当前位置: 首页 > news >正文

Linux驱动开发(3)——设备树

一、驱动和设备分离

设备树可以统一管理设备,存放所有设备信息。

1、设备树文件类型:

  • dts:设备树源文件
  • dtsi:设备树头文件
  • dtb:编译好的二进制设备树文件,可直接使用
  • DTC:编译工具

2、设备树节点语法:

设备名{ #address-cells = <1>;//每个地址所占字节 #size-cells = <1>;//地址大小所占字节 // 寄存器物理地址 + 长度 可以写多组 reg = <地址1 长度1 地址2 长度2 地址3 长度3>; status = "okey";//设备可用状态 }

3、设备树函数接口:

1).函数:struct device_node *of_find_node_by_path(const char *path);

  • 功能:通过路径获得设备树节点
  • 参数:@path --- 设备树节点全路径(比如'/myled')

2).函数:intof_property_read_string(struct device_node *np, const char *propname, const char **out_string);

  • 功能:读取属性中的字符串值
  • 参数:@np --- 设备树节点,@propname --- 要读的属性名,@out_string --- 存放缓冲区

3).函数:void __iomem *of_iomap(struct device_node *np, int index);

  • 功能:设备树中的物理地址映射为内核虚拟地址
  • 参数:@np --- 设备树节点,@index --- reg数组的下标,从0开始)

二、驱动分层:

设备有4 类寄存器:

  • 引脚复用
  • 电气属性
  • GPIO 方向
  • GPIO 数据

将寄存器的配置移入设备树(Device Tree),由 Linux 内核的pinctrl 子系统GPIO 子系统完成。

1、pinctrl子系统:操作iomuxrc的寄存器

1).pinctrl方案定义

pinctrl_myled:myledgrp{//方案名:组名 fsl,pins = < //引脚配置宏 电器属性参数 >; }

2).pinctrl方案使用

设备树节点{ pinctrl-names = "default";//默认按照pinctrl方案定义配置 pinctrl-0 = <&pinctrl方案名>; };

2、GPIO子系统:操作GPIO的寄存器

设备树节点{ gpio-led = <&gpio控制器编号 gpio引脚号 有效电平>; };

1).函数:intof_get_named_gpio(struct device_node *np, const char *propname, int index);

  • 功能:从设备树节点中解析并获取指定GPIO硬件编号
  • 参数:@np --- 设备树节点,@propname --- GPIO子系统名,@index --- 方案编号,从0开始
  • 返回值:成功返回引脚编号,失败返回-1

2).函数:intdevm_gpio_request(struct device *dev, unsigned gpio, const char *label);

  • 功能:或得单个GPIO描述符,设备卸载时自动释放
  • 参数:@dev --- 设备,@gpio --- 要占用的引脚编号,@label --- 标明占用资源的驱动

3).函数:int gpio_get_value(unsigned int gpio);

  • 功能:读取输入引脚电平

4).函数:void gpio_set_value(unsigned int gpio, int value);

  • 功能:设置输出引脚电平

三、Linux中断

Linux 内核有中断子系统,专门管理所有硬件中断,不用我们直接操作寄存器配置中断。中断子系统分为:顶半部 + 底半部。

顶半部:

  • 硬件一触发中断立刻执行
  • 执行时间必须很短,只做最简单的事:标记中断、读取按键电平
  • 不能延时、不能睡眠、不能做耗时操作

底半部:

  • 耗时、复杂的任务挪到底半部执行
  • 顶半部快速退出,不占用 CPU,提高系统响应速度
  • 常见实现:工作队列、tasklet 等
设备节点{ interrupt-parent = <&gpio1>;//中断控制器 interrupts = <15 IRQ_TYPE_EDGE_FALLING>;//触发方式,例如15下降沿触发 };
http://www.jsqmd.com/news/733549/

相关文章:

  • 35个Illustrator自动化脚本:设计师效率革命的完整解决方案
  • nstagram内容分级扩展后跨境品牌如何把握素材边界
  • Kodi字幕插件终极指南:告别字幕烦恼的完整解决方案
  • Picasso:基于React+TypeScript的Web3 DApp前端模块化开发框架
  • Taotoken多模型聚合平台为开发者提供稳定低延迟的API调用体验
  • 实测对比:在YOLOv9里塞入GhostConv模块,模型体积和推理速度到底能降多少?
  • SAP MRP顾问实战避坑:MD02/MD01N参数组合怎么选?附真实项目踩坑案例
  • CLeVeR:用多模态对比学习把“漏洞语义”从代码里挖出来
  • 初次接触大模型API的开发者如何通过Taotoken快速上手并控制预算
  • 从蓝桥杯国赛题看嵌入式系统设计:一个按键如何实现模式切换、参数调整与数据刷新?
  • 2025全栈开发样板:TypeScript、tRPC与AI友好的现代化实践
  • 如何3分钟掌握网盘直链下载助手:告别限速的终极方案
  • 告别手动测量!WebPlotDigitizer:3步从图表图片提取精确数据的终极方案
  • Cursor编辑器重置工具:一键清理配置与缓存,解决插件异常与性能问题
  • 3种颠覆性方式重构你的多屏工作空间:VirtualMonitor虚拟显示技术深度解析
  • WPS用户必看:手把手教你搞定EndNote插件安装(附Win11权限问题解决方案)
  • LaSt-ViT:Vision Transformers Need More Than Registers(CVPR 2026)
  • Firefox老版本爱好者的自救指南:手动修改prefs.js与channel-prefs.js锁定版本
  • 开源AI视频生成项目Vidya:从扩散模型原理到实战部署全解析
  • 如何利用NTU VIRAL数据集构建无人机多传感器融合算法:完整技术指南
  • AMD Ryzen处理器终极调试指南:SMUDebugTool免费开源工具完全教程
  • 避开这些坑!Pipelined-ADC设计实战:从理论指标到电路仿真的完整避坑指南
  • 微信读书笔记助手:免费高效的阅读管理终极指南
  • 2026年,405nm窄带滤光片定制有何独特之处?带你一探究竟!
  • 实时日志采集与统计分析平台
  • 三电平半桥LLC谐振变换器电路仿真研究:移相角度控制与DSP PWM生成方式探讨,输出电压优化...
  • Anthropic 推出 Claude Security,AI 漏洞扫描能否助力开发者高效修复漏洞?
  • SAA-C03备考别死记硬背!用这5个真实AWS场景串联核心服务(附避坑清单)
  • 杂谈勾股定理
  • 京东秒杀自动化工具:5步轻松实现热门商品抢购的终极指南