linux 获取设备树源文件(dts)里描述的资源,Linux 获取设备树源文件(DTS)里描述的资源...

在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 的头文件 里面。

uboot将.dts文件里的描述解析出来, 再对相应寄存器赋值, 在linux启动后, 使用  platform_get_resource() 即可获取到这些给定的资源, 在驱动里使用。

例如一个在.dts文件中关于gpio资源的描述:

gpio: [email protected] {

#gpio-cells = <2>;

compatible = "cavium,octeon-3860-gpio";

reg = <0x10700 0x00000800 0x0 0x100>;

gpio-controller;

根据其描述, 可知道gpio控制器的IO内存起始地址为:0x107900000800, 长度为0x100.

即从 0x107900000800 到 0x1079000008ff.

在目标板里使用  cat /proc/iomem  可以看到:

关于i2c 的描述:

twsi0: [email protected] {

#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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要修改Linux内核的设备树源文件(Device Tree Source, DTS),您可以按照以下步骤进行操作: 1. 定位设备树源文件:在Linux内核源码目录中,通常位于`arch/<架构>/boot/dts/`目录下,其中`<架构>`是您的目标硬件架构,比如`arm`、`arm64`等。在该目录中,找到您要修改的设备树源文件(通常以`.dts`或`.dtsi`为扩展名)。 2. 编辑设备树源文件:使用任何文本编辑器打开设备树源文件。确保您具有足够的权限来修改该文件。 3. 进行所需的修改:根据您的需求,在设备树源文件中找到相应的节点,并进行相应的修改。设备树使用了一种类似于树形结构的语法,您需要了解设备树的语法和结构以正确地进行修改。在修改之前,建议先备份原始的设备树源文件,以防止错误导致系统无法启动。 4. 保存并退出编辑器:在完成修改后,保存您所做的更改,并关闭编辑器。 5. 重新编译设备树:通过以下命令重新编译设备树文件: ```bash $ make dtbs ``` 这将重新生成设备树二进制文件(Device Tree Blob, DTB)。 6. 更新内核镜像:将生成的DTB文件复制到适当的位置,以便在系统启动时使用。具体位置取决于您的系统和引导方式。通常情况下,DTB文件位于`/boot`目录下。 7. 重新启动系统:重新启动计算机,使新的设备树生效。 请注意,修改设备树源文件需要对硬件和设备树的了解,以确保正确地进行修改。不正确的修改可能导致系统无法正常启动或硬件功能失效。因此,在修改设备树之前,请务必备份原始的设备树源文件,并确保您对所做的更改有深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值