一种基于gt9系列芯片的驱动实现方法及系统与流程

文档序号:15462372发布日期:2018-09-18 18:28阅读:240来源:国知局
本发明属于芯片设计
技术领域
:,尤其涉及一种基于gt9系列芯片的驱动实现方法及系统。
背景技术
::I2C协议是嵌入式系统中广泛使用的一类通信协议,主要用于CPU和各种外设之间的低速数据通信。Linuxkernel使用I2Cframework抽象、管理相应的资源,并以各种形式,向各类使用者提供API。Linux的I2C体系结构分为3个组成部分,具体是:(1)I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即Algorithm)上层的与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。(2)I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部;I2C总线驱动主要包含I2C适配器数据结构i2c_adapter、I2C适配器的Algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数;经由I2C总线驱动的代码,可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。(3)I2C设备驱动:I2C设备驱动(也称为客户驱动)是对I2C硬件系统结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据;I2C设备驱动主要包含数据结构i2c_driver和i2c_client,需要根据具体设备实现其中的成员函数。目前,gt9系列芯片包含有若干种类型的芯片,每一类型的芯片均需要配置一对应的驱动程序,但是该gt9系列的芯片类型有若干,从而增加了芯片研发难度,而且不同类型的芯片之间兼容性较差。技术实现要素:本发明的目的在于提供一种基于gt9系列芯片的驱动实现方法,旨在解决现有技术中的问题。本发明是这样实现的,一种基于gt9系列芯片的驱动实现方法,所述方法包括下述步骤:在I2Cadapter的DTSnode中添加外设的DTS描述;当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离。作为一种改进的方案,所述在I2Cadapter的DTSnode中添加外设的DTS描述的步骤具体包括下述步骤:根据硬件的连接方式,确定外设所从属的I2Cadapter;在所述I2Cadapter的DTSnode中,添加外设的DTS描述。作为一种改进的方案,所述当添加完成所述DTS描述后,生成所述外设的驱动程序的步骤具体包括下述步骤:定义一个structi2c_driver类型的变量,所述变量包含一个与DTS中的“compatible”字段相同的of_match_table字段以及一个probe接口;调用module_i2c_driver接口,同时将调用的所述module_i2c_driver接口注册到I2Ccore中。作为一种改进的方案,所述方法还包括下述步骤:在入口函数tpd_driver_init中调用i2c_add_driver完成对i2c_driver的注册;其中,所述i2c_driver对应一套驱动方法,所述i2c_driver的成员函数包括probe()、remove()、suspend()和resume()。作为一种改进的方案,所述方法还包括下述步骤:控制在所述驱动程序中生成probe()函数,其中,所述probe()函数中包含tpd_power_on函数、gtp_read_version函数、gtp_init_panel函数、proc_create函数以及touch_event_handler函数;其中,所述tpd_power_on函数用于为所述外设提供供电脚设置以及做上电复位动作,所述gtp_read_version函数用于读取外设版本号,若读取成功则标识I2C已通,所述gtp_init_panel函数用于读取配置文件,获取中断触发方式和分辨率信息,所述proc_create函数用于创建proc下的调试节点,所述touch_event_handler函数用于创建接收输入事件的线程。作为一种改进的方案,所述方法还包括下述步骤:对I2C读写函数进行封装,所述I2C读写函数的单位为i2cmsg,在所述I2C读写函数中,addr是I2Cslavedevice的地址,flags为数据传输可携带的flag,I2C数据传输的接口包含两类,一类是以i2cclient为参数,进行简单的数据收发,另一类是以i2cadapter和i2cmsg为参数进行的数据收发动作。本发明的另一目的在于提供一种基于gt9系列芯片的驱动实现系统,所述系统包括:DTS描述添加模块,用于在I2Cadapter的DTSnode中添加外设的DTS描述;驱动程序生成模块,用于当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离。作为一种改进的方案,所述DTS描述添加模块具体包括:I2Cadapter确定模块,用于根据硬件的连接方式,确定外设所从属的I2Cadapter;添加模块,用于在所述I2Cadapter的DTSnode中,添加外设的DTS描述。作为一种改进的方案,所述驱动程序生成模块具体包括:变量定义模块,用于定义一个structi2c_driver类型的变量,所述变量包含一个与DTS中的“compatible”字段相同的of_match_table字段以及一个probe接口;接口调用注册模块,用于调用module_i2c_driver接口,同时将调用的所述module_i2c_driver接口注册到I2Ccore中。作为一种改进的方案,所述系统还包括:i2c_driver注册模块,用于在入口函数tpd_driver_init中调用i2c_add_driver完成对i2c_driver的注册,其中,所述i2c_driver对应一套驱动方法,所述i2c_driver的成员函数包括probe()、remove()、suspend()和resume();probe()函数生成模块,用于控制在所述驱动程序中生成probe()函数,其中,所述probe()函数中包含tpd_power_on函数、gtp_read_version函数、gtp_init_panel函数、proc_create函数以及touch_event_handler函数,其中,所述tpd_power_on函数用于为所述外设提供供电脚设置以及做上电复位动作,所述gtp_read_version函数用于读取外设版本号,若读取成功则标识I2C已通,所述gtp_init_panel函数用于读取配置文件,获取中断触发方式和分辨率信息,所述proc_create函数用于创建proc下的调试节点,所述touch_event_handler函数用于创建接收输入事件的线程;读写函数封装模块,用于对I2C读写函数进行封装,所述I2C读写函数的单位为i2cmsg,在所述I2C读写函数中,addr是I2Cslavedevice的地址,flags为数据传输可携带的flag,I2C数据传输的接口包含两类,一类是以i2cclient为参数,进行简单的数据收发,另一类是以i2cadapter和i2cmsg为参数进行的数据收发动作。在本发明实施例中,在I2Cadapter的DTSnode中添加外设的DTS描述;当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离,从而实现对所有gt9系列芯片的驱动,减少各个gt9系列芯片设计一种对应的驱动程序所带来的增加研发成本,解决了各个芯片之间驱动程序兼容性较差的问题。附图说明图1是本发明提供的基于gt9系列芯片的驱动实现方法的实现流程图;图2是本发明提供的I2C子系统框架的结构示意图;图3本发明提供的在I2Cadapter的DTSnode中添加外设的DTS描述的实现流程图;图4是本发明提供的当添加完成所述DTS描述后,生成所述外设的驱动程序的实现流程图;图5是本发明提供的基于gt9系列芯片的驱动实现系统的结构框图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。图1示出了本发明提供的基于gt9系列芯片的驱动实现方法的实现流程图,其具体包括下述步骤:在步骤S101中,在I2Cadapter的DTSnode中添加外设的DTS描述。在步骤S102中,当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离。在该步骤中,上述步骤是基于I2C子系统框架实现,其中,该I2C子系统框架为现有的技术方案,结合图2所示,下述仅给出其具体的结构,但不用以限制本发明:(1)I2Cframework的最终目标,是提供一种“访问I2Cslavedevices”的方法。由于这些slavedevices由I2Ccontroller控制,因而主要由I2Ccontroller驱动实现这一目标;(2)经过I2Cframework的抽象,consumer可以不用关心I2C总线的技术细节,只需要通过简单的API,就可以与slavedevices进行数据交互。正常情况下,consumer是位于内核态的其它driver(例如HDMIdriver、touchscreendriver等等);与此同时,I2Cframework也通过字符设备向用户空间提供类似的接口,用户空间程序可以通过该接口访问slavedevices;(3)在I2Cframework内部,有I2Ccore、I2Cbusses、I2Calgos和I2Cmuxes四个模块;(4)I2Ccore使用I2Cadapter和I2Calgorithm两个子模块抽象I2Ccontroller的功能,使用I2Cclient和I2Cdriver抽象I2Cslavedevice的功能(对应设备模型中的device和devicedriver)。另外,基于I2C协议,通过smbus模块实现SMBus(SystemManagementBus,系统管理总线)的功能;(5)I2Cbusses是各个I2Ccontrollerdrivers的集合,位于drivers/i2c/busses/目录下;(6)I2Calgos包含了一些通用的I2Calgorithm,所谓的algorithm,是指I2C协议包的生成方法,进而组合成I2C的read/write指令,一般情况下,都是由硬件实现,不需要特别关注该目录;(7)I2Cmuxes用于实现I2Cbus的多路复用功能,在此不过多介绍。在本发明实施例中,如图3所示,在I2Cadapter的DTSnode中添加外设的DTS描述的步骤具体包括下述步骤:在步骤S201中,根据硬件的连接方式,确定外设所从属的I2Cadapter。在步骤S202中,在所述I2Cadapter的DTSnode中,添加外设的DTS描述。其中,DTS描述的格式与和正常的platformdevice一致,所示如下:DTS描述中的compatible关键字用于设备和驱动的probe,如“compatible="huiding,gt9xx";”,其它字段根据实际情况自行添加。如图4所示,当添加完成所述DTS描述后,生成所述外设的驱动程序的步骤具体包括下述步骤:在步骤S301中,定义一个structi2c_driver类型的变量,所述变量包含一个与DTS中的“compatible”字段相同的of_match_table字段以及一个probe接口;在步骤S302中,调用module_i2c_driver接口,同时将调用的所述module_i2c_driver接口注册到I2Ccore中。在图4所示的驱动程序的生成过程中,包括下述执行节点,具体为:(1)在入口函数tpd_driver_init中调用i2c_add_driver完成对i2c_driver的注册;其中,所述i2c_driver对应一套驱动方法,所述i2c_driver的成员函数包括probe()、remove()、suspend()和resume();在该实施例中,i2c_driver的实现程序为:staticstructi2c_drivertpd_i2c_driver={.probe=tpd_i2c_probe,.remove=tpd_i2c_remove,.detect=tpd_i2c_detect,.driver.name="gt9xx",.id_table=tpd_i2c_id,.address_list=(constunsignedshort*)forces,};(2)控制在所述驱动程序中生成probe()函数,其中,所述probe()函数中包含tpd_power_on函数、gtp_read_version函数、gtp_init_panel函数、proc_create函数以及touch_event_handler函数;其中,所述tpd_power_on函数用于为所述外设提供供电脚设置以及做上电复位动作,所述gtp_read_version函数用于读取外设版本号,若读取成功则标识I2C已通,所述gtp_init_panel函数用于读取配置文件,获取中断触发方式和分辨率信息,所述proc_create函数用于创建proc下的调试节点,所述touch_event_handler函数用于创建接收输入事件的线程,没有输入事件时睡眠,有输入事件产生时,会被中断例程唤醒,获取输入事件并上报;最后是做中断相关的设置;在该实施例中,probe()函数的具体实现程序为:statics32tpd_i2c_probe(structi2c_client*client,conststructi2c_device_id*id){s32err=0;s32ret=0;u16version_info;ret=tpd_power_on(client);if(ret<0){GTP_ERROR("I2CcommunicationERROR!");}ret=gtp_read_version(client,&version_info);if(ret<0){GTP_ERROR("Readversionfailed.");}ret=gtp_init_panel(client);if(ret<0){GTP_ERROR("GTPinitpanelfailed.");}gt91xx_config_proc=proc_create(GT91XX_CONFIG_PROC_FILE,0666,NULL,&config_proc_ops);if(gt91xx_config_proc==NULL){GTP_ERROR("create_proc_entry%sfailed\n",GT91XX_CONFIG_PROC_FILE);}else{GTP_INFO("createprocentry%ssuccess",GT91XX_CONFIG_PROC_FILE);}thread=kthread_run(touch_event_handler,0,TPD_DEVICE);if(IS_ERR(thread)){err=PTR_ERR(thread);GTP_INFO(TPD_DEVICE"failedtocreatekernelthread:%d\n",err);}mt_set_gpio_mode(GPIO_CTP_EINT_PIN,GPIO_CTP_EINT_PIN_M_EINT);mt_set_gpio_dir(GPIO_CTP_EINT_PIN,GPIO_DIR_IN);mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN,GPIO_PULL_DISABLE);msleep(50);if(!int_type){mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM,EINTF_TRIGGER_RISING,tpd_eint_interrupt_handler,1);}else{mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM,EINTF_TRIGGER_FALLING,tpd_eint_interrupt_handler,1);}mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);return0;}(3)对I2C读写函数进行封装,I2C传输(读或者写)以i2cmsg为单位,该数据结构包含了数据传输相关的所有信息,其中,addr,是I2Cslavedevice的地址。flags,数据传输可携带的flag,常用的包括:I2C_M_TEN,支持10-bit的slave地址;I2C_M_RD,此次传输是读操作;len,数据传输的长度,单位为byte;buf,数据buf。i2c数据传输有关的接口有两类:一类是以i2cclient为参数,进行简单的数据收发,包括i2c_master_send、i2c_master_recv。该方法只可以通过标准方式,发送或者接收一定数量的数据。另一类是以i2cadapter和i2cmsg为参数,可以更为灵活的read或者write数据,包括i2c_transfer。使用该方法可以以structi2c_msg为参数,一次读取、或者写入、或者读取加写入,一定数量的数据。本驱动实现的读函数接口如下:inti2c_read_bytes_non_dma(structi2c_client*client,u16addr,u8*rxbuf,intlen){u8buffer[GTP_ADDR_LENGTH];u8retry;u16left=len;u16offset=0;structi2c_msgmsg[2]={{.addr=((client->addr&I2C_MASK_FLAG)|(I2C_PUSHPULL_FLAG)),.flags=0,.buf=buffer,.len=GTP_ADDR_LENGTH,.timing=I2C_MASTER_CLOCK},{.addr=((client->addr&I2C_MASK_FLAG)|(I2C_PUSHPULL_FLAG)),.flags=I2C_M_RD,.timing=I2C_MASTER_CLOCK},};if(rxbuf==NULL)return-1;while(left>0){buffer[0]=((addr+offset)>>8)&0xFF;buffer[1]=(addr+offset)&0xFF;msg[1].buf=&rxbuf[offset];if(left>MAX_TRANSACTION_LENGTH){msg[1].len=MAX_TRANSACTION_LENGTH;left-=MAX_TRANSACTION_LENGTH;offset+=MAX_TRANSACTION_LENGTH;}else{msg[1].len=left;left=0;}retry=0;while(i2c_transfer(client->adapter,&msg[0],2)!=2){retry++;if(retry==5){GTP_ERROR("I2Cread0x%Xlength=%dfailed\n",addr+offset,len);return-1;}}}return0;}在本发明实施例中,本TP驱动的实现遵照主机驱动和外设驱动分离的设计思想,在设备模型的基础上进一步简化了设备驱动的实现,为驱动的维护升级提供了最大限度的便利。图5示出了本发明提供的基于gt9系列芯片的驱动实现系统的结构框图,为了便于说明,图中仅给出了与本发明实施例相关的部分。基于gt9系列芯片的驱动实现系统包括:DTS描述添加模块11,用于在I2Cadapter的DTSnode中添加外设的DTS描述;驱动程序生成模块12,用于当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离。其中,DTS描述添加模块11具体包括:I2Cadapter确定模块13,用于根据硬件的连接方式,确定外设所从属的I2Cadapter;添加模块14,用于在所述I2Cadapter的DTSnode中,添加外设的DTS描述。驱动程序生成模块12具体包括:变量定义模块15,用于定义一个structi2c_driver类型的变量,所述变量包含一个与DTS中的“compatible”字段相同的of_match_table字段以及一个probe接口;接口调用注册模块16,用于调用module_i2c_driver接口,同时将调用的所述module_i2c_driver接口注册到I2Ccore中。在该实施例中,i2c_driver注册模块17,用于在入口函数tpd_driver_init中调用i2c_add_driver完成对i2c_driver的注册,其中,所述i2c_driver对应一套驱动方法,所述i2c_driver的成员函数包括probe()、remove()、suspend()和resume();probe()函数生成模块18,用于控制在所述驱动程序中生成probe()函数,其中,所述probe()函数中包含tpd_power_on函数、gtp_read_version函数、gtp_init_panel函数、proc_create函数以及touch_event_handler函数,其中,所述tpd_power_on函数用于为所述外设提供供电脚设置以及做上电复位动作,所述gtp_read_version函数用于读取外设版本号,若读取成功则标识I2C已通,所述gtp_init_panel函数用于读取配置文件,获取中断触发方式和分辨率信息,所述proc_create函数用于创建proc下的调试节点,所述touch_event_handler函数用于创建接收输入事件的线程;读写函数封装模块19,用于对I2C读写函数进行封装,所述I2C读写函数的单位为i2cmsg,在所述I2C读写函数中,addr是I2Cslavedevice的地址,flags为数据传输可携带的flag,I2C数据传输的接口包含两类,一类是以i2cclient为参数,进行简单的数据收发,另一类是以i2cadapter和i2cmsg为参数进行的数据收发动作。其中,上述各个模块的功能如上述方法实施例所记载,在此不再赘述。在本发明实施例中,在I2Cadapter的DTSnode中添加外设的DTS描述;当添加完成所述DTS描述后,生成所述外设的驱动程序,所述外设的驱动程序主机驱动程序分离,从而实现对所有gt9系列芯片的驱动,减少各个gt9系列芯片设计一种对应的驱动程序所带来的增加研发成本,解决了各个芯片之间驱动程序兼容性较差的问题。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1