完整教程:《嵌入式操作系统》_从uboot官方移植_02_20251126

接上回,内容太多了,我们开启第二章

1.时钟初始化

1.1更改串口输出的CPU信息

1.2重新设置时钟参数

发现irom中并未按照cpu材料手册中推荐的最佳参数设置的

在串口初始化之前输入架构始终初始化程序调用

添加初始化时钟代码,记得包含头文件#include <s5pc110.h>

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)中

代码分析:

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

那肯定不行,在重定位计算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移植结束

posted @ 2026-01-27 20:52  clnchanpin  阅读(1)  评论(0)    收藏  举报