嵌入式Linux应用开发-第十二章设备树的改造

news2024/11/30 6:48:10

嵌入式Linux应用开发-第十二章设备树的改造

  • 第十二章 LED模板驱动程序的改造:设备树
    • 12.1 总结3种写驱动程序的方法
    • 12.2 怎么使用设备树写驱动程序
      • 12.2.1 设备树节点要与platform_driver能匹配
      • 12.2.2 设备树节点指定资源,platform_driver获得资源
    • 12.3 开始编程
      • 12.3.1 修改设备树添加led设备节点
        • 12.3.1.1 对于 xxxxxx-am335x 单板
        • 12.3.1.2 对于 firefly-rk3288
        • 12.3.1.3 对于 firefly的 roc-rk3399-pc
        • 12.3.1.4 对于百问网使用 QEMU模拟的 IMX6ULL板子
        • 12.3.1.5 对于野火 imx6ull-pro
        • 12.3.1.6 对于正点原子 imx6ull-alpha
      • 12.3.2 修改platform_driver的源码
    • 12.4 上机实验
    • 12.5 调试技巧
      • 12.5.1 设备树的信息
      • 12.5.2 platform_device的信息
      • 12.5.3 platform_driver的信息
    • 12.6 课后作业

第十二章 LED模板驱动程序的改造:设备树

在这里插入图片描述

12.1 总结3种写驱动程序的方法

在这里插入图片描述

核心永远是 file_operations结构体。
上述三种方法,只是指定“硬件资源”的方式不一样。

从上图可以知道,platform_device/platform_driver只是编程的技巧,不涉及驱动的核心。

12.2 怎么使用设备树写驱动程序

12.2.1 设备树节点要与platform_driver能匹配

在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。
但是,匹配过程所要求的东西是固定的:
① 设备树要有 compatible属性,它的值是一个字符串
② platform_driver中要有 of_match_table,其中一项的.compatible成员设置为一个字符串 ③ 上述 2个字符串要一致。
示例如下:
在这里插入图片描述

12.2.2 设备树节点指定资源,platform_driver获得资源

如果在设备树节点里使用 reg属性,那么内核生成对应的 platform_device时会用 reg属性来设置IORESOURCE_MEM类型的资源。
如果在设备树节点里使用 interrupts属性,那么内核生成对应的 platform_device时会用 reg属性来设置 IORESOURCE_IRQ类型的资源。对于 interrupts属性,内核会检查它的有效性,所以不建议在设备树里使用该属性来表示其他资源。
在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。驱动程序中根据pin属性来确定引脚,那么我们就在设备树节点中添加 pin属性。
设备树节点中:

#define GROUP_PIN(g,p) ((g<<16) | (p)) 
xxxxxx_led0 { 
   compatible = “xxxxxx,led”; 
   pin = <GROUP_PIN(5, 3)>; 
}; 

驱动程序中,可以从 platform_device中得到 device_node,再用 of_property_read_u32得到属性的值:

struct  device_node* np = pdev->dev. of_node; 
int led_pin; 
int err = of_property_read_u32(np, “pin”, &led_pin); 

12.3 开始编程

12.3.1 修改设备树添加led设备节点

在本实验中,需要添加的设备节点代码是一样的,你需要找到你的单板所用的设备树文件,在它的根节点下添加如下内容:

#define GROUP_PIN(g,p) ((g<<16) | (p)) 
xxxxxx_led@0 { 
 compatible = "xxxxxx,leddrv"; 
 pin = <GROUP_PIN(3, 1)>; 
}; 
xxxxxx_led@1 { 
 compatible = "xxxxxx,leddrv"; 
 pin = <GROUP_PIN(5, 8)>; 
}; 
12.3.1.1 对于 xxxxxx-am335x 单板

设备树文件是:内核源码目录中 arch/arm/boot/dts/xxxxxx-am335x.dts
修改、编译后得到 arch/arm/boot/dts/xxxxxx-am335x.dtb文件。
要更换板子上的设备树文件,启动板子后,更换这个文件:/boot/xxxxxx-am335x.dtb

12.3.1.2 对于 firefly-rk3288

