栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux中设备树下platform总线的应用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux中设备树下platform总线的应用

文章目录
  • 前言
  • 一、代码的编写
    • 1.compatible_dts_node.c文件
    • 2.Makefile文件
  • 二、运行结果
  • 总结

前言

本文的主要内容是Linux中设备树下platform总线的应用,在之前我们已经介绍过注册平台总线设备和驱动以及probe函数编写等内容,本文正是在此基础上进行代码改动的。


一、代码的编写

说明:本文是在Linux下注册平台总线设备和驱动及probe函数的编写和上一篇Linux下设备树中常用的of操作函数举例的基础上进行的。

1.compatible_dts_node.c文件
#include  
#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");
2.Makefile文件
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总线的作用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号