當前位置:
首頁 > 知識 > 查看Linux內核源碼技巧的記錄

查看Linux內核源碼技巧的記錄

一、關於Linux內核啟動流程

參見文章《Linux內核啟動流程筆記》。

二、關於數據結構

1. 雙向循環鏈表

參見總結《Linux中List.h文件分析和應用》。

2. 哈希表

三、關於驅動程序的分析

基於4412-linux3.5平台,以I2C介面的觸摸屏驅動為例子。

1. 找驅動程序源文件

觸摸屏肯定屬於輸入子系統,所以在driversinput ouchscreen目錄下肯定能找到其驅動程序; 然後把觸摸屏電源和地短接一下,串口終端就會列印什麼ft5x06 err,所以斷定driversinput ouchscreen目錄下下的ft5x06_ts.c文件為當前使用觸摸屏的驅動程序。

2. 在Linux內核中找到對於配置項

在上面找到文件名的情況下, 終端中輸入命令grep "ft5x06_ts" -R * 找到如下一行:

drivers/input/touchscreen/Makefile:obj-$(CONFIG_TOUCHSCREEN_FT5X0X) += ft5x06_ts.o

由此可見,當變數CONFIG_TOUCHSCREEN_FT5X0X為y或m時,ft5x06_ts文件會被編譯。

在內核源碼目錄中執行make menuconfig,按」/「表示搜索。輸入CONFIG_TOUCHSCREEN_FT5X0X,出現如下信息:

| Symbol: TOUCHSCREEN_FT5X0X_SINGLE [=n]

| Type : boolean

| Prompt: Disable MULTI-Touch Mode

| Defined at drivers/input/touchscreen/Kconfig:324

| Depends on: !S390 && !UML && INPUT [=y] && INPUT_TOUCHSCREEN [=y] && TOUCHSCREEN_FT5X0X [=y]

| Location:

| -> Device Drivers

| -> Input device support

| -> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])

| -> Touchscreens (INPUT_TOUCHSCREEN [=y])

| -> FocalTech ft5x0x TouchScreen driver (TOUCHSCREEN_FT5X0X [=y])

從上述信息中可知,只要FocalTech ft5x0x TouchScreen driver選項被配置,相應Makefile中CONFIG_TOUCHSCREEN_FT5X0X變數的值就為y,ft5x06_ts.就會被編譯近內核。上述信息中Defined at drivers/input/touchscreen/Kconfig:324 表示在Kconfig文件中定義的位置,一般在Kconfig中都是CONFIG TOUCHSCREEN_FT5X0X的字樣。

注意,有時分析是上述流程的逆過程,也就是用配置選項CONFIG_TOUCHSCREEN_FT5X0X找到驅動源文件ft5x06_ts.c。

3. 驅動結構的分析

分析子系統源碼,一般從入口函數開始分析。在ft5x06_ts.c源碼文件中,由module_init(ft5x0x_ts_init);可知入口函數為ft5x0x_ts_init,在ft5x0x_ts_init函數中調用i2c_add_driver函數註冊i2c_driver,對應的i2c_driver結構體為ft5x0x_ts_driver,在ft5x0x_ts_driver結構體id_table成員中name為ft5x0x_ts。

通過上面的分析,再結合bus-dev-drv模型,在bus匯流排的dev鏈表中必將找到對應的一個i2c_client結構(i2c_board_info的type成員值為ft5x0x_ts),所以在終端中輸入命令:

grep "ft5x0x_ts" -R * 後,找到如下信息:

arch/arm/mach-exynos/mach-tiny4412.c: I2C_BOARD_INFO("ft5x0x_ts", (0x70 >> 1)),

從上述信息中可以知道在mach-tiny4412.c文件中肯定能找到dev(如果是I2c設備,就是i2c_client)的註冊過程。通過內核文檔可知,i2c_client的註冊過程有4中方法,查看mach-tiny4412.c源碼文件發現使用了第一中方法。

這種方法是線調用i2c_register_board_info函數把i2c_board_info結構體放入__i2c_board_list鏈表,後面在某個地方會調用i2c_register_adapter函數,此函數中會調用i2c_scan_static_board_info函數,此函數就會使用到__i2c_board_list鏈表,具體做法就是調用i2c_new_device函數把鏈表中的每個成員構造成一個i2c_client。

由此可見,這種方法必須在 i2c_register_adapter 之前 i2c_register_board_info,所以不適合動態載入insmod。如果要想動態載入,可以使用直接創建設備的方法,即直接i2c_new_device方法。不管哪種方法,最終都會調用i2c_driver結構體的成員函數probe,在裡面進行設備驅動的設計,由於是觸摸屏,將使用輸入子系統。

查看Linux內核源碼技巧的記錄

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

PHP 使用 phpmailer 發送電子郵件

TAG:程序員小新人學習 |