- 前言
- 一、代码的编写
- 1.compatible_dts_node.c文件
- 2.Makefile文件
- 二、运行结果
- 总结
本文的主要内容是Linux中设备树下platform总线的应用,在之前我们已经介绍过注册平台总线设备和驱动以及probe函数编写等内容,本文正是在此基础上进行代码改动的。
一、代码的编写
说明:本文是在Linux下注册平台总线设备和驱动及probe函数的编写和上一篇Linux下设备树中常用的of操作函数举例的基础上进行的。
1.compatible_dts_node.c文件#include2.Makefile文件#include #include #include #include int size; u32 out_values[2] = {0}; const char *str; struct device_node *test_device_node; struct property *test_node_property; unsigned int *vir_addr; int dts_probe(struct platform_device *pdev) { int ret = 0; printk("dts_probe matching ok!n"); printk("node name is %s.n", pdev->dev.of_node->name); //直接读取节点名字的方法 test_device_node = of_find_node_by_path("/test"); //在设备树节点中查找test这个节点 if(test_device_node == NULL){ printk("of_find_node_by_path is error!n"); return -1; } ret = of_property_read_u32_array(test_device_node, "reg", out_values, 2); //参数依次为节点名、要查找的属性名、保存查找到的值、长度 //ret = of_property_read_u32_array(pdev->dev.of_node, "reg", out_values, 2);//这两句话等价 if(ret < 0){ printk("of_property_read_u32_array is error!n"); return -1; } printk("out_values[0] is 0x%08x.n",out_values[0]); //打印读取到的数组值 printk("out_values[1] is 0x%08x.n",out_values[1]); vir_addr = of_iomap(pdev->dev.of_node,0); //参数依次为节点名、地址的段数(默认从0开始) if(vir_addr == NULL){ //地址映射失败 printk("of_iomap is error!n"); return -1; } return 0; } int dts_remove(struct platform_device *pdev) { printk("dts_remove!n"); return 0; } const struct platform_device_id dts_idtable = { .name = "dts_test" //匹配优先级 第二 }; const struct of_device_id of_match_table_test[] = { {.compatible = "test123"}, //匹配优先级 第一 {} }; struct platform_driver dts_device = { .probe = dts_probe, .remove = dts_remove, .driver = { .owner = THIS_MODULE, .name = "dts123", //匹配优先级 第三 .of_match_table = of_match_table_test }, .id_table = &dts_idtable }; static int dts_driver_init(void) { int ret = 0; ret = platform_driver_register(&dts_device); if(ret < 0) { printk("platform_driver_register error!n"); return ret; } printk("platform_driver_register ok!n"); return 0; } static int dts_driver_exit(void) { printk("dts_driver_exit!n"); platform_driver_unregister(&dts_device); } module_init(dts_driver_init); module_exit(dts_driver_exit); MODULE_LICENSE("GPL");
obj-m += compatible_dts_node.o KDIR:=/linux/linux-4.1.15 PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean
二、运行结果
将上面的代码敲好以后编译,然后将驱动文件发送至开发板。
在开发板上加载驱动,其打印信息如下图所示。
通过打印信息我们知道了,compatible属性和设备树节点匹配成功了,reg的属性也被读取到了。
相关的值获取成功以后,我们还可以在此基础上注册杂项设备或是字符设备。
总结
以上就是Linux中设备树下platform总线应用的所有内容了,通过这个例子,要好好体会设备树下platform总线的作用。



