精华内容
下载资源
问答
  • 主要介绍了android4.0与2.3版本的TP代码区别,需要的朋友可以参考下
  • 高通平台之TP代码分析

    千次阅读 2018-04-23 17:50:07
    TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synaptics(新思)。 TP驱动的调试主要是将接口调通。 从TP厂商获取驱动和配置资料。 4.2.1. 集成或者使用系统自带的TP驱动 查找kernel...

    TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synaptics(新思)。
    TP驱动的调试主要是将接口调通。
    从TP厂商获取驱动和配置资料。
    4.2.1. 集成或者使用系统自带的TP驱动

    查找kernel/drivers/input/touchscreen,看是否有对应的驱动。如果没有,可以从高通的网站下载驱动或者找厂商要驱动

    由于TP通过I2C与处理器通信,所以只要调通I2C,TP调试工作基本就完成了。
    通过kernel log 查看类似这些probe函数:goodix_ts_probe(), cyttsp5_probe(), synaptics_rmi4_probe() 的执行情况,看看问题出在哪。
    I2C主要看地址是否正确。还要用示波器量一下I2C线上的波形。I2C是不用时拉高,传输数据时才会有拉低的信号。如果log里说I2C忙,那就有可能I2C没有拉高。


    TP触摸屏,应该是驱动开发中比较简单并且适合新手入手的模块。不过虽然简单,但涉及到的内容还是比较多的,其中linux相关主要的机制:

    1. input 机制

    2. 中断、定时器

    3. I2C

    1.TP的原理:TP一般为电容或为电阻屏,不过现在基本上都是电容屏,可能一些WINCE的设备还会用电阻屏,但Android的基本现在为电容屏,且多点触摸和手套触摸都集成在TP的IC中。当用户触摸电容屏时,由于人体电场,用户手指和工作面形成一个耦合电容,因为工作面上接有高频信号,于是手指吸收走一个很小的电流,这个电流分别从屏的四个角上的电极中流出,且理论上流经四个电极的电流与手指头到四角的距离成比例,控制器通过对四个电流比例的精密计算,得出位置。可以达到99%的精确度,具备小于3ms的响应速度。在实际产品中,当屏幕感应到手指的接触或者靠近,会产生一个外部中断给CPU,在中断中,一般中断下半部,通过I2C总线,从TP的IC中读取相关的信息,经过一定的数据处理,上报X,Y坐标值。

     2.linux input机制:

    linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。

    对于输入子系统设备驱动层而言,主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。(工程师主要做的事情)

    对于核心层而言,为设备驱动层提供了规范和接口。设备驱动层只要关心如何驱动硬件并获得硬件数据(例如按下的按键数据),然后调用核心层提供的接口,核心层会自动把数据提交给事件处理层。

    对于事件处理层而言,则是用户编程的接口(设备节点),并处理驱动层提交的数据处理。

    3. 中断

    中 断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的 程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。

    Linux 中断分为两个半部:上半部(tophalf)和下半部(bottom half)。上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。因此,上半部 执行的速度就会很快,可以服务更多的中断请求。但是,仅有"登记中断"是远远不够的,因为中断的事件可能很复杂。因此,Linux引入了一个下半部,来完 成中断事件的绝大多数使命。下半部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的,下半部几乎做了中断处理程序所有的事情,而且可以被新的 中断打断!下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

    4. 定时器

    两种设备进行计时:系统定时器和实时时钟。

    实时时钟(RTC):用来持久存放系统时间的设备,即便系统关闭后,靠主板上的微型电池提供电力保持系统的计时。系统启动内核通过读取RTC来初始化墙上时间,改时间存放在xtime变量中。

    系统定时器:内核定时机制,注册中断处理程序,周期性触发中断,响应中断处理程序,进行处理执行以下工作:

    5. I2C协议

    2条双向串行线,一条数据线SDA,一条时钟线SCL。

    SDA传输数据是大端传输,每次传输8bit,即一字节。
       支持多主控(multimastering),任何时间点只能有一个主控。
       总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.
       系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。

    上一篇主要讲的与TP相关的知识点,讲这个主要是,你对这一模块有个基本的概念,知道其工作原理,这样在实际开发过程中,你才知道怎么去写起的驱动,碰到问题时,出现在哪一块,该怎么去解决。

          这一篇,主要根据代码来讲上一篇涉及到的相关机制。TP的连线很简单,一路I2C,一根中断线,VCC、GND,reset。

    1. TP主要相关demo:

    驱动demo:\kernel\drivers\input\touchscreen\Ft5x06_ts.c 

        \kernel\drivers\input\touchscreen\Ft5x06_ts.h

    dtsi文件:\kernel\arch\arm\boot\dts\qcom\Msm8X16-qrd.dtsi

    2. dtsi的相关解释

    i2c@f9923000{ //TP所连的I2C的寄存器
    focaltech@38{ 
    compatible = "focaltech,5x06"; //I2C驱动match的内容
    reg = <0x38>; //I2C地址
    interrupt-parent = <&msmgpio>;  //中断引脚
    interrupts = <1 0x2>;
    vdd-supply = <&pm8110_l19>;     //I2C供电的电影控制
    vcc_i2c-supply = <&pm8110_l14>;
    focaltech,name = "ft6x06";     //tp类型
    focaltech,family-id = <0x06>;   
    focaltech,reset-gpio = <&msmgpio 0 0x00>; //复位引脚,,用于初始化时序
    focaltech,irq-gpio = <&msmgpio 1 0x00>;   //中断引脚
    focaltech,display-coords = <0 0 480 800>; //TP的触点范围
    focaltech,panel-coords = <0 0 480 800>;
    focaltech,button-map= <139 102 158>;     //虚拟按键
    focaltech,no-force-update;
    focaltech,i2c-pull-up;
    focaltech,group-id = <1>;
    focaltech,hard-reset-delay-ms = <20>;
    focaltech,soft-reset-delay-ms = <150>;
    focaltech,num-max-touches = <2>;
    focaltech,fw-name = "ft_8610_qrd_fw.bin"; //TP固件
    focaltech,fw-delay-aa-ms = <100>;
    focaltech,fw-delay-55-ms = <30>;
    focaltech,fw-upgrade-id1 = <0x79>;
    focaltech,fw-upgrade-id2 = <0x08>;
    focaltech,fw-delay-readid-ms = <10>;
    focaltech,fw-delay-era-flsh-ms = <2000>;
    };
    }; 

    3. 驱动文件

    3.1 I2C驱动注册

    static int __init ft5x06_ts_init(void)
    {
    pr_err("start \n");
    return i2c_add_driver(&ft5x06_ts_driver); //I2C驱动注册
    pr_err("end \n");
    }

    3.2 文件接口,of_match_table,需要DTSI中compatible定义的一致。

    static struct i2c_driver ft5x06_ts_driver = {
    .probe = ft5x06_ts_probe,
    .remove = ft5x06_ts_remove,
    .driver = {
      .name = "ft5x06_ts",
      .owner = THIS_MODULE,
    .of_match_table = ft5x06_match_tabl
    #ifdef CONFIG_PM
      .pm = &ft5x06_ts_pm_ops,
    #endif
      },
    .id_table = ft5x06_ts_id,
    };

    3.3 probe

    这个里面代码量太多,就不详细一一说明,这里主要讲解一些基本的步骤。

    一般,先给相关的结构体分配存储空间,然后从dt设备树中读取相关的信息,测试I2C是否通。

    input_dev = input_allocate_device();//分配输入子系统

    data->input_dev = input_dev;
    data->client = client;
    data->pdata = pdata;
    input_dev->name = "ft5x06_ts";
    input_dev->id.bustype = BUS_I2C;
    input_dev->dev.parent = &client->dev;
    input_set_drvdata(input_dev, data);
    i2c_set_clientdata(client, data);
    __set_bit(EV_KEY, input_dev->evbit);  //设置有什么事件 按键事件 tp虚拟按键
    __set_bit(EV_ABS, input_dev->evbit);  //绝对事件 
    __set_bit(BTN_TOUCH, input_dev->keybit);
    __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
    input_mt_init_slots(input_dev, pdata->num_max_touches, 0);
    input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, //X坐标事件
        pdata->x_max, 0, 0);
    input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, //Y坐标事件
        pdata->y_max, 0, 0);

    ft5x06_power_init(data, true); //电源、GPIO相关的初始化

    ft5x06_power_on(data, true); // 上电,时序初始化

    err = request_threaded_irq(client->irq, NULL,ft5x06_ts_interrupt,IRQF_ONESHOT,
    client->dev.driver->name, data); //请求中断,并把事件处理放在下半部。

    psensor_input_dev = input_allocate_device(); 分配子输入设备

    err = input_register_device(psensor_input_dev);

    ft5x06_update_fw_ver(data); //导入固件信息
    ft5x06_update_fw_vendor_id(data); //获取固件版本ID


    3.4 中断处理程序 ft5x06_ts_interrupt

    static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id)

    这个里面主要是读I2C,根据芯片手册,进行数据出来,然后上报事件。

    input_report_abs(ip_dev, ABS_MT_POSITION_X, x);
    input_report_abs(ip_dev, ABS_MT_POSITION_Y, y);

    input_sync(ip_dev);

    当然有些TP,如GT9xxxx,会申请工作队列,然后中断产生会在上半部,启动工作队列,然后屏蔽当前中断,在工作队列事件处理完后,使能中断。有些还会当中断请求失败时,申请一个高精度的定时器,会一直轮询启动工作线程,上报事件。


    4. 调试相关经验

    4.1 一般TP驱动开发,屏产都会给驱动代码或者PATCH,这时主要合代码进去。

    一般找代码内现有的一个TP驱动,按它的添加。主要:

    1. 把驱动文件放入kernel\drivers\input\touchscreen\,

    2. 修改kconfig和Makefile,加入需要根据宏才能编进去,那么需要在deconfig配置文件中设置为Y.

    3. 在DTSI中加入该TP的配置。


     4.2 编译boot,在out/target/product/msmXXX/obj/KERNEL_OBJ/driver/input/touchscreen/下,看是否有.o文件没有,有则编译成功。

    4.3 把新的boot文件刷入板子,查看内核log,cat proc/kmsg,看是否有该TP驱动的打印信息。

    4.4 根据打印信息,判断出错的问题。

    一般问题,中断注册不上,资源分配不成功,I2C设备通信失败。

    一些经验,I2C总线不通,可能是因为I2C供电的电源没有供电,或者该总线上挂的设备太多影响的,前期调最好I2C总线上,只挂一个设备。

    若probe成功,可在中断或者工作线程里面加一些打印log。在adb shell进入终端,输入getevent,手按TP,查看是否有数据打出,对于该TP的输入设备。


    5. 查看I2C设备:

    root@Android:/sys/bus/i2c # cd devices
    cd devices
    root@android:/sys/bus/i2c/devices # ls
    ls
    0-0020
    0-0022
    0-0036
    0-0078
    1-000c
    1-000d
    1-001d
    1-0028
    1-0029
    1-002a
    1-0038
    1-0060
    1-0068
    2-001c
    i2c-0
    i2c-1
    i2c-2
    root@android:/sys/bus/i2c/devices # cd 0-0036
    cd 0-0036
    root@android:/sys/bus/i2c/devices/0-0036 # ls
    ls
    driver
    modalias
    name
    power
    subsystem
    uevent
    root@android:/sys/bus/i2c/devices/0-0036 # cat name
    cat name
    msm_actuator
    root@android:/sys/bus/i2c/devices/0-0036 #


    展开全文
  • tp代码,不完整,可以参考
  • 模型分层是从tp5.0 过来的,虽然5.1手册中没有了关于模型分层的介绍,但还是保留了分层,需要自己创建 1)服务层模型,带有调用逻辑层的增删改查4个方法 2)逻辑层模型,带有调用数据层的常用几个方法 3)数据层模型...
  • 一键设置L2TP代码

    2020-11-13 09:35:46
    编译后直接设置好L2TP,帮助小白用户使用,输入用户密码后自动保存,在win10+RouteOS上测试通过
  • l2tp内核源码

    2012-10-29 23:04:02
    l2tp内核源码
  • TP5+MySQL通用分表代码

    2018-12-20 10:58:12
    - 分表情况,2:日期分表,按照目标表里面的记录日期的字段,按照日期【日、周、月、年】拆分成多个表【本代码仅考虑unix时间戳来分表,其它不支持,您可以自己思考,自己修改代码】 - 注意,支持【子表】,填入...
  • tp3.2微信授权登录代码,新手建议多看看使用,老手不喜欢勿喷,谢谢
  • tplink ar9331芯片路由器uboot源代码
  • tp代码生成器

    千次阅读 2014-12-08 09:54:47
    所谓的代码生成器就是我们通过一段代码的控制tp生成相应的模块、模块下的控制器、模块下的模型、模块下的视图,它生成的一些信息都是一些我们经常要自己写的信息, 但是这些信息又都是重复的,我们完全可以用这个...

    最近看了一下代码生成器的原理,发现这个东西还是很方便的。可以让我们少些很多的代码。


    所谓的代码生成器就是我们通过一段代码的控制tp生成相应的模块、模块下的控制器、模块下的模型、模块下的视图,它生成的一些信息都是一些我们经常要自己写的信息,

    但是这些信息又都是重复的,我们完全可以用这个东西代替我们自己敲代码。

    这样我们可以有更多的时间考虑程序本身的问题,而不用重复的去做这些事情。


    代码生成器也是有他的局限性的,越是可以多用的代码,他上面的信息越是稀少,我们还要以后自己书写,不过即使这样已经很方便了。

    展开全文
  • 图像旋转45度的matlab代码TP-GAN ICCV17论文“”的TP-GAN Tensorflow正式实施,作者为张和Shu,李和,天宇和。 目的是从任何姿势下的单个面部图像中恢复同一个人的正面面部图像。 这是本文中的一些示例。 测试图像 ...
  • 支付宝支付代码是我在项目开发时写的,集成在thinkphp中,PHP或用其他框架的朋友可以稍作修改用。
  • Android代码实现在图片进行翻页时添加翻页动画。
  • tp5+后台管理系统(权限管理系统已经实现),利用tp框架,这个非常好用,小编一直在用
  • ThinkPHP 清理缓存最新TP5.0/6.0有效完全代码 , 1 . 清除模版缓存 不删除cache目录 。。。。 2 . 清除模版缓存 不删除 temp目录 。。。 3 . 清除日志缓存 不删出log目录 使用循环方式获取所以有效的文件夹
  • TP5.0.5框架源代码

    2017-04-22 15:45:09
    TP5.0.5框架源代码
  • 注意事项: ... 2.只要是数据库操作必须引用 use/think/Db;严格区分大小写。... /****************tp5中使用原生语句*******************/ //query 用于查询 其他的用execute // 插入记录 // $result = Db::e
  • TP驱动调试笔记

    千次阅读 2020-12-22 14:33:28
    以在mtk6737平台移植汇顶的GT910举例,建议正式调试的前一天把代码完整编译一遍,假如时间来不及,至少...一般要提前准备:主板、TP模组、串口线、硬件原理图,供应商提供芯片手册、规格书、驱动代码和cfg参数等。 ...

    前言:    

         以在mtk6737平台移植汇顶的GT910举例,建议正式调试的前一天把代码完整编译一遍,假如时间来不及,至少

    要先编译内核,编译eng或者userdebug版本。一般要提前准备:主板、TP模组、串口线、硬件原理图,供应商提供

    芯片手册、规格书、驱动代码和cfg参数等。调试最开始首先要了解TP芯片的型号、屏幕分辨率、主板上面TP座子位

    置、供电方式、中断和复位脚的GPIO号、用到哪组i2c总线核对主板座子和规格书里面排线线序是否一致。接下来第

    一个小目标就是调通i2c,读到正确的ID值。

     

         TP(触摸屏)的大致工作流程是:主控芯片与TP芯片通过i2c总线通讯,它们之间一般有6个引脚相连接,分别是VDD、

    RESET、SCL、SDA、INT、GND。开机过程中系统会对TP芯片进行上电初始化,之后TP处于待命状态。当TP模组

    表面有触摸时,会产生中断,接着在中断处理函数中唤醒触摸事件的线程,在线程里面通过i2c读取点坐标信息上报给

    系统层。

     

    1、移植芯片driver驱动代码

    把厂家提供的GT910的代码复制到以下目录,有时候要把另外提供的CFG参数替换到gt9xx_config.h的CTP_CFG

    _GROUP1中

    kernel-3.18/drivers/input/touchscreen/mediatek/

     

    驱动代码gt9xx_driver.c中需要重点关注的一些函数:

      static int __init tpd_driver_init(void); /*一般阅读驱动的代码是从最下面的module_init里面的函数开始*/

      void tpd_get_dts_info(void); /*读取设备树touch节点的属性*/

      static int tpd_local_init(void); /*在这里添加i2c driver*/

      static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); /*匹配成功才调用这个函数*/

      static int tpd_power_on(struct i2c_client *client); /*上电和复位*/

      s32 gtp_read_version(struct i2c_client *client, u16 *version); /*读取版本号,在这里可以确认i2c通讯是否成功*/

      static s32 gtp_init_panel(struct i2c_client *client); /*TP芯片的初始化*/

      static int touch_event_handler(void *unused); /*触摸事件处理线程,中断产生时会唤醒这个线程*/

      static void tpd_down(s32 x, s32 y, s32 size, s32 id); /*上报点坐标*/

     

    如果感兴趣,可以等驱动调通后再更加仔细地阅读代码,在内核中用dump_stack(); 函数可以查看当前函数被

    哪些函数调用,对跟读代码很有帮助。

     

    a、供电方面要注意,主板上是采用pmic输出2.8V,还是外部独立的LDO供电,根据硬件原理图来定。

         //pmic输出2.8V的部分控制代码

         tpd->reg = regulator_get(tpd->tpd_dev, "vtouch");

         ret = regulator_set_voltage(tpd->reg, 2800000, 2800000); /*set 2.8v*/

         if (ret) {

             printk("regulator_set_voltage(%d) failed!\n", ret);

             return -1;

          }

          ret = regulator_enable(tpd->reg); /*使能电源*/

     

         //独立的LDO供电方式,则是控制某个gpio输出高、低电平

         #define GTP_POWER_PORT  (GPIO22 | 0x80000000) 

         /*MTK旧的平台可以直接这样调用GPIO,Android7.0及以后建议改用从dts里面读取*/

     

         mt_set_gpio_mode(GTP_POWER_PORT, GPIO_MODE_00);

         mt_set_gpio_dir(GTP_POWER_PORT, GPIO_DIR_OUT);

         mt_set_gpio_out (GTP_POWER_PORT, 1); //输出高电平,使能LDO的2.8V

     

    b、检查一下的复位时序

          void gtp_reset_guitar(struct i2c_client *client, s32 ms);

          

    c、看看申请中断的部分,少数时候要修改compatible匹配名称

      

    d、针对这个芯片,不需要固件升级

          #define GTP_FW_DOWNLOAD       0 /* update FW to TP SRAM */

     

    e、还有一点提醒,供应商提供的驱动代码,不一定是标准版本,也有可能被别人改过,需要自己根据平台、

         硬件信息修改。

     

    2、修改Makefile和Kconfig

    kernel-3.18/arch/arm/configs/产品_debug_defconfig  (注意:64位系统选择arm64目录,32位系统选择arm目录)

    +CONFIG_TOUCHSCREEN_MTK_GT910=y

    -CONFIG_TOUCHSCREEN_MTK_FT5X0X=y

    +# CONFIG_TOUCHSCREEN_MTK_FT5X0X is not set (把旧型号的注释掉,前面加“# ”末尾改成“ is not set”)

     

    kernel-3.18/arch/arm/configs/产品_defconfig

    +CONFIG_TOUCHSCREEN_MTK_GT910=y

    -CONFIG_TOUCHSCREEN_MTK_FT5X0X=y

    +# CONFIG_TOUCHSCREEN_MTK_FT5X0X is not set

     

    kernel-3.18/drivers/input/touchscreen/mediatek/Makefile

    +obj-$(CONFIG_TOUCHSCREEN_MTK_GT910) += GT910/

     

    kernel-3.18/drivers/input/touchscreen/mediatek/Kconfig

    +source "drivers/input/touchscreen/mediatek/GT910/Kconfig"

     

    Kconfig文件的作用是产生”CONFIG_”开头的全局宏,以便在config文件中赋值。全局宏一般用来作为条件编译

    或者替代自定义的字符串或数值。config文件是用来给全局的宏赋初始值,一般赋值为“y”、字符串或者数值。

    取消某个宏定义的方法是:前面加“# ”末尾改成“ is not set”。编译过程中会在out目录生成.config文件。 

     

    注意:凡是修改了config文件,编译前要删除out目录中的.config文件(下面的产品名称根据自己的项目来定)

    rm -rf out/target/product/产品/obj/KERNEL_OBJ/.config

     

    3、修改设备树dts文件

     kernel-3.18/arch/arm/boot/dts/产品.dts

     

    &touch {  # tpd_get_dts_info函数里面会读取这里的一些参数

        tpd-resolution = <480 800>; #修改分辨率,与LCD的一致

        use-tpd-button = <0>;  #TP的底部是否带触摸按键,配置为0表示不带

        tpd-key-num = <3>;

        tpd-key-local= <139 172 158 0>;

        tpd-key-dim-local = <90 883 100 40 230 883 100 40 370 883 100 40 0 0 0 0>;

        tpd-max-touch-num = <5>;  #最多支持5点触摸

        tpd-filter-enable = <0>;

        tpd-filter-pixel-density = <146>;

        tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 0 0>;

        tpd-filter-custom-speed = <0 0 0>;

        pinctrl-names = "default", "state_eint_as_int", "state_eint_output0", "state_eint_output1",

        "state_rst_output0", "state_rst_output1";  #mtk_tpd.c里面会根据这些名称来匹配pinctrl_state,用来控制gpio

        pinctrl-0 = <&CTP_pins_default>;

        pinctrl-1 = <&CTP_pins_eint_as_int>;

        pinctrl-2 = <&CTP_pins_eint_output0>;

        pinctrl-3 = <&CTP_pins_eint_output1>;

        pinctrl-4 = <&CTP_pins_rst_output0>;

        pinctrl-5 = <&CTP_pins_rst_output1>;

        status = "okay";

    };

    &pio {

        CTP_pins_default: eint0default {

        };

        CTP_pins_eint_as_int: eint@0 {

            pins_cmd_dat {

                pins = <PINMUX_GPIO124__FUNC_GPIO124>; #根据原理图修改中断脚的gpio

                slew-rate = <0>;  #配置成0表示输入

                bias-disable;  #取消内部上下拉

            };

        };

        CTP_pins_eint_output0: eintoutput0 {

            pins_cmd_dat {

                pins = <PINMUX_GPIO124__FUNC_GPIO124>;

                slew-rate = <1>;  #配置成1表示输出

                output-low;  #输出低

            };

        };

        CTP_pins_eint_output1: eintoutput1 {

            pins_cmd_dat {

                pins = <PINMUX_GPIO124__FUNC_GPIO124>;

                slew-rate = <1>;

                output-high;  #输出高

            };

        };

        CTP_pins_rst_output0: rstoutput0 {

            pins_cmd_dat {

                pins = <PINMUX_GPIO123__FUNC_GPIO123>; #根据原理图修改复位脚的gpio

                slew-rate = <1>;

                output-low;

            };

        };

        CTP_pins_rst_output1: rstoutput1 {

            pins_cmd_dat {

                pins = <PINMUX_GPIO123__FUNC_GPIO123>;

                slew-rate = <1>;

                output-high;

            };

        };

    };

     

           设备树(Device  Tree)的作用是把硬件相关的资源信息独立出来放到dts文件中,使得设计开发更加方便。

           Device Tree可以描述的信息包括CPU、内存、总线、中断控制器、GPIO控制器、Clock控制器、常用外设

           如屏、TP、摄像头、各种传感器等。dts即device tree source 设备树源码,最终会编译成.dtb文件。

     

    凡是dts有修改的,编译bootimage前要先删除下面目录(不是每次编译前都要删除,有修改了才需要删)

    rm -rf out/target/product/产品/obj/KERNEL_OBJ/arch/arm/boot/dts/

     

    4、配置dws文件

            DWS文件也属于设备树,MTK为了方便设计开发,专门做了一个DCT图型界面编辑工具,用来修改配置

            GPIO、中断、ADC、按键、I2C、PMIC、时钟等信息。

     

    DCT编辑工具位置:

    vendor\mediatek\proprietary\bootable\bootloader\preloader\tools\dct\old_dct\DrvGen.exe

     

    DWS文件位置:

    vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\产品\dct\dct\codegen.dws

    vendor\mediatek\proprietary\bootable\bootloader\lk\target\产品\dct\dct\codegen.dws

    kernel-3.18\drivers\misc\mediatek\mach\平台\产品\dct\dct\codegen.dws

     

    a、打开I2C选项栏,选择TP的i2c设备名称i2c总线填入i2c地址

              dws中的Slave Device名称要与驱动代码中.compatible的cap_touch”名称一致,dws中的设备名称一般

          用大写如下图所示。 TP芯片用到哪组i2c总线,根据硬件原理图来确定。TP的i2c地址可以在数据手册里面

          找到或者直接问FAE。

     

         如果Slave Device下拉列表中找不到“CAP_TOUCH”名称,可以在下面的文件中自定义增加,然后重新

         打开dct编辑工具,就可以找到。

         vendor/mediatek/proprietary/bootable/bootloader/preloader/tools/dct/old_dct/I2C_YuSu.cmp

     

    b、打开GPIO选项栏,配置gpio默认属性

          gpio124是中断脚,勾选中断、内部上下拉使能、上拉高电平;

          gpio123是复位脚,配置成普通GPIO(Def.Mode选0:),勾选内部上下拉使能,由于没有勾选上拉所以默认

          是下拉,输出低电平。  

    c、打开EINT选项栏,配置中断名称、防抖时间、极性、触发类型、是否有防抖  

    d、修改dws后的编译注意

         凡是dws有修改的,要先删除下面的3个目录,再重新编译pl、lk、bootimage

         rm -rf out/target/product/产品/obj/KERNEL_OBJ/arch/arm/boot/dts/

         rm -rf out/target/product/产品/obj/BOOTLOADER_OBJ/

         rm -rf out/target/product/产品/obj/PRELOADER_OBJ/

     

         make pl -j16 ; make lk -j16 ; make bootimage -j16

     

    5、排除编译报错, boot、pl、lk编译通过后刷机测试

          a、移植GT910驱动代码后的第一次编译,先删除下面的目录再编译,里面有其它旧型号的驱动.o文件

                rm -rf out/target/product/产品/obj/KERNEL_OBJ/drivers/input/touchscreen/

     

          b、查看开机串口log里面,有没有调用tpd_i2c_probe函数,probe匹配原理是:驱动代码中tpd_of_match

                的compatible名称与dws编译出来的I2C Slave Device compatible名称对比。看到调用probe后,接着

               看上电、复位、读取芯片ID、芯片初始化、申请中断等有没有成功。确认开机初始化通过后,触摸TP

               看看界面是否响应。调试过程可以在代码中多增加printk打印log,方便了解驱动代码运行到哪一步。

     

    6、调试过程遇到一些问题的处理方法

          a、开机过程没有调用probe函数

                   检查驱动代码有没有编译到,tpd_of_match中compatible里逗号后面的名称是否与dws中的I2C Slave

               Device名称一致。检查上面提到的一些注意事项,凡是config、dws或dts有修改,编译前要删除out目录

               中的一些编译输出文件。

          b、开机过程中i2c报错

                   检查供电、复位脚时序、软件中i2c总线有没有选对,核对i2c地址,核对座子和TP排线的线序,如果

               有必要可以使用示波器测量波形。有时候可更换主板或TP模组试试,排除硬件物料问题。实在找不到问

               题点,可以找硬件设计人员、FAE一起协助分析。

          c、开机初始化没有报错,读ID正常,但触摸无响应

                   在中断函数里面加log打印或者使用示波器测量中断脚波形,看有没有中断产生。检查驱动代码里面中

               断脚有没有配置正确。有时候要更新cfg参数或者固件,多跟FAE沟通。

         d、效果问题

                   报点错乱、划线断线(系统设置开发者选项里面开启”指针位置”后,在屏幕划线时会有点轨迹)、触摸

               不灵敏等效果问题需要找FAE协助优化,更新cfg参数或者固件。

     

    7、开机初始化时tpd_i2c_probe的调用过程

         驱动代码gt9xx_driver.c:

         static int tpd_local_init(void)

           \if (i2c_add_driver(&tpd_i2c_driver) != 0) {

              \int i2c_register_driver(struct module *owner, struct i2c_driver *driver)

                 \int driver_register(struct device_driver *drv)

                     \int bus_add_driver(struct device_driver *drv)

                         \int driver_attach(struct device_driver *drv)

                             \int bus_for_each_dev(struct bus_type *bus, struct device *start, /*在这里遍历所有的设备*/

                                 \static int __driver_attach(struct device *dev, void *data)

                                     \ if (!driver_match_device(drv, dev))  /*如果这里匹配不成功,则直接返回0,不会往下调用

                                          driver_probe_device*/

                                        \ static inline int driver_match_device(struct device_driver *drv,

                                            \static int i2c_device_match(struct device *dev, struct device_driver *drv)

                                                \ static inline int of_driver_match_device(struct device *dev,

                                                   \ const struct of_device_id *__of_match_node(const struct of_device_id *matches,

                                                       \ static int __of_device_is_compatible(const struct device_node *device,

                                                         /*最终对比compatible名称*/

                                    \int driver_probe_device(struct device_driver *drv, struct device *dev)

                                        \static int really_probe(struct device *dev, struct device_driver *drv)

                                             \ret = dev->bus->probe(dev);

                                                 \static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)

     

    ====================================================================================

    展开全文
  • tp5升级 tp5系统更新 #安装作曲家需要xiaoyaor / tp5升级
  • TP-清洁代码-源码

    2021-02-09 10:54:47
    TP-清洁代码
  • tp5自动生成代码和mvc文件功能

    千次阅读 2018-07-23 00:27:56
    基于tp5的build.php的改进,自动生成mvc文件 thinkphp5.1 工具地址:https://download.csdn.net/download/qq_33984993/10587027 thinkphp5.0 工具地址:https://download.csdn.net/download/qq_33984993/10587036 ...

    基于tp5的build.php的改进,自动生成mvc文件

    thinkphp5.1 工具地址:https://download.csdn.net/download/qq_33984993/10587027

    thinkphp5.0 工具地址:https://download.csdn.net/download/qq_33984993/10587036

    最近想做项目的时候,写了很多重复,但又不能避免的代码,比如在模型里面绑定表和主键等等,这些代码是不能避免的。

    我被这些写烦了,就有了自动生成代码和mvc文件的想法,自己在网上搜索了一下,目前只有自动生成代码,但并没有找到自动生成mvc文件的相关信息,我就自己写了一个。

    下面直接上图,看效果

    一、自动生成模型文件

    根据数据库的表,自动生成对应的模型,比如一共40张表,就生成40个模型文件并绑定对应的表和主键

    解决你重复的创建模型的烦恼

    根据你的需求,数据层,逻辑层,服务层都可以自动创建好

    生成后的文件

    二、自动生成控制器文件

    根据需求选择后,自动创建控制器到你指定的模块

    生成后的文件

    视图目前只有生成代码,生成文件会在近段时间内在码云上更新完成

    码云:

    tp5.0:https://gitee.com/www.358881498.com/code

    tp5.1:https://gitee.com/www.358881498.com/tp5.1code

    展开全文
  • 介绍:TP房产系统又称tpfangchan系统目前有三个系列,分别是单城市标准版,单城市新房版,多城市版 各个系列市场适应人群略有不同,整个系统内核为TP内核,高度的可开发性和可延展性.非常受市场欢迎
  • 主要介绍了TP5框架实现的数据库备份功能,结合实例形式分析了TP5数据库备份功能相关原理及实现方法,需要的朋友可以参考下
  • TP5微信小程序获取openid和unionid代码 俩种方式:1获取openid 判断数据库是否存在获取unionid 2.获取openid后不存在 走官方button按钮 的getuserinfo去获取unionid
  • 发送邮箱简易代码
  • author:咔咔 wechat:fangkangfk 注释: 注明方法是干什么的 注明参数类型,参数注解 获取首页信息使用List 获取域名信息,使用info 修改域名,使用edit 删除域名,使用del ......
  • TP5发送邮件类库

    2019-06-26 11:05:49
    TP5发送邮件类库 phpmailer phpmailer phpmailer phpmailer phpmailer
  • TP5后台管理系统.rar

    2019-06-05 11:38:10
    该资源是用PHP的ThinkPHP5框架写的一个后台权限管理系统
  • 今天小编就为大家分享一篇关于易语言源码被腾讯TP破坏后修复的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • tp5+excel上传下载

    2019-01-25 10:22:32
    基于tp5下做的excel上传和下载设置了几个字段,根据个人需要设置字段

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,114
精华内容 36,845
关键字:

tp代码