RTEMS在S3C2440上的移植-(4)

时间:2022-05-01 20:08:40
TQ2440硬件平台的RTEMS系统BSP的移植--下

         有了前一篇文章的铺垫,基本上移植的工作就成功了一大半了,接下来要做的就是针对2410和2440的不同及不同开发板模块、接口的差异对2410的BSP进行修改工作。由于2410的寄存器基本吻合,所以头文件不改也没问题,这里我主要还是参考了Etual大牛的博客做了一下工作:     1.修改了时钟(PLL设置)。     libcpu\arm\s3c24xx\clock\support.c
    修改get_FCLK
    由于2440 的PLL计算公式不同,在原来的基础上乘以2 就行了。修改为
    return((BSP_OSC_FREQ * m * 2) / (p << s));
    2.对启动代码进行修改。libbsp\arm\sbc2440\start\start.S     删除 GamePark magic sequence
    修改启动代码,我是用GDB的话,则会根据ELF文件自动下载的,RTEMS 的运行地址是 0x30000100 添加初始化
    (1)关闭看门狗,关闭所有中断,SVC模式
    (2)设置PLL,将 FCLK : HCLK : PCLK 设置为 200 : 100 : 50 MHZ
    (3)清除 .bss 段的内容。
    (4)接着做RTEMS 原来的初始化
    添加到内容如下
        /*
         * Etual add
         */
#define WTCON        0x53000000
#define INTMSK         0x4A000008
#define INTSUBMSK     0x4A00001C

        /*
         * watching dog off
         */
        ldr     r0, =WTCON
        mov     r1, # 0x0
        str     r1, [r0]

        /*
         * mask all IRQs by setting all bits in the INTMR - default
         */
        mov     r1, # 0xffffffff
        ldr     r0, =INTMSK
        str     r1, [r0]

        ldr     r1, =0x7ff
        ldr     r0, =INTSUBMSK
        str     r1, [r0]

        /*
         * FCLK:HCLK:PCLK = 1:2:4
         * default OSC = 12MHZ
         * FCLK : HCLK : PCLK = 200 : 100 : 50 MHZ
         */
        mov     r1, # 0x4C000000
        adr     r2, pll_cfg_val
        add     r3, r1, # 7*4
1:
        ldr     r4, [r2], #4
        str     r4, [r1], #4
        cmp     r1, r3
        bne     1b

        mrc     p15, 0, r1, c1, c0, 0
        orr     r1, r1, #0xc0000000
        mcr     p15, 0, r1, c1, c0, 0

        b       clear_bss

pll_cfg_val:
        .long   0xFFFFFFFF              @LOCKTIME 0x4C000000
        .long   0x0005C012              @MPLLCON
        .long   0x00038021              @UPLLCON
        .long   0x001FFFF0              @CLKCON
        .long   0x00000004              @CLKSLOW
        .long   0x00000003              @CLKDIVN
        .long   0x00000000              @CAMDIVN

        /*
         * clear .bss
         */
clear_bss:
        ldr     r0, =_axf_bss_start
        ldr     r1, =_axf_bss_end
        mov     r2, #0x00000000
        b       clbss_2
clbss_l:
        str     r2, [r0]
        add     r0, r0, #4
clbss_2:
        cmp     r0, r1
        bne     clbss_l
    3.修改串口相关的代码 static ssize_t uart_write(int minor, const char *buf, size_t len)
    函数下修改这里:
            while(!(rUTRSTAT0 & 0x4)) //原来这里为0x2
{ ...                 }

    初始化函数不使用FIFO直接使用死循环模式。
static void uart_init(int minor)
{
    int i;
    unsigned int reg = 0;

    rGPHCON  |= 0xa0;
    rGPHUP   = 0x0c;

    /* enable UART0 */
    rCLKCON|= (1<<10);

    /* value is calculated so : (int)(PCLK/16./baudrate) -1 */
    reg = get_PCLK() / (16 * 115200) - 1;

    /* FIFO enable, Tx/Rx FIFO clear */
    rUFCON0 = 0x0;
    rUMCON0 = 0x0;
    /* Normal,No parity,1 stop,8 bit */
    rULCON0 = 0x3;
    /*
     * tx=level,rx=edge,disable timeout int.,enable rx error int.,
     * normal,interrupt or polling
     */
    rUCON0 = 0x05;
    rUBRDIV0 = reg;

    for (i = 0; i < 100; i++);
}

    主要修改UART0口的初始化就行了,不用FIFO,主要发送的时候判断。
    4.sbc2440/startup/bspstart.c 屏蔽掉设置时钟频率,设置SDRAM控制器到代码,因为时钟已经在 start.S 中做了。而内存控制器在gdb的启动脚本中做,在debug开发不许要设置。 bsp_start_default 函数中
  /* setup clocks */
//  rCLKDIVN = M_CLKDIVN;
//  rMPLLCON = ((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);
  /* setup rREFRESH
   * period = 15.6 us, HCLK=66Mhz, (2048+1-15.6*66)
   */
//  REFCNT   = 2048+1-(15.6*get_HCLK()/1000000);
//  rREFRESH = ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);
    5.完成之后 make install 安装     (本文对原作进行了少量的修改!原文:http://blog.csdn.net/etual/article/details/18003067)