请稍侯

Ppc使用中遇到的问题

(以下内容试用于 freescale 的 mpc83xx 和 p1020 系列)

  1. 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 校验算法相同。
  2. 内存长度配置 ppc 配置内存长度有多处寄存器需要设置:
    • LAW : LAW_LAWBAR
    • localbus : eLBC_ORg
    • ddr 控制器 : DDR_CSn_BNDS
    • mmu : tlb
  3. 配置外部中断(p1020) 配置寄存器 PIC_EIVPRn 设置中断优先级和中断触发方式(极性、edge or level sensitive),以及中断向量地址,以及寄存器 PIC_EIDRn,设置那个core 可以接收该中断和该中断是否是 critical interrupt 等。

配置内部中断类似(配置寄存器 PIC_IIDRnPIC_IIVPRn),不过不需要设置 edge or level sensitive。

  1. processor ID 寄存器 (PIR) PIR 在文档说明是 read-only,但是实际上初始值为 0,每个 core 需要把自己的实际 ID 写到 PIR 寄存器里。如果要获取处理器 ID 最好读取寄存器 PIC_WHOAMI 获取处理器 ID

  2. 双核启动 p1020 作为双核处理器有两种启动模式,一种是和其它多核处理器(如arm a9 x2)一样的模式,即 core 0 首先启动,然后由软件唤醒 core 1 (core 2、 core 3 、、、类似),另一种模式是两个 core 同时启动,分别直接从存储介质执行指令。

大部分情况下都使用第一种模式,根据需要由软件控制 cpu 的启动顺序,这种也是通行方式;第二种方式在一些 rtos 中采用,比如 ucos 2/3 ,做法是两个 core 同时执行一份代码,然后根据所处的 core no 执行不同的代码分支。