自学内容网 自学内容网

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

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

1.时钟初始化

1.1更改串口输出的CPU信息

1.2重新设置时钟参数

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

在串口初始化之前输入系统始终初始化程序调用

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

system_clock_init:

ldrr0, =ELFIN_CLOCK_POWER_BASE@0xe0100000

/* Set Mux to FIN */
ldrr1, =0x0
strr1, [r0, #CLK_SRC0_OFFSET]

ldrr1,=APLL_LOCKTIME_VAL
strr1,[r0, #APLL_LOCK_OFFSET]

/* Disable PLL */
retryloop:
ldrr1, =0x0
strr1, [r0, #APLL_CON0_OFFSET]
ldrr1, =0x0
strr1, [r0, #MPLL_CON_OFFSET]

ldrr1, =0x0
strr1, [r0, #MPLL_CON_OFFSET]

ldr   r1, [r0, #CLK_DIV0_OFFSET]
ldrr2, =CLK_DIV0_MASK
bicr1, r1, r2

ldrr2, =CLK_DIV0_VAL
orrr1, r1, r2
strr1, [r0, #CLK_DIV0_OFFSET]

ldrr1, =APLL_VAL
strr1, [r0, #APLL_CON0_OFFSET]

ldrr1, =MPLL_VAL
strr1, [r0, #MPLL_CON_OFFSET]

ldrr1, =VPLL_VAL
strr1, [r0, #VPLL_CON_OFFSET]
#if defined(CONFIG_EVT1)
ldrr1, =AFC_ON
strr1, [r0, #APLL_CON1_OFFSET]
#endif
movr1, #0x10000
1:subsr1, r1, #1
bne1b

/* MPLL software workaround */
ldrr1, [r0, #MPLL_CON_OFFSET]
orr     r1, r1, #(1<<28)
strr1, [r0, #MPLL_CON_OFFSET]

movr1, #0x100
1:subsr1, r1, #1
bne1b

ldrr1, [r0, #MPLL_CON_OFFSET]
andr1, r1, #(1<<29)
cmpr1, #(1<<29)
bne retryloop

/* H/W lock detect disable */
ldrr1, [r0, #MPLL_CON_OFFSET]
bic     r1, r1, #(1<<28)
strr1, [r0, #MPLL_CON_OFFSET]


ldrr1, [r0, #CLK_SRC0_OFFSET]
ldrr2, =0x10001111
orrr1, r1, r2
strr1, [r0, #CLK_SRC0_OFFSET]

/* CLK_DIV6 */
ldrr1, [r0, #CLK_DIV6_OFFSET]
bicr1, r1, #(0x7<<12)@; ONENAND_RATIO: 0
strr1, [r0, #CLK_DIV6_OFFSET]

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


原文地址:https://blog.csdn.net/Qq19122427/article/details/155275836

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!