1、硬件原理
TP 相關(guān)的引腳有 SCL、SDA、VREG_L10、INT、RST,SCL、SDA用于I2C通訊,VREG_L10用于芯片供電,INT用于產(chǎn)生外部中斷,RST是復(fù)位引腳。
2、涉及到的知識點
I2C子系統(tǒng):(https://www.cnblogs.com/deng-tao/p/6130080.html)
INPUT輸入子系統(tǒng):(https://www.cnblogs.com/deng-tao/p/6094049.html)
工作隊列:(http://bgutech.blog.163.com/blog/static/18261124320116181119889/)
中斷:(http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21977330&id=3755609)
在linux里,中斷處理分為頂半(top half),底半(bottom half),在頂半里處理優(yōu)先級比較高的事情,要求占用中斷時間盡量的短,在處理完成后,就激活底半,有底半處理其余任務(wù)。底半的處理方式主要有soft_irq, tasklet, workqueue三種,他們在使用方式和適用情況上各有不同。soft_irq用在對底半執(zhí)行時間要求比較緊急或者非常重要的場合,主要為一些subsystem用,一般driver基本上用不上。 tasklet和work queue在普通的driver里用的相對較多,主要區(qū)別是tasklet是在中斷上下文執(zhí)行,而work queue是在process上下文,因此可以執(zhí)行可能sleep的操作。
3、功能的調(diào)試
a、工模信息的導(dǎo)入
為了方便查看 手機(jī)內(nèi)部信息,項目一般會定制工模,TP正常工作后一般下一步是導(dǎo)入工模,A306的工模通過撥號可以查看,步驟如下。
在makefile下包含wind_device_info下的文件
要在common.c中包含相應(yīng)的頭文件,及定義一個wind_device_info 結(jié)構(gòu)體。
在來prob函數(shù)的末尾處把TP名稱和版本信息放到wind_device_info結(jié)構(gòu)體中,將就會顯示到工模中。
b、手勢功能的調(diào)試
手勢的作用是為了在熄屏狀態(tài)下快速喚醒手機(jī)或應(yīng)用,流程是當(dāng)處于熄屏狀態(tài)下,在屏幕上畫相應(yīng)的手勢后,觸摸ic處理相應(yīng)的數(shù)據(jù)后產(chǎn)生中斷,驅(qū)動程序根據(jù)數(shù)據(jù)上報相應(yīng)的鍵值,然后上層根據(jù)鍵值就會打開相應(yīng)的手勢功能。
-
中斷中如何獲取TP捕捉到的手勢信息
鍵值的上報: hx83102_ts_register_interrupt(ts->client); himax_int_register_trigger(client); request_threaded_irq(client->irq, NULL, himax_ts_thread,...); himax_ts_thread(int irq, void *ptr) himax_ts_isr_func((struct hx_83102_ts_data *)ptr); hx83102_ts_work(ts); //主要的工作在這個環(huán)節(jié) himax_wake_check_func(); ret_event = himax_parse_wake_event(hx83102_ts); //解析手勢鍵值 input_report_key(hx83102_ts->input_dev, KEY_EVENT, 1);//上報鍵值,上層解析到鍵值會做相應(yīng)動作。 input_sync(hx83102_ts->input_dev);//事件結(jié)束
c、TP固件升級
-
固件升級是為了當(dāng)TP中的IC固件升級后,可以在開機(jī)后自動加載目錄中更新版的固件進(jìn)行升級。
1、讀取 TP IC 中的固件版本號。
2、讀取代碼(*.i文件)中TP固件版本號。
3、將上述兩個版本號比較,判斷是否進(jìn)行TP固件升級
4、如何進(jìn)行固件升級://申請更新,創(chuàng)建工作隊列, 可以把工作推后,交由一個內(nèi)核線程去執(zhí)行,因為固 件升級比較耗時。 ts->himax_update_wq = create_singlethread_workqueue("HMX_update_reuqest"); //準(zhǔn)備更新TP的固件 INIT_DELAYED_WORK(&ts->work_update, himax_update_register); himax_update_register(); i_update_FW(); fts_ctpm_fw_upgrade_with_sys_fs_32k(private_ts->client,\ ImageBuffer,fullFileLength,false); i2c_himax_write(client, HX_CMD_TSSLPOUT,&cmd[0], 0, DEFAULT_RETRY_CNT)