1.2 驅動程式
LED 裝置驅動程式 mini2440_leds.c 是直接編入核心,不是以外部驅動程式的方式掛載。
編譯核心時,會直接產生 mini2440_leds.o,納入核心驅動程式映像,而不是產生 mini2440_leds.ko,從外面掛載。
引入標頭檔群。
linux/miscdevice.h 是在 include/linux/miscdevice.h,定義一般設備裝置相關的常數與結構。
mach/regs-gpio.h 是在 /arch/arm/mach-s3c2410/include/mach,定義 S3C2410_GPB(x)、S3C2410_GPIO_OUTPUT。
定義裝置名稱字串 leds,這個名稱字串會加入到 misc 結構的 name 變數中,成為驅動程式的名稱。這個名稱在核心驅動程式中必須是唯一。
定義腳位表,陣列中每個成員都描述一根腳位的位置,分別指向 s3c2410 的 GPB 的第 5、6、7、8 腳位。
定義腳位組態表,陣列中每個成員都描述一根腳位的組態,均為輸出組態。
定義裝置 IO 控制函式,此函式會設定到裝置驅動程式的操作函式結構 dev_fops 的 .ioctl 變數,成為驅動程式的 ioctl 操作函式。
參數 cmd 是命令參數,0 表示 LED 亮,1 表示 LED 暗。
參數 arg 是命令參數的引數,0 表示第一個 LED,其餘 1、2、3 表示另外三個 LED。
函式 s3c2410_gpio_setpin 是 arch/arm/plat-s3c24xx/gpio.c,是 GPIO 的設定函式,給定腳位位置和值,設定該腳位為邏輯 0 或 1。
定義裝置(檔案)操作結構,包含裝置擁有者和裝置控制函式。
其中,裝置控制函式就是當應用程式呼叫 ioctl(device,cmd,arg) 時,重新指向的操作函式。
定義裝置結構,包含次要編號、裝置名稱、裝置操作結構。
次要編號是裝置所歸屬的裝置佇列號碼,裝置管理器有好幾個裝置佇列。
裝置名稱就是字串 leds,在裝置中必需是唯一,不該有兩個裝置的裝置名稱一樣。
裝置操作結構包含裝置操作函式,是裝置驅動程式運作時的函式集合,主要是 ioctl 成員。
關於一般裝置結構 miscdevice。
裝置結構 miscdevice 定義在 /include/linux/miscdevice.h,是一個雙向串列結構,用來承裝各式各樣的驅動程式。
當呼叫模組註冊函式 misc_register 時,會將裝置驅動程式的裝置結構安裝到核心裝置結構佇列。
核心用此裝置結構佇列管理所有核心裝置驅動程式。
模組初始化函式。
當模組載入核心完成後,第一時間執行的函式。
模組初始化函式會註冊驅動程式,顯示驅動程式安裝完成訊息。
函式的功能是設定 LED 相關的 GPIO 的組態和初始值,即設定 4 個 GPIO 都為輸出,並設定輸出值為 0。
之後,註冊驅動程式,並顯示驅動程式初始化完成訊息。
misc_register 是裝置註冊函式,用來安裝使用結構 miscdevice 的裝置驅動程式。
misc_register 的實作是放在 /drivers/char/misc.c。
模組卸載函式。
當模組從核心卸載之前,必需要執行的函式。
模組卸載函式會註銷驅動程式。
misc_deregister 是裝置註銷函式,用來註銷使用結構 miscdevice 的裝置驅動程式,是 misc_register 的反向函式。
misc_deregister 的實作是放在 /drivers/char/misc.c。
設定模組初始化函式。
設定模組卸載函式。
設定模組授權等級。
設定模組著作者名稱。
這些資訊會紀錄在模組檔中,以區段與符號的方式紀錄。
|