linux驱动中触屏ic固件升级

转载 2016年05月31日 14:04:44

转自:http://blog.csdn.net/zhandoushi1982/article/details/6597947

在驱动开发过程中,我们有时会碰到这种应用:比如说某款芯片的固件不是固定的,是可以后期升级的。那么在每次系统开机时,需要做个检测,如果检测到提供了新的固件,那么在第一次开机时就升级固件。之后由于保存了新的固件版本号可供检测,就不用再开机升级了。

        以一款I2C的触摸屏芯片为例,假设供应商提供的新固件文件名是Us3x06eb_use.it,将该文件放在触摸屏驱动.c的同目录下,那么需要做的就是在触摸屏的Probe函数里面加入对应的版本号检测处理,并决定是否升级。如果需要升级,将目标固件通过I2C写入即可。

  1. typedef enum  
  2. {  
  3.        ERR_OK,  
  4.        ERR_MODE,  
  5.        ERR_READID,  
  6.        ERR_ERASE,  
  7.        ERR_STATUS,  
  8.        ERR_ECC,  
  9.        ERR_DL_ERASE_FAIL,  
  10.        ERR_DL_PROGRAM_FAIL,  
  11.        ERR_DL_VERIFY_FAIL  
  12. }E_UPGRADE_ERR_TYPE;  
  13.   
  14. #define    FTS_PACKET_LENGTH        2    //一次写两个字节,作为一个PACKET  
  15.   
  16. static unsigned char CTPM_FW[] =            //载入目标固件  
  17. {  
  18.       #include "Us3x06eb_use.it"  
  19. };  
  20.   
  21. static int fts_i2c_txdata(u8 *txdata, int length)   //一次通过I2C传输多字节数据  
  22. {  
  23.        int ret;  
  24.        struct i2c_msg msg;  
  25.        msg.addr = i2c_client->addr;  
  26.        msg.flags = 0;  
  27.        msg.len = length;  
  28.        msg.buf = txdata;  
  29.        ret = i2c_transfer(i2c_client->adapter, &msg, 1);  
  30.   
  31.        if(ret < 0)  
  32.        {  
  33.              pr_err("%s i2c write error: %d\n", __func__, ret);  
  34.        }  
  35.   
  36.        return ret;  
  37. }  
  38.   
  39. static bool i2c_write_interface(u8 *pbt_buf, int dw_lenth)    //通过I2C写多个数据  
  40. {  
  41.        int ret;  
  42.        ret = i2c_master_send(i2c_client, pbt_buf, dw_lenth);  
  43.        if(ret <= 0)  
  44.        {  
  45.              printk("[TSP]i2c_write_interface error line = %d, ret = %d\n", __LINE__, ret);  
  46.              return FTS_FALSE;  
  47.        }  
  48.   
  49.        return FTS_TRUE;  
  50. }  
  51.   
  52. static bool i2c_read_interface(u8 *pbt_buf, int dw_lenth)   //通过I2C读多个数据  
  53. {  
  54.        int ret;  
  55.        ret = i2c_master_recv(i2c_client, pbt_buf, dw_lenth);  
  56.        if(ret <= 0)  
  57.        {  
  58.               printk("[TSP]i2c_read_interface error\n");  
  59.               return FTS_FALSE;  
  60.        }  
  61.   
  62.        return FTS_TRUE;  
  63. }  
  64.   
  65. static bool fts_register_write(u8 reg_name, u8 *tx_buf)     //往寄存器写单字节数据  
  66. {  
  67.        u8 write_cmd[2] = {0};  
  68.        write_cmd[0] = reg_name;  
  69.        write_cmd[1] = *tx_buf;  
  70.        return i2c_write_interface(write_cmd, 2);  
  71. }  
  72.   
  73. static bool fts_register_read(u8 reg_name, u8 *rx_buf, int rx_length)    //从寄存器读多个数据  
  74. {  
  75.        u8 read_cmd[2] = {0};  
  76.        u8 cmd_len  = 0;  
  77.        read_cmd[0] = reg_name;  
  78.        cmd_len = 1;  
  79.   
  80.        /*send register addr*/  
  81.        if(!i2c_write_interface(&read_cmd[0], cmd_len))  
  82.        {  
  83.               return FTS_FALSE;  
  84.        }  
  85.   
  86.        if(!i2c_read_interface(rx_buf, rx_length))  
  87.        {  
  88.               return FTS_FALSE;  
  89.        }  
  90.   
  91.        return FTS_TRUE;  
  92. }  


      E_UPGRADE_ERR_TYPE  fts_ctpm_fw_upgrade(u8 *pbt_buf, int dw_lenth)   //编程烧录细节不阐述,实例会在本博客的续篇中列出

{

       //将数据划分成相应的PACKET,一次通过I2C写入芯片中。有几个问题需要注意:(1)要注意分包的衔接,数据长度未必恰好能划分成整数个包,那么最后一个包要单独

       //处理;(2)数据校验,比如说芯片带自动异或校验的话,一方面我们在发送的过程中要及时进行数据校验运算,另一方面在数据发送完毕后,可以把这个校验值跟校验

       //寄存器的值进行比较,从而判断当前传输是否有效。

}

  1. int fts_ctpm_fw_upgrade_with_i_file(void)  
  2. {  
  3.        u8     *pbt_buf = 0x0;  
  4.        int ret;  
  5.        pbt_buf = CTPM_FW;  
  6.        ret =  fts_ctpm_fw_upgrade(pbt_buf, sizeof(CTPM_FW));     //升级特定文件  
  7.        return ret;  
  8. }  
  9.   
  10. static int __devinit tpd_probe(struct i2c_client *client, const struct i2c_device_id *id) //TP的probe函数  
  11.   
  12. {  
  13.   
  14.         .............  
  15.   
  16.         {   
  17.                u8 reg_val=0;  
  18.                mdelay(50);  
  19.                fts_register_read(0xA6,®_val,1);     //读出当前版本号  
  20.                  if(reg_val<TP_LIB_VERSION)    //如果当前版本号小于待升级版本号,进行升级  
  21.                 {  
  22.                        printk("TP firmware version OK, start upgrade\n");   
  23.                        fts_ctpm_fw_upgrade_with_i_file();     
  24.               }  
  25.        }  
  26.   
  27.         .............  
  28.   

linux驱动中触屏ic固件升级

转自:http://blog.csdn.net/zhandoushi1982/article/details/6597947 在驱动开发过程中,我们有时会碰到这种应用:比如说某款芯片的固件不是固...
  • richu123
  • richu123
  • 2016年05月31日 14:04
  • 498

2014版本USBasp固件升级,更换公版固件以支持ArduinoIDE

2014版本免驱USBasp固件升级在网上买了个9块钱包邮的USBasp下载器,说是免驱,软件自动降速,无需跳线设置,支持S5x系列下载,无64K限制,结果Arduino IDE根本不认咱这国货,Li...
  • tw359303267
  • tw359303267
  • 2017年05月08日 09:33
  • 1033

每日程炼-触摸屏编程OnGesture

Delphi 2010 最抢眼的新功能可能就是支持”触摸屏”了, 它包括一个 可触控的软键盘 和识别不同的触屏手势.因为手势同时支持鼠标, 所以没有触摸屏的我也可以尝试一下其大多数的功能.首次尝试的步...
  • GODYAD
  • GODYAD
  • 2011年05月22日 11:43
  • 3178

Linux驱动之触摸屏(4)-多点触控

Linux驱动之触摸屏(4)-多点触控 4.1 概述          此驱动支持it7260触摸屏控制器,最多支持三点触摸,已在CPU: s5pc110、linux-2.6.32.9、andro...
  • cjok376240497
  • cjok376240497
  • 2011年12月26日 21:14
  • 3471

信号调理IC:一种低成本ASIC替代品

2006-05-27 15:20:03 0 && image.height>0){if(image.width>=510){this.width=510;this.height=i...
  • mybirdsky
  • mybirdsky
  • 2008年01月17日 16:20
  • 693

主流Wifi芯片简要介绍

802.11n其实可以达到600Mbps 其实,802.11n是可以达到最高600Mbps标准的,这得益于MIMO(多进多出)以及OFDM(正交频分复用)技术两项技术的应用,但是由于还存在路由器...
  • ZYBASJJ
  • ZYBASJJ
  • 2014年07月30日 10:26
  • 30742

linux驱动入门之触摸屏驱动

按照韦东山老师视频所编写,加入自己的实践 废话不多说,直接上文件 1.tq2440_ts_sk.c #include #include #include #include #include ...
  • stevenking55
  • stevenking55
  • 2013年08月17日 19:06
  • 1758

IC设计流程概述

芯片设计流程概述 芯片设计分为前端设计和后端设计,前端设计(也称逻辑设计)和后端设计(也称物理设计)并没有统一严格的界限,涉及到与工艺有关的设计就是后端设计。 ...
  • limanjihe
  • limanjihe
  • 2016年09月26日 21:59
  • 1077

说说芯片设计这点事

芯片设计这个行当 ,从大的方面讲,主要分模拟和数字两大块, 而每大块又分前端和后端, 我想大部分同学对这个肯定是非常清楚的, 下面就数字电路聊聊芯片设计的一些事情,就是芯片设计有哪些活做, 这并不是全...
  • lijiuyangzilsc
  • lijiuyangzilsc
  • 2015年06月17日 17:09
  • 1051

芯片比较

给你补一点手机党的基础知识,觉得好可以提高悬赏,hoho。 瑞芯微属于低端解决方案,跟它类似的还有全志的a10,通常存在于1000以下的pad中,手机上面用得少,因为发热量和功耗不尽人意。它们的性能对...
  • wangshilin
  • wangshilin
  • 2013年01月11日 16:03
  • 425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux驱动中触屏ic固件升级
举报原因:
原因补充:

(最多只允许输入30个字)