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

嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API(2)

接前一篇文章嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API1核心数据结构device_node、property和resource在讲具体的API之前我们需要先了解一下内核是用什么数据结构来表示设备树的。毕竟API只是操作这些数据结构的工具如果不了解数据结构本身用起API来也是一头雾水。struct device_node节点的内核表示struct device_node是内核对设备树节点的描述。每个设备树节点在内核里都对应一个device_node结构体。这个结构体的定义在include/linux/of.h里我们挑重点字段看struct device_node { const char *name; /* 节点名字比如 gpio */ const char *type; /* 设备类型取自 device_type 属性 */ phandle phandle; /* 节点的 phandle 值 */ const char *full_name; /* 节点的全路径名 */ struct fwnode_handle fwnode; struct property *properties; /* 属性链表头 */ struct property *deadprops; /* 已删除的属性 */ struct device_node *parent; /* 父节点 */ struct device_node *child; /* 子节点 */ struct device_node *sibling; /* 兄弟节点 */ struct kobject kobj; unsigned long _flags; void *data; /* ... 更多平台特定字段 ... */ };这个结构体设计得很巧妙。它不仅记录了节点的名字和类型还通过parent、child和sibling三个指针把整棵树串了起来。这意味着你可以从任意一个节点出发往上找父节点、往下找子节点、往旁边找兄弟节点 —— 就像在真的树上爬一样其实更像查族谱。struct device_node中的properties字段指向一个属性链表所有的property结构体都挂在这个链表上。我们接下来看property结构体。struct property属性的内核表示struct property { char *name; /* 属性名字比如 reg */ int length; /* 属性值的字节长度 */ void *value; /* 属性值可以是任意数据 */ struct property *next; /* 指向下一个属性 */ unsigned long _flags; unsigned int unique_id; struct bin_attribute attr; };这里最关键的是value字段。它是一个void *可以指向任意类型的数据。这是因为设备树里的属性值可以是各种类型可能是单个整数、可能是字符串、可能是整数数组、甚至可能是任意字节序列。那么内核怎么知道value里存的是什么类型呢答案是不知道。内核只知道这是一坨字节具体怎么解释要看属性的名字和上下文。比如status属性通常被解释为字符串reg属性被解释为整数数组而compatible属性被解释为字符串数组。所以当我们用API读取属性时需要明确告诉内核我们想要什么类型的数据。这就是为什么有of_property_read_u32()、of_property_read_string()这样不同的函数。struct resource资源的统一描述Linux 内核用struct resource来统一描述各种资源 —— 不仅仅是内存映射IO还包括中断、DMA 通道等。这个结构体定义在include/linux/ioport.h中struct resource { resource_size_t start; /* 资源起始地址/号 */ resource_size_t end; /* 资源结束地址/号 */ const char *name; /* 资源名称 */ unsigned long flags; /* 资源类型标志 */ struct resource *parent, *sibling, *child; };flags字段说明这是什么类型的资源IORESOURCE_MEM内存映射IO。IORESOURCE_IRQ中断资源。IORESOURCE_IO端口IOx86特有。IORESOURCE_DMADMA通道。设备树里的reg属性可以通过of_address_to_resource()函数转换成resource结构体这样驱动就可以用统一的方式来处理不同类型的资源了。更多内容请看下回。
http://www.zskr.cn/news/1371134.html

相关文章:

  • CenToken 开发者接入指南:一次对接全模型通调
  • AI 伪造图像在电信诈骗攻防中的应用与治理研究 —— 以韩国诱捕诈骗快递员案为例
  • Gemini免费配额分配机制大起底(基于17份GCP服务等级协议SLO逆向分析):为什么你的项目只分到同行1/3额度?
  • Python 开发者五分钟接入 Taotoken 调用多款大模型指南
  • 辽宁省凌源寄快递省钱新思路!全网靠谱低价寄件渠道汇总,告别线下高价寄件 - 时讯资讯
  • 终极轻量级浏览器内核:miniblink49嵌入式HTML UI完整指南
  • 03最大岛屿的面积 图论
  • 小红书数据采集:如何用Python破解社交电商的数据密码?
  • 审核延迟超800ms?吞吐暴跌63%?DeepSeek本地化审核引擎调优指南,7步压测达标金融级SLA
  • 为Nodejs后端服务配置Taotoken多模型聚合API调用
  • 毕业设计 深度学习yolo11空域安全无人机检测识别系统(源码+论文)
  • 3.1 注册表的备份与还原(Wise Registry Cleaner)——桌面支持必会的“后悔药”操作
  • ZXPInstaller终极指南:告别Adobe插件安装烦恼的跨平台解决方案
  • 【DeepSeek V2.3工具调用新特性首发解读】:支持多工具并行调度、状态感知重试与JSON Schema动态校验
  • 辽宁省调兵山寄快递省钱新思路!小众靠谱线上寄件渠道,跨省同城都划算 - 时讯资讯
  • 【SRC漏洞挖掘系列】第08期:SSRF与内网探测—— 借刀杀人的“内网特工”
  • 从零开始使用Taotoken和Python SDK构建一个智能对话应用
  • 四线三格英语本模板word版pdf版作文纸可打印
  • 为Claude Code配置TaoToken作为稳定后备API源防止服务中断
  • 辽宁凤城寄件省钱指南|避开高价网点,这几款全国靠谱寄件渠道省心又省钱 - 时讯资讯
  • ChatGPT企业版知识库构建全流程:从非结构化PDF到可审计问答系统的48小时极速上线方案
  • 现在不部署DeepSeek,3个月后将错过火山引擎新推的「DeepSeek-Optimized」专属实例——首批仅开放50个内测名额
  • 【ChatGPT商业计划书写作黄金模板】:20年投行+VC专家亲授,3小时产出投资人抢着看的BP(含12个致命漏洞自查清单)
  • ChatGPT翻译“看似流畅实则危险”:20年技术文档本地化总监亲测,7类高频误译已导致3起客户合规事故(含真实截图)
  • 辽宁北票寄快递省钱指南|避开高价网点,这几款小众靠谱寄件平台更划算 - 时讯资讯
  • 终极Win11去臃肿指南:快速免费的专业系统优化方案
  • 论文写到一半卡壳了?高校教授说用这几个AI写作辅助软件
  • DeepSeek隔离能力被严重低估!实测对比Llama-3/Phi-4:显存利用率提升47%,推理P99延迟下降63%
  • DeepSeek API调用成本失控?揭秘Token计费陷阱及4步精准降本法
  • 辽宁北镇寄件省钱新思路!全网平价靠谱寄件渠道,本地人寄快递这样选更划算 - 时讯资讯