前文回顾

《Linux驱动开发(一)—环境搭建与hello world》

《Linux驱动开发(二)—驱动与设备的分离设计》

继续宣传一下韦老师的视频

70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】

设备树

前面的设备分离模式,将模块分为了驱动部分和设备部分,设备部分目前也是c语言编写的,但是这样就为内核引入了大量的代码,有点惹怒了linus,然后就引入了设备树这个东西。大佬就是大佬,可靠。

简单来说,就是通过配置文件的方法,代替device部分的c代码,来描述了设备的信息,参数等。
那么简单一下介绍一下设备树的格式,设备树使用的语言叫DTS语法,可以参考博客《一文搞定 Linux 设备树》

DTS( device tree source)文件通过DTC工具编译为DTB(device tree blob)文件,系统启动时候,会通过解析dtb文件,自动来创建节点和设备。

这些基本知识点还是要掌握,至少要能看得懂一个dts文件的内容大概是什么意思。

代替device模块

多说无益,还是介绍怎么用DTS配置文件,替换掉device模块。
首先在DTS根节点下增加一个DTS节点,并且要保证其能够生成一个device,而且最重要的是要匹配上对应的driver。
一个例子

这个comoatible就是我们所要查找的驱动的标记字符串,内容随意,一般都是“厂商,驱动名字”。

这个DTS编译之后,系统启动的时候进行解析,就能够创建对应的节点,然后创建对应的device。是不是很智能,并且还提供了一个pin的参数,其实可以任意提供数据,只要定义好,例如:

    myled_ok: myled_for_test_ok {compatible = "100ask,led";pin = "gpio5_3";para_A = "hello";para_B = "world";};

那么,和之前的文章一样,关键点来了,驱动如何和这个device匹配上,那么就需要驱动引入另一个参数of_device_id 。


static const struct of_device_id dts_device_ids[] = {{ .compatible = "100ask,led", },{/* sentinel */}
};/* A. 实现platform_driver  */
static struct platform_driver led_driver = {.probe      = led_probe,.remove     = led_remove,.driver     = {.name   = "100ask_led",.of_match_table = dts_device_ids,},.id_table = led_id_table,
};

这个driver结构中的of_match_table ,里面就提供了,匹配的参数,里面可以定义多个,匹配的就是节点中的compatible 参数。
这样一来。设备和驱动就又匹配上了,自然就可以快乐的执行到driver中的probe函数了。

参数传递

那么新的问题又来了,之前参数通过device中的resource传递,这下没了resource,多了一个pin参数,那怎么处理呢,方法来了
在probe函数中,入参为platform_device pdev,这个pdev内部有标记,表明是普通的模块device还是设备树创建的device。

前者可以通过platform_get_resource得到参数数据
后者可以通过设备树接口来访问节点,然后得到参数。
例如

if (!pdev->dev.of_node)  /* 普通的platform_device */{res = platform_get_resource(pdev, IORESOURCE_IRQ, i++);if (!res)return -EINVAL;minor = g_ledcnt;leds_desc[minor].pin = res->start;}else{of_property_read_string(pdev->dev.of_node, "pin", &tmp_str);printk("pin = %s\n", tmp_str);minor = g_ledcnt;leds_desc[minor].pin = tmp_str[6] - '0';}

of_property_read_string就可以读出节点数据中的pin参数。
真是上有政策,下有对策,灵活选择。

获取参数还可以通过如下几种接口

功能 函数
查找节点 of_find_node_by_path 函数,通过指定全路径来查找指定节点。
提取属性值 of_find_property 函数 ,获取到的值保存到了 property 结构体中。
读整数u32 of_property_read_u32
读整数u64 of_property_read_u64
读某个整数u32 of_property_read_u32_index
读某个整数u64 of_property_read_u64_index
读取属性中数组数据 of_property_read_variable_u8_array
of_property_read_variable_u16_array
of_property_read_variable_u32_array
of_property_read_variable_u64_array
读取属性中字符串值 of_property_read_string 函数。
直接内存映射 of_iomap 函数,获取内存地址所对应的虚拟地址

注意事项

内核中已经有了很多驱动,这些驱动需要的参数,叫什么,其实都已经定义好了,所以我们再增加DTS的时候,需要了解驱动需要定义那些参数,对应提供好即可。

参考文档

补充知识点可以参考阅读下面博客
《ARM 设备树》

结束语

昨天行程码带星的取消了,大家都开始高兴,说明国家的大趋势已经开始要精准防疫了,不会再一个小区高风险,整个城市受限制了。
希望这个夏天能够去一下海边……

公司里的技术专家辞职了,可能是受不了各种奇葩的规矩吧,一个从华为出来的人,怕是怎么也理解不了老板的脑回路,对比起华为,我们这里更社会。

其实这就是人生啊,哪有一帆风顺,都是跌跌撞撞。

Linux驱动开发(三)---设备树相关推荐

  1. 【Linux驱动开发】设备树详解(二)设备树语法详解

    ​ 活动地址:CSDN21天学习挑战赛 [Linux驱动开发]设备树详解(一)设备树基础介绍 [Linux驱动开发]设备树详解(二)设备树语法详解 [Linux驱动开发]设备树详解(三)设备树Kern ...

  2. Linux驱动开发:设备树节点与属性

    目录 1.设备节点(node) 2.属性(property) 3.节点的一些特性 4.节点的一些标准属性 4.1 compatible属性 4.2 model属性 4.3 status属性 4.4 r ...

  3. linux uart寄存器 代替 printk,Linux驱动学习之设备树(设备树下的LED驱动实验),...

    Linux驱动学习之设备树(设备树下的LED驱动实验), 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.相当于从驱动代码分离出来的配置文件,比如串口的波特率通过设 ...

  4. Linux 驱动开发 三:字符设备驱动框架

    一.参考 (3条消息) Linux 字符设备驱动结构(一)-- cdev 结构体.设备号相关知识解析_知秋一叶-CSDN博客 (3条消息) linux设备驱动框架_不忘初心-CSDN博客_linux设 ...

  5. Linux 驱动开发 三十五:Linux 内核时钟管理

    参考: linux时间管理,时钟中断,系统节拍_u010936265的博客-CSDN博客_系统节拍时钟中断 Linux内核时钟系统和定时器实现_anonymalias的专栏-CSDN博客_linux内 ...

  6. Linux驱动开发|块设备驱动

    块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...

  7. Linux驱动开发_设备文件系统详解

    目录 何为设备管理器? Linux下dev的作用 Devfs sysfs kobject udev proc 何为设备管理器? 设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入 ...

  8. linux驱动编写(设备树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux的开发者来说,设备树其实比较熟悉.但是为什么要有设备树,很多人不了解,其实本质来说 ...

  9. i.MX6ULL驱动开发 | 04-Linux设备树基本语法与实例解析

    文章目录 一.设备树简介 1. 设备树在ARM架构的引入 2. 什么是设备树 3. DTS.DTSI.DTB 4. 设备树编译 二.设备树语法 1. 设备树版本 2. 设备树节点 3. 设备树节点标准 ...

  10. MSM8998(高通835处理器)外接指纹识别传感器linux驱动如何与设备树进行匹配

    驱动名称:fpc1020.c 平台:msm8998 描述指纹传感器设备的结构: struct fpc1020_data {struct device *dev;struct wake_lock ttw ...

最新文章

  1. php根据城市获取天气预报,根据浏览者ip获取城市,然后在获取城市天气预报
  2. idea如何导出war文件
  3. dp入门 专题记录 2017-7-26
  4. 【牛客 - 280C】约数(数论,GCD,数学,分解因子)
  5. 它是那么的渺小freeeim
  6. javascript 容错处理代码【屏蔽js错误】
  7. 浅入浅出Vivado IP之DDS Compiler
  8. 利用平面投影坐标与经纬度粗略自动计算高斯投影坐标系参数
  9. 产品优化策略,有效提升产品自身竞争力,我赌你一定没用过
  10. java代码演示经典哲学家就餐问题,以及解决方案
  11. SAN 光纤交换机配置zone实验
  12. 谈智能家居,当我们谈起它的时候我们到底在谈论什么?
  13. php项目经验总结,php项目心得以及总结
  14. 安装 virtualbox additions 备忘 转
  15. webpack bable
  16. 说说dota、人生、程序(长篇、神经质)
  17. (附源码)ssm教育机构管理系统 毕业设计 010224
  18. 3ds max材质库操作
  19. HDU 5155 Harry And Magic Box
  20. 收益和亏损时的持仓观念

热门文章

  1. English Learning - Day35 作业打卡 2023.1.11 周三
  2. 大量短信群发?不妨来看看这几个平台
  3. mysql异常代码c0000005_win7系统因0xc0000005错误导致应用程序无法正常启动的解决方法...
  4. 为什么会出现雷粉?他们为什么会流失?怎样维护和粉丝之间的关系?
  5. 百款蓝牙耳机试用测评:这五款高性价比蓝牙耳机更值得入手
  6. 计算机怎么设置网络共享,如何设置局域网共享,教您电脑如何设置局域网共享文件夹...
  7. 字母符号计算一条英文句子中单词个数
  8. 爬虫——cookie模拟登陆
  9. 从工地转行网络安全工程师,工资翻了好几倍,我想和大家聊聊我的经历
  10. 视频直播流程以及ffmpeg编解码流程