设为首页 加入收藏

TOP

rtthread移植到jz2440之BootLoader(三)
2019-09-01 23:09:19 】 浏览:100
Tags:rtthread 移植 jz2440 BootLoader
;
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */ UTXH0 = c; } void puts(char *str) { int i = 0; while (str[i]) { putc(str[i]); i++; } } void puthex(unsigned int val) { /* 0x1234abcd */ int i; int j; puts("0x"); for (i = 0; i < 8; i++) { j = (val >> ((7-i)*4)) & 0xf; if ((j >= 0) && (j <= 9)) putc('0' + j); else putc('A' + j - 0xa); } } View Code

start.S

    a、 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
    b、如果bootloader比较大,要把它重定位到SDRAM
    c、把内核从NAND FLASH读到SDRAM
   e、设置"要传给内核的参数"
 
#define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))
#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))
#define MEM_CTL_BASE    0x48000000

.text
.global _start
_start:

/* 1. 关看门狗 */
    ldr r0, =0x53000000
    mov r1, #0
    str r1, [r0]
    
/* 配置GPF4为输出引脚
 * 把0x100写到地址0x56000050
 */
    ldr r1, =0x56000050
    ldr r0, =0x1500    /* mov r0, #0x100 */
    str r0, [r1]
/* 设置GPF4输出高电平 
 * 把0写到地址0x56000054
 */
    ldr r1, =0x56000054
    ldr r0, =0    /* mov r0, #0 */
    str r0, [r1]
/* 2. 设置时钟 */
    ldr r0, =0x4c000014
    //    mov r1, #0x03;              // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
    mov r1, #0x05;              // FCLK:HCLK:PCLK=1:4:8
    str r1, [r0]

    /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
    mrc    p15, 0, r1, c1, c0, 0        /* 读出控制寄存器 */ 
    orr    r1, r1, #0xc0000000            /* 设置为“asynchronous bus mode” */
    mcr    p15, 0, r1, c1, c0, 0        /* 写入控制寄存器 */

    /* MPLLCON = S3C2440_MPLL_400MHZ */
    ldr r0, =0x4c000004
    ldr r1, =S3C2440_MPLL_400MHZ
    str r1, [r0]

    /* 启动ICACHE */
    mrc p15, 0, r0, c1, c0, 0    @ read control reg
    orr r0, r0, #(1<<12)
    mcr    p15, 0, r0, c1, c0, 0   @ write it back


/* 3. 初始化SDRAM */
    ldr r0, =MEM_CTL_BASE
    adr r1, sdram_config     /* sdram_config的当前地址 */
    add r3, r0, #(13*4)
1:
    ldr r2, [r1], #4
    str r2, [r0], #4
    cmp r0, r3
    bne 1b

/* 4. 重定位 : 把bootloader本身的代码从flash复制到它的链接地址去 */
    ldr sp, =0x34000000

    bl nand_init

    mov r0, #0
    ldr r1, =_start
    ldr r2, =__bss_start
    sub r2, r2, r1
    
    bl copy_code_to_sdram
    bl clear_bss
    
/* 5. 执行main */
    ldr lr, =halt
    ldr pc, =main
halt:
    b halt

sdram_config:
    .long 0x22011110     //BWSCON
    .long 0x00000700     //BANKCON0
    .long 0x00000700     //BANKCON1
    .long 0x00000700     //BANKCON2
    .long 0x00000700     //BANKCON3  
    .long 0x00000700     //BANKCON4
    .long 0x00000700     //BANKCON5
    .long 0x00018005     //BANKCON6
    .long 0x00018005     //BANKCON7
    .long 0x008C04F4     // REFRESH
    .long 0x000000B1     //BANKSIZE
    .long 0x00000030     //MRSRB6
    .long 0x00000030     //MRSRB7
View Code

boot.c

实现把rtthread从nandflash读到SDRAM

extern void uart0_init(void);
extern void nand_read(unsigned int addr, unsigned char *buf, unsigned int len);
extern void puts(char *str);
extern void puthex(unsigned int val);
extern void led_on(void);
extern void led_off(void);

int strlen(char *str)
{
    int i = 0;
    while (str[i])
    {
        i++;
    }
    return i;
}

void strcpy(char *dest, char *src)
{
    while ((*dest++ = *src++) != '\0');
}

int main(void)
{
    void (*theKernel)( unsigned int params);
    unsigned int *p = 0x30000000;
    /* 0. 帮内核设置串口: 内核启动的开始部分会从串口打印一些信息,但是内核一开始没有初始化串口 */
    uart0_init();
    
    /* 1. 从NAND FLASH里把内核读入内存 */
    puts("Copy kernel from nand\n\r");
    nand_read(0x0, (unsigned char *)0x30000000, 0x100000);
    puts("\n\r");
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇痞子衡嵌入式:开启NXP-MCUBootUt.. 下一篇内存相关工具

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目