1. 程式人生 > >【迅為iTop4412學習筆記】5. 設備註冊

【迅為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; };
  1. 引數 name 也提到過,linux在match裝置和驅動的時候,首先你們名字要一樣,才能讓裝置和驅動匹配成功。
  2. 引數 id ,舉個例子,你叫張三,然而全國叫這個名字的不在少數,那怎麼確定是你呢?name張三,id 420621…(身份證),通過這兩個引數,你就知道張三是你,而非其他人。對於註冊裝置來說,如果只有一個,那麼id設定為-1,如果有同名name,你就給他們分配id吧。
  3. 其他引數暫時先不瞭解,有興趣自己查

現在開始註冊裝置

平臺檔案全部在 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。(文章開頭定義結構體的時候寫的)