標籤:
通過蜂鳴器的實現原理,實現一個完整的蜂嗚器驅動,可以開啟和關閉蜂鳴器. PWM驅動的實現方式不同於LED驅動, PWM 驅動將由多個檔案組成。這也是大多數 Linux 驅動的標準實現方式.
剛開始是LED驅動的代碼重用,Linux 驅動的代碼重用有很多種方法。可以採用標準 C程式的方式。將要重用的代碼放在其他 的檔案 (在標頭檔中聲明〉中。 如果要使用某些功能, include 相應的標頭檔即可〈這種方式稱為 靜態重用〉。也可以使用另外一種動態重用的方式,也就是一個 Linux 驅動可以使用另外←個 Linux 驅動中的資源(函數、變數、宏等)。接下來講強行卸載Linux驅動的內容,本節的方法只能卸載自於異常情況而導致的 Linux 驅動模組無法卸載 的情況。
情況 1:白 初始化函數崩潰
情況 2: 卸載函數被阻塞
蜂鳴器驅動蜂鳴器驅動的原理蜂鳴器也稱為 PWM (脈衝寬度調製〉,基本原理是通過脈衝來控制蜂鳴器的開啟和停止。實現蜂鳴器驅動測試蜂鳴器驅動
PWM 驅動與LED驅動的原理相似,只要會了一種實驗,另一種也會明白。但是其中的代碼需要認真編寫,理解啟動並執行相關步驟
通過有I/O命令可以開啟和停止PWM,PWM 驅動由3 個檔案組成: pwm.c, pwm_fun.h 、pwm_fun.c。
pwm.c 是驅動主程式。
pwm_fun.h 引用了相應的標頭檔,以及定義了一些宏。
pwm_fun.c 檔案則包含了開啟和停止PWM的兩個函數( pwm_start 和pwm_stop )。
運行之後從Makefile 檔案的內容可以看出,
1,首先將pwm.c 和pwm_fun.c 檔案編譯成pwm.o和pwm_fun.o,
2,然後再將這兩個*.o檔案連結成pwm_driver.o,
3,最後產生pwm_driver.ko 。
接下來測試蜂鳴器驅動,首先進入/root/drivers/ioctl 目錄, 執行build礎指令檔編譯和上傳ioctl 檔案〈如果啟動多個Android 裝置,要選擇上傳到S3C6410 開發板。在測試PWM 驅動之前,先要按照上一節的方法編譯和安裝PWM 驅動,然後進入開發板終端的Idata/local 目錄, 輸入開啟和關閉PWM的明令 。由於ioctl 命令必須要求輸入I/O命令的參數,但PWM 驅動未使用I/O 命令參數。所以ioctl 最後一個命令列參數可以任意輸入。執行上面的命令後,如果輸出(# . / ioctl /dev/pwm_dev 1 0)的資訊,並且PWM. 可以正常發出尖叫聲,說明PWM 驅動測試成功。
PWM
Linux代碼的重用:
在標頭檔中載入即可使用到原來所有的功能,還有動態方式就是一個驅動使用另一個驅動的資源。
對於像蜂鳴器這樣的實驗,它的內部檔案有很多,所有要有很多的原始碼以用於妥善管理。
有多個檔案的話,module-y指定所有的檔案,然後將會產生一個build.sh指令碼,使用sh執行,使用dmesg查看日誌資訊。
代碼重用分為靜態和動態。靜態重用是產生.ko核心,動態重用是模組依賴,一個驅動使用另一個驅動模組裡匯出的符號。
重啟開發板或者模擬器.ko檔案就會自動消失。使用異常情況卸載:1.初始化函數卸載。2.卸載函數被阻塞
卸載一個驅動,需要輸入一堆命令查詢module結構體的首地址,安裝和下載force_kill_driver驅動。
蜂鳴器的驅動實現原理與LED基本相同,但是實現方式不同,因為PWM是由多個檔案組成的。
PWM基本原理是通過脈衝來控制蜂鳴器的開啟和停止。GPFCON只用了最高的兩位來控制PWM。
靜態函數結構體,PWM裝置檔案open函數,使用訊號量控制在同一時刻 只能開啟PWM裝置檔案,然後close函數釋放訊號量,ioctl()函數處理I/O命令,設定檔案裝置file_operation裝置,最後在最開 始初始化訊號量,移除訊號量。在pwm.h檔案PWM_IOTCL_START開啟,PWM_IOTCL_STOP停止,這裡在Linux底層驅動中有詳 解,產生.ko檔案,編譯成功。
測試蜂鳴器一般使用I/O命令的參數,可以正常發聲。
Android深度探索(卷1)HAL與驅動開發第八章讀書筆記