Ppc使用中遇到的问题
(以下内容试用于 freescale 的 mpc83xx 和 p1020 系列)
- ddr ecc
- mpc8308 和 p1020 都支持 ddr 的 ecc 校验,硬件上需要附加一块 ddr 作为 ecc 内存来存储 ecc 校验值,换言之要使能 ecc 需要两块 ddr , 一块供程序使用,一块供 ecc 使用。
- 使能 ecc 需要在初始化 ddr 之前完成,对于 uboot 来说,就是要在初始化 ddr 控制器、将 flash 的数据拷贝到内存之前就把 ecc 相关的寄存器配置好,举个例子,对于 p1020 来说,需要在函数
initdram()
里调用ddr_enable_ecc()
使能 ecc ,而initdram()
就是再拷贝 flash 数据之前执行的,ddr_enable_ecc()
也是在配置 ddr 的过程中调用的。 - 使能完 ecc 之后不能立即读内存,因为此时的内存的 ecc 校验值都是乱的,直接读取内存肯定会发生 ecc 错误,所以执行之前需要把所有内存初始化一遍,即全部写一遍。
- ppc 的 ddr ecc 支持纠正一位错,可以检测两位错和多位的 nibble 错(注:nibble 错误是啥?)。ecc 的校验算法和 FCM 的 ecc 校验算法相同。
- 内存长度配置
ppc 配置内存长度有多处寄存器需要设置:
- LAW : LAW_LAWBAR
- localbus : eLBC_ORg
- ddr 控制器 : DDR_CSn_BNDS
- mmu : tlb
- 配置外部中断(p1020)
配置寄存器
PIC_EIVPRn
设置中断优先级和中断触发方式(极性、edge or level sensitive),以及中断向量地址,以及寄存器PIC_EIDRn
,设置那个core 可以接收该中断和该中断是否是 critical interrupt 等。
配置内部中断类似(配置寄存器 PIC_IIDRn
和 PIC_IIVPRn
),不过不需要设置 edge or level sensitive。
-
processor ID 寄存器 (PIR) PIR 在文档说明是 read-only,但是实际上初始值为 0,每个 core 需要把自己的实际 ID 写到 PIR 寄存器里。如果要获取处理器 ID 最好读取寄存器 PIC_WHOAMI 获取处理器 ID
-
双核启动 p1020 作为双核处理器有两种启动模式,一种是和其它多核处理器(如arm a9 x2)一样的模式,即 core 0 首先启动,然后由软件唤醒 core 1 (core 2、 core 3 、、、类似),另一种模式是两个 core 同时启动,分别直接从存储介质执行指令。
大部分情况下都使用第一种模式,根据需要由软件控制 cpu 的启动顺序,这种也是通行方式;第二种方式在一些 rtos 中采用,比如 ucos 2/3 ,做法是两个 core 同时执行一份代码,然后根据所处的 core no 执行不同的代码分支。