u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)

news/2024/11/17 12:59:17/

这次更新,实现了自动识别Nand或MMC/SD启动(环境变量统一存放于Nandflash中),统一SD及Nand启动模式的nandflash驱动均为8bit HW ECC校验,并调整部分源码文件的结构。 您可以从下面的链接获得源码,也可以下载历史版本,并参考后面的步骤修改获得ver3.1。本次修改的原理简单不做太详细的分析。

最新源码下载:

ver4.0源码下载:u-boot for tiny210 ver4.0

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   ver4.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, #BOOT_NAND
+
+ cmp r2, #0x4 @ 4KB 5-cycle 8-bit ECC
+ moveq r3, #BOOT_NAND
+
+ cmp r2, #0x6 @ 4KB 5-cycle 16-bit ECC
+ moveq r3, #BOOT_NAND
+
+ cmp r2, #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, [r0, #INF_REG3_OFFSET]
+
+ ldr r1, [r0, #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 

http://www.ppmy.cn/news/471296.html

相关文章

ug侧铣头编程_数控机械加工侧铣头(角度头)编程入门知识

①什么是角度头。如下图&#xff1a; ②角度头的结构(来自网络)。 ③角度头怎样与机床主轴(spindle)连接。 ④角度头的应用。 ⑤角度头的方向(这种角度头有称之为侧铣头)。 从角度头与主轴的连接可以看出&#xff0c;当主轴定位后(如M19)&#xff0c;通常角度头的朝向只有一个&…

error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

y81.第四章 Prometheus大厂监控体系及实战 -- 监控扩展(十二)

10.2 监控redis https://github.com/oliver006/redis_exporter 10.2.1 部署redis root@k8s-master1:~/app-monitor-case/redis/yaml# cat redis-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: redisnamespace: raymond-1 spec:replicas: 1selector…

【Python计量】独立混合横截面数据与邹氏检验

文章目录 一、获取数据二、分组回归三、联合显著性F检验四、邹氏检验五、全套代码六、拓展 独立混合横截面数据&#xff1a;在不同时点&#xff0c;从一个大总体里进行随机抽样。 面板数据&#xff1a;区别于独立混合横截面&#xff0c;面板数据是指在不同时间跟踪同一批个体&a…

【Python计量】DID模型构建

文章目录 一、DID&#xff08;Differences-in-Differences&#xff09;模型DID模型形式 二、DID案例&#xff1a;垃圾焚化炉的区位对住房价格的影响三、DID案例&#xff1a;实证论文《我国推出融资融券交易促进了标的股票的定价效率吗&#xff1f;》四、DID案例&#xff1a;实证…

网络管理与维护(二)网络用户设置管理

网络用户设置管理 2.1 用户帐户安全管理 用户账户的分类 管理员帐户。拥有管理本台计算机的所有权限和权利。系统内置的Administrator用户帐户 和Administrators组帐户的成员就属于管理员帐户 标准帐户。通常分配给最终用户使用&#xff0c;适用于日常工作&#xff0c;对操作…

【MySQL数据库】MySQL日志管理、备份与恢复

MySQL日志管理、备份与恢复 一、MySQL日志管理1.1日志存放位置 二、数据备份2.1物理备份与逻辑备份2.2完整备份、差异备份、增量备份2.3常见的备份方法 三、完整备份与恢复3.1物理冷备份与恢复3.2mysqldump 备份3.3mysqldump数据恢复3.4MySQL增量备份3.5MySQL增量恢复 一、MySQ…

创新涌动于先丨2023 PingCAP 用户峰会等你来!

PingCAP 用户峰会 2023 报名现已开启&#xff0c;扫码立即报名活动&#xff01; 数字经济时代&#xff0c;数据已经成为了驱动企业业务发展的关键生产要素&#xff0c;而 新技术的涌现为企业技术架构的跃迁提供了新契机。 AIGC 虽然还处于高度混沌的状态&#xff0c;但它的崛…