从本节开始,就正式进入移植过程,首先进行u-boot-spl.bin的移植。
一、因为第一步要移植u-boot-spl.bin,所以我们需要先在头文件里添加宏CONFIG_SPL
u-boot-2016.09$ vim include/configs/tq210.h
#define CONFIG_SPL
二、时钟初始化
由上节分析,由于我们没有定义宏CONFIG_SKIP_LOWLEVEL_INIT,所以进入board/samsung/tq210/lowlevel_init.S进行硬件初始化。
首先添加S5PV210的时钟相关寄存器:
u-boot-2016.09$ vim arch/arm/mach-s5pv210/include/mach/clock.h
并在tq210.c中加入clock头文件并实现clock_init(这里也如lowlevel_init.S使用CONFIG_SPL_BUILD 来控制编译顺序):
在clock_init的实现函数中,使用了struct s5pv210_clock const clock = (struct s5pv210_clock )samsung_get_base_clock(),其中samsung_get_base_clock,在arch/arm/mach-s5pv210/include/mach/cpu.h中实现:
将其修改为
三、DDR初始化
u-boot-2016.09$ vim board/samsung/tq210/lowlevel_init.S
添加DMC信息,参考《嵌入式Linux学习笔记(基于s5pv210、tq210)》,这里就不详细贴出来了。
在tq210.c中添加dmc的头文件并实现ddr_init。
#include 在arch/arm/mach-s5pv210/include/mach/cpu.h中添加宏 #define S5PV210_DMC0_BASE 0xF0000000 #define S5PV210_DMC1_BASE 0xF1400000 SAMSUNG_BASE(dmc0, DMC0_BASE) SAMSUNG_BASE(dmc1, DMC1_BASE) S5PV210_DMC0_BASE与S5PV210_DMC1_BASE在第一节我们已经定义了,如果没有定义,这里自己定义 接着执行到_main函数, 由于u-boot-spl.bin文件比较小,使用SRAM提供栈内存就好,所以可以将栈指针屏蔽掉,修改为: 五、拷贝BL2到SDRAM 在tq210.c中实现拷贝函数,拷贝完成后,直接跳转到DDR的起始地址执行 BL2。 CONFIG_SYS_SDRAM_BASE 在 u-boot-2014.04/include/configs/smdkv210.h 中定义,我们将其修改为我们实际 DDR 的起始地址0x20000000,CopySDMMCtoMem实现从SD的34扇区复制BL2到到DDR的起始地址0x20000000。 注: 因为BL1最大只能到16K,而每个扇区的大小为512B,16K正好是32个扇区,所以为了安全起见,我们将BL2的起始扇区设置为34。这个值并不固定,只要比u-boot-spl.bin的大小大就可以了。 四、编译 u-boot-2016.09$ make tq210_defconfig u-boot-2016.09$ make spl/u-boot-spl.bin 修改configs/tq210_defconfig,添加CONFIG_SPL=y 再次编译,发现出现mkexynosspl:Command not find。分析scripts/Makefile.spl 如果定义了CONFIG_SUMSANG,就会添加目标(obj)/$(BOARD)-spl.bin,展开即为spl/tq210-spl.bin,这里需要一个添加头文件的工具。 我这里的工具是使用的国嵌的mkv210,将其复制到tool下,将名字改为mktq210spl,修改 scripts/Makefile.spl 再次编译,发现已经产生了我们需要的spl/tq210-spl.bin。 五、烧录与测试 单独的.bin文件启动看不到现象,这里我在board/samsung/tq210/lowlevel_init.S中添加了蜂鸣器鸣叫的片段。 .globl lowlevel_init lowlevel_init: mov r9, lr #ifdef CONFIG_SPL_BUILD bl clock_init /* 时钟初始化 */ bl beep_asm_init bl delay bl beep_asm_off bl ddr_init /* DDR初始化 */ bl uart_asm_init #endif mov pc, r9 /* * beep_asm_init: 初始化蜂鸣器,并让其发声 */ beep_asm_init: ldr r0, = 0xE02000A0 ldr r1, = 0x00000010 str r1, [r0] ldr r0, = 0xE02000A4 ldr r1, = 0x2 str r1, [r0] mov pc, lr /* * delay: 延时 */ delay: mov r0, #0x2000000 delay_loop: sub r0, r0, #1 cmp r0, #0 bne delay_loop mov pc, lr /* * beep_asm_off: 关闭蜂鸣器 */ beep_asm_off: ldr r0, = 0xE02000A4 ldr r1, = 0x0 str r1, [r0] mov pc, lr 为了偷懒,我直接使用了网上搜索的TQ210的裸机LED程序,编译得到led.bin。 烧录测试: 使用DD_for_win7.exe将tq210-spl.bin与led.bin分别烧入1和34扇区 然后将SD卡插入开发板,打开电源,发现蜂鸣器鸣叫一声,并且LED不停闪烁,表示我们tq210-spl.bin移植成功。 注: DD_for_win7.exe有添加头字节选项,如果我们使用tq210-spl.bin就不需要选择这个选项,如果使用u-boot-spl.bin就必须将这个选项勾上。
上一篇:u-boot-2016.09移植(2)-uboot启动简易分析
下一篇:ARMv7-A,ARMv7-R和ARMv7-M之间有什么区别?
推荐阅读最新更新时间:2024-11-09 12:53
设计资源 培训 开发板 精华推荐
- LT6657BHMS8-3 升压型输出电流基准的典型应用电路
- NCV8873汽车级非同步升压控制器典型应用
- LT3973HMSE-5 1.21V 降压转换器的典型应用
- 微型双路全桥压电电机驱动器参考设计在低输入电压下运行
- 【训练营】物联网RGB灯+5v灯带接口--836140A
- CP2102下载器
- NCP3064B 1.5A 具有 ON/OFF 功能的升压/降压/反相开关稳压器的典型应用
- 使用 Infineon Technologies AG 的 OM1327NKM 的参考设计
- 使用 Murata Manufacturing 的 D1U3CS-12-CONC 的参考设计
- 基于SLLIMM智能功率模块STGIPQ8C60T-HZ的600W电机控制电源板