嵌入式linux: ARM: dts中定义的设备属于/sys/bus/platform还是/sys/bus/amba

DTS中设备所属总线及目录确定方法

在设备树(Device Tree Source, DTS)中定义的设备最终会出现在 /sys/bus/platform 还是 /sys/bus/amba 目录下,取决于设备节点的 compatible 属性。下面是确定设备属于哪个总线的一些步骤和方法:

  • 1. 检查 compatible 属性

Platform Bus:如果设备节点没有明确指定一个具体的总线类型,那么该设备通常会被添加到平台总线,并在 /sys/bus/platform/devices/ 下出现。平台总线是一种虚拟的、通用的总线类型,用于表示那些直接挂载在 CPU 或 SoC 上的设备。这些设备通常不通过标准的 PCI、USB 或其他硬件总线连接,而是通过内存映射 I/O 或者特定的控制器接口进行通信
AMBA Bus:“arm,primecell” 是一个在设备树(Device Tree, DTS/DTSI)中常用的兼容属性(compatible property),用于标识 ARM PrimeCell 设备。PrimeCell 是 ARM 公司设计的一系列外设 IP 核,这些外设通过 AMBA 总线连接到片上系统(SoC)中。

  • 2. 设备树解析

当内核启动时,它会解析设备树并根据每个节点的 compatible 属性来查找匹配的驱动程序。

Platform Devices:对于平台设备,内核中的 platform_bus_type 会处理那些没有明确总线类型的设备。如果设备节点没有明确指出它属于哪种总线,它通常会被当作平台设备处理。
AMBA Devices:对于 AMBA 总线上的设备,内核中的 amba_bus_type 会处理这些设备。

  • 3. 驱动程序注册

Platform Drivers:平台设备驱动程序通过 platform_driver_register() 函数注册。一旦注册,它们就会尝试绑定到所有兼容的平台设备上。
AMBA Drivers:AMBA 设备驱动程序通过 driver_register() 函数注册,并且通常会在 of_match_table 中包含 compatible 字符串,以便与设备树中的设备节点匹配。

  • 4. sysfs 

Platform Bus:一旦平台设备被正确识别并绑定到平台驱动程序,设备信息将会出现在 /sys/bus/platform/devices/ 目录下。
AMBA Bus:同样地,一旦 AMBA 设备被正确识别并绑定到 AMBA 驱动程序,设备信息将会出现在 /sys/bus/amba/devices/ 目录下。

更详细的解释,参考《4.2.5 根据DTS完成platform设备创建》。

记录点滴,欢迎点赞关注收藏,共同进步 !

