Linux 设备驱动之 DTS 描述的资源
来源:互联网 发布:linux libxml2 安装 编辑:程序博客网 时间:2024/04/30 02:57
在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 platform_driver 的probe() 里面知道设备的中断号, 内存地址等资源。
这些资源的描述信息存放在 resource 数据结构中, 相同的资源存放在一个树形树形数据结构中, 通过父节点, 兄弟节点, 子节点相连。 比如中断资源, IO端口资源, IO内存资源, DMA资源有不同资源树。
Linux使用 struct resource 来描述一个resouce
struct resource { resource_size_t start; //资源范围的开始 resource_size_t end; //资源范围的结束 const char *name; //资源拥有者名 unsigned long flags; //资源属性标识 struct resource *parent, *sibling, *child; //资源树的父节点, 兄弟节点, 字节点指针};
resource_size_t 由系统决定 为uint32_t 或uint64_t 。
在platform机制里, 使用platform_get_resource()来获取指定的资源类型。
//比如获取想获取中断号,irq = platform_get_irq(pdev, 0);int platform_get_irq(struct platform_device *dev, unsigned int num) { struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num); return r ? r->start : -ENXIO;}EXPORT_SYMBOL_GPL(platform_get_irq); platform_get_irq() //会返回一个start, 即可用的中断号。//之后便可使用request_irq() 来注册中断服务函数。//再比如想要获取IO内存资源:struct resource *res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
即可得到一个IO内存资源节点指针, 包括了地址的开始,结束地址等, 该IO内存的长度可用 resource_size() 来获取, 但这段资源只是一个描述, 想真正使用这段IO内存, 还要经过先申请, 再映射的过程。例如可使用devm_request_mem_region()申请出使用这段IO内存, 再使用ioremap() 将其映射出来, 供用户空间使用。
devm_request_mem_region(&pdev->dev, res_mem->start, resource_size(res_mem),
res_mem->name))
addr_start = ioremap(res_mem->start, resource_size(res_mem));
ioremap() 的返回值即为该资源的虚拟地址。
IO内存的资源是在设备树源(Device Tree Source)文件(以.dts结尾)里给出的,.dts文件就是用来描述目标板硬件信息的, 在uboot启动后, 使用uboot提供的特定API将其获取出来, 如fdt_getprop(), fdt_path_offset(), 这些API包含在uboot 的头文件
gpio: gpio-controller@1070000000800 { #gpio-cells = <2>; compatible = "cavium,octeon-3860-gpio"; reg = <0x10700 0x00000800 0x0 0x100>; gpio-controller;
根据其描述, 可知道gpio控制器的IO内存起始地址为:0x107900000800, 长度为0x100.
即从 0x107900000800 到 0x1079000008ff.
在目标板里使用 cat /proc/iomem 可以看到:
1070000000800-10700000008ff : /soc@0/gpio-controller@1070000000800
关于i2c 的描述:
twsi0: i2c@1180000001000 { #address-cells = <1>; #size-cells = <0>; compatible = "cavium,octeon-3860-twsi"; reg = <0x11800 0x00001000 0x0 0x200>; interrupts = <0 45>; clock-rate = <100000>;
IO内存起始地址为: 0x118000001000, 长度为0x200.
从 0x118000001000 到 0x1180000011ff.
在目标板里使用 cat /proc/iomem 可以看到:
1180000001000-11800000011ff : /soc@0/i2c@1180000001000
- Linux 设备驱动之 DTS 描述的资源
- Linux 获取设备树源文件(DTS)里描述的资源
- Linux 获取设备树源文件(DTS)里描述的资源
- Linux 获取设备树源文件(DTS)里描述的资源
- linux 驱动之 dts
- Linux 获取设备树源文件(DTS)里的资源
- Linux 获取设备树源文件(DTS)里的资源
- Linux 获取设备树源文件(DTS)里的资源
- uboot 设备驱动之设备驱动描述
- Linux Kernel 设备驱动之I2C之host描述
- Linux Kernel 设备驱动之I2C之client描述
- Linux 内核设备驱动之GPIO驱动之GPIO 控制器设备描述
- uboot 设备驱动之设备描述
- Linux设备驱动中得 DTS文件加载过程
- Linux设备驱动中得 DTS文件加载过程
- Linux设备驱动中得 DTS文件加载过程
- Linux加载DTS设备节点的过程
- Linux设备驱动学习资源
- oc三种传值方式:通知传值,代理传值,block传值
- Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)
- 调度时机分析之被动调度(之中断处理返回)
- IOS--Delegate 自定义之个人感悟
- noi2015模板-决策单调性
- Linux 设备驱动之 DTS 描述的资源
- JS的面向对象的基础
- VC运行库依赖导致的InnoSetup安装程序调用DLL报错:无法导入DLL
- srm 540
- 1.3 编程范式
- Intelhaxm启动却无法加速的问题
- HDU 2196 Anniversary party (树形DP 水题)
- PAT 数据结构 06-图7. How Long Does It Take (25) 拓扑排序 最早开始时间
- 【沙龙干货】Swift是花拳绣腿吗?开发语言与职业生涯如何选择?