设为首页 加入收藏

TOP

移植u-boot-2012.04.01到JZ2440(一)
2017-10-10 21:05:44 】 浏览:8734
Tags:移植 u-boot-2012.04.01 JZ2440

开发板:JZ2440  256M NandFlash  64M SDRAM


交叉编译器:arm-linux-gcc-4.3.2


u-boot:u-boot-2012.04.01 


  最近在学习BootLoader,移植u-boot-2012.04.01到JZ2440开发板,现在把移植过程记录下来,一来梳理思路,二来方便以后更进一步学习。


一、  u-boot分析过程


    a、 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH


    b、如果bootloader比较大,要把它重定位到SDRAM


    c、把内核从NAND FLASH读到SDRAM


    d、设置"要传给内核的参数"


    e、跳转执行内核


具体代码分析


1、set the cpu to SVC32 mode


2、turn off the watchdog


3、mask all IRQs by setting all bits in the INTMR


4、设置时钟比例


5、设置内存控制器


6、设置栈,调用C函数board_init_f


7、调用函数数组init_sequence里的各个函数


    7.1 board_early_init_f : 设置系统时钟、设置GPIO


......................................


8、重定位代码


    8.1 从NOR FLASH把代码复制到SDRAM


    8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址",现在把程序复制到了SDRAM,需要修改代码,把"基于0地址编译得到的地址"改为新地址。


    8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs


9、clear_bss


10、调用C函数board_init_r:第2阶段的代码


 


二、初始编译


 1、  解压 u-boot-2012.04.01.tar.bz2



tar xjf u-boot-2012.04.01.tar.bz2


进入解压后文件目录


cd u-boot-2012.04.01


2、在解压后文件目录下根据靠近的单板,配置


make smdk2410_config
make


这个时候编译完成后是不能在JZ2440上正常运行


三、建立自己的单板,定制适合自己单板的bootloader


1、新建一个单板


    cd board/samsung/
    cp smdk2410 smdk2440 -rf
    cd ../../include/configs/
    cp smdk2410.h smdk2440.h


修改boards.cfg


仿照2410,添加2440



smdk2410                    arm        arm920t    -                  samsung        s3c24x0


添加


smdk2440                    arm        arm920t    -                  samsung        s3c24x0


make , 烧写调试


2、根据需求进一步配置


make menuconfig 


3、修改Makefile ,开头指定架构和编译器


 ARCH=arm
 CROSS_COMPILE=arm-linux-


4、修改uboot代码,适合单板


  uboot里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置


  处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置


a、设置PLL的时钟的函数在_main中的board_init_f中初始化函数列表中的  boad_early_init_f 中,设置MPLL倍频值。它应该要在设置分频系数和初始化内存控制器之前来设置。


做如下修改: 在smdk2410.c文件中找到设置MPLL部分的代码,注释掉。


 



    /* to reduce PLL lock time, adjust the LOCKTIME register */
        //writel(0xFFFFFF, &clk_power->locktime);


      /* configure MPLL */
        //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
          //    &clk_power->mpllcon);


然后在start.S中再设置MPLL


#define S3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
#if 0
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
  #else
        /* 2. 设置时钟 400MHz */
        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,

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python3基本语法简述 下一篇Java中equals与==的用法比较

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目