S3C6410移植u-boot-2010.3(2)基本的启动信息修改
1、启动模块修改
进入/cpu/arm1176/目录,修改start.S文件
首先找到需要修改的CONFIG_NAND_SPL汇编原码,修改如下:
#ifndef CONFIG_NAND_SPL /** flush v4 I/D caches*/ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ /** disable MMU stuff and caches*/ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) orr r0, r0, #0x00000002 @ set bit 2 (A) Align orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache //将原来之间的内容删除 mcr p15, 0, r0, c1, c0, 0 #endif
检索到“lowlevel_init”
添加如下内容,功能看注释
/* when we already run in ram, we don't need to relocate U-Boot.* and actually, memory controller must be configured before U-Boot* is running in ram.*/ldr r0, =0xff000fffbic r1, pc, r0 /* r0 <- current base addr of code */ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */bic r2, r2, r0 /* r0 <- current base addr of code */cmp r1, r2 /* compare r0, r1 */beq after_copy /* r0 == r1 then skip flash copy */
此处顺便温习arm汇编
ldr汇编码与伪汇编码区别在于是否有“=”号
ldr汇编为 ldr r1, [r2], 将 r2 当作地址放入 r1 寄存器,而intel与at&t汇编的mov指令是无法对地址直接操作的。
ldr伪汇编为 ldr r1, =<constant-expression>,将<constant-expression>放入 r1 中,可以是地址,这里所用为伪汇编
bic语法格式为 BIC{<cond>}{S} <Rd>,<Rn>,<shifter_operand>,shifter_operand取反后,和Rn与运算,值传回Rd
bic一般用于清零处理:
1、此处若系统从nandflash中启动,则pc小于4k,取反、与运算后,将0传给r1
此处_TEXT_BASE可能为0x57e00000或者0c7e00000,取反、与运算后,将0x00e00000传回r2
beq相等则跳转指令,此处 r1,r2不相等,故不跳转,继续往下执行
2、此处若系统从ram中启动,则此处的pc应该与_TEXT_BASE相等,故直接跳转至after_copy(复制
完成)处运行。
紧接着前面的代码添加下面一段代码:
#ifdef CONFIG_BOOT_NANDmov r0, #0x1000bl copy_from_nand #endif
此处的 bl 为调用子程序,接着上面的是因为未复制完成从新跳回 copy_from_nand 从新复制nandflash
然后找到_mmu_table_base,在它的#endif之后,添加如下代码,即上面所跳转的目标代码
/** copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)* r0: size to be compared* Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size*/.globl copy_from_nand copy_from_nand:mov r10, lr /* save return address */mov r9, r0/* get ready to call C functions */ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */sub sp, sp, #12mov fp, #0 /* no previous frame, so fp=0 */mov r9, #0x1000bl copy_uboot_to_ram3: tst r0, #0x0bne copy_failedldr r0, =0x0c000000ldr r1, _TEXT_PHY_BASE 1: ldr r3, [r0], #4ldr r4, [r1], #4teq r3, r4bne compare_failed /* not matched */subs r9, r9, #4bne 1b4: mov lr, r10 /* all is OK */mov pc, lrcopy_failed:nop /* copy from nand failed */b copy_failedcompare_failed:nop /* compare failed */b compare_failed
至此,start.S文件修改完成。
接着在/cpu/arm1176/目录下添加一个nand_cp.c文件
代码如下
#include <common.h>#ifdef CONFIG_S3C64XX#include <asm/io.h>#include <linux/mtd/nand.h>#include <asm/arch/s3c6410.h>static int nandll_read_page (uchar *buf, ulong addr, int large_block){int i;int page_size = 512;/* 2K */if (large_block==1)page_size = 2048;/* 4K */if (large_block==2)page_size = 4096;NAND_ENABLE_CE();NFCMD_REG = NAND_CMD_READ0;/* Write Address */NFADDR_REG = 0;if (large_block)NFADDR_REG = 0;NFADDR_REG = (addr) & 0xff;NFADDR_REG = (addr >> 8) & 0xff;NFADDR_REG = (addr >> 16) & 0xff;if (large_block)NFCMD_REG = NAND_CMD_READSTART;NF_TRANSRnB();/* for compatibility(2460). u32 cannot be used. by scsuh */for(i=0; i < page_size; i++){*buf++ = NFDATA8_REG;}NAND_DISABLE_CE();return 0;}static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block){uchar *buf = (uchar *)dst_addr;int i;uint page_shift = 9;if (large_block==1)page_shift = 11;/* Read pages */if(large_block==2)page_shift = 12;if(large_block == 2){/* Read pages */for (i = 0; i < 4; i++, buf+=(1<<(page_shift-1))){nandll_read_page(buf, i, large_block);}/* Read pages *//* 0x3c000 = 11 1100 0000 0000 0000 */for (i = 4; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)){nandll_read_page(buf, i, large_block);}}else{for (i = 0; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)){nandll_read_page(buf, i, large_block);}}return 0;}int copy_uboot_to_ram(void){int large_block = 0;int i;vu_char id;/*#define NAND_ENABLE_CE() (NFCONT_REG &= ~(1 << 1))#define NFCONT_REG__REG(ELFIN_NAND_BASE + NFCONT_OFFSET)#define __REG(x) (*((volatile u32 *)(x)))#define ELFIN_NAND_BASE 0x70200000#define NFCONT_OFFSET 0x04NFCONT_REG = ( *( (volatile u32 *) (0x70200004) ) )NFCONT 0x70200004 读/写NAND Flash 控制寄存器[0]1:NAND Flash 控制器使能*/NAND_ENABLE_CE();/*#define NFCMD_REG__REG(ELFIN_NAND_BASE + NFCMMD_OFFSET)#define ELFIN_NAND_BASE 0x70200000#define NFCMMD_OFFSET 0x08NFCMD_REG = ( *( (volatile u32 *) (0x70200008) ) )NFCMMD 0x70200008 NAND Flash 命令设置寄存器0#define NAND_CMD_READID 0x90*/NFCMD_REG = NAND_CMD_READID;/*#define NFADDR_REG__REG(ELFIN_NAND_BASE + NFADDR_OFFSET)#define ELFIN_NAND_BASE 0x70200000#define NFADDR_OFFSET 0x0CNFADDR_REG = ( *( (volatile u32 *) (0x7020000C) ) )NFADDR 0x7020000C NAND Flash 地址设置寄存器*/NFADDR_REG = 0x00;/*#define NFDATA8_REG__REGb(ELFIN_NAND_BASE + NFDATA_OFFSET)#define __REGb(x) (*(vu_char *)(x))NFDATA8_REG = ( *( (vu_char *) (0x70200010) ) )NFDATA 0x70200010 读/写NAND Flash 数据寄存器NAND Flash 读/烧写数据值用于I/O*//* wait for a while */for (i=0; i<200; i++);id = NFDATA8_REG;id = NFDATA8_REG;if (id > 0x80)large_block = 1;if(id == 0xd5)large_block = 2;/* read NAND Block.* 128KB ->240KB because of U-Boot size increase. by scsuh* So, read 0x3c000 bytes not 0x20000(128KB).*//*#define CONFIG_SYS_PHY_UBOOT_BASE(CONFIG_SYS_SDRAM_BASE + 0x07e00000)#define CONFIG_SYS_SDRAM_BASE 0x50000000CONFIG_SYS_PHY_UBOOT_BASE = 0x57e0 00000x3 c000 = 1M*/return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x3c000, large_block);}#endif
然后在/cpu/arm1176/makefile中添加一个依赖到COBJS目标后面
COBJS = cpu.o nand_cp.o
接着在/nand_spl/board/samsung/smdk6410/Makefile中添加一个依赖到COBJS后面
COBJS = nand_boot.o nand_ecc.o s3c64xx.o nand_cp.o
补全规则
# from SoC directory $(obj)cpu_init.S:@rm -f $@@ln -s $(TOPDIR)/cpu/arm1176/s3c64xx/cpu_init.S $@ $(obj)nand_cp.c:@rm -f $@@ln -s $(TOPDIR)/cpu/arm1176/nand_cp.c $@
接着修改smdk6410.h文件(在/include/configs/目录下):
1、添加宏定义
#define virt_to_phys(x) virt_to_phy_smdk6410(x)
2、用户名回显修改
#define CONFIG_SYS_PROMPT "SMDK6400 #"
3、添加smdk6410 ID 检索到MACH_TYPE,将其注释掉,然后添加smdk6410 ID如下
#define MACH_TYPE 1626
4、增加NAND config的内容
添加位置 /* NAND configuration */
#define NAND_DISABLE_CE()(NFCONT_REG |=(1<<1)) #define NAND_ENABLE_CE()(NFCONT_REG &=~(1<<1)) #define NF_TRANSRnB() do{while(!(NFSTAT_REG&(1<<0)));}while(0)
5、NAND flash 大小
//#define PHYS_SDRAM_1_SIZE 0x08000000 /* 128 MB in Bank #1 */ #define PHYS_SDRAM_1_SIZE 0x10000000 /* 256 MB in Bank #1 */
6、NAND flash块大小
/* NAND chip block size */ //#define CONFIG_SYS_NAND_BLOCK_SIZE (128 * 1024) #define CONFIG_SYS_NAND_BLOCK_SIZE (512 * 1024)
7、NAND flash页大小
/* NAND chip page size */ //#define CONFIG_SYS_NAND_PAGE_SIZE 2048 #define CONFIG_SYS_NAND_PAGE_SIZE 4096
8、位校验
/* NAND chip page per block count */ //#define CONFIG_SYS_NAND_PAGE_COUNT 64 #define CONFIG_SYS_NAND_PAGE_COUNT 128
9、更改内存分配空间
/** Size of malloc() pool*/ //#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 1024 * 1024) #define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 512 * 1024)
10、修改开机延迟时间
#define CONFIG_BOOTDELAY 3
11、设置SDRAM大小
//#define PHYS_SDRAM_1_SIZE 0x08000000 /* 128 MB in Bank #1 */ #define PHYS_SDRAM_1_SIZE 0x10000000 /* 256 MB in Bank #1 */ /* 后面的大小自己设定 这里是256MB的SDRAM */
12、修改SDROM大小
//#define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_SDRAM_BASE + 0x7e00000) /* 126MB in DRAM */ #define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_SDRAM_BASE + 0x9e00000) /* 256MB in DRAM */
13、PWM设置
//#define CONFIG_SYS_HZ 1000 #define CONFIG_SYS_HZ 1562500
14、堆栈大小
/*-----------------------------------------------------------------------* Stack sizes** The stack sizes are set up in start.S using the settings below*/ //#define CONFIG_STACKSIZE 0x40000 /* regular stack 256KB */ #define CONFIG_STACKSIZE 0x80000 /* regular stack 512KB */
15、环境变量空间
//#define CONFIG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */ #define CONFIG_ENV_SIZE 0x80000 /* Total Size of Environment Sector */
16、环境变量偏移地址
//#define CONFIG_ENV_OFFSET 0x0040000 #define CONFIG_ENV_OFFSET 0x0080000
17、BOOTCOMMAND
更改后的内容为
#ifdef CONFIG_ENABLE_MMU #define CONFIG_SYS_MAPPED_RAM_BASE 0xc0000000 #define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x100000 0x500000;" \"bootm 0xc0008000" #else #define CONFIG_SYS_MAPPED_RAM_BASE CONFIG_SYS_SDRAM_BASE #define CONFIG_BOOTCOMMAND "nand read 0x50008000 0x100000 0x500000;" \"bootm 0x50008000" #endif
然后开始添加内容到u-boot.lds,在目录cpu/arm1176/还有uboot根目录下面都有
完善如下代码段
. = ALIGN(4);.text :{ cpu/arm1176/start.o (.text)cpu/arm1176/s3c64xx/cpu_init.o (.text)board/samsung/smdk6410/lowlevel_init.o (.text)cpu/arm1176/nand_cp.o (.text)lib_arm/board.o (.text)*(.text)}
添加内容到u-boot-nand.lds,在目录/board/samsung/smdk6410中
完善如下代码
. = ALIGN(4);.text :{cpu/arm1176/start.o (.text)cpu/arm1176/s3c64xx/cpu_init.o (.text)board/samsung/smdk6410/lowlevel_init.o (.text)cpu/arm1176/nand_cp.o (.text)lib_arm/board.o (.text)*(.text)}
接着就可以回到根目录进行make了。
然后就可以看到你的uboot正式运转了…、
转载于:https://www.cnblogs.com/plinx/archive/2013/04/11/2963823.html
S3C6410移植u-boot-2010.3(2)基本的启动信息修改相关推荐
- s3c6410移植android,S3C6410 移植Android 内核
原标题:S3C6410 移植Android 内核 主要过程: . 安装lunux 环境 . 安装编译工具 . 下载Linux kernel . 安装SDK . 获得root file system . ...
- 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT
[TINY4412]U-BOOT移植笔记:(9)SD卡启动U-BOOT 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板 ...
- Spring Boot 启动 Logo 修改 字符图案 只支持ASCII字符
Spring Boot 启动 Logo 修改 字符图案 只支持ASCII字符 参考网址:http://patorjk.com/software/taag gitee的pages:https://win ...
- spring boot所打的jar在服务器启动时,日志打印时间、jar所使用时间和系统当前时间不一致
1.spring boot所打的jar在服务器启动时,日志打印时间.jar所使用时间和系统当前时间不一致 1)系统时间 2)日志打印时间 2.解决方法 在启动的时间添加-Duser.timezone= ...
- S3C6410移植linux4.17内核(一)
环境:Ubuntu16.04(VMWare) 1.准备工作 下载最新的内核,linux-4-17 便在交叉编译工具,gcc-arm-none-eabi-7-2018-q2-update-linux.t ...
- Spring Boot 2.1之后如何在启动日志中打印请求路径列表
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...
- 移植uboot第四步:设置NAND启动
写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...
- Spring boot 如何读取配置文件properties中的信息
1. 用 @Value 注解 直接可以在你要用到改配置文件信息的类里面进行 具体例子如下: @Service public class MyCommandService { @Value(&q ...
- 004-Spring boot 快速入门-项目搭建与启动、SpringBootApplication、启动图标
一.官方地址 Spring:http://spring.io/ Spring Project:http://spring.io/projects Spring boot:https://project ...
最新文章
- AttributeError: ‘NoneType‘ object has no attribute ‘group‘
- jmeter吞吐量图形显示_Jmeter系列(43)- 详解 Jmeter 图形化 HTML 压测报告之 Charts 模块...
- 深入浅出之C++11新特性
- 用动态规划算法求解最少硬币问题 c语言,动态规划算法求解硬币找零问题
- Java环境变量CLASSPATH详解
- echart仪表盘旋转_使用echart仪表盘
- 一样的打游戏,不一样的酷
- Spark学习之路 (二十三)SparkStreaming的官方文档
- JavaWeb基于session和cookie的数据共享
- Java:判断某年是闰年or平年并输出某月的天数
- “用户体验及可用性测试”前三章:读书笔记
- 工业互联网(一):工业互联网的发展背景
- pta中c语言编程问题答案,pta题库答案_浙大远程教育2015秋 程序设计基础C 求PTA实验代码题库liujiahai-C答案_淘题吧...
- 雇佣兵问题(Python解答)
- 前端展示中实现批量标签动态生成
- 游戏c是什么网络语言,游戏cpdd网络用语是什么意思 王者荣耀里很常见
- nuc972外部中断1实验代码
- 行间距和文本样式的设置
- 台式机键盘鼠标失灵,无法输入密码,无法登陆电脑
- 2023年留学基金委(CSC)联合培养博士研究生项目解读及建议
热门文章
- LeetCode MySQL 178. 分数排名(dense_rank连续排名)
- LeetCode 1470. 重新排列数组
- LeetCode 230. 二叉搜索树中第K小的元素(中序遍历)
- 字符串匹配算法(Trie树)
- 数据结构--单链表single linked list数据结构C++实现
- 完全相同的4个小矩形如图所示放置_吸睛!矩形在PPT中的创意表现
- 数据库练习题(一)创建表格并做相应的查询
- python中解决死锁的方法
- 预训练模型对实体的表示能力差?一个简单有效的解法来了!(开源)
- ACL2020 | 线上搜索结果大幅提升!亚马逊提出对抗式query-doc相关性模型