设备树文件是:内核源码目录中 arch/arm/boot/dts/rk3288-firefly.dts
修改、编译后得到 arch/arm/boot/dts/rk3288-firefly.dtb文件。
对于这款板子,本教程中我们使用 SD卡上的系统。
要更换板上的设备树文件,你可以使用 SD卡启动开发板后,更换这个文件:/boot/rk3288-firefly.dtb

12.3.1.3 对于 firefly的 roc-rk3399-pc

设备树文件是:内核源码目录中 arch/arm64/boot/dts/rk3399-roc-pc.dts
修改、编译后得到 arch/arm64/boot/dts/rk3399-roc-pc.dtb文件。
对于这款板子,本教程中我们使用 SD卡上的系统。
要更换板上的设备树文件,你可以使用 SD卡启动开发板后,更换这个文件:/boot/ rk3399-roc-pc.dtb

12.3.1.4 对于百问网使用 QEMU模拟的 IMX6ULL板子

设备树文件是:内核源码目录中 arch/arm/boot/dts/xxxxxx_imx6ul_qemu.dts
修改、编译后得到 arch/arm/boot/dts/xxxxxx_imx6ul_qemu.dtb文件。

它是执行 qemu时直接在命令行中指定设备树文件的,你可以打开脚本文件 qemu-imx6ul-gui.sh找到dtb文件的位置,然后使用新编译出来的 dtb去覆盖老文件。

12.3.1.5 对于野火 imx6ull-pro

设备树文件是:内核源码目录中 arch/arm/boot/dts/imx6ull-14x14-ebf.dts
修改、编译后得到 arch/arm/boot/dts/imx6ull-14x14-ebf.dtb文件。
对于这款板子,本教程中我们使用 SD卡上的系统。
要更换板上的设备树文件,你可以使用 SD卡启动开发板后,更换这个文件:/boot/imx6ull-14x14-ebf.dtb

12.3.1.6 对于正点原子 imx6ull-alpha

设备树文件是:内核源码目录中 arch/arm/boot/dts/imx6ull-14x14-alpha.dts
修改、编译后得到 arch/arm/boot/dts/imx6ull-14x14-alpha.dtb文件。
对于这款板子,本教程中我们使用 SD卡上的系统。
要更换板上的设备树文件,你可以使用 SD卡启动开发板后,更换这个文件:
/boot/arch/arm/boot/dts/imx6ull-14x14-alpha.dtb

12.3.2 修改platform_driver的源码

使用 GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\ 
05_嵌入式 Linux驱动开发基础知识\source\ 
02_led_drv\05_led_drv_template_device_tree 

关键代码在 chip_demo_gpio.c,主要看里面的 platform_driver,代码如下。
第 166行指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有 compatile属性,并且其值等于第 157行的“xxxxxx,leddrv”,就会导致第 162行的 probe函数被调用。

156 static const struct of_device_id xxxxxx_leds[] = { 
157     { .compatible = "xxxxxx,leddrv" }, 
158     { }, 
159 }; 
160 
161 static struct platform_driver chip_demo_gpio_driver = { 
162     .probe      = chip_demo_gpio_probe, 
163     .remove     = chip_demo_gpio_remove, 
164     .driver     = { 
165         .name   = "xxxxxx_led", 
166         .of_match_table = xxxxxx_leds, 
167     }, 
168 }; 
169 
170 static int __init chip_demo_gpio_drv_init(void) 
171 { 
172     int err; 
173 
174     err = platform_driver_register(&chip_demo_gpio_driver); 
175     register_led_operations(&board_demo_led_opr); 
176 
177     return 0; 
178 } 
179 

12.4 上机实验

1.使用新的设备树 dtb文件启动单板,查看/sys/firmware/devicetree/base下有无节点
2. 查看/sys/devices/platform目录下有无对应的 platform_device 3. 加载驱动:

# insmod  leddrv.ko 
# insmod  chip_demo_gpio.ko 
  1. 测试驱动:
# ./ledtest   /dev/xxxxxx_led0  on # ./ledtest   /dev/xxxxxx_led0  off 

12.5 调试技巧

/sys目录下有很多内核、驱动的信息:

12.5.1 设备树的信息

