资讯动态

嵌入式--驱动3

发布时间:2026/8/8 8:17:35 来源:尧图企业网站定制
设备树设备树是硬件的说明书告诉内核系统里有什么硬件、怎么配置。它让同一个内核可以支持不同的板子修改硬件只需改设备树而不需要重新编译内核。设备树描述引脚复用、时钟、中断、内存等硬件信息驱动根据设备树自动配置硬件。核心思想是设备与驱动分离设备树文件后缀类型设备树节点puteleds自定义的控制设备节点名称#address-cells表示子节点或寄存器地址用1个字4个字节表示#size-cells表示地址范围长度用1个字4个字节表示compatible绑定设备与驱动程序的标识符status显示启用该设备若为disabled则内核会忽略此节点reg每对值表示一个寄存器起始地址和长度。169 puteled 170 { 171 #address-cells1;//寄存器地址需要1个32位4字节 172 #size-cells1;//每个寄存器大小用 1 个 32 位4 字节描述 173 compatible PT,pute-led; 174 statusokay; 175 reg 176 0x20E0068 0x04 /*MUX*/ 177 0x020E02F4 0x04 /*PAD*/ 178 0x0209C000 0x04 /*DAT*/ 179 0x0209C004 0x04 /*DIR*/ 180 ; 181 };相关函数接口int ret 0; u32 v 0; u32 reg_array[8] {0}; int i 0; const char *compa NULL; const char *led_status NULL; ret misc_register(misc_dev); if (ret) { pr_err(misc_register error,errno %d\n, ret); return ret; } pnode of_find_node_by_path(/puteled); if (!pnode) { ret PTR_ERR(pnode); pr_err(of_find_node_by_path error, errno:%d\n, ret); return ret; } // compatible status ret of_property_read_string(pnode, compatible, compa); if (ret) { pr_err(of_property_read_string error,errno %d\n, ret); return ret; } ret of_property_read_string(pnode, status, led_status); if (ret) { pr_err(of_property_read_string error,errno %d\n, ret); return ret; } pr_info(compa:%s status:%s\n, compa, led_status); ret of_property_read_u32_array(pnode, reg, reg_array, 8); if (ret) { pr_err(of_property_read_u32_array error,errno %d\n, ret); return ret; } for (i 0; i 4; i) { printk(index:%d reg add:0x%x\n, i, reg_array[i * 2]); // 0 2 4 6 } // pmux ioremap(reg_array[0], reg_array[1]); pmux of_iomap(pnode, 0); if (NULL pmux) { pr_err(ioremap ADDR_MUX error\n); return -ENOMEM; } // ppad ioremap(reg_array[2], reg_array[3]); ppad of_iomap(pnode, 1); if (NULL ppad) { pr_err(ioremap ADDR_PAD error\n); return -ENOMEM; } // pdir ioremap(reg_array[6], reg_array[7]); pdir of_iomap(pnode, 3); if (NULL pdir) { pr_err(ioremap LED_DIR error\n); return -ENOMEM; } // pdata ioremap(reg_array[4], reg_array[5]); pdata of_iomap(pnode, 2); if (NULL pdata) { pr_err(ioremap LED_DATA error\n); return -ENOMEM; }创建杂项设备通过设备树的节点查找到设备通过字符串查找这个节点下的属性读寄存器数组建立reg的映射设备树将硬件配置信息从驱动代码中抽离出来变成独立的数据文件.dts。驱动通过读取设备树中的匹配字符串compatible找到对应设备再根据资源描述reg、interrupts等动态配置硬件从而做到同一份驱动适配多款硬件。简单来讲通过compatible 匹配机制连接驱动和设备通过 reg/自定义属性 描述硬件资源让驱动代码变成纯逻辑处理硬件参数变成纯数据描述。三者驱动代码、设备树、内核各自独立演进互不绑架这就是设备树实现设备与驱动分离的本质维度传统方式硬编码设备树方式分离硬件变了改驱动代码重新编译内核只改 .dts重新编译 dtb驱动升级了要重新适配所有硬件驱动代码不变匹配所有硬件内核升级了驱动接口可能变要大面积改代码匹配机制保持兼容驱动基本不改同一驱动支持多板写多个条件编译#ifdef BOARD_A同一份 .ko 不同 .dtb产品变体如高配/低配编译多个内核版本同一内核 不同 dtb设备树的核心理念是描述式配置而非指令式配置。驱动代码只描述操作流程如读取地址→映射→写寄存器设备树只描述硬件参数如地址是多少、中断号是多少内核通过compatible机制将两者匹配。这样硬件升级时只需修改.dts驱动升级时只需修改.c内核升级时只需保证匹配接口稳定三者互不影响各自独立演进。这就是驱动做逻辑设备树做数据内核做匹配的三层分离架构。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价