{\r
cst92xx_tp_i2c_data_write(buf,reg_len+len);\r
\r
- return 0;\r
+ return 1;\r
}\r
\r
static int hyn_wr_reg(struct hyn_ts_data *hyn_92xxdata, uint32_t reg_addr, uint8_t reg_len, uint8_t *rbuf, uint16_t rlen)\r
{\r
cst92xx_tp_i2c_data_read(reg_addr,reg_len,rbuf,rlen);\r
- return 0;\r
+ return 1;\r
}\r
\r
// cst92xx_drv_data g_cst92xx_drv = {\r
hyn_delay_ms(40);\r
\r
ret = cst92xx_updata_tpinfo();\r
- if(ret == FALSE){\r
+ if(ret != 0){\r
HYN_INFO("cst92xx_updata_tpinfo failed");\r
}\r
ret |= cst92xx_set_workmode(NOMAL_MODE,0);\r
}\r
#endif\r
\r
-static int cst92xx_enter_boot(void)\r
+static int cst92xx_enter_boot(void)\r
{\r
- if(hyn_92xxdata == NULL)\r
- {\r
- return EXT_ERR_FAILURE;\r
- }\r
-\r
- int ok = FALSE,t,retry = 3;\r
+ int ok = FALSE,t;\r
uint8_t i2c_buf[4] = {0};\r
- hyn_set_i2c_addr(hyn_92xxdata,BOOT_I2C_ADDR);\r
+\r
for (t = 10;; t += 2)\r
{\r
- if(t >= 30 || retry==0){\r
+ if (t >= 30){\r
return FALSE;\r
}\r
\r
- // cst92xx_reset();\r
cst92xx_reset();\r
hyn_delay_ms(t);\r
\r
- ok = hyn_wr_reg(hyn_92xxdata, 0xA001AA, 3, i2c_buf, 2);\r
- if(ok == FALSE || (i2c_buf[0]==0x5A && i2c_buf[1]==0x5A)){\r
- if(ok==TRUE && retry){\r
- retry--;\r
- t = 10;\r
- }\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA001AA, 3, i2c_buf, 0);\r
+ if(ok == FALSE){\r
continue;\r
}\r
+\r
hyn_delay_ms(1);\r
+\r
ok = hyn_wr_reg(hyn_92xxdata, 0xA002, 2, i2c_buf, 2);\r
if(ok == FALSE){\r
continue;\r
}\r
+\r
if ((i2c_buf[0] == 0x55) && (i2c_buf[1] == 0xB0)) {\r
break;\r
}\r
}\r
- ok = hyn_wr_reg(hyn_92xxdata, 0xA00100, 3, i2c_buf, 2);\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA00100, 3, i2c_buf, 0);\r
if(ok == FALSE){\r
return FALSE;\r
}\r
+\r
return TRUE;\r
}\r
\r
static int erase_all_mem(void)\r
{\r
- if(hyn_92xxdata == NULL)\r
- {\r
- return EXT_ERR_FAILURE;\r
- }\r
-\r
int ok = FALSE,t;\r
uint8_t i2c_buf[8];\r
\r
//erase_all_mem\r
- ok = hyn_wr_reg(hyn_92xxdata, 0xA0140000, 4, i2c_buf, 2);\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA0140000, 4, i2c_buf, 0);\r
if (ok == FALSE){\r
return FALSE;\r
}\r
- ok = hyn_wr_reg(hyn_92xxdata, 0xA00C807F, 4, i2c_buf, 2);\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA00C807F, 4, i2c_buf, 0);\r
if (ok == FALSE){\r
return FALSE;\r
}\r
- ok = hyn_wr_reg(hyn_92xxdata, 0xA004EC, 3, i2c_buf, 2);\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA004EC, 3, i2c_buf, 0);\r
if (ok == FALSE){\r
return FALSE;\r
}\r
}\r
\r
\r
- ok = hyn_wr_reg(hyn_92xxdata,0xA004EE,3,i2c_buf,2);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA004EE,3,i2c_buf,0);\r
if(ok == FALSE){\r
return FALSE;\r
}\r
uint32_t chip_checksum = 0;\r
uint8_t retry = 5;\r
\r
- ok = hyn_wr_reg(hyn_92xxdata,0xA00300,3,i2c_buf,2);\r
+ hyn_92xxdata->boot_is_pass = 0;\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA00300,3,i2c_buf,0);\r
if (ok == FALSE) {\r
return FALSE;\r
} \r
\r
hyn_delay_ms(1);\r
if(i2c_buf[0] == 0x01){\r
+ hyn_92xxdata->boot_is_pass = 1;\r
memset(i2c_buf,0,sizeof(i2c_buf));\r
ok = hyn_wr_reg(hyn_92xxdata,0xA008,2,i2c_buf,4);\r
if (ok == FALSE) {\r
return FALSE;\r
} \r
- chip_checksum = uint8_tTO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);\r
+\r
+ chip_checksum = ((uint32_t)(i2c_buf[0])) |\r
+ (((uint32_t)(i2c_buf[1])) << 8) |\r
+ (((uint32_t)(i2c_buf[2])) << 16) |\r
+ (((uint32_t)(i2c_buf[3])) << 24);\r
}\r
else{\r
hyn_92xxdata->need_updata_fw = 1;\r
if(0 != hyn_92xxdata->fw_file_name[0]){\r
//node to update\r
ok = copy_for_updata(hyn_92xxdata,i2c_buf,CST92XX_BIN_SIZE-20,4);\r
- fw_checksum = uint8_tTO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);\r
+ fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);\r
if(hyn_92xxdata->hw_info.ic_fw_checksum == fw_checksum || ok != 0){\r
HYN_INFO("no update,fw_checksum is same:0x%04x",fw_checksum);\r
goto UPDATA_END;\r
}\r
}else{\r
- fw_checksum = uint8_tTO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT+0]);\r
+ fw_checksum = U8TO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT+0]);\r
}\r
HYN_INFO("updating fw checksum:0x%04x",fw_checksum);\r
\r
break;\r
}\r
\r
- hyn_wr_reg(hyn_92xxdata,0xA006EE,3,i2c_buf,2); //exit boot\r
+ hyn_wr_reg(hyn_92xxdata,0xA006EE,3,i2c_buf,0); //exit boot\r
hyn_delay_ms(2);\r
\r
UPDATA_END: \r
\r
return ok_copy;\r
}\r
-\r
-static int cst92xx_updata_tpinfo(void)\r
+static int16_t read_word_from_mem(uint8_t type, uint16_t addr, uint32_t *value)\r
{\r
- if(hyn_92xxdata == NULL)\r
+ int16_t ret = 0;\r
+ uint8_t i2c_buf[4] = {0},t;\r
+\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x10;\r
+ i2c_buf[2] = type;\r
+ ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,3); \r
+ if (ret)\r
+ {\r
return -1;\r
+ }\r
\r
- uint8_t buf[30],retry=8;\r
- struct tp_info *ic = &hyn_92xxdata->hw_info;\r
- if(ic == NULL)\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x0C;\r
+ i2c_buf[2] = addr;\r
+ i2c_buf[3] = addr >> 8;\r
+ ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,4); \r
+ if (ret)\r
+ {\r
return -1;\r
+ }\r
\r
- int ret = 0;\r
- hyn_92xxdata->boot_is_pass = 0;\r
- while(retry--){\r
- cst92xx_set_workmode(0xff,DISABLE);\r
- ret = hyn_wr_reg(hyn_92xxdata,0xD101,2,buf,2);\r
- if(ret) continue;\r
- ret = hyn_wr_reg(hyn_92xxdata,0xD1F4,2,buf,28);\r
- printf("buf[19] :0x%x\n",buf[19]);\r
- if(ret==0 && (buf[19]==0x92||buf[19]==0x91)){\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x04;\r
+ i2c_buf[2] = 0xE4;\r
+ ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,3); \r
+ if (ret)\r
+ {\r
+ return -1;\r
+ }\r
+\r
+ for (t = 0;; t++)\r
+ {\r
+ if (t >= 100)\r
+ {\r
+ return -1;\r
+ }\r
+ ret =hyn_wr_reg(hyn_92xxdata,0xA004,2,i2c_buf,1);\r
+ if (ret)\r
+ {\r
+ continue;\r
+ }\r
+ if (i2c_buf[0] == 0x00)\r
+ {\r
break;\r
}\r
- ret = -1;\r
}\r
- if(ret){\r
- return FALSE;\r
+ ret =hyn_wr_reg(hyn_92xxdata,0xA018,2,i2c_buf,4);\r
+ if (ret)\r
+ {\r
+ return -1;\r
+ }\r
+ *value = ((uint32_t)(i2c_buf[0])) |\r
+ (((uint32_t)(i2c_buf[1])) << 8) |\r
+ (((uint32_t)(i2c_buf[2])) << 16) |\r
+ (((uint32_t)(i2c_buf[3])) << 24);\r
+\r
+ return 0;\r
+}\r
+static int cst92xx_read_chip_id(void)\r
+{\r
+ int16_t ret = 0;\r
+ uint8_t retry = 3;\r
+ uint32_t partno_chip_type,module_id;\r
+\r
+ ret = cst92xx_enter_boot();\r
+ if (ret == FALSE)\r
+ {\r
+ HYN_ERROR("enter_bootloader error");\r
+ return -1;\r
+ }\r
+ for (; retry > 0; retry--)\r
+ {\r
+ // partno\r
+ ret = read_word_from_mem(1, 0x077C, &partno_chip_type);\r
+ if (ret)\r
+ {\r
+ continue;\r
+ }\r
+ // module id\r
+ ret = read_word_from_mem(0, 0x7FC0, &module_id);\r
+ if (ret)\r
+ {\r
+ continue;\r
+ }\r
+ if ((partno_chip_type >> 16) == 0xCACA)\r
+ {\r
+ partno_chip_type &= 0xffff;\r
+ break;\r
+ }\r
+ }\r
+ cst92xx_reset();\r
+ LOS_Mdelay(30);\r
+ HYN_INFO("partno_chip_type: 0x%04x", partno_chip_type);\r
+ HYN_INFO("module_id: 0x%04x", module_id);\r
+ if ((partno_chip_type != 0x9217) && (partno_chip_type != 0x9220))\r
+ {\r
+ HYN_ERROR("partno_chip_type error 0x%04x", partno_chip_type);\r
+ //return -1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int cst92xx_updata_tpinfo(void)\r
+{\r
+ uint8_t buf[30];\r
+ struct tp_info *ic = &hyn_92xxdata->hw_info;\r
+ int ret = 0;\r
+\r
+ cst92xx_set_workmode(0xff,DISABLE);\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD101,2,buf,0);\r
+ if(ret == FALSE){\r
+ return FALSE;\r
+ }\r
+ LOS_Mdelay(5);\r
+\r
+ //firmware_project_id firmware_ic_type\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD1F4,2,buf,28);\r
+ if(ret == FALSE){\r
+ return FALSE;\r
}\r
- hyn_92xxdata->boot_is_pass = 1;\r
ic->fw_project_id = ((uint16_t)buf[17] <<8) + buf[16];\r
ic->fw_chip_type = ((uint16_t)buf[19] <<8) + buf[18];\r
\r
//firmware_version\r
ic->fw_ver = (buf[23]<<24)|(buf[22]<<16)|(buf[21]<<8)|buf[20];\r
+\r
//tx_num rx_num key_num\r
ic->fw_sensor_txnum = ((uint16_t)buf[1]<<8) + buf[0];\r
ic->fw_sensor_rxnum = buf[2];\r
\r
//fw_checksum\r
ic->ic_fw_checksum = (buf[27]<<24)|(buf[26]<<16)|(buf[25]<<8)|buf[24];\r
+\r
HYN_INFO("IC_info project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);\r
\r
cst92xx_set_workmode(NOMAL_MODE,ENABLE);\r
\r
- return TRUE;\r
+ return 0;\r
}\r
\r
static int cst92xx_updata_judge(uint8_t *p_fw, uint16_t len)\r
uint32_t f_checksum,f_fw_ver,f_ictype,f_fw_project_id;\r
uint8_t *p_data = p_fw + len - 28; //7F64\r
struct tp_info *ic = &hyn_92xxdata->hw_info;\r
+ int ret;\r
\r
- f_fw_project_id = uint8_tTO16(p_data[1],p_data[0]);\r
- f_ictype = uint8_tTO16(p_data[3],p_data[2]);\r
+ ret = cst92xx_enter_boot();\r
+ if (ret == FALSE){\r
+ HYN_INFO("cst92xx_enter_boot fail,need update");\r
+ return 1; \r
+ }\r
+ hyn_92xxdata->hw_info.ic_fw_checksum = cst92xx_read_checksum();\r
+ if(hyn_92xxdata->boot_is_pass == 0){\r
+ HYN_INFO("boot_is_pass %d,need force update",hyn_92xxdata->boot_is_pass);\r
+ return 1; //need updata\r
+ }\r
+ \r
+ f_fw_project_id = U8TO16(p_data[1],p_data[0]);\r
+ f_ictype = U8TO16(p_data[3],p_data[2]);\r
\r
- f_fw_ver = uint8_tTO16(p_data[7],p_data[6]);\r
- f_fw_ver = (f_fw_ver<<16)|uint8_tTO16(p_data[5],p_data[4]);\r
+ f_fw_ver = U8TO16(p_data[7],p_data[6]);\r
+ f_fw_ver = (f_fw_ver<<16)|U8TO16(p_data[5],p_data[4]);\r
\r
- f_checksum = uint8_tTO16(p_data[11],p_data[10]);\r
- f_checksum = (f_checksum << 16)|uint8_tTO16(p_data[9],p_data[8]);\r
+ f_checksum = U8TO16(p_data[11],p_data[10]);\r
+ f_checksum = (f_checksum << 16)|U8TO16(p_data[9],p_data[8]);\r
\r
\r
HYN_INFO("Bin_info project_id:0x%04x ictype:0x%04x fw_ver:0x%x checksum:0x%x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);\r
- if(\r
- (f_checksum != ic->ic_fw_checksum && f_fw_ver >= ic->fw_ver && f_ictype == ic->fw_chip_type)\r
- || (hyn_92xxdata->boot_is_pass==0) //empty chip\r
- ){\r
+ if(f_ictype != ic->fw_chip_type || f_fw_project_id != ic->fw_project_id){\r
+ HYN_ERROR("not update,please confirm: ic_type 0x%04x,ic_project_id 0x%04x",ic->fw_chip_type,ic->fw_project_id);\r
+ return 0; //not updata\r
+ }\r
+ if(f_checksum != ic->ic_fw_checksum && f_fw_ver > ic->fw_ver){\r
HYN_INFO("need update!");\r
return 1; //need updata\r
}\r
\r
int cst92xx_set_workmode(uint8_t mode,uint8_t enable)\r
{\r
- // printf("mode : %d\n",mode);\r
int ok = FALSE;\r
uint8_t i2c_buf[4] = {0};\r
uint8_t i = 0;\r
hyn_92xxdata->work_mode = mode;\r
-\r
- for(i=0;i<3;i++){\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD11E,2,i2c_buf,2);\r
- LOS_Udelay(200);\r
- ok |= hyn_wr_reg(hyn_92xxdata,0x0002,2,i2c_buf,2);\r
- printf("i2c_buf[1] :0x%x\n",i2c_buf[1]);\r
- if(ok==TRUE && i2c_buf[1] == 0x1E){\r
+ // if(mode != NOMAL_MODE){\r
+ // hyn_esdcheck_switch(hyn_92xxdata,DISABLE);\r
+ // }\r
+ for(i=0;i<3;i++)\r
+ {\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD11E,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ msleep(1);\r
+ continue;\r
+ }\r
+ msleep(1);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0x0002,2,i2c_buf,2);\r
+ if (ok == FALSE) {\r
+ msleep(1);\r
+ continue;\r
+ }\r
+ if(i2c_buf[1] == 0x1E){\r
break;\r
} \r
} \r
- // hyn_esdcheck_switch(hyn_92xxdata,enable);\r
+\r
switch(mode){\r
case NOMAL_MODE:\r
hyn_irq_set(hyn_92xxdata,ENABLE);\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD109,2,i2c_buf,2);\r
+ // hyn_esdcheck_switch(hyn_92xxdata,ENABLE);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD109,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ }\r
break;\r
case GESTURE_MODE:\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,2);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ }\r
break;\r
case LP_MODE:\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD107,2,i2c_buf,2);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD107,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ }\r
break;\r
case DIFF_MODE:\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD10D,2,i2c_buf,2);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD10D,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ }\r
break;\r
+\r
case RAWDATA_MODE:\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD10A,2,i2c_buf,2);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD10A,2,i2c_buf,0);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ }\r
break;\r
case FAC_TEST_MODE:\r
- hyn_wr_reg(hyn_92xxdata,0xD114,2,i2c_buf,2);\r
- msleep(50);\r
- break;\r
- case CHARGE_EXIT:\r
- case CHARGE_ENTER:\r
- hyn_92xxdata->charge_is_enable = mode&0x01;\r
- ok = hyn_wr_reg(hyn_92xxdata,(mode&0x01)? 0xD01F:0xD020,2,i2c_buf,2); //charg mode\r
- mode = hyn_92xxdata->work_mode; //not switch work mode\r
- HYN_INFO("set_charge:%d",hyn_92xxdata->charge_is_enable);\r
- break;\r
- case ENTER_BOOT_MODE:\r
- ok = cst92xx_enter_boot();\r
+ hyn_wr_reg(hyn_92xxdata,0xD114,2,i2c_buf,0);\r
break;\r
case DEEPSLEEP:\r
- hyn_wr_reg(hyn_92xxdata,0xD105,2,i2c_buf,2);\r
+ hyn_wr_reg(hyn_92xxdata,0xD105,2,i2c_buf,0);\r
break;\r
default :\r
hyn_92xxdata->work_mode = NOMAL_MODE;\r
- ok = -2;\r
break;\r
}\r
- if(ok != -2){\r
- hyn_92xxdata->work_mode = mode;\r
- }\r
- HYN_INFO("set_workmode:%d ret:%d",mode,ok);\r
- return ok;\r
+\r
+ return 0;\r
}\r
\r
+\r
+\r
+\r
static int cst92xx_supend(void)\r
{\r
HYN_ENTER();\r
return 0;\r
}\r
\r
-\r
static int cst92xx_resum(void)\r
{\r
cst92xx_reset();\r
msleep(50);\r
- cst92xx_set_workmode(NOMAL_MODE,1);\r
+ cst92xx_set_workmode(NOMAL_MODE,0);\r
return 0;\r
}\r
\r
\r
- // if (model == 0)\r
- // {\r
- // g_cst92xx_drv.touch_msg.tp_event = MC_TP_RELEASE;\r
- // point_count=0;\r
- // }else{\r
- // if (point_count==0)\r
- // {\r
- // g_cst92xx_drv.touch_msg.tp_event = MC_TP_PRESS;\r
- // }else{\r
- // g_cst92xx_drv.touch_msg.tp_event = MC_TP_MOVE;\r
- // }\r
- // point_count++;\r
- // }\r
+static int cst92xx_report(void)\r
+{\r
+ static int point_count = 0;\r
+ int ok = FALSE;\r
+ uint8_t i2c_buf[MAX_POINTS_REPORT*5+5] = {0};\r
+ uint8_t finger_num = 0;\r
+ uint8_t key_state=0,key_id = 0;\r
+\r
+ hyn_92xxdata->rp_buf.report_need = REPORT_NONE;\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,sizeof(i2c_buf));\r
+ if (ok == FALSE){\r
+ return FALSE;\r
+ } \r
\r
- // g_cst92xx_drv.touch_msg.tp_event_info.x_axis[0] = x_axis;\r
- // g_cst92xx_drv.touch_msg.tp_event_info.y_axis[0] = y_axis;\r
- // g_cst92xx_drv.touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
- \r
- // // } else {\r
- // // g_cst92xx_drv.touch_msg.tp_event = MC_TP_INVALID;\r
- // // tp_warning("TOUCH:parse wrong touchstatus %d", touch_status);\r
- // // return EXT_ERR_SUCCESS;\r
- // // }\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD000AB,3,i2c_buf,0);\r
+ if (ok == FALSE){\r
+ return FALSE;\r
+ } \r
\r
- // return EXT_ERR_SUCCESS;\r
\r
-static int cst92xx_report(void)\r
-{\r
- if(hyn_92xxdata == NULL)\r
- {\r
- return EXT_ERR_FAILURE;\r
+ if (i2c_buf[6] != 0xAB) {\r
+ HYN_INFO("fail buf[6]=0x%02x",i2c_buf[6]);\r
+ return FALSE;\r
}\r
- int ret = FALSE;\r
- uint8_t i2c_buf[MAX_FINGER*5+5] = {0};\r
- uint8_t finger_num = 0,key_state=0,retry=3,re_len=0,ges_state;\r
\r
- while(--retry){\r
- hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,2); //wakeup\r
- LOS_Udelay(200);\r
- ret = hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,7);\r
- if(ret || i2c_buf[6]!=0xAB || i2c_buf[0]==0xAB){\r
- ret = -1;\r
- continue;\r
- }\r
- finger_num = i2c_buf[5] & 0x7F;\r
- printf("finger_num : %d\n",finger_num);\r
- if(finger_num > MAX_FINGER){\r
- ret = -2;\r
- continue;\r
- }\r
- key_state = i2c_buf[5]>>7;\r
- printf("key_state : %d\n",key_state);\r
- re_len = ((finger_num>1 ? finger_num-1:0)+key_state)*5;\r
- if(re_len){\r
- ret = hyn_wr_reg(hyn_92xxdata,0xD007,2,i2c_buf+7,re_len);\r
- if(ret){\r
- ret = -2;\r
- continue;\r
- }\r
- }\r
- ret = hyn_wr_reg(hyn_92xxdata,0xD000AB,3,i2c_buf,2); //write end flag\r
- if(ret){\r
- ret = -3;\r
- continue;\r
- }\r
- else{\r
- break;\r
- }\r
- }\r
+ finger_num = i2c_buf[5] & 0x7F;\r
\r
- if(ret){\r
- HYN_ERROR("read point erro:%d\r\n",ret);\r
- hyn_wr_reg(hyn_92xxdata,0xD000AB,3,i2c_buf,2); //write end flag\r
- return ret;\r
+ if (finger_num > MAX_POINTS_REPORT) {\r
+ HYN_INFO("fail finger_num=%d",finger_num);\r
+ return TRUE;\r
}\r
+ hyn_92xxdata->rp_buf.rep_num = finger_num;\r
\r
- ges_state = i2c_buf[4]>>4;\r
- // printf("ges_state :%d\n",ges_state);\r
- if(ges_state){ //gesture\r
- if((ges_state&0x80) == 0x80){ //palm\r
- hyn_92xxdata->gesture_id = IDX_POWER;//IDX_Z;// palm \r
- }\r
- else{ //other gesture\r
- hyn_92xxdata->gesture_id = IDX_POWER;//GESTURE wakeup\r
- }\r
- HYN_INFO("gesture buf4:%#x\r\n",i2c_buf[4]);\r
- hyn_92xxdata->rp_buf.report_need |= REPORT_GES;\r
- printf("111 hyn_92xxdata->rp_buf.report_need |= REPORT_GES \n");\r
- }\r
- // printf("key_state :%d\n",key_state);\r
- if(key_state){\r
- uint8_t *data_ptr = i2c_buf;\r
- if(finger_num){\r
- data_ptr += (finger_num*5+2);\r
+ \r
+ if ((i2c_buf[5] & 0x80) == 0x80) { // button\r
+ uint8_t *data = i2c_buf + finger_num * 5;\r
+ if (finger_num > 0) {\r
+ data += 2;\r
}\r
- if( hyn_92xxdata->rp_buf.report_need==REPORT_NONE){\r
+ key_state = data[0];//0x83:�����д��� 0x80:����̧��\r
+ key_id = data[1]; // data[1]; :0x17 0x27 0x37\r
+\r
+ if(key_state&0x80){ \r
hyn_92xxdata->rp_buf.report_need |= REPORT_KEY;\r
+ if((key_id == hyn_92xxdata->rp_buf.key_id || 0 == hyn_92xxdata->rp_buf.key_state)&& key_state == 0x83){\r
+ hyn_92xxdata->rp_buf.key_id = key_id;\r
+ hyn_92xxdata->rp_buf.key_state = 1;\r
+ }\r
+ else{\r
+ hyn_92xxdata->rp_buf.key_state = 0;\r
+ }\r
}\r
- hyn_92xxdata->rp_buf.key_id = (data_ptr[1]>>4)-1; //0x17 0x27 0x37\r
- hyn_92xxdata->rp_buf.key_state = data_ptr[0]==0x83 ? 1:0; //0x83 0x80\r
- printf("hyn_92xxdata->rp_buf.key_id : %d\n",hyn_92xxdata->rp_buf.key_id);\r
- printf("hyn_92xxdata->rp_buf.key_state : %d\n",hyn_92xxdata->rp_buf.key_state);\r
}\r
-\r
- if(finger_num){\r
- uint8_t i = 0,index = 0,id = 0;\r
- uint8_t *data_ptr = i2c_buf;\r
- if( hyn_92xxdata->rp_buf.report_need==REPORT_NONE){\r
- hyn_92xxdata->rp_buf.report_need |= REPORT_POS;\r
+ else//pos\r
+ {\r
+ uint8_t index = 0,i;\r
+ if((i2c_buf[4]&0xF0) > 0){\r
+ if((i2c_buf[4]&0x80) == 0x80)\r
+ hyn_92xxdata->gesture_id = 14;//KEY_POWER;// palm\r
+ else if(i2c_buf[4]&0x70)\r
+ hyn_92xxdata->gesture_id = 14;//GESTURE wakeup\r
+ HYN_INFO("i2c_buf[4]=0x%x,gesture_id=0x%x",i2c_buf[4],hyn_92xxdata->gesture_id);\r
+ hyn_92xxdata->rp_buf.report_need |= REPORT_GES;\r
+ return TRUE;\r
}\r
- for (i = 0; i < finger_num; i++) {\r
- id = data_ptr[0] >> 4;\r
- \r
- hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;\r
- hyn_92xxdata->rp_buf.pos_info[index].event = (data_ptr[0]&0x0F) ? 1 : 0; \r
- hyn_92xxdata->rp_buf.pos_info[index].pos_x = (data_ptr[1] << 4) | (data_ptr[3] >> 4);\r
- hyn_92xxdata->rp_buf.pos_info[index].pos_y = (data_ptr[2] << 4) | (data_ptr[3] & 0x0F);\r
- hyn_92xxdata->rp_buf.pos_info[index].pres_z = (data_ptr[4] & 0x7F);\r
-\r
- data_ptr += (i==0 ? 7:5);\r
-\r
-\r
- printf("hyn_92xxdata->rp_buf.pos_info[index].event : %d index:%d\n",hyn_92xxdata->rp_buf.pos_info[index].event,index);\r
- uint8_t event = hyn_92xxdata->rp_buf.pos_info[index].event; // 事件标识(0=抬起,1=有效)\r
- uint16_t curr_x = hyn_92xxdata->rp_buf.pos_info[index].pos_x; // 当前X坐标\r
- uint16_t curr_y = hyn_92xxdata->rp_buf.pos_info[index].pos_y; // 当前Y坐标\r
-\r
- printf("curr_x:%d,curr_y:%d\n",curr_x,curr_y);\r
- if(curr_x >= 466 || curr_y >= 466)\r
- continue;\r
-\r
\r
- hyn_92xxdata->touch_msg.tp_event_info.x_axis[0] = curr_x;\r
- hyn_92xxdata->touch_msg.tp_event_info.y_axis[0] = curr_y;\r
- hyn_92xxdata->touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
-\r
- if(event == 0)\r
+ hyn_92xxdata->rp_buf.report_need |= REPORT_POS;\r
+ if (finger_num > 0) {\r
+ uint8_t *data = i2c_buf;\r
+ //uint8_t *data_ges = i2c_buf + finger_num * 5 + 2;\r
+ uint8_t id = data[0] >> 4;\r
+ uint8_t switch_ = data[0] & 0x0F;\r
+ uint16_t x = ((uint16_t)(data[1]) << 4) | (data[3] >> 4);\r
+ uint16_t y = ((uint16_t)(data[2]) << 4) | (data[3] & 0x0F);\r
+ uint16_t z = (data[3] & 0x1F) + 0x03;\r
+\r
+ // HYN_INFO("finger=%d id=%d x=%d y=%d z=%d switch_=%d",finger_num,id,x,y,z,switch_);\r
+\r
+ if (switch_ == 0)\r
{\r
- point_count = 0;\r
hyn_92xxdata->touch_msg.tp_event = MC_TP_RELEASE;\r
- }\r
- else\r
- {\r
- if(point_count == 0)\r
+ point_count=0;\r
+ }else{\r
+ if (point_count==0)\r
+ {\r
hyn_92xxdata->touch_msg.tp_event = MC_TP_PRESS;\r
- else \r
+ }else{\r
hyn_92xxdata->touch_msg.tp_event = MC_TP_MOVE;\r
-\r
+ }\r
point_count++;\r
}\r
+ \r
+ HYN_INFO("finger=%d id=%d x=%d y=%d z=%d switch_=%d point_count:%d",finger_num,id,y,x,z,switch_,point_count);\r
+\r
+ hyn_92xxdata->touch_msg.tp_event_info.x_axis[0] = y;\r
+ hyn_92xxdata->touch_msg.tp_event_info.y_axis[0] = x;\r
+ hyn_92xxdata->touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
\r
- printf("hyn_92xxdata->touch_msg.tp_event %d\n",hyn_92xxdata->touch_msg.tp_event);\r
+ if (id < MAX_POINTS_REPORT) {\r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;\r
+ hyn_92xxdata->rp_buf.pos_info[index].event = (switch_ == 0x06 || switch_ == 0x07) ? 1 : 0; \r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_x = x;\r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_y = y;\r
+ hyn_92xxdata->rp_buf.pos_info[index].pres_z = z;\r
+ index++;\r
+ }\r
+ \r
\r
- index++;\r
}\r
- hyn_92xxdata->rp_buf.rep_num = index;\r
\r
- \r
- \r
+ for (i = 1; i < finger_num; i++) {\r
+ uint8_t *data = i2c_buf+5*i+2;\r
+ uint8_t id = data[0] >> 4;\r
+ uint8_t switch_ = data[0] & 0x0F;\r
+ uint16_t x = ((uint16_t)(data[1]) << 4) | (data[3] >> 4);\r
+ uint16_t y = ((uint16_t)(data[2]) << 4) | (data[3] & 0x0F);\r
+ uint16_t z = (data[4] & 0x7F);\r
+\r
+ if (id < MAX_POINTS_REPORT) {\r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;\r
+ hyn_92xxdata->rp_buf.pos_info[index].event = (switch_ == 0x06) ? 1 : 0; \r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_x = x;\r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_y = y;\r
+ hyn_92xxdata->rp_buf.pos_info[index].pres_z = z;\r
+ index++;\r
+ }\r
+ }\r
}\r
\r
-\r
return 0;\r
}\r
-\r
-\r
static uint32_t cst92xx_check_esd(void)\r
{\r
- int ok = FALSE;\r
+ int ret = 0;\r
+ uint8_t retry=3;\r
+ uint8_t buf[6];\r
+ HYN_ENTER();\r
+ while (retry--)\r
+ {\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD040,2,buf,0);\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD040,2,buf,6);\r
+ if(ret ==0 && hyn_sum16(0xA5,buf,4)==U8TO16(buf[4],buf[5])){\r
+ ret = U8TO32(buf[0],buf[1],buf[2],buf[3]);\r
+ break;\r
+ }\r
+ }\r
+ \r
+\r
+ return ret;\r
+}\r
+#if 0\r
+static u32 cst92xx_check_esd(void)\r
+{\r
+\r
+ int16_t ok = FALSE;\r
uint8_t i2c_buf[6], retry;\r
+ uint8_t flag = 0;\r
+ uint16_t checksum = 0;\r
uint32_t esd_value = 0;\r
+\r
+ if ((hyn_92xxdata->work_mode != NOMAL_MODE)&&(hyn_92xxdata->work_mode != GESTURE_MODE))\r
+ {\r
+ HYN_ERROR("esd_check work_mode error return");\r
+ return 0;\r
+ }\r
retry = 4;\r
- while (retry--){\r
- hyn_wr_reg(hyn_92xxdata,0xD048,2,i2c_buf,2);\r
- LOS_Udelay(200);\r
- ok = hyn_wr_reg(hyn_92xxdata,0xD048,2,i2c_buf,1);\r
- if (ok == 0 &&((i2c_buf[0]&0xF0) == 0x20 || (i2c_buf[0]&0xF0) == 0xA0)&&(i2c_buf[0]&0x0F)<10){\r
- break;\r
- }\r
- else{\r
- ok = -2;\r
+ flag = 0;\r
+ while (retry--)\r
+ {\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD040,2,i2c_buf,6);\r
+ if (ok == FALSE){\r
+ msleep(1);\r
+ continue;\r
+ } \r
+ else\r
+ {\r
+ checksum = i2c_buf[0] + i2c_buf[1] + i2c_buf[2] + i2c_buf[3] + 0xA5;\r
+ esd_value = (i2c_buf[0] << 24) + (i2c_buf[1] << 16) + (i2c_buf[2] << 8) + i2c_buf[3];\r
+ flag = 1;\r
+ if (((i2c_buf[4] << 8) + i2c_buf[5]) == checksum)\r
+ {\r
+ flag = 2;\r
+ if (((esd_value - hyn_92xxdata->esd_last_value) < 1) && (esd_value > 20))\r
+ {\r
+ flag = 3;\r
+ }\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ HYN_INFO("ESD data checksum err:0x%x,0x%x", esd_value, checksum);\r
+ continue;\r
+ }\r
}\r
}\r
- if(-2==ok){ //esdcheck failed rest system\r
- hyn_92xxdata->esd_fail_cnt = 3;\r
- esd_value = hyn_92xxdata->esd_last_value;\r
- }\r
- else{\r
- esd_value = hyn_92xxdata->esd_last_value+1;\r
+ HYN_INFO("ESD data:%d,0x%04x,0x%04x", flag, esd_value, hyn_92xxdata->esd_last_value);\r
+\r
+ if ((flag == 0) || (flag == 3) || (flag == 1))\r
+ {\r
+ cst92xx_rst();\r
+ msleep(40);\r
+ esd_value = 0;\r
+ hyn_92xxdata->esd_last_value = 0;\r
+ HYN_INFO("esd_check power reset ic");\r
+ if (hyn_92xxdata->work_mode == GESTURE_MODE)\r
+ {\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,0);\r
+ if (ok == FALSE){\r
+ HYN_ERROR("enter_sleep failed");\r
+ } \r
+ }\r
}\r
+ \r
+ hyn_92xxdata->esd_last_value = esd_value;\r
+ \r
return esd_value;\r
}\r
-\r
+#endif\r
\r
static int cst92xx_prox_handle(uint8_t cmd)\r
{\r
\r
static int cst92xx_get_test_result(uint8_t *buf, uint16_t len)\r
{\r
- int ret = 0;\r
+ int ret = 0,timeout;\r
struct tp_info *ic = &hyn_92xxdata->hw_info;\r
uint16_t scap_len = (ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*2;\r
uint16_t mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum*2,i = 0;\r
return FAC_GET_DATA_FAIL;\r
}\r
HYN_INFO("---open_higdrv---");\r
- hyn_wr_reg(hyn_92xxdata,0xD110,2,buf,2); ////test open high\r
- hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ timeout = 500;\r
+ hyn_wr_reg(hyn_92xxdata,0xD110,2,buf,0); ////test open high\r
+ while(--timeout){ //wait rise edge\r
+ if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;\r
+ LOS_Mdelay(10);\r
+ }\r
if(hyn_wr_reg(hyn_92xxdata,0x3000,2,buf,mt_len)){ //open high\r
ret = FAC_GET_DATA_FAIL;\r
HYN_ERROR("read open high failed");\r
goto selftest_end;\r
}\r
- hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,2); \r
+ hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,0); \r
\r
HYN_INFO("---open_low---");\r
- hyn_wr_reg(hyn_92xxdata,0xD111,2,buf,2); ////test open low\r
- hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ timeout = 500;\r
+ hyn_wr_reg(hyn_92xxdata,0xD111,2,buf,0); ////test open low\r
+ while(--timeout){ //wait rise edge\r
+ if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;\r
+ LOS_Mdelay(10);\r
+ }\r
if(hyn_wr_reg(hyn_92xxdata,0x1000,2,buf + mt_len,mt_len)){ //open low\r
ret = FAC_GET_DATA_FAIL;\r
HYN_ERROR("read open low failed");\r
goto selftest_end;\r
}\r
- hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,2); \r
+ hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,0); \r
\r
//short test\r
HYN_INFO("---short---");\r
- hyn_wr_reg(hyn_92xxdata,0xD112,2,buf,2); //// short test\r
- hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ timeout = 500;\r
+ hyn_wr_reg(hyn_92xxdata,0xD112,2,buf,0); //// short test\r
+ while(--timeout){ //wait rise edge\r
+ if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;\r
+ LOS_Mdelay(10);\r
+ }\r
if(hyn_wr_reg(hyn_92xxdata,0x5000,2,buf+(mt_len*2),scap_len)){\r
ret = FAC_GET_DATA_FAIL;\r
HYN_ERROR("read fac short failed");\r
if(0 == fac_test_log_save(FACTEST_LOG_PATH,hyn_92xxdata,(int16_t*)buf,ret,FACTEST_ITEM)){\r
HYN_INFO("fac_test log save success");\r
} \r
- cst92xx_resum();\r
-\r
+ cst92xx_reset();\r
+ LOS_Mdelay(40);\r
return ret;\r
}\r
\r