【驅動】TP電容屏驅動—0.電容觸摸屏TP調試筆記及問題匯總


 

問題1:函數的參數在傳輸過程中會出問題嗎?為什么總是出現Segmentation fault?
答:段錯誤,一般是出現野指針或對空指針的調用而出現的?。
所謂的段錯誤就是指訪問的內存超過了系統所給這個程序的內存空間,通常這個值是由gdtr來保存的,他是一個48位的寄存器,其中的32位是保存由它指向的gdt表,
后13位保存相應於gdt的下標,最后3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向的gdt是由以64位為一個單位的表,在這張表中就保存着程序運
行的代碼段以及數據段的起始地址以及相應的斷限和頁面交換還有程序運行級別和內存粒度等信息,一旦一個程序發生了越界訪問,CPU就會產生相應的異常保護,
於是segmentation fault就出現了。
即“當程序試圖訪問不被允許訪問的內存區域(比如,嘗試寫一塊屬於操作系統的內存),或以錯誤的類型訪問內存區域(比如,嘗試寫一塊只讀內存)。這個描述
是准確的。為了加深理解,我們再更加詳細的概括一下SIGSEGV。段錯誤應該就是訪問了不可訪問的內存,這個內存要么是不存在的,要么是受系統保護的。
Ø SIGSEGV是在訪問內存時發生的錯誤,它屬於內存管理的范疇
Ø SIGSEGV是一個用戶態的概念,是操作系統在用戶態程序錯誤訪問內存時所做出的處理。
Ø 當用戶態程序訪問(訪問表示讀、寫或執行)不允許訪問的內存時,產生SIGSEGV。
Ø 當用戶態程序以錯誤的方式訪問允許訪問的內存時,產生SIGSEGV。
用戶態程序地址空間,特指程序可以訪問的地址空間范圍。如果廣義的說,一個進程的地址空間應該包括內核空間部分,只是它不能訪問而已。
————————————————
版權聲明:本文為CSDN博主「喜歡戀着風」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010150046/article/details/77775114

問題2:明明在i2c.c中已經定義了mt7620_i2c_xfer()函數,且EXPORT_SYMBOL(mt7620_i2c_xfer)修飾,但是在執行ili2117.ko模塊時仍發生錯誤:
ili2117: Unknown symbol mt7620_i2c_xfer (err 0)
insmod: cannot insert 'ili2117.ko': Success
答:原因找到了,加載ili2117.ko模塊之前卸載了板子的所有驅動(包括i2c所在的ramips_mt7620模塊),因此必然出現“Unknown symbol mt7620_i2c_xfer”
錯誤。

問題3:目前的內核是否使用了Linux內核自帶的I2C/input子系統、設備樹?如何和奕力TP原廠的ILI2117_TP驅動對接起來?
答:都沒有,不過目前公司的系統里面,自定義了i2c驅動,且直接編譯進內核了,不過這個i2c功能比較簡單,只有i2c_read/i2c_write(),沒有比較豐富的
i2c操作函數(尤其i2c子系統常用的內核i2c-core.c中的一些函數,例如:i2c_transfer())。ILI2117_TP驅動的最底層是內核i2c_transfer()函數,而我們的
i2c驅動最底層是i2c_read/i2c_write(),通過查驗i2c_transfer()函數可知其到底是調用某CPU的master_i2c_xfer()函數。因此,在i2c.c文件中定義
mt7620_i2c_xfer()函數並實現其內部讀寫函數:
if (msgs[i].flags & I2C_M_RD) /* 2.讀數據 */
{
ret = do_master_read(&msgs[i]);
}
else /* 3.寫數據 */
{
ret = do_master_write(&msgs[i]);
}
的定義與實現。
備注:關於內核的I2C/input子系統、設備樹可以通過make menuconfig配置選項進系統。

問題4:為什么mt7620_i2c_xfer()函數名字改成i2c_transfer()時,且內部實現一致時,編譯時總是發生一些未知/莫名的錯誤?
答:不要定義和內核函數同名的函數,否則由於頭文件包含的原因,極易因調用混亂而產生錯誤。

問題5:ILI2117_TP持續修改測試方法
答:前言:由於TP和keys_leds的GPIO沖突,執行fv_drv.sh腳本,卸載所有驅動,然后重新加載fvdd/ramips_mt7620,在公司的i2c平台上實現i2c操作,
然后再加載ili2117.ko驅動並調試。

①每次修改前,先把之前的代碼復制一份(名字不用改動),然后再修改;
②用D:\shared_dir\driver_ts_20191230\fip11c\build目錄下的keys_leds.ko復制到D:\shared_dir\driver_tp_20200116\fip15\build目錄下;
③保持fv_drv.sh不變,不要刪除該文件(xx_OK.sh是目前可以滿足要求的腳本);
④下載fv_drv.sh到/tmp目錄,chmod 777 fv_drv.sh;
⑤加載模塊並測試:

cat /proc/kmsg &    //若在telnet,打開后台打印;

voip.sh stop
rmmod alc5621d
rmmod ramips_mt7620
rmmod fvdd
rmmod keys_leds
rmmod nand_lcd_notdma_fip11c
cd /tmp
tftp -g -l ili2117.ko 192.168.1.88
或者
cd /tmp
tftp -g -l fv_drv.sh 192.168.1.88
chmod 777 fv_drv.sh
tftp -g -l ili2117.ko 192.168.1.88

#insmod ili2117.ko

 

 

問題6:加載ili2117.ko之后,執行期間發生錯誤:
<4>*** ilitek_get_customer_firmware_version ***
<1>CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == 80013240, ra == 80013018
原因何在?
答:互斥鎖的原因,暫時關閉即可。
//mutex_lock(&ilitek_data->ilitek_mutex);
ret = ilitek_i2c_write_and_read(data, 1, 5, data, 4);
p_customer_fw_ver = kzalloc(sizeof(u8) * 11, GFP_KERNEL);
//mutex_unlock(&ilitek_data->ilitek_mutex);

 

問題7:TP可視區左右的虛擬鍵區,如何讀取坐標?

答:①使用單獨線控制TP虛擬鍵,即除TP六線外,單獨有一根線(我們的TP沒有)控制虛擬鍵區,如此即可使用《I2C_ProgramingGuide(ILI211XA,MSG58XX)_V1.03.pdf》頁末中關於I2C傳輸的43字節的byte[41],作為虛擬鍵坐標信息進行上報;

②只有TP標准六線(如下圖2),如此,虛擬鍵區將作為普通觸摸區,其坐標納入TP坐標系(坐標由byte[1~39]保留並上報),TP上報的坐標將以左虛擬鍵區左上角(像素?)為原點,右虛擬鍵區右下角最后一個(像素?)為末點。

圖1:

 

 圖2:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM