移植uboot到JZ2440的笔记

移植的是u-boot-2012.04.01
    下面基本上都是东山老师移植uboot视频的实验笔记,移植中出现的很多问题,下面可能都会有你想要的答案。
虽然下面这个笔记对着实验按部就班,没有什么深度,但我觉得很有用,解决问题的过程中,不懂的地方也就懂了,
实践是学习的好方法,既检验理论知识,遇到问题又促进思考,互相作用,效果很好。


uboot配置、编译:
两条命令搞定:
1、make smdk2410_config //为什么能够执行这条命令?顶层Makefile中找不到smdk2410_config及相类似的目标。
//依赖顶层目录boards.cfg文件,其他单板的配置项也来自这里/
2、make
现象:arm-linux-gcc3.4.5工具链版本太低导致make 编译u-boot-2012.04.01失败;使用 4.3.2版本解决问题

显示环境变量echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin

安装arm-linux-gcc.4.3.2 //发现已经安装arm-linux-gcc 4.3.2 

扩展环境变量: //临时扩展
export PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
或者写环境变量文件永久修改:vi /etc/environment

用新工具重新编译一次:
make distclean
make smdk2410_config
make

发现编译成功
//这个版本的uboot已经有部分代码支持2440,只是不齐全。
把u-boot.bin烧写,启动,发现没有任何输出。


 修改U-BOOT代码支持2440:
1、建一个单板
cd board/samsung/
cp smdk2410 smdk2440 -rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h
修改顶层目录boards.cfg:
仿照
smdk2410                     arm         arm920t     -                   samsung        s3c24x0
添加:
smdk2440                     arm         arm920t     -                   samsung        s3c24x0

     阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置,如下面注释掉下面两行
 //writel(0xFFFFFF, &clk_power->locktime);
 /* configure MPLL */
 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);

//* 要先正确配置内存控制器,才会有乱码输出。把原来对内存控制器寄存器组全部替换成二期之前的裸板内存寄存器数组
//* 这个寄存器组在lowlevel_init.S里面设置。
/* 存储控制器13个寄存器的值 */
    p[0] = 0x22011110;     //BWSCON
    p[1] = 0x00000700;     //BANKCON0
    p[2] = 0x00000700;     //BANKCON1
    p[3] = 0x00000700;     //BANKCON2
    p[4] = 0x00000700;     //BANKCON3  
    p[5] = 0x00000700;     //BANKCON4
    p[6] = 0x00000700;     //BANKCON5
    p[7] = 0x00018005;     //BANKCON6
    p[8] = 0x00018005;     //BANKCON7
    
                                            /* REFRESH,
                                             * HCLK=12MHz:  0x008C07A3,
                                             * HCLK=100MHz: 0x008C04F4
                                             */ 
    p[9]  = 0x008C04F4;
    p[10] = 0x000000B1;     //BANKSIZE
    p[11] = 0x00000030;     //MRSRB6
    p[12] = 0x00000030;     //MRSRB7

再编译,编出的uboot400多kb,nandfalsh uboot分区装不下。为不破坏nandflash分区,把uboot下载在SDRAM,在复制到
norflash 0地址前面512k执行看看:(这里会破坏掉nor flash 上原来的uboot)
tftp 30000000 u-boot.bin;
protect off all //擦除nor flash写保护
erase 0 7ffff //擦除512k内容
cp.b 30000000 0 80000  //复制到nor的0-80000

这样再次启动就有乱码的东西出来了。

乱码解决办法:
 乱码,查看串口波特率的设置,发现在speed.c:get_HCLK里没有定义CONFIG_S3C2440
    处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410,同时也去掉#define CONFIG_CMD_NAND
                                          //#define CONFIG_S3C2440
                                          //#define CONFIG_CMD_NAND
    或者直接这样处理:在speed.c get_HCLK()函数里返回HCLK的频率也可以:
  return get_FCLK() / 2;   //200/2
重新编译烧写,输出正常,但卡住了:
CPUID: 32440001
FCLK:      400 MHz
HCLK:      100 MHz
PCLK:       50 MHz
DRAM:  64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###


下面解决nand启动的问题
修改u-boot支持nand启动:
    u-boot2012源码中重定位代码之前的代码大于4K则不能nand启动,为了支持nand启动,使用自己写BootLoader那种方法,
在前4K代码中并尽可能早地初始化内存和nand flash以重定位代码,然后跳到重定位后的代码中执行。

    原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"
    使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)
1 去掉 "-pie"选项
      arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行
      
2 参考"毕业班第1课"的start.S, init.c来修改代码
      把init.c放入board/samsung/smdk2440目录, 修改Makefile,添加init.o
      修改include/configs/smdk2440.h:CONFIG_SYS_TEXT_BASE为0x33f80000 
      要修改board.c里面的addr值,注释掉这两句:
      //addr -= gd->mon_len;
      //addr &= ~(4096 - 1);
      添加:
      addr = CONFIG_SYS_TEXT_BASE //或 *addr = _TEXT_BASE  ,addr指定为0x33f00000
      修改start.S,用init.c里面的函数初始化nand,重定位代码,
      复制代码的指令改为:(原来的伪汇编指令 ldr r1,=_start可能会存在问题,当_start值比较复杂时,不知道会存在哪里)
        mov r0, #0
// ldr r1, =_TEXT_BASE //应改为没有=的

//ldr r2, =__bss_start
//sub r2, r2, r1
ldr r1,_TEXT_BASE
ldr r2,_bss_start_ofs

bl copy_code_to_sdram
bl clear_bss

ldr pc,= call_board_init_f /*** 跳转执行 */

删除原来的relocate 和清除bss的代码。
      
      第二阶段void board_init_r(gd_t *id, ulong dest_addr)函数的参数意义:dest_addr:程序的链接地址,
      id:仅有的那个gd结构体
      start.S里bl board_init_f紧接着 bl board_init_r,在board_init_f里面设置bl board_init_r所需的参数 id
      
   3 修改arch/arm/lib/board.c:board_init_f, 把relocate_code去掉,返回id,把id存在r0寄存器,为board_init_r设置第一个参数
      修改board_init_f()函数的返回值类型 为 unsigned int,include/common.h中对其的声明也要修改,并修改common.h中board_init_f 函数的noreturn 属性。
4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面(链接脚本应该是自动生成的,却又可以直接修改其内容?)
      ./arch/arm/cpu/u-boot.lds 中start.o (.text)下面添加:
      
      board/samsung/smdk2440/libsmdk2440.o (.text) //  目录/board/samsung/smdk2440下面的文件被链接成库
      
至此可以nand启动了,不过和nor 启动一样,输出一下信息就卡主了:

U-Boot 2012.04.01 (Dec 22 2017 - 10:20:33)
CPUID: 32440001
FCLK:      400 MHz
HCLK:      100 MHz
PCLK:       50 MHz
DRAM:  64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
还没重新设置栈,可能会出现问题。      
   
先记录到这里,休息一下,下一篇继续。

你可能感兴趣的:(U-Boot与内核)