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

相关推荐
艾芯微科技4 小时前
B1040A2|DFN1006‑2L 超微型肖特基二极管,便携设备高频整流优选国产器件
网络·单片机·嵌入式硬件·集成测试·51单片机
芯岭技术4 小时前
XL5301 TOF传感器,XL5300的升级版本,测距距离更远,功耗更低,电压更宽
嵌入式硬件·物联网
瞬间&永恒~4 小时前
【Kubernetes】(十五)维护与升级、ETCD 备份和恢复
linux·运维·docker·云原生·kubernetes
SKH.4 小时前
网络(2)UDP通信
网络·单片机·udp
susplus4 小时前
【linux应用软件编程】进程间的通信方式2【网络通信从入门到UDP编程】
linux·udp·ip
MSTcheng.4 小时前
【Linux】Linux学习第三弹——Linux基本指令2
linux·windows·学习·ubuntu·操作系统
希望奇迹很安静4 小时前
Linux基本使用命令
linux·运维·服务器
zcmodeltech4 小时前
风力发电沙盘模型控制系统设计与灯光联动实现方案——基于STM32与Modbus RTU,服务范围覆盖全国的多场景风力发电沙盘模型定制
网络·数据库·stm32·单片机·嵌入式硬件·能源
离凌寒4 小时前
一、关于软件定时器模拟任务运行总结
单片机·嵌入式硬件
邪修king4 小时前
Re:Linux 系统篇(十七):进程篇(六):环境变量深度解析|命令行参数、环境变量表、4 种获取方式与继承机制万字详解
linux·服务器·c++