以下目录对应设备树的根节点,可以从此进去找到自己定义的节点。 cd /sys/firmware/devicetree/base/
节点是目录,属性是文件。
属性值是字符串时,用 cat命令可以打印出来;属性值是数值时,用 hexdump命令可以打印出来。

12.5.2 platform_device的信息

以下目录含有注册进内核的所有 platform_device:

/sys/devices/platform 

一个设备对应一个目录,进入某个目录后,如果它有“driver”子目录,就表示这个 platform_device跟某个 platform_driver配对了。
比如下面的结果中,平台设备“ff8a0000.i2s”已经跟平台驱动“rockchip-i2s”配对了:

/sys/devices/platform/ff8a0000.i2s]# ls driver -ld 
lrwxrwxrwx    1 root     root             0 Jan 18 16:28 driver -> ../../../bus/platform/drivers/rockchip-i2s 

12.5.3 platform_driver的信息

以下目录含有注册进内核的所有 platform_driver:

/sys/bus/platform/drivers 

一个 driver对应一个目录,进入某个目录后,如果它有配对的设备,可以直接看到。
比如下面的结果中,平台驱动“rockchip-i2s”跟 2个平台设备“平台设备“ff890000.i2s”、
“ff8a0000.i2s”配对了:
在这里插入图片描述

注意:一个平台设备只能配对一个平台驱动,一个平台驱动可以配对多个平台设备。

12.6 课后作业

请仿照本节提供的程序(位于 05_led_drv_template_device_tree目录),改造你所用的单板的 LED驱动程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于vue+Element Table Popover 弹出框内置表格的封装

文章目录 项目场景&#xff1a;实现效果认识组件代码效果分析 封装&#xff1a;代码封装思路页面中使用 项目场景&#xff1a; 在选择数据的时候需要在已选择的数据中对比选择&#xff0c;具体就是点击一个按钮&#xff0c;弹出一个小的弹出框&#xff0c;但不像对话框那样还需…

第79步 时间序列建模实战:支持向量机回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍支持向量机&#xff08;SVM&#xff09;回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemor…

Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)

一、命令行提示符格式内容因shell类型而异 Linux终端命令行提示符内容格式则因shell的类型而异&#xff0c;例如CoreLinux默认的shell是sh&#xff0c;其命令行提示符为黑底白字&#xff0c;内容为&#xff1a; tcbox:/$ 其中&#xff0c;tc为当前用户名&#xff0c;box为主机…

CSP-J第二轮试题-2021年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 分糖果题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2-优化 [CSP-J 2021] 插入排序题目描述输入格式输出格式样例 #1样例输入 #1样…

趣解设计模式之《小王的披萨店续集》

〇、小故事 在《小王的披萨店》这篇文章中&#xff0c;我们介绍了小王开披萨店的故事&#xff0c;并且为了解决多种口味披萨的扩展问题&#xff0c;引出了简单工厂和工厂方法模式。但是&#xff0c;故事仍在继续&#xff0c;如果芝加哥的披萨店和纽约的披萨店&#xff0c;要求…

T8161B T8403 T8448 ICS TRIPLEX 具有支持物联网边缘的计算机视觉

T8161B T8403 T8448 ICS TRIPLEX 具有支持物联网边缘的计算机视觉 edge Xpert(1.8版)现在提供了一个用于计算机视觉的插件&#xff0c;使用户能够在边缘运行他们的人工智能算法和视觉模型。基于英特尔的OpenVINO工具包&#xff0c;Edge Xpert计算机视觉服务为用户提供了在现…

「大数据-2.2」使用命令操作HDFS文件系统

目录 一、HDFS文件系统基本信息 1. HDFS的路径表达形式 2.HDFS和Linux的根目录的区分 二、 使用命令操作HDFS文件系统 0. Hadoop的两套命令体系 1. 创建文件夹 2. 查看指定目录下内容 3. 上传文件到HDFS指定目录下 4. 查看HDFS文件内容 5. 下载HDFS文件 6. 拷贝HDFS文件 7.…

快速幂算法-python

