Touch 驅動部分理解

2021-07-25 02:22:25 字數 1813 閱讀 3777

在touch----初識的基礎上,今天主要是理解touch的驅動。

1.丟log

在kernel/drivers/input/touchscreen/synaptics_dsx下的檔案中的一些函式中加入一句printk("cassie------%s\n",__func__);重新編譯bootimage,然後燒入到手機。重新開機,使用uart串列埠除錯工具以及cutecom軟體抓取log,並且將log儲存到乙個檔案之中。

2.分析log

下面是其中的一部分log的截圖。

由上圖可以知道,和預期中的一樣,開機過程中,首先跑的就是synaptics_dsx_core.c檔案中的synaptics_rmi4_init函式。

在init函式中,會呼叫函式synaptics_rmi4_bus_init()。這個函式的原型在synaptics_dsx_i2c.c中。這個函式很簡單,可以根據函式名大致猜測出就是註冊i2c的驅動。實際上,也可以看成是乙個全新的驅動,驅動的型別的i2c。之後依舊跑的是通檔案中的synaptics_rmi4_i2c_probe函式。

這個probe函式相對來說比較複雜。這個函式做的事情比較多。包括分配一些記憶體,分析裝置樹(parse_dt),並且在最後

呼叫platform_device_register函式註冊乙個裝置。

之後,會回到synaptics_dsx_core.c檔案中檔案中繼續跑synaptics_rmi4_probe函式,這個函式的主要是給rmi4_data進行一些初始化以及對應上其功能函式。然後有呼叫synaptics_rmi4_get_reg,synaptics_rmi4_enable_reg獲取regulators並且使能。然後是設定gpio,得到中斷號,中斷使能等等。

3.suspend函式為什麼注釋掉了?

suspend的意思是掛起。掛起一般是為了省電。在學習的原始碼也就是synaptics_dsx_core.c中,發現沒有呼叫suspend函式,並且將原來的函式注釋掉了。後來發現,是改寫了suspend,並且使用了export_symbol(fun_name)的形式將函式放出去被別的檔案呼叫了。也就是說,並不是沒有suspend,而是可能因為一些時序的原因放在別的驅動中去掛起了。

4.為什麼會有很多的report?

synaptics_rmi4_report_touch函式中,根據fhandler->fn_number選擇呼叫不同的report函式。synaptics_rmi4_f11_abs_report;synaptics_rmi4_f12_abs_report;synaptics_rmi4_f1a_report三種情況。

首先,看看fhandler->fn_number是怎麼得到的:synaptics_rmi4_report_touch函式是在synaptics_rmi4_sensor_report中被呼叫的,在synaptics_rmi4_sensor_report中,有定義乙個變數(struct synaptics_rmi4_fn *fhandler;),然後用了下面的**進行賦值。至於這個**的具體含義,老實說,我看不懂~~

if (!list_empty(&rmi->support_fn_list)) }}}

在測試過程中,發現呼叫的是synaptics_rmi4_f12_abs_report,但是,並沒有呼叫檢測手勢的情況。這個具體的原因以後再來補充。

5.對應於不同的手勢(c,z等形狀)是怎麼處理的?

首先,不同的手勢,是根據讀取暫存器的值得到的兩個值

gesture_type ,

總結:自己學習的效率實在是低下。需要整頓。

Touch 驅動部分理解

在touch 初識的基礎上,今天主要是理解touch的驅動。1.丟log 在kernel drivers input touchscreen synaptics dsx下的檔案中的一些函式中加入一句printk cassie s n func 重新編譯bootimage,然後燒入到手機。重新開機,使...

結構struct的部分理解

結構與類的作用基本相同,最大的區別為結構是值型別,類為引用型別。關於值型別和引用型別可以檢視這兩篇 link.結構的其他特點 結構中的字段不能賦初始值。例如stuct a 宣告結構體物件,可以不使用new關鍵字,但是這個時候,結構體物件的字段沒有初始值,通過new關鍵字建立結構體物件,這個物件的字段...

Bootstrap3部分理解

行 row 必須包含在 container 固定寬度 或 container fluid 100 寬度 中,以便為其賦予合適的排列 aligment 和內補 padding 通過 行 row 在水平方向建立一組 列 column 你的內容應當放置於 列 column 內,並且,只有 列 column...