u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)
这次更新,实现了自动识别Nand或MMC/SD启动(环境变量统一存放于Nandflash中),统一SD及Nand启动模式的nandflash驱动均为8bit HW ECC校验,并调整部分源码文件的结构。?您可以从下面的链接获得源码,也可以下载历史版本,并参考后面的步骤修改获得ver3.1。本次修改的原理简单不做太详细的分析。 ver3.1源码下载:?u-boot for tiny210 ver3.1 下面的链接提供了历史版本的源码 ver3.0源码下载:u-boot for tiny 210 ver3.0 ver2.2源码下载:??u-boot for tiny210 ver2.2 ver2.1源码下载:u-boot for tiny210 ver2.2 ver2.1源码下载:u-boot for tiny210 ver2.1 ver2.0源码下载:u-boot for tiny210 ver2.0
各版本修改分析链接:
ver2.0?
?
ver2.1??
ver2.2?
ver2.2.1?
ver2.2.2?
ver 3.0
ver3.1的基本功能: 1. SD boot,基于linaro u-boot的SPL功能实现 2. 从SD卡的FAT分区上加载文件到SDRAM 3. 将环境变量保存至SD卡 4. 添加DM9000网卡驱动,开启网络功能(例如:tftp,nfs等) 5. 添加TAB键命令自动补全功能 6.修复bug: 修复bug 1:SD卡保存环境变量出现Writing to MMC(0)... mmc_send_cmd: error during transfer: 0x00208001 mmc write failed。 修复bug 2:每次启动只能保存一次环境变量。 7.添加NandFlash驱动,开启所有Nand cmd。 8.添加Yaffs文件系统烧写支持。 9.修改在SD卡启动及nand启动时对nandflash的烧写为8bit 硬件ECC校验。 10.添加Nandflash启动。
+11.添加自动识别Nand or MMC/SD启动。
?
关于源码结构的调整,请参考ver3.1的源码包。
?
?
下面介绍修改过程并作简要的分析:
?
1.修改arch/arm/cpu/armv7/start.S文件,在此文件中添加"+"后内容:
?
@@ -32,7 +32,9 @@
?#include <asm-offsets.h> ?#include <config.h> ?#include <version.h> - +#include <common.h> +#include <configs/tiny210.h> +#include <s5pc110.h> ?.globl _start ?_start: b reset ? ldr pc,_undefined_instruction @@ -176,8 +178,61 @@ call_board_init_f: ? ldr sp,=(CONFIG_SYS_INIT_SP_ADDR) ? bic sp,sp,#7 /* 8-byte alignment for ABI compliance */ ? ldr r0,=0x00000000 +#if defined(CONFIG_TINY210) || defined(CONFIG_MINI210) + adr r4,_start + ldr r5,_TEXT_BASE + cmp???? r5,r4 + beq board_init_in_ram + ? + ?ldr r0,=PRO_ID_BASE +??????? ldr r1,[r0,#OMR_OFFSET] +??????? bic r2,r1,#0xffffffc1 + + /* NAND BOOT */ + cmp r2,#0x0 @ 512B 4-cycle + moveq r3,#BOOT_NAND + + cmp r2,#0x2 @ 2KB 5-cycle + moveq r3,#0x4 @ 4KB 5-cycle 8-bit ECC + moveq r3,#0x6 @ 4KB 5-cycle 16-bit ECC + moveq r3,#0x8 @ OneNAND Mux + moveq r3,#BOOT_ONENAND + + /* SD/MMC BOOT */ + cmp???? r2,#0xc + moveq?? r3,#BOOT_MMCSD? + + /* NOR BOOT */ + cmp???? r2,#0x14 + moveq?? r3,#BOOT_NOR? + + /* Uart BOOTONG failed */ + cmp???? r2,#(0x1<<4) + moveq?? r3,#BOOT_SEC_DEV +? + ldr r0,=INF_REG_BASE + str r3,#INF_REG3_OFFSET] + + ?ldr r1,#INF_REG3_OFFSET] + cmp r1,#BOOT_NAND /* 0x0 => boot device is nand */ + beq nand_boot_210 + cmp???? r1,#BOOT_MMCSD + beq???? mmcsd_boot_210 + ? +nand_boot_210: + bl???? board_init_f_nand + +mmcsd_boot_210: + bl???? board_init_f +board_init_in_ram: +#endif ? bl board_init_f - 蓝色代码实现的功能:将 PRO_ID_BASE?+ OMR_OFFSET (这是一个启动方式寄存器,从中可以得到上电时的启动状态)地址处的读取启动信息,值0x0~0x6分别对应几种不同的nandflash启动,0xc对应MMC/SD启动。当确定是某一种启动方式后,将其对应的十六进制存放于INFORM3寄存器中。
红色代码实现的功能:将INFORM3的内容读出,并和预先定义的BOOT_NAND? BOOT_MMCSD cmp,并进行对应的跳转,跳转到相应启动方式的代码搬运函数中。
?
?
2.
将board/samsung/tiny210/nand_cp.c移动到 -->arch/arm/cpu/armv7/s5pc1xx/目录下
将board/samsung/tiny210/mmc_boot.c移动到-->arch/arm/cpu/armv7/s5pc1xx/目录下
nand_cp.cmmc_boot.c的移动主要是为了让目录层次更加清晰减少代码的重复。
在arch/arm/cpu/armv7/s5pc1xx/Makefile中
添加红色代码:
@@ -32,6 +32,10 @@ SOBJS = cache.o
?SOBJS += reset.o ? ?COBJS += clock.o +ifdef CONFIG_SPL_BUILD +COBJS? += mmc_boot.o +COBJS? += nand_cp.o +endif ? ?SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ?OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS)) 修改board/samsung/tiny210/Makefile删除下面红色代码:
-ifdef CONFIG_SPL_BUILD
-ifdef CONFIG_TINY210_NAND_BOOT
-COBJS? += mmc_boot.o
-endif
-ifdef CONFIG_TINY210_NAND_BOOT
-COBJS? += nand_cp.o
-endif
-endif
?
?
3.修改arch/arm/cpu/armv7/s5pc1xx/nand_cp.c
将void board_init_f(unsigned long bootflag)-->void board_init_f_nand(unsigned long bootflag)
134 void board_init_f_nand(unsigned long bootflag) 135 { 136???????? __attribute__((noreturn)) void (*uboot)(void); 137???????? copy_uboot_to_ram_nand();
删除下面代码:
-void board_init_r(gd_t *id,ulong dest_addr)
-{
-? ? ? ? /* Function attribute is no-return */
- ? ? ? /* This Function never executes */
-? ? ? ? while (1)
-? ? ? ? ? ? ? ? ;
-}
-void save_boot_params(u32 r0,u32 r1,u32 r2,u32 r3) {}
?
4.
修改include/common.h,添加下面红色代码:
?
243 /* arch/$(ARCH)/lib/board.c */
244 void??? board_init_f? (ulong) __attribute__ ((noreturn)); 245 #if defined(CONFIG_TINY210) || defined(CONFIG_MINI210) 246 void??? board_init_f_nand? (ulong) __attribute__ ((noreturn)); 247 #endif 248 void??? board_init_r? (gd_t *,ulong) __attribute__ ((noreturn)); 249 int???? checkboard??? (void);
5.修改
arch/arm/lib/board.c
261 void board_init_f_nand(ulong bootflag)
262 { 263???????? while(1); 264 } 265 ? 266 void board_init_f(ulong bootflag) 267 { 268???????? bd_t *bd; 269???????? init_fnc_t **init_fnc_ptr; 270???????? gd_t *id;
?
6.
修改spl/Makefile
在make过程合并 tiny210-spl.bin u-boot.bin
104???????? $(TOPDIR)/board/$(BOARDDIR)/tools/mk$(BOARD)spl.exe
105???????????????? $(obj)u-boot-spl.bin $(obj)$(BOARD)-spl.bin +106????????? ? cat $(obj)$(BOARD)-spl.bin $(TOPDIR)/u-boot.bin > $(TOPDIR)/$(BOARD)-uboot.bin
7.
修改include/configs/tiny210.h
将427行以后的内容替换为
?/* FLASH and environment organization */
429 #define CONFIG_SYS_NO_FLASH???????????? 1 430 #undef CONFIG_CMD_IMLS 431 #define CONFIG_IDENT_STRING???? " for FriendlyLEG-TINY210" 432 #define CONFIG_DOS_PARTITION??????????? 1 433? 434 /*NAND_BOOT & MMCSD_BOOT? by lk? */ 435 #define CONFIG_S5PC11X 436 #define CONFIG_ENV_IS_IN_NAND??????????? 1 437 #define CONFIG_ENV_SIZE???????? 0x4000? /* 16KB */ 438 #define RESERVE_BLOCK_SIZE????????????? (2048) 439 #define BL1_SIZE??????????????????????? (8 << 10) /*8 K reserved for BL1*/ 440 #define CONFIG_ENV_OFFSET?????????????? 0x40000 441 #define CFG_NAND_HWECC 442 #define CONFIG_NAND_BL1_8BIT_ECC 443 #define CONFIG_8BIT_HW_ECC_SLC????? 1
?
至此ver3.0 --> ver3.1修改完成.
?
?
编译u-boot
$make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_config $make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl
由于我的系统下装有两套交叉工具链,所以没有把?/opt/FriendlyARM/toolschain/4.5.1/bin/?添加到环境变量,在使用工具链时要指明路径。
1.sd启动
?
将u-boot镜像写入SD卡
将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb. 执行下面的命令 $sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1
2.nand启动
通过SD卡启动的u-boot for tiny210 将u-boot镜像写入nandflash
开发板终端下执行下面的命令
[FriendlyLEG-TINY210]# tftp 21000000 tiny210-uboot.bin
[FriendlyLEG-TINY210]# nand erase.chip
[FriendlyLEG-TINY210]# nand write 21000000 0?
3c1f4?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |