单片机学习小组
直播中

李桂兰

7年用户 1432经验值
私信 关注

关于linux设备树的地址问题求解

pci2: pcie@ffe0a000 {
      cell-index = <2>;
      compatible = "fsl,mpc8548-pcie";
      device_type = "pci";
      #interrupt-cells = <1>;
      #size-cells = <2>;//表示几个cell,表示长度
      #address-cells = <3>;//表示几个cell,表示地址
      reg = <0xffe0a000 0x1000>;
      bus-range = <0 255>;
      ranges = <0x2000000 0x0 0xc0000000 0xc0000000 0x0 0x20000000 0x1000000 0x0 0x0 0xffc20000 0x0 0x10000>;
      clock-frequency = <33333333>;
      interrupt-parent = <&mpic>;
      interrupts = <27 2>;
      interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
      interrupt-map = < /* IDSEL 0x0 */ 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0000 0x0 0x0 0x4 &mpic 0x3 0x1 >;
      pcie {
            reg = <0x0 0x0 0x0 0x0 0x0>;
            #size-cells = <2>;
            #address-cells = <3>;
            device_type = "pci";
            ranges = <0x2000000 0x0 0xc0000000 0x2000000 0x0 0xc0000000 0x0 0x20000000 0x1000000 0x0 0x0 0x1000000 0x0 0x0 0x0 0x100000>
;
现在对这个地址分配还是有点不明白  首先pci控制器地址是ffe0a000 range映射地址是pci地址c0000000映射到cpu地址c0000000  那我要访问控制器的话 地址是c0000000+ffe0a000吗?可是range映射的长度只有20000000啊?还有我想问这个设备树里的cpu地址是虚拟地址还是物理地址?我要在应用层访问这个地址需要mmap吗?    求解!


回帖(1)

从未拥有

2024-4-8 18:09:34
bsp;      reg = <0 0xffe0a000 0 0x8000>;      bus-range = <0x00 0xff>;      interrupt-map-mask = <0x0 0x0 0x0 0x7>;      interrupt-map = << 0x0 0x0 0x0 0x1 &pcie_controller_irq 0x0 0x0 0x8 &pcie_dma_irq 0x0 0x0 0x9 &pcie_err_irq&gt;&gt;;};

在这个设备树的地址中,reg = <0 0xffe0a000 0 0x8000>;表示这个PCI设备在物理地址为0xffe0a000的位置,长度为0x8000。其中,0表示空间是在主芯片的地址空间中,1表示空间在网络上的位置。

另外,#address-cells = <3>;表示这个地址需要用三个cell来表示,即一个PCI设备的地址需要32位,而PCI地址通常是64位,因此需要用两个cell来表示高32位和低32位。同样,#size-cells = <2>;表示设备的尺寸也需要两个cell来表示。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分