2021.9.26 linux驱动开发
#有关dts
全称device tree source设备树源码,device tree是一种描述硬件的数据结构。Device tree使用BootLoader传递参数。
对于高通msm8992平台,sbl将烧卸载emmc的cdt.bin进行读取和处理,获得nPlatform和nsubtype。Dts在编译时编译为dtb文件,启动kernel时将dtb地址传递给kernel,kernel通过传入的dtb地址进行设备创建。
Dt由一系列被命名的结点(node)和属性(property)组成,而结点本身可以包含子结点。属性是指成对出现的name和value。Dt画一棵电路板上CPU、总线、设备组成的树,BootLoader将这棵树传递给内核,内核识别这棵树并根据他展开出linux内核中的各种设备,设备使用的资源也会传递给内核,内核会将这些资源绑定给展开的相应设备。Dts是一种ascII文本格式的device tree描述。
*多数设备注册到platform bus上,在系统目录/sys/bus/platform/devices中列出系统已经注册的设备
如何在一个树状结构的device tree中引用一个node?要想唯一指定一个node,必须使用full path。
#dts组成
/{ “/”表示root结点,该结点下有两个子结点node1和node2
Node1 { 结点node1下又含有子结点,各结点都有一系列属性
a-string-property = “Astring”; 属性为字符串
a-string-preperty = “firststring”,”second string”; 字符串数组
child-node1 {
first-child-property;
second-child-property = <1>;Cells (由u32整数组成)
a-string-property = “hello world!”;
}
}
Node2{
An-empty-property; 属性为空
}
}
#dts语法
Dts文件中root结点的compatible属性用于定义系统的名称。
Compatible是字符串属性,用于匹配设备和设备驱动,一般形式为:
<芯片供应商>,<模块名>
Pwms:pwms为设备属性,其引用了一个pwm设备结点,结点信息解析成设备,在pum_bl.c驱动中可以直接get pwn资源以及对pwm资源进行操作。
Status:若为okay则在解析设备树文件时会将此设备注册到对应的总线上,否则需要手动注册。
#dts与驱动
对比:使用dts之前的bsp和driver
#ifdefCONFIG_LEDS_CTL
Structplatform_device s3c_device_leds_ctl = {
.name = “leds”,
.ud = -1,
};
#endif
Driver:
Static strucplatform_driver leds_driver = {
.probe = leds_probe,
.remove = leds_remove
.suspend = leds_suspend,
.resume = leds_resume,
.driver={
.name = DRIVER_NAME,
.owner = THIS_MODULE,
},
};
使用了dts之后,似乎可以用compatible中的参数代替leds,在驱动的结构定义中使用.<参数> = “设备名_调用函数”
Dts文件
&soc{
I2c@f9928000{ /* BLS1 QUP6 */
Status = “OK”;
Nfc-nci@76{
Compatible = “brcm,bcm2079x”
…
}
Driver:
Static structof_device_id bcm_match_table[]={
{.compatible = “brcm,bcm2079x”},
{}
}
Static structi2c_driver bcm2079x_driver = {
.Id_table = bcm2079x_id,
.probe = bcm2079x_probe,
.remove = bcm2079x_remove,
.driver = {
.owner=THIS_MODULE,
.name=”bcm2079x-i2c”,
.of_match_table = bcm_match_table,
},
};