《嵌入式操作系统》_从uboot官方移植_02_20251126

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

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移植结束

相关推荐
小Tomkk4 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊4 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
木卫二号Coding6 分钟前
第七十九篇-E5-2680V4+V100-32G+llama-cpp编译运行+Qwen3-Next-80B
linux·llama
getapi15 分钟前
Ubuntu 22.04 服务器的系统架构是否为 amd64 x86_64
linux·服务器·ubuntu
消失的旧时光-194332 分钟前
Linux 入门核心命令清单(工程版)
linux·运维·服务器
艾莉丝努力练剑39 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
项目題供诗1 小时前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
Trouvaille ~1 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
羽获飞1 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
旖旎夜光2 小时前
Linux(13)(中)
linux·网络