PowerPC Embedded.docx
- 文档编号:29547791
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:8
- 大小:17.58KB
PowerPC Embedded.docx
《PowerPC Embedded.docx》由会员分享,可在线阅读,更多相关《PowerPC Embedded.docx(8页珍藏版)》请在冰豆网上搜索。
PowerPCEmbedded
PowerPCEmbedded
PowerPC的PCI总线的dts配置
2010年08月30日
powerpc使用称为FDT扁平设备描述树的机制传递给内核硬件配置参数,从而引导内核。
这样的优势是PowerPC在Linux上的移植基本上都是对dts文件的修改,而升级内核的工作量远远小于其他cpu体系结构。
只是目前介绍FDT或者OPENFirmware的中文资料欠缺,这里记录我领悟的关于PCI总线树部分的ranges参数。
pci0:
pci@e0008500{
interrupt-map-mask=<0xf800007>;
interrupt-map=<
/*IRQ5=21=0×15,IRQ6=0×16,IRQ7=23=0×17*/
/*IDSELAD14IRQ6inta*/
0×70000×00×00×1&ipic0×120×8
/*IDSELAD15IRQ5inta,IRQ6intb,IRQ7intd*/
0×78000×00×00×1&ipic0×130×8
>;
interrupt-parent=<&ipic>;
interrupts=<660×8>;
bus-range=<0×00×0>;
ranges=<0×020000000×00×900000000×900000000×00×10000000
0×420000000×00×800000000×800000000×00×10000000
0×010000000×00×000000000xe03000000×00×00100000>;
sleep=<&pmc0×00010000>;
clock-frequency=<66666666>;
#interrupt-cells=<1>;
#size-cells=<2>;
#address-cells=<3>;
reg=<0xe00085000x100/*internalregisters*/
0xe00083000×8>;/*configspaceaccessregisters*/
compatible=“fsl,mpc8349-pci”;
device_type=“pci”;
};
这是一个mpc8379的dts配置文件,一些属性还是很好理解,
pci@e0008500说明这个pci控制器的寄存器映射基地址为e0008500
reg=<0xe00085000x100/*internalregisters*/
0xe00083000×8>;/*configspaceaccessregisters*/
再次证明,pci控制器的寄存器映射基地址为e0008500,读取配置空间使用的寄存器映射基址为0xe0008300,后面是长度,8个字节。
即CFG_ADDR和CFG_DATA这两个寄存器。
最最费解的是ranges,用来描述cpu地址空间和pci地址空间的映射关系。
对于e300内核来说,一组配置由6个32位16进制组成。
ranges=
<0×020000000×00×900000000×900000000×00×10000000
0×420000000×00×800000000×800000000×00×10000000
0×010000000×00×000000000xe03000000×00×00100000>;
这里有3组,开头的第一个32位数表明映射的地址的属性。
0x01000000是IO映射,0x02000000是内存映射,0x42000000也是内存映射,支持预取。
第2-3个双字表示pci总线的地址空间,用2个双字因为PCI总线可能是支持64位寻址的。
第4个双字表示放cpu_address,即cpu存储器域地址空间,是cpu寻址的空间。
e300是32位cpu,如果是e500内核,则需要2个双字了。
第5-6个双字表示映射长度
内核启动消息里显示
mpc837x_rdb_setup_arch()
FoundFSLPCIhostbridgeat0x00000000e0008500.Firmwarebusnumber:
0->0
PCIhostbridge/pci@e0008500(primary)ranges:
MEM0×0000000090000000..0x000000009fffffff->0×0000000090000000
MEM0×0000000080000000..0x000000008fffffff->0×0000000080000000Prefetch
IO0x00000000e0300000..0x00000000e03fffff->0×0000000000000000
正好与之匹配。
分配配置空间要注意cpu存储器域地址空间,不要跟其他设备的cpu存储器域地址空间重复。
************************************************************************************************************
/*IPIC
*interruptscell=<intr#,sense>
*sensevaluesmatchlinuxIORESOURCE_IRQ_*defines:
*sense==8:
Level,lowassertion
*sense==2:
Edge,high-to-lowchange
*/
pic@700{
linux,phandle=<700>;--->节点标记号
interrupt-controller;--->表明为中断控制器
#address-cells=<0>;
#interrupt-cells=<2>;--->表示响应边缘触发的中断(由高电平到低电平)
reg=<700100>;--->中断控制器IMMR的偏移量以及大小
built-in;
device_type="ipic";--->设备类型:
IntegratedProgrammableInterruptController
};
pci@8500{
interrupt-map-mask=<f800007>;
--->interrupt-map-mask由unitaddressmask以及
interruptspecifiermask两部分组成,每部分
占cells的个数分别由#address-cells与#interrupt-cells
决定。
interrupt-map=<
/*IDSEL0x0E-miniPCI*/
7000001700128
7000002700128
7000003700128
7000004700128
/*IDSEL0x0F-PCIslot*/
7800001700118
7800002700128
7800003700118
7800004700128>;
--->interrupt-map表示每个PCI设备中断与IPIC之间的对应关系
如下:
700000
表示unitaddress,由#address-cells决定其大小,其值
为<700000>&<f80000>(位与)取高5位得到0x0e,对应该PCI
设备的IDSELAD值;
1
表示该PCI设备的INTA跨接PCI中断控制器的INTX。
每个
PCI设备有INTA、INTB、INTC以及INTD四个硬件中断(
对应数值为1、2、3以及4),该值表示该PCI设备与PCI
Controller相连的硬件中断引脚。
700
表示所应该连接的中断控制器的标记号
118
表示占用中断控制器(如IPICController)向量值,即为
interruptspecifier值,8表示电平触发;
interrupt-parent=<700>;
interrupts=<428>;
--->interrupts由两部分组成interruptspecifier值(66),
以及interrupttype/sense(8,表示电平触发)。
bus-range=<00>;
ranges=<0200000009000000090000000010000000
4200000008000000080000000010000000
01000000000000000e2000000000100000>;
--->rangs由busaddress,parentbusaddress,size三部分组成;
其每一部分占#size-cells个cells。
busaddress,表示占用总线的地址范围,如PCIBridge设备,
它就表示一个PCI地址。
(busaddress,size)定义了PCIBridge
下游PCI子设备所占用的PCI地址范围;
parentbusaddress,表示该总线在父总线上的地址,如PCI控制
器,它则表示CPUBUS的地址;它定义了父总线上MAP该设备
的起始地址。
clock-frequency=<3f940aa>;
#interrupt-cells=<1>;--->表示interruptspecifier占一个cell
#size-cells=<2>;--->表示rangs每一个值占两个cells
#address-cells=<3>;--->表示unitaddress占三个cells
reg=<8500100>;
compatible="83xx";
device_type="pci";
sleep=<b0018000100000>;
};
/*phytype(ULPI,UTMI,UTMI_WIDE,SERIAL)*/
--->USBPHY四种类型:
ULPI为外置PHY接口,可用于OTG模式
UTMI为内置8位数据宽度的PHY接口
UTMI_WIDE为内置16位数据宽度的PHY接口
SERIAL为串行接口
usb@23000{
device_type="usb";
compatible="fsl-usb2-dr";--->drdual-role,可以充当两个角色:
设备和主控制器
reg=<230001000>;
#address-cells=<1>;
#size-cells=<0>;
interrupt-parent=<700>;
interrupts=<262>;
phy_type="utmi_wide";
control_init=<00000280>;//UTMIext48MHzclk
sleep=<b0018003000000>;
};
注:
一般来说,每个cell占用32位
#address-cells=<1>;1表示地址32位,2表示地址64位
#size-cells=<1>;1表示rangs的每部分占一个cell,依此类推
#interrupt-cells=<2>;2表示interrupts用两个cell表示中断<interruptnumber,interrupttype>
*****************************************************************************************************
OpenFirmware的API函数
OF提供了许多API,查找保存在全局链表allnodes中的devicenode。
这些API函数的源代码见./arch/powerc/kernel/prom.c文件。
其主要API如下所示:
of_get_flat_dt_root函数。
该函数用来查找在dtb中的根节点。
of_find_node_by_path函数。
该函数根据deice_node结构的full_name参数,在全局链表allnodes中,查找合适的device_node。
该函数的使用方法如下所示:
复制代码
structdevice_node*cpus;
cpus=of_find_node_by_path("/cpus");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PowerPC Embedded