看了大神讲解&#xff0c;理论在这里&#xff1a;快速幂算法&#xff08;全网最详细地带你从零开始一步一步优化&#xff09;-CSDN博客 例题&#xff1a;求整数 base 的 整数 power 次方&#xff0c;对整数 num_mod 取幂。 python 代码如下&#xff1a; import timedef norm…

经历网 微信二维码 制作方法

1、谷歌浏览器&#xff0c;打开要制作微信二维码的 网站页面 2、点击页面空白处&#xff08;此步为了使鼠标激活页面&#xff0c;可省&#xff09;&#xff0c;点击鼠标右键&#xff0c;弹窗 点选 为此页面创建二维码&#xff0c;点击下载到自己指定的地方。完成。 下载下来的…

小黑子的java项目开发理解

小黑子的理解 一、基于Maven模板构建的三种常见Java项目——基于maven二、通常的java目录结构utils层 工具包model层&#xff08;pojo层&#xff09;exceptions层 报错包dao层&#xff08;mapper层&#xff09;[impl包—查询数据库]service层 定义接口 [impl—实现事务]control…

Docker-Windows安装使用

1.下载docker https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2.配置虚拟化环境 通过控制面板“设置”启用 Hyper-V 角色 右键单击 Windows 按钮并选择“应用和功能”。选择相关设置下右侧的“程序和功能”。选择“打开或关闭 Windows 功能”。选择“Hyper-…

Ubuntu性能分析-ftrace 底层驱动

1、框架介绍 ftrace内核驱动可以分为几部分:ftrace framework,RingBuffer,debugfs,Tracepoint,各种Tracer。 ftrace框架是整个ftrace功能的纽带,包括对内和的修改,Tracer的注册,RingBuffer的控制等等。 RingBuffer是静态动态ftrace的载体。 debugfs则提供了用户空间…

【李沐深度学习笔记】Softmax回归

课程地址和说明 Softmax回归p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 Softmax回归 虽然它名字叫作回归&#xff0c;但是它其实是分类问题 本节课的基础 想要学会本节课得需要一点基础&#xff0c…

day9.30

消息队列实现进程之间通信方式代码&#xff0c;现象 #include<myhead.h>//消息结构体 typedef struct {long msgtype; char data[1024]; }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) int main(int argc, const char *argv[]) {//1、创建key值…

安全渗透测试基础之-Nessus漏洞扫描工具(安装下载)

【注:本文中所需软件请回复公众号后获取,有任何问题请留言,看到会第一时间回复,毕竟我有自己的工作,分享经验并不是主业,不能时刻关注到。如果您觉得我写的好,请记得将公众号设为星标公众号,否则下次可能找不到。先谢谢各位愿意努力奋斗的小伙伴们了。】 本篇是安装下…

UML学习笔记

前言 UML&#xff08;Unified Modeling Language&#xff09;是一种对软件密集系统进行可视化建模的一种语言。有了图后来就可以一目了然。 C中有好多继承图&#xff0c;我都看不懂&#xff0c;所以就来学习一波&#xff5e; -代表私有&#xff08;private&#xff09;的表示…

经典网络解(三) 生成模型VAE | 自编码器、变分自编码器|有监督,无监督

文章目录 1 有监督与无监督2 生成模型2.1 重要思路 3 VAE编码器怎么单独用&#xff1f;解码器怎么单独用&#xff1f;为什么要用变分变分自编码器推导高斯混合模型 4 代码实现 之前我们的很多网络都是有监督的 生成网络都是无监督的&#xff08;本质就是密度估计&#xff09;&a…

5、Linux驱动开发:设备-设备注册

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

12、Kubernetes中KubeProxy实现之iptables和ipvs

目录 一、概述 二、iptables 代理模式 三、iptables案例分析 四、ipvs案例分析 一、概述 iptables和ipvs其实都是依赖的一个共同的Linux内核模块&#xff1a;Netfilter。Netfilter是Linux 2.4.x引入的一个子系统&#xff0c;它作为一个通用的、抽象的框架&#xff0c;提供…

华为智能高校出口安全解决方案(3)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/133267254?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的攻击防御&安全运维&日志审计的部署流程。 华为智能高校出口安全解决方案&#xff08;3&#xff09; 课程地址攻击防…