以MT7620a爲例闡述dts如何匹配driver
openwrtmt7620的SDK默認配置常用的外設都沒有被使能,默認編譯出來的固件在/dev目錄下無法查到如I2C-0\SPI0等節點,還以爲kernel已經做了什麼更改。然後根據之前編寫驅動的經驗,查找與平臺有關的設備文件,在arch/mips/ralink下胡亂搜了一通始終查不到有關設備註冊的信息,最初以爲mtk是否因爲什麼原因沒有做這部分的功能,後來經過信息收集發現了dts的一個東西,才明白最新的kenrel結構已經改變,那麼如何添加匹配一個platform
device來創建一個設備節點呢?最新的kernel應該是從3.0以上慢慢採用了dts的新的關聯方式來代替以前的resource\i2c_board_info\spi_board_info等等信息。
-添加I2C 設備
target/linux/ramips/dts$ls
MT7620a.dts mt7620a.dtsi
在MT7620a.dts中添加
i2c@900 {
status = "okay"; //使能i2c設備
zl380tw@45 { //如果有設備存在 添加要驅動的i2c設備,如果只是創建i2c節點,只需status使能就可以
compatible = "microsemi,zl380tw-codec" //匹配字符串, 必須和zl380 i2c driver中的driver.compatible一致,否則匹配失敗
reg = <0x45>; //i2c slave addr
};
};
在pinctrl中查看是否釋放i2c io口,沒有釋放將會在ralink,group = "i2c", "uartf";中看到I2C字符串,在這需要去掉i2c字符串
pinctrl {
57 state_default: pinctrl0 {
58 gpio {
59 ralink,group = "uartf";
60 ralink,function = "gpio";
61 };
62 };
通過以上步驟dts設置已經okl,下面還需要查看zl380tw芯片驅動是否有compatible關聯設置。經過查看沒有發現,因此需要進行添加:
打開zl380tw.c添加如下內容:
vi sound/soc/codecs/zl380tw.c
2702 static const struct of_device_id zl380tw_of_match[] = {
2703 { .compatible = "microsemi,zl380tw-codec", },
2704 { }
2705 };
2706
2707 MODULE_DEVICE_TABLE(of, zl380tw_of_match);
2708
2709 static struct i2c_device_id zl380tw_id_table[] = {
2710 {"zl380tw", 0 },
2711 {}
2712 };
2713
2714 static struct i2c_driver zl380tw_i2c_driver = {
2715 .driver = {
2716 .name = "zl380tw",
2717 .owner = THIS_MODULE,
2718 .of_match_table = zl380tw_of_match,
2719 },
2720 .probe = zl380tw_i2c_probe,
2721 .remove = zl380tw_i2c_remove,
2722 .id_table = zl380tw_id_table,
2723 };
以上添加完畢以後,這樣就可以建立platform_driver與platform_device, i2c_driver與i2c_device之間的關聯了
ps:platform_driver與platform_device關聯建立就可以在/dev下查看到所關聯的設備節點,i2c_driver與i2c_device之間的關聯就可以進行設備通信了。
剩下的就是編譯燒錄測試 一切ok!!!!! 不過用慣了resource board_info的方式註冊設備 在接觸dts的確有些不習慣。但是dts的確很強大方便
- 添加SPI設備
同樣修改dts文件
target/linux/ramips/dts$ls
MT7620a.dts mt7620a.dtsi
在MT7620a.dts中添加
41 reg = <0x50000 0x7b0000>;
42 };
43 };
44
45 + spidev@1 {
46 + #address-cells = <1>;
47 + #size-cells = <1>;
48 + compatible = "rak,spidev_test"; //
49 + reg = <1 0>;
50 + linux,modalias = "spidev", "spidev";
51 + spi-max-frequency = <10000000>;
52 + };
53 }; /*spi@b00 end*/
在pinctrl中查看是否釋放spi refclk gpio#37口的複用片選,沒有釋放將會在ralink,group = "spi refclk", "uartf";中看到spi refclk字符串,在這需要去掉,並添加spi cs片選
pinctrl {
57 state_default: pinctrl0 {
58 gpio {
59 ralink,group = "uartf";
60 ralink,function = "gpio";
61 };
62 };
63 /*add spi_cs1 func*/
64 spi_cs1 {
65 ralink,group = "spi refclk";
66 ralink,funtion = "spi refclk";
67 };
68 };
同樣需要在spidev.c中添加spi匹配兼容信息
vi driver/spi/spidev.c
685 static const struct of_device_id spidev_dt_ids[] = {
686 { .compatible = "rohm,dh2228fv" },
687 { .compatible = "rak,spidev_test" },
688 {},
689 };
690
691 MODULE_DEVICE_TABLE(of, spidev_dt_ids);
添加完畢後同樣進行編譯測試ok,在/dev下可以找到設備節點,同時在總線設備目錄下可以發現多出一個spi設備
root@OpenWrt:/# ls /dev/spidev32766.1 -l
crw-r--r-- 1 root root 153, 0 Dec 7 02:52 /dev/spidev32766.1
root@OpenWrt:/#
root@OpenWrt:/# ls /sys/bus/spi/devices/
spi32766.0 spi32766.1
root@OpenWrt:/#
root@OpenWrt:/#
附上DeviceTree (DTS)語法入門
http://download.csdn.net/detail/sevenjoin/9321553