移植过程主要参考http://blog.chinaunix.net/u1/34474/showart.php?id=397315文章,tekkamna写的很详细!下面就移植过程中出现的问题和学到的东西进行总结:
1.U-BOOT 启动分为两个阶段,第一阶段主要是对时钟和中断进行初始化。这主要在/cpu/arm920t/start.S中,我们只要修改其中的中断屏蔽语句、时钟配置语句。
2.在第一阶段中还会跳入cpu_init_crit中执行,在其中主要是禁止MMU,刷新寄存器。然后系统会跳入到lowlevel_init中去执行,这一步很关键,主要是初始化SDRAM的时序,为重定向NAND内的程序做准备。
3.然后就是修改对NAND中的U-BOOT程序的重定向(也就是把NAND中的U-BOOT拷到SDRAM中)语句。重定向的地址由"=TEXT_BASE"来指定,"=TEXT_BASE"定义在/board/smdk2410/config.mk
注意:由于这里需要调用C语言NAND_READ_LL函数,所以要定义栈指针。?
.align ? ? 2
DW_STACK_START: ?.word ?STACK_BASE+STACK_SIZE-4
4.在第一阶段执行完成后,程序就跳入start_armboot中执行。在start_armboot中通过执行一个函数指针数组
for (init_fnc_ptr = init_sequence; *init_fnc_ptr;++init_fnc_ptr)来执行一系列初始化函数。
5.下面就是修改/include/configs/hongge2440.h(这个头文件根据自己的定义而不同),修改的内容主要是一些寄存器和宏的定义。特别注意,下面三个要定义成char型,这主要是它们都是8位的(这个可以看2440的DATASHEET):
#define rNFCMD (*(volatile unsigned char *)0x4e000008)
#define rNFADDR (*(volatile unsigned char *)0x4e00000c)
#define rNFDATA (*(volatile unsigned char *)0x4e000010)
6.修改/cpu/arm920t/s3c24x0/speed.c文件,这个文件中主要提供了算FCLK,HCLK等,这些函数将会在计算波特率、探测系统时钟频率的时候用到,如果设错了就会导致串口输出乱码。
7.env_relocate(),该函数是在start_armboot中被调用,用来对环境变量重定向。我的理解是把NAND中的保存的环境变量读到内存中,如果NAND中没有的话就使用默认的环境变量配置!
U-BOOT移植过程中碰到的问题:
1.修改了start.S中的文件后串口没有任何反映。
?? ?分析了整个程序后,发现少设置了一个NAND寄存器,导致程序在拷贝UBOOT到SDRAM中时总是不对。。。。。。。
2,修改start.S后通过点灯程序发现程序已经走完第一阶段,但串口输出总为乱码。通过分析发现lowlevel_init中SDRAM的时序设置不对,同时speed.c中对于HCLK,FCLK读取函数不对,这导致寄存器的值计算不正确。
3. 关于NAND FLASH ID、读、写都不正确的问题。
??在移植的过程中发现对FLASH ID、读、写都不正确,开始以为是UBOOT对FLASH的操作有问题,但后来发现写入的数据总是32位往里写入。导致每次写入的数据都不对,坏块标记位总是不对。在仔细检查后发现对rNFDATA的定义不对,在2440 DATASHEET中说明数据位都为8位,但我却使用
#define rNFADDR (*(volatile unsigned int *)0x4e00000c)
定义为32位(int在arm中为32位,short ... 为16位,char 为8位)
正确的定义应该如下:
#define rNFADDR (*(volatile unsigned char *)0x4e00000c)
注意:这里必须使用volatile,应为该地址为寄存器,需要每次更新其中数据,不然编译器会读取内存中已有的数据而不去真正的寄存器更新数据。
4.关于不能启动linux,总是报错内核参数错误。这个错误可以更改内核中的head.S文件,手动给其赋值。
MOV R0,#0
MOV R1,...
但也可以修改lib_arm/armlinux.c中的do_bootm_linux()函数。下面是对LINUX内核启动参数的详解:
CPU register settings
r0 = 0.
r1 = machine type number.
r2 = physical address of tagged list in system RAM.
CPU mode
All forms of interrupts must be disabled (IRQs and FIQs.)
The CPU must be in SVC mode. (A special exception exists for Angel.)
Caches, MMUs
The MMU must be off.
Instruction cache may be on or off.
Data cache must be off and must not contain any stale data.
Devices
DMA to/from devices should be quiesced.
The boot loader is expected to call the kernel image by jumping directly to the first instruction of the kernel image.