<think> 我们面对的问题是:当 `/sys/bus/amba/devices` 目录为空时,如何查看 `amba_id`?这通常意味着系统中没有检测到任何 AMBA 设备。但我们可以通过其他方式获取驱动支持的 `amba_id` 信息。 ### 方法一:查看内核驱动的 ID 表 即使没有设备,我们也可以查看驱动内置的 ID 表(如果驱动已编译进内核或作为模块加载): 1. **驱动模块路径**:`amba_id` 信息存储在驱动模块的 `id_table` 符号中(若驱动为模块) 2. **模块名称**:对于 PL011 驱动,模块名为 `uart-pl011` #### 操作步骤: ```bash # 1. 确认驱动模块是否加载 lsmod | grep uart-pl011 # 2. 若已加载,查看模块信息(包含 id_table) modinfo uart-pl011 ``` > 若驱动编译进内核(built-in),则需通过内核符号表获取 ### 方法二:分析内核源代码 直接查看驱动源码中的 `amba_id` 定义: 1. **定位驱动源码文件**:`drivers/tty/serial/amba-pl011.c` 2. **查找结构体**:搜索 `static const struct amba_id pl011_ids[]` #### 示例代码片段: ```c static const struct amba_id pl011_ids[] = { { .id = 0x00041011, .mask = 0x000fffff, .data = &vendor_arm, }, { .id = 0x00380802, .mask = 0x00ffffff, .data = &vendor_st, }, {0, 0}, }; MODULE_DEVICE_TABLE(amba, pl011_ids); ``` ### 方法三:调试文件系统(需内核配置支持) 若内核配置了 `CONFIG_DEBUG_FS` 和驱动特定调试支持: ```bash mount -t debugfs none /sys/kernel/debug grep -r "amba_id" /sys/kernel/debug ``` ### 方法四:通过设备树间接获取 若系统使用设备树,可查找兼容性字符串与 `amba_id` 的映射: 1. 设备树节点示例: ```dts uart0: uart@1c090000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x1c090000 0x1000>; ... }; ``` 2. 内核驱动中 `amba_id` 的 `data` 字段通常关联 `compatible` 字符串处理逻辑 ### 特殊情况处理 当系统无 AMBA 设备时,建议: 1. 检查 AMBA 总线支持:`ls /sys/bus/amba` 2. 确认 SOC 是否使用 AMBA 架构(如 ARM Versatile Express 平台) > 注:在 QEMU 虚拟 ARM 机器中可通过 `-machine virt` 参数启用 AMBA 设备 §§相关问题§§ 1. 如何在内核模块中定义和注册 `amba_id` 表? 2. 当 AMBA 设备未被检测到时,如何进行硬件调试? 3. 设备树中的 `compatible` 属性如何与 `amba_id` 协同工作? 4. 如何为自定义 AMBA 设备编写内核驱动? </think> ### 当 `/sys/bus/amba/devices` 目录为空时查看 `amba_id` 的方法 当 `/sys/bus/amba/devices` 为空时,表示系统未检测到任何 AMBA 设备。此时可通过以下方法查看驱动支持的 `amba_id`: --- ### 方法一:通过内核符号表查看(无需硬件设备) **核心原理**:`amba_id` 表作为静态数据存储在驱动模块中 **操作步骤**: ```bash # 1. 查找驱动模块名称 lsmod | grep -e pl011 -e amba # 2. 查看驱动符号表(以uart-pl011为例) grep pl011_ids /proc/kallsyms # 3. 使用crash工具解析符号内容(需要调试信息) echo "struct amba_id 0x$(grep pl011_ids /proc/kallsyms | cut -d' ' -f1)" | crash /usr/lib/debug/boot/vmlinux ``` **输出示例**: ``` struct amba_id { id = 0x41011, mask = 0xfffff, data = 0xffffffff822a8000 <vendor_arm> } ``` --- ### 方法二:从内核源码直接获取 **步骤**: 1. 定位驱动源码:`drivers/tty/serial/amba-pl011.c` 2. 查找 `pl011_ids` 数组定义: ```c static const struct amba_id pl011_ids[] = { { .id = 0x00041011, // ARM标准PL011 .mask = 0x000fffff, .data = &vendor_arm, }, { .id = 0x00380802, // ST微电子变种 .mask = 0x00ffffff, .data = &vendor_st, }, { .id = AMBA_LINUX_ID(0x00, 0x1, 0xffe), // ZTE设备 .mask = 0x00ffffff, .data = &vendor_zte, }, {0, 0}, // 结束标记 }; ``` --- ### 方法三:通过模块信息查看(驱动为模块时) **操作**: ```bash # 1. 确保驱动以模块形式加载 modprobe uart-pl011 # 2. 查看模块信息 modinfo uart-pl011 | grep parm -A10 # 3. 使用systool解析(需sysfs支持) systool -m uart-pl011 -av ``` --- ### 方法四:调试接口查看(需内核配置) **启用调试**: 1. 配置内核:`CONFIG_DYNAMIC_DEBUG=y` 2. 激活调试: ```bash echo 'file amba-pl011.c +p' > /sys/kernel/debug/dynamic_debug/control dmesg | grep amba_id ``` --- ### 关键数据结构说明 `amba_id` 结构定义(`include/linux/amba/bus.h`): ```c struct amba_id { unsigned int id; // 外设ID unsigned int mask; // 掩码 void *data; // 厂商特定数据 }; ``` 匹配逻辑伪代码: ```c for_each_amba_id(id, driver->id_table) { if ((device->periphid & id->mask) == id->id) { probe(id->data); // 匹配成功,调用驱动probe函数 } } ``` --- ### 特殊情况分析 当 `/sys/bus/amba/devices` 为空时,可能原因: 1. **平台无AMBA设备**:如x86平台 2. **驱动未加载**:`amba_driver` 未注册 3. **设备未枚举**:AMBA总线扫描未执行 4. **内核配置问题**:`CONFIG_AMBA=y` 未启用 > 验证总线支持:`ls /sys/bus/amba` 应返回目录结构而非空目录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值