標籤:
第八章
這章將介紹蜂鳴器的實現原犁,並實現一個完整的蜂嗚器驅動(可以開啟和關閉蜂鳴 器).Linux驅動的代碼重用,可以採用標準的C程式的方法將要重用的代碼放在其他的檔案中。如果要使用某些功能,include相應的標頭檔即可,也可以是另外一種動態重用的方式,也是一個Linux驅動可以使用另外一個Linux驅動中的資源。蜂鳴器是 S3C6410 開發板上帶的一個硬體裝置。可以通過向寄存器寫入特定的值來控制蜂鳴器 發出尖叫聲。 PWm時驅動的實現方式不同於LED 驅動,PWM 驅動將由多個檔案組成。這也是大多數Linux 驅動的標準實現方式。在編譯 Linux 驅動時將這些檔案進行聯合編譯。本節將介紹把 Linux 驅動分成多個檔案的方式。這些檔案中的資料結構、函數的代碼也可以被多個不同的驅動使用, 所 以這也是代碼重用的重要方法。 PWM 驅動與 LED 驅動的實現流程類似,可能還要簡單一些。在本章只是為了示範如何將一個 Linux 驅動分成多個實現檔案,才使用了比較簡單的 PWM 驅動。通過本章的學習,可以掌握 Linux 驅動常用的代碼重用方式。
第九章
HAL是建立在Linux驅動之上的一套程式庫,這套程式庫並不屬於Linux核心,而是屬於Linux核心層之上的應用程式層。Google為Android加入HAL主要有如下的目的:統一硬體的調用介面、解決了GPL著作權問題。加入HAL的驅動使應用程式不需要再關心Linux驅動和裝置檔案的互動方式,而只需要像訪問普通API一樣就可以和Linux驅動進行互動。
實現LED驅動在裝置檔案的read和write函數中讀寫指定的寄存器。基本原理是只從指定寄存器讀取或寫入5個位元組,第1個位元組用於指定讀寫的動作以及寄存器類型。後4個位元組是讀寫的實際的資料。在與LED驅動互動時,只要向裝置檔案讀取或發送5個位元組的資料,就可以讀寫指定的寄存器。由於LED驅動程式的裝置檔案接收的不是字串,而是位元組類型的資料,因此需要單獨做一個程式向裝置檔案寫入位元組形式的資料,或從裝置檔案中讀取位元組類型的資料。
HAL模組可以被Android系統自動調用,自然也擁有類似main或init函數的介面,只不過這個介面不是函數,而是一個固定名稱的結構體變數HAL_MODULE_INFO_SYM.也就是說,所有的HAL程式都必須要有一個HAL_MODULE_INFO_SYM變數。編寫HAL模組的步驟和原理:定義結構體和宏,編寫HAL模組的open函數,定義hw_module_methods_t結構體變數,定義HAL_MODULE_INFO_SYM變數,編寫HAL模組的 close函數,編寫控制LED的函數
在Android系統中使用Linux驅動有兩種方式,一種就是通過傳統的方式直接與Linux驅動互動,如直接讀寫裝置檔案的資料。另外一種是Android特有的,就是通過HAL模組。HAL模組本質上就是通過Linux共用庫與Linux驅動互動,然後應用程式再訪問Linux共用庫。
第十章
對於複雜的Linux驅動及HAL等程式庫,需要使用各種方法對其進行調試,例如,設定斷點、逐步跟蹤代碼、輸出調試資訊等。Printk函數運行在核心空間,printf函數運行在使用者空間。
初始化Linux驅動
Static int _init printk_demo_init(void)
卸載Linux驅動
Static void _exit printk_demo_exit(void)
使用printk函數可以很方便地將訊息寫入記錄檔或控制台,但大量使用printk函數動作記錄檔案或控制台裝置檔案會嚴重影響Linux驅動的效能,因此,這就要求Linux驅動只在開發階段使用printk函數輸出訊息。Printk函數在控制台顯示訊息是通過/dev/console裝置檔案實現的,該裝置檔案只在字元介面的控制台下才起作用,所以printk函數只有用在字元介面的控制台上才能正常輸出訊息。
在Linux檔案系統中,/proc經常被用來作為核心空間與使用者空間進行資料互動的工具。/proc是虛擬檔案系統,所以讀寫/proc檔案系統的速度要遠比讀寫/dev檔案系統的速度快。因此,/proc檔案系統也可作為Linux驅動與使用者空間程式互動的工具。在Linux驅動程式中可以使用核心功能在/proc目錄中建立和刪除虛擬檔案,也可以建立和刪除虛擬目錄。/proc檔案系統和/dev檔案系統一樣,也需要設定訪問檔案的動作處理函數,/dev檔案系統通過file_operations.read和file_operations.write函數指標變數讀寫裝置檔案的讀寫動作處理函數。Proc_dir_entry結構體代表一個虛擬目錄或檔案。
Android模擬器只能通過連接埠映射方式使用gdbserver偵錯工具,但開發板除了可以通過IP串連到gdbserver外,還可以通過串口進行串連。
Android深度探索(三)