《嵌入式操作系统》_从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移植结束

相关推荐
码农101号41 分钟前
Linux - redis下载以及基础使用
linux·运维·redis
深圳佛手43 分钟前
Consul热更新的原理与实现
java·linux·网络
linux修理工44 分钟前
vagrant ansible 配置
linux·运维·服务器·数据库·centos
学习路上_write1 小时前
FREERTOS_定时器——创建和基本使用
c语言·开发语言·c++·stm32·嵌入式硬件
李斯维1 小时前
第12章 使用 Shell:变量和选项
linux·unix
大聪明-PLUS1 小时前
如何提高 FFmpeg 中的视频流解码速度
linux·嵌入式·arm·smarc
黑客思维者1 小时前
凌科芯安LKT6850安全MCU的技术特性与多领域应用
单片机·嵌入式硬件·安全·硬件加密
苦学编程的谢1 小时前
RabbitMQ_2_RabbitMQ快速入门
linux·centos·rabbitmq
RisunJan1 小时前
Linux命令-free命令(查看系统内存(RAM)和交换空间(Swap)使用情况)
linux·运维·服务器