CTP固件升级接口技术规范
一. 固件升级需求指引
调研用户,售后,工厂测试得到ctp的固件升级的基本需求如下:
1. 应用或shell命令可以强制下载ctp固件,包括降级的固件(降级固件不能重新开机,因为开机后会自动升级为软件集成的最新固件)。
2. 应用或shell命令可以要求ctp驱动升级自带的固件(如果自带的固件有多个版本,则升级到最新版)。
3. 应用或shell命令能够读取固件信息,包括版本号,名称等。
二. 整体结构框图
如上图,用户空间可以通过访问sysfs文件系统的方式与内核空间中fw_man模块进行通信,Fw_man模块与ctp模块以标准化的固件升级接口对接。用户空间传入给fw_man某种需求后,fw_man 将其分解成一条条ctp模块可执行的基本功能,然后按照一定的逻辑关系组合这些被分解后的基本功能。
三. CTP驱动接口技术规范
1.Fw_man模块与CTP驱动的接口定义如下:
struct firmware_object{
//强制写固件函数指针,其中firmware是存放固件内容的指针,num为固件长度,要求固件升级动作ctp单独启动一个线程完成,相关函数应立即返回,不应有所堵塞。
int(*write_firmware_from_sdcard)(u8 * firmware,unsigned long num);
//固件自升级,要求升级自带的固件数组内容,要求升级最新版本的固件数组,要求固件升级动作ctp单独启动一个线程完成,相关函数应立即返回,不应有所堵塞。
int (*write_firmware_self)(void);
//读取固件ic供应商,名称,版本,固件id号等
int(*read_firmware_profile) (char * ic, char * panel, char * fw_ver, char *cfg_id);
//读取固件ctp升级状态
int (*read_firmware_update_state)(void);
//ctp的名称,由ctp驱动分配
char*firmware_name;.
};
总之,Ctp应提供给fw_man模块以下几种接口功能:
( 1 )固件强制升级
( 2 )Ctp自升级
( 3 )升级时的状态
0:The device updatessuccessfully.
1:The device is updating.
-1:The device failed to update.
2:The device has not been found.
( 4 )固件的信息反馈
2.ctp的接口通过注册和注销的方式被fw_man添加和删除。
注册函数为:firmware_attach (struct firmware_object *obj);
注销函数为:firmware_dettach (struct firmware_object *obj).
这里须在ctp驱动中建立一个全局变量(struct firmware_object *fw_obj)用于向fw_man模块中添加和删除ctp对象。
这两个函数添加位置参考代码,以Gt9158为例:
( 1 )staticint tpd_local_init(void)
{
…
attach_fw_man_init();
return 0;
}
( 2 )staticvoid __exit tpd_driver_exit(void)
{
…
firmware_dettach(fw_obj->dev);
}
3.其他ctp相关接口参考(基于gt9158):
( 1 )static int ctp_write_firmware(u8 *firmware,unsigned long num){
inti =0;
intret;
GTP_INFO("ctp_write_firmware\n");
read_firmware_update_state= 1;
ret =gup_init_update_proc_test(i2c_client_point, firmware, num);
if (ret < 0)
{
GTP_ERROR("Create update thread error.");
read_firmware_update_state = 2;
}
return0;
}
( 2 )int ctp_read_firmware(char * ic, char* panel, char * fw_ver, char * cfg_id){
ctp_get_pid(ic);
ctp_get_vendor(panel);
sprintf(fw_ver,"0x%x", ctp_get_vid());
sprintf(cfg_id,"0x%x", ctp_get_cfg_id());
return 0;
}
( 3 )intctp_read_firmware_update_state(void){
GTP_INFO("ctp_read_firmware_update_states\n");
returnread_firmware_update_state;
}
( 4 )int ctp_write_firmware_self(void){
/*
......
*/
return 0;
}
( 5 )intattach_fw_man_init(void)
{
GTP_INFO("attach_fw_man_init\n");
interr = 0;
fw_obj= kzalloc(sizeof(struct firmware_object), GFP_KERNEL);//全局变量
memset(fw_obj,0, sizeof(struct firmware_object));
fw_obj->write_firmware_self= ctp_write_firmware_self;
fw_obj->write_firmware= ctp_write_firmware;
fw_obj->read_firmware= ctp_read_firmware;
fw_obj->read_firmware_update_state= ctp_read_firmware_update_state;
fw_obj->dev= 0;//可有可无,在fw_man中分配dev编号
fw_obj->firmware_name= kzalloc(sizeof(char*), GFP_KERNEL);
strcpy(fw_obj->firmware_name,"ctp9158");
if(err= firmware_attach(fw_obj))
{
GTP_INFO("attach fail = %d\n",err);
}
returnerr;
}
( 6 )int dettach_fw_man_init(void)
{
int err = 0;
err =firmware_dettach(fw_obj);
return err;
}
四. 上层接口调用规范
由二的原理可知,上次接口通过访问sys文件系统操作与fw_man通信,sys文件系统路径为:/sys/class/fw_man/current/…
Sys文件系统为上层调用提供以下接口:
1. 强制升级命令接口:
接口名称: force(命令),data(数据)
路径为:/sys/class/fw_man/current/ force
使用方法:
(1)echo 1 > force //开始写ctp固件标志
(2)cat 固件文件名 >data //传入ctp固件数据
(3)echo 0 > force //写固件,结束
自升级命令接口;
接口名称:self
路径为:/sys/class/fw_man/current/self
使用方法:echo xx(任何) > self
例子:echo 1 > self
2. 读取固件版本号
接口名称:version
路径为:/sys/class/fw_man/current/ version
使用方法:cat version, 可以获取ctp的版本号和名称。
3. 读取ctp状态
接口名称:state
使用方法:cat state, 可以获取ctp当前的状态。定义以下四种状态:
0:Thedevice updates successfully.
1:The device is updating.
-1:The device failed to update.
2:The device has not been found.
4.上层在固件升级时,要持有系统suspend lock,防止系统休眠,导致固件升级失败。应对用户有提示,固件升级时不能灭屏和断电,低电量的固件升级可能会失败等。
五.fw_man基本功能程序流程图
1.Ctp注册到fw_man模块
2.强制固件升级流程