Linux的芯片驱动firmware自动升级之一:功能说明
来源:互联网 发布:淘宝店铺显示的销量 编辑:程序博客网 时间:2024/06/03 02:38
在驱动开发过程中,我们有时会碰到这种应用:比如说某款芯片的固件不是固定的,是可以后期升级的。那么在每次系统开机时,需要做个检测,如果检测到提供了新的固件,那么在第一次开机时就升级固件。之后由于保存了新的固件版本号可供检测,就不用再开机升级了。
以一款I2C的触摸屏芯片为例,假设供应商提供的新固件文件名是Us3x06eb_use.it,将该文件放在触摸屏驱动.c的同目录下,那么需要做的就是在触摸屏的Probe函数里面加入对应的版本号检测处理,并决定是否升级。如果需要升级,将目标固件通过I2C写入即可。
- typedef enum
- {
- ERR_OK,
- ERR_MODE,
- ERR_READID,
- ERR_ERASE,
- ERR_STATUS,
- ERR_ECC,
- ERR_DL_ERASE_FAIL,
- ERR_DL_PROGRAM_FAIL,
- ERR_DL_VERIFY_FAIL
- }E_UPGRADE_ERR_TYPE;
- #define FTS_PACKET_LENGTH 2 //一次写两个字节,作为一个PACKET
- static unsigned char CTPM_FW[] = //载入目标固件
- {
- #include "Us3x06eb_use.it"
- };
- static int fts_i2c_txdata(u8 *txdata,int length) //一次通过I2C传输多字节数据
- {
- int ret;
- struct i2c_msg msg;
- msg.addr = i2c_client->addr;
- msg.flags = 0;
- msg.len = length;
- msg.buf = txdata;
- ret = i2c_transfer(i2c_client->adapter, &msg, 1);
- if(ret < 0)
- {
- pr_err("%s i2c write error: %d\n", __func__, ret);
- }
- return ret;
- }
- static bool i2c_write_interface(u8 *pbt_buf,int dw_lenth) //通过I2C写多个数据
- {
- int ret;
- ret = i2c_master_send(i2c_client, pbt_buf, dw_lenth);
- if(ret <= 0)
- {
- printk("[TSP]i2c_write_interface error line = %d, ret = %d\n", __LINE__, ret);
- return FTS_FALSE;
- }
- return FTS_TRUE;
- }
- static bool i2c_read_interface(u8 *pbt_buf,int dw_lenth) //通过I2C读多个数据
- {
- int ret;
- ret = i2c_master_recv(i2c_client, pbt_buf, dw_lenth);
- if(ret <= 0)
- {
- printk("[TSP]i2c_read_interface error\n");
- return FTS_FALSE;
- }
- return FTS_TRUE;
- }
- static bool fts_register_write(u8 reg_name, u8 *tx_buf) //往寄存器写单字节数据
- {
- u8 write_cmd[2] = {0};
- write_cmd[0] = reg_name;
- write_cmd[1] = *tx_buf;
- return i2c_write_interface(write_cmd, 2);
- }
- static bool fts_register_read(u8 reg_name, u8 *rx_buf,int rx_length) //从寄存器读多个数据
- {
- u8 read_cmd[2] = {0};
- u8 cmd_len = 0;
- read_cmd[0] = reg_name;
- cmd_len = 1;
- /*send register addr*/
- if(!i2c_write_interface(&read_cmd[0], cmd_len))
- {
- return FTS_FALSE;
- }
- if(!i2c_read_interface(rx_buf, rx_length))
- {
- return FTS_FALSE;
- }
- return FTS_TRUE;
- }
E_UPGRADE_ERR_TYPE fts_ctpm_fw_upgrade(u8 *pbt_buf, int dw_lenth) //编程烧录细节不阐述,实例会在本博客的续篇中列出
{
//将数据划分成相应的PACKET,一次通过I2C写入芯片中。有几个问题需要注意:(1)要注意分包的衔接,数据长度未必恰好能划分成整数个包,那么最后一个包要单独
//处理;(2)数据校验,比如说芯片带自动异或校验的话,一方面我们在发送的过程中要及时进行数据校验运算,另一方面在数据发送完毕后,可以把这个校验值跟校验
//寄存器的值进行比较,从而判断当前传输是否有效。
}
- int fts_ctpm_fw_upgrade_with_i_file(void)
- {
- u8 *pbt_buf = 0x0;
- int ret;
- pbt_buf = CTPM_FW;
- ret = fts_ctpm_fw_upgrade(pbt_buf, sizeof(CTPM_FW)); //升级特定文件
- return ret;
- }
- static int __devinit tpd_probe(struct i2c_client *client,const struct i2c_device_id *id)//TP的probe函数
- {
- .............
- {
- u8 reg_val=0;
- mdelay(50);
- fts_register_read(0xA6,®_val,1); //读出当前版本号
- if(reg_val<TP_LIB_VERSION) //如果当前版本号小于待升级版本号,进行升级
- {
- printk("TP firmware version OK, start upgrade\n");
- fts_ctpm_fw_upgrade_with_i_file();
- }
- }
- .............
- }
- Linux的芯片驱动firmware自动升级之一:功能说明
- Linux的芯片驱动firmware自动升级之一:功能说明
- Linux的芯片驱动firmware自动升级之二:MELFAS的TP升级实例
- Linux的芯片驱动firmware自动升级之二:MELFAS的TP升级实例
- linux驱动之firmware
- 升级HCA卡的firmware
- Linux 设备驱动的固件firmware加载
- Firmware升级
- DM9000网络芯片详细说明及linux驱动
- 74系列芯片功能说明
- 74系列芯片功能说明
- 74系列芯片功能说明
- 4412芯片GPIO功能说明
- PIC单片机芯片引脚常用符号的功能说明
- Firmware Linux
- Linux firmware
- 什么是Firmware升级
- Windows 7的自动寻找驱动功能
- dup重定向到标准
- Django学习笔记之简介
- 用java的开发简易邮件群发软件
- getsockopt的TCP层实现剖析
- 中文比较问题
- Linux的芯片驱动firmware自动升级之一:功能说明
- Java 线程同步(synchronized)
- 用Perl访问ftp服务器
- springMVC基于注解配置教程一
- 上班族的真实写照
- STUN, TURN, ICE简要介绍
- 如何保护HTML5应用代码
- codeforces LionAge II DP
- Quotes of the Day – Personal ReminderList