【迅為iTop4412學習筆記】5. 設備註冊
宣告
以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。
本節目標
學會註冊裝置
上一篇說註冊裝置的時候談到一個結構體 platform_device,我們直接找到linux的定義檢視,首先你要進iTop4412原始碼目錄,輸入命令
vim include/linux/platform_device.h
一進來就看到
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
- 引數 name 也提到過,linux在match裝置和驅動的時候,首先你們名字要一樣,才能讓裝置和驅動匹配成功。
- 引數 id ,舉個例子,你叫張三,然而全國叫這個名字的不在少數,那怎麼確定是你呢?name張三,id 420621…(身份證),通過這兩個引數,你就知道張三是你,而非其他人。對於註冊裝置來說,如果只有一個,那麼id設定為-1,如果有同名name,你就給他們分配id吧。
- 其他引數暫時先不瞭解,有興趣自己查
現在開始註冊裝置
平臺檔案全部在 arch下,我們用的是arm晶片,4412屬於三星mach-exynos,而平臺檔案是迅為寫好的,名字叫mach-itop4412.c,所以我們應該找到
vim arch/arm/mach-exynos/mach-itop4412.c
開啟之後,顯然不用我們自己造輪子,找一個已有的拿來改就行了,以leds為例,就在leds下面仿照著寫一個吧,我起的名字也與迅為的不一樣,迅為的巨集定義是CONFIG_HELLO_CTL,我的叫CONFIG_MRYANG_CTL。
(這裡的巨集定義源自筆記2仿寫Kconfig的時候寫的)
#ifdef CONFIG_MRYANG_CTL
struct platform_device s3c_device_mryang_ctl = {
.name = "mryang_ctl",
.id = -1,
};
不知道大家還記不記得,我們之前提到過強制編譯和條件編譯長什麼樣,我們之前做的都類似是個開關(Kconfig是圖形介面開關,這裡是定義了這個結構體),你編譯勾選了也沒用,因為他們根本沒聯絡起來,而我們要把他們聯絡起來,肯定是要用C語言的條件編譯的,我們繼續在這個檔案中搜索leds
#ifdef CONFIG_LEDS_CTL
&s3c_device_leds_ctl,
#endif
其實這就很清楚了,定義了CONFIG_LEDS_CTL,就傳參這個結構體,為了讓我們寫的也生效,我們把這裡也要仿寫一下。
#ifdef CONFIG_MRYANG_CTL
&s3c_device_mryang_ctl,
#endif
然後儲存退出就可以進行下一步了
為了保證正確,我們還是回過頭檢查一下之前我們定義的巨集定義吧
vim drivers/char/Kconfig
搜尋我定義的巨集定義的關鍵詞 MRYANG
啥?沒搜到?那就搜一下LEDS,因為我們就是照著LEDS仿寫的,搜到了,我之前定義了忘記儲存了,難怪沒搜到,重新補上吧…
config MRYANG_CTL
bool "Enable MRYANG config"
default y
help
Study Kconfig
因為我是仿寫的,所以我寫的就跟著LEDS後面,其實在哪都行。記得儲存!!!
仿寫結構體和巨集變數完成,準備編譯
我們檢視一下圖形介面,我們寫的是否被選中編譯進核心
make menuconfig
還是老地方,Device Drivers/Character devices 下(再次說明:因為我們是仿照字元裝置LED寫的,所以在這)
檢查 Enable MRYANG config 前面確實有個星號,表示被編譯進核心,那麼就開始編譯吧!
make zImage
我在 make zImage 的時候有提示問我 Enable MRYANG config (MRYANG_CTL) [Y/n/?] (NEW) ,我在後面輸入了個y回車,表示確定編譯進核心。
我去 怎麼報錯了,仔細一看,原來是定義結構體platform_device的s3c_device_mryang_ctl最後少了個 ; 號(上面已重新新增),這錯誤犯的真2…
修改之後 編譯完成
生成的zImage路徑是 /arch/arm/boot下,以後就不再敘述了
把編譯生成的zImage燒寫進板子
我們用命令檢視虛擬匯流排platform是否掛載了我們仿寫的驅動
ls /sys/devices/platform
果然看到了我們編寫的 mryang_ctl (第一列倒數第7個)
當然,你也可以直接用 ls sys/devices/platform |grep mryang,免得顯示這麼多。
[[email protected]]# ls sys/devices/platform
adc_ctl s3c-pl330.1 s5pv210-uart.3
alarm s3c-pl330.2 samsung-audio
android_pmem.0 s3c-sdhci.2 samsung-audio-idma
android_pmem.1 s3c-sdhci.3 samsung-i2s.0
arm-pmu.0 s3c-usbgadget samsung-i2s.4
bt-sysfs s3c2410-wdt samsung-keypad
buzzer_ctl s3c2440-i2c.1 samsung-kmsg
dw_mmc s3c2440-i2c.3 samsung-pd.0
exynos-busfreq s3c2440-i2c.4 samsung-pd.1
exynos-usb-switch s3c2440-i2c.5 samsung-pd.2
exynos4412-adc s3c2440-i2c.7 samsung-pd.5
gpio-keys s3c24xx-pwm.1 samsung-pd.6
i2c-gpio.0 s3c64xx-rtc samsung-pd.7
ion-exynos s3c64xx-spi.2 samsung-rp
leds s5p-ehci serial8250
max485_ctl s5p-fimg2d si_gps
mryang_ctl s5p-pmic snd-soc-dummy
mt3326-gps s5p-sysmmu.15 soc-audio
power s5p-tvout-cec switch-gpio.0
power.0 s5p-tvout-hpd tc4-regulator-consumer
reg-dummy s5pv210-uart.0 uevent
regulatory.0 s5pv210-uart.1 wlan_ar6000_pm_dev.1
relay_ctl s5pv210-uart.2
至此,我們已經成功註冊了裝置,名字name叫 mryang_ctl,因為只有一個沒有重名,所以id是-1。(文章開頭定義結構體的時候寫的)