來源:百問網
作者:韋東山
本文字數:961,閱讀時長:3分鐘
1. 把驅動拆分為通用的框架(leddrv.c)、具體的硬體操作(board_X.c):
2. 以面向對象的思想,改進代碼:
抽象出一個結構體:
使用 GIT 下載所有源碼後,本節源碼位於如下目錄:
01_all_series_quickstart\
05_嵌入式 Linux 驅動開發基礎知識\source\02_led_drv\01_led_drv_template
6.4.1 驅動程序
驅動程序分為上下兩層:leddrv.c、board_demo.c。
leddrv.c 負責註冊 file_operations 結構體,它的 open/write 成員會調用 board_demo.c 中提供的硬
件 led_opr 中的對應函數。
6.4.1.1 把 LED 的操作抽象出一個 led_operations 結構體
首先看看 led_opr.h,它定義了一個 led_operations 結構體,把 LED 的操作抽象為這個結構體:
6.4.1.2 驅動程序的上層:file_operations 結構體
上層是 leddrv.c,它的核心是 file_operations 結構體,首先看看入口函數: 80
第 88 行向內核註冊一個 file_operations 結構體。
第 102 行從底層硬體相關的代碼 board_demo.c 中獲得 led_operaions 結構體。
再來看看 leddrv.c 中 file_operations 結構體的成員函數:
第 49 行、第 60 行,會調用 led_operations 結構體中對應的函數。
6.4.2 測試程序
測試程序為 ledtest.c:
第 26 行打開設備節點。
如果用戶想點亮 LED,第 37 行會把值「1」通過 write 函數寫入驅動程序。
如果用戶想熄滅 LED,第 42 行會把值「0」通過 write 函數寫入驅動程序。
6.4.3 上機測試
這只是一個示例程序,還沒有真正操作硬體。測試程序操作驅動程序時,只會導致驅動程序中列印信息。
首先設置交叉工具鏈,修改驅動 Makefile 中內核的源碼路徑,編譯驅動和測試程序。
啟動開發板後,通過 NFS 訪問編譯好驅動程序、測試程序,就可以在開發板上如下操作了: