MT通過DTS添加設備

以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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章