在我所从事的嵌入式系统领域中,操作系统内核通过读取“设备树”来知道调用哪个设备驱动程序。点击
这里了解更多相关信息。
然而,更准确地说,设备树(描述操作系统运行硬件的文件)是在启动时读取的。因此,操作系统会读取它并实例化正确的驱动程序。在设备树的“compatible”字段中,必须与驱动程序的关键字匹配。
例如,假设您有一个包含以下节点的设备树:
ps7_axi_interconnect_0: axi@0 {
compatible = "xlnx,ps7-axi-interconnect-1.00.a", "simple-bus";
ranges ;
gic: interrupt-controller@f8f01000 {
compatible = "arm,cortex-a9-gic";
interrupt-controller ;
reg = < 0xf8f01000 0x1000 >,< 0xf8f00100 0x100 >;
} ;
pl310: pl310-controller@f8f02000 {
arm,data-latency = < 3 2 2 >;
arm,tag-latency = < 2 2 2 >;
cache-level = < 2 >;
cache-unified ;
compatible = "arm,pl310-cache";
interrupts = < 0 34 4 >;
reg = < 0xf8f02000 0x1000 >;
} ;
[ ... more items ... ]
xillybus_0: xillybus@50000000 {
compatible = "xlnx,xillybus-1.00.a";
reg = < 0x50000000 0x1000 >;
interrupts = < 0 59 1 >;
interrupt-parent = <&gic>;
xlnx,max-burst-len = <0x10>;
xlnx,native-data-width = <0x20>;
xlnx,slv-awidth = <0x20>;
xlnx,slv-dwidth = <0x20>;
xlnx,use-wstrb = <0x1>;
} ;
} ;
请注意字段compatible
。
现在,将使用此节点的驱动程序必须具有类似于以下内容:
static struct of_device_id xillybus_of_match[] __devinitdata = {
{ .compatible = "xlnx,xillybus-1.00.a", },
{}
};
MODULE_DEVICE_TABLE(of, xillybus_of_match);
/********something else*******/
static struct platform_driver xillybus_platform_driver = {
.probe = xilly_drv_probe,
.remove = xilly_drv_remove,
.driver = {
.name = "xillybus",
.owner = THIS_MODULE,
.of_match_table = xillybus_of_match,
},
};
为了更好地理解正在发生的事情,请参考
this简单教程。希望这能有所帮助。
关于LED示例
在这个
git存储库文件夹中,您可以找到一个设备驱动程序模块,它可以通过读取设备树的
compatible
字段来管理其开启和关闭。在同一文件夹中,还有源C文件来测试驱动程序的开启和关闭。通过阅读C代码,您可以了解在调用
open
和
close
时发生了什么等信息。