接上回,内容太多了,我们开启第二章
1.时钟初始化
1.1更改串口输出的CPU信息



1.2重新设置时钟参数
发现irom中并未按照cpu数据手册中推荐的最佳参数设置的
在串口初始化之前输入系统始终初始化程序调用

添加初始化时钟代码,记得包含头文件#include <s5pc110.h>
cpp
system_clock_init:
ldr r0, =ELFIN_CLOCK_POWER_BASE @0xe0100000
/* Set Mux to FIN */
ldr r1, =0x0
str r1, [r0, #CLK_SRC0_OFFSET]
ldr r1, =APLL_LOCKTIME_VAL
str r1, [r0, #APLL_LOCK_OFFSET]
/* Disable PLL */
retryloop:
ldr r1, =0x0
str r1, [r0, #APLL_CON0_OFFSET]
ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET]
ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET]
ldr r1, [r0, #CLK_DIV0_OFFSET]
ldr r2, =CLK_DIV0_MASK
bic r1, r1, r2
ldr r2, =CLK_DIV0_VAL
orr r1, r1, r2
str r1, [r0, #CLK_DIV0_OFFSET]
ldr r1, =APLL_VAL
str r1, [r0, #APLL_CON0_OFFSET]
ldr r1, =MPLL_VAL
str r1, [r0, #MPLL_CON_OFFSET]
ldr r1, =VPLL_VAL
str r1, [r0, #VPLL_CON_OFFSET]
#if defined(CONFIG_EVT1)
ldr r1, =AFC_ON
str r1, [r0, #APLL_CON1_OFFSET]
#endif
mov r1, #0x10000
1: subs r1, r1, #1
bne 1b
/* MPLL software workaround */
ldr r1, [r0, #MPLL_CON_OFFSET]
orr r1, r1, #(1<<28)
str r1, [r0, #MPLL_CON_OFFSET]
mov r1, #0x100
1: subs r1, r1, #1
bne 1b
ldr r1, [r0, #MPLL_CON_OFFSET]
and r1, r1, #(1<<29)
cmp r1, #(1<<29)
bne retryloop
/* H/W lock detect disable */
ldr r1, [r0, #MPLL_CON_OFFSET]
bic r1, r1, #(1<<28)
str r1, [r0, #MPLL_CON_OFFSET]
ldr r1, [r0, #CLK_SRC0_OFFSET]
ldr r2, =0x10001111
orr r1, r1, r2
str r1, [r0, #CLK_SRC0_OFFSET]
/* CLK_DIV6 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0x7<<12) @; ONENAND_RATIO: 0
str r1, [r0, #CLK_DIV6_OFFSET]
mov pc, lr
在配置文件中添加配置定义

2.SDRAM初始化


需要修改SDRAM配置定义,我们只有两块容量256MB的ddr

修改容量大小并且删掉第三块ddr


ok ddr初始化完成
3.添加机器码的定义


4.board_init_r函数的移植
4.1关掉电源管理芯片的初始化

4.2关闭onenand初始化
我们根本没有onenand这个设备,你只需要将这个宏定义给注释掉就可以了。


如果有其他问题我再去改
发现问题一,我们根本就不需要编译这个文件,把这个文件干掉就可以

在common文件夹下的makefile中有这个文件的编译选项

你把头文件定义里面的宏定义给干掉他就不会编译了

但是会报错,添加以下环境变量

再干掉这个


此时可以看到命令行并且支持部分指令。但是mmc是错误的
来到他的初始化代码,他有个检测mmc代码和我们的不匹配,直接将初始化函数复制一遍,注释掉检测代码就可以:

4.3sd卡驱动移植
uboot官方版本驱动在u-boot-2013.10/divers/mmc文件夹

在makefile中注释掉编译链接选项

在配置文件中注释掉条件定义(其实这两件事做一个就可以)

添加定义

修改初始化代码,mmc初始化逻辑:
board.c -> mmc_initialize(gd->bd); -> mmc.c -> if (board_mmc_init(bis) < 0) -> goni.c
-> int board_mmc_init(bd_t *bis)

把setup_hsmmc.c复制到官方goni文件夹下,修改makefile

把mmc.h、cmd_mmc.c替换到当前目录
注释掉不需要的.o文件

添加头文件


如何在uboot中测试mmc是否可用


sd卡到此移植成功,读写测试均成功。
5环境变量
环境变量的保存问题

环境变量保存位置问题
uboot烧录时使用的扇区是SD2(外部sd卡)的1-16【bl1】扇区和49-X【bl2】(X-49应该大于uboot的大小)
ENV的大小为16K字节,也就是32扇区。
sd_fusing:

sd卡烧录配置
SD2的扇区0空闲
扇区1-16被uboot的BL1占用
扇区17-48空闲
扇区49-x被uboot的BL2占用
再往后就是内核、rootfs等镜像的分区了。系统移植工程师可以根据kernel镜像大小、rootfs大小等来自由给SD分区。
但是现在的env位置在inand(sd0)中

代码分析:
CONFIG_ENV_OFFSET这个红决定了env被写到了第几个扇区,这里是0,也就是0-31扇区

那肯定不行,在重定位计算bl2位置时,计算公式如下:(就是1+16+32=49)

添加宏定义

此时环境变量将被写到合适的位置,干掉原有env

保存环境变量后,读取到内存后展示,得证。

删除env中无用内容

重启后

6.网卡移植
uboot中的条件编译

我们需要在头文件中定义这个宏来添加对网络的支持

干掉undefine

但是另一个文件中<config_cmd_default.h>有定义网络配置,我们还是给自己定义的拿掉吧



添加ping和tftp命令
这两个函数也是通过宏定义实现的

函数名:do_ping
添加宏定义

出现ping、tftp命令

但是发现ping命令失败了,这玩意只有一个上层,他的底层实现失败了

找不到网卡
网卡预初始化
添加网卡初始化函数

把实体函数搬到函数名之前

将宏定义搬运到定义头文件

注册网卡
该函数用于dm9000网卡注册

网卡初始化
但是仍然缺乏初始化函数cpu_eth_init(第一阶段初始化)和board_eth_init(第二阶段初始化),和网卡指针eth_devices(用来指向一个链表,这个链表中保存了当前系统中所有的网卡信息)
和eth_current(eth_current指针指向当前我们正在操作的那个网卡)

重定义函数

移植完成,uboot移植结束
