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




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