以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