亮仔移植u-boot系列之-- S3c2440在最新版本U-boot-2015.10移植(支持SPL模式启动) -- 2


    这章讲解BL1的移植方法.

    打开Start.S文件,在Cpu上电后的第一条命令b reset后进入这个文件执行后续操作,和老的u-boot版本一样执行了以下步骤

     1:切换到svc32模式,关闭icache和dcache

     2:关中断

     3:关狗

     4:设置时钟分频比

     5:设置各个Bank

     6:搬移BL2的代码从Nand Flash到SDRAM

     7:跳转到_main执行

     显然过程1-过程5只需要在BL1阶段执行1次,BL2直接在b reset后直接跳转到过程6执行.(++表示添加的)

++ #if defined(CONFIG_SPL_BUILD)
   /*
    * set the cpu to SVC32 mode
    */
   mrs	r0, cpsr
   bic	r0, r0, #0x1f
   orr	r0, r0, #0xd3
   msr	cpsr, r0
   .
   .
   .
   .
   .
++#else //#if defined(CONFIG_SPL_BUILD)
    ldr     r0, =0x56000054
    mov     r1, #0xffffff8f
    str     r1, [r0]    //Set Led1 2 3 On
++#endif
    
    bl _main

     由于2440和2410时钟设置上有区别,因此我将时钟设置这段代码注释了,因为俺的汇编比较渣,所以针对2440的时钟初始化工作我移到设置完sp后跳转到c代码yl_clock_init去执行.

   /* FCLK:HCLK:PCLK = 1:2:4 */
   /* default FCLK is 120 MHz ! */
   -- ldr	r0, =CLKDIVN
   -- mov	r1, #3
   -- str	r1, [r0]

      还要注意关闭中断,将ldr r1, =0x3ff修改为0x7fff

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

      _main在arch\arm\lib目录下的Crt0.S文件内,我在yl2440.h目录下设置了

   #define CONFIG_SPL_STACK   0x1000
      即SPL模式下的堆栈指针指向Cpu的Steppingstone的最顶部.

  #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
	ldr	sp, =(CONFIG_SPL_STACK)
  #else
	ldr	sp, =(CONFIG_SYS_INIT_SP_ADDR)
  #endif

   当PC指针指向这个点,BL1的任务只剩下之前提到的step4,6,7了,在bl board_init_f处做如下处理,即SPL模式下不需要进入

board_init_f板块第一次初始化函数,修改为bl yl_clock_init通过C语言的方式初始化时钟,具体yl_clock_init()功能实现网上很多,本文就不多讲了.

  #if defined(CONFIG_SPL_BUILD)
        bl  yl_clock_init
       /* Read u-boot from Nandflash to SDRAM address $CONFIG_SYS_TEXT_BASE */
        ldr r0, =BL2_MTD_OFFSET
        ldr r1, =CONFIG_SYS_TEXT_BASE
        ldr r2, =BL2_MTD_LENTH

        bl yl_copy_code_from_nand_to_sdram
        ldr pc, =CONFIG_SYS_TEXT_BASE
   #else
	bl	board_init_f
   #endif	

     在yl2440.h定义上面上个宏:

  #define BL2_MTD_OFFSET          0x20000  /* BL2: 128K nand offset - 1Block */
  #define BL2_MTD_LENTH           0x100000 /* BL2: 1M nand lenth */
  #define CONFIG_SYS_TEXT_BASE	0x30008000

     BL2_MTD_OFFSET因为我板子上的Nand Flash是2K/Page,总共64个Page,那么整个Block大小是128K.规划BL1.bin存放在Block0,BL2.bin存放在Block1,BL2_MTD_LENTH表示了BL2占用从block1起头的1M空间.

    CONFIG_SYS_TEXT_BASE是BL2链接时在SDRAM的运行地址,因此只要yl_copy_code_from_nand_to_sdram函数将Nand Flash所在的BL2位子搬移到SDRAM的CONFIG_SYS_TEXT_BASE处,再将pc指针指向这个BL2代码运行的首地址,则BL1就一去不复返了,将控制权交给了BL2.

    BL2无非需要实现以下几个任务:

      1:能通过串口打印相关信息,通过串口实现有关功能

      2:能读写nand flash,将内核镜像和根文件系统写道某个nand flash特定分区内

      3:能通过网线实现tftp传输相关文件

      4:能引导linux内核

 

      下一章将实力分析BL2代码的重定位和串口功能的实现.

  


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值