06-S3C2440学习之移植2012u-boot到S3C2440(移植过程二)支持NAND启动
2017-04-19 16:50
621 查看
说明:
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)","*(.dynsym)"(*(.rel*)","*(.dynsym)这些地址信息用于实现UBOOT可以被拷贝到任何地方,更新地址信息),但使得程序非常大,结构复杂,不利于从NAND启动(重定位之前的启动代码应该少于4K)。所提去掉了pie功能。
(1)使用一下之前写的init.c
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/3bc961ae025ca98f84340b733e3d655c)
拷贝到2440单板下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/ecdc85de6a3753ff2199bc2fea130dd1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/866b75045501f056d2b19f669c93dae6)
修改init内容为:
/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))
/* GPIO */
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHUP (*(volatile unsigned long *)0x56000078)
/* UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)
#define TXD0READY (1<<2)
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void)
{
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
}
void clear_bss(void)
{
}
void nand_init_ll(void)
{
}
static void nand_select(void)
{
}
static void nand_deselect(void)
{
}
static void nand_cmd(unsigned char cmd)
{
}
static void nand_addr(unsigned int addr)
{
}
static void nand_wait_ready(void)
{
}
static unsigned char nand_data(void)
{
}
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
}
(2)使用已经设置好栈,进行nand初始化、重定位等操作
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/5e02d1026d7022946521b9ef8ee41475)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/6c5d29717e58616a2753fb0863312b7e)
参考:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/7694b6546d4dea402b40fc7123d0c690)
拷贝:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/c8f0b2d1a1d65e48c3cd262a7e474fa3)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/dc6ca4a468ab7f8b14bf1ab7bcb03334)
链接地址为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/09994ca108f51fafed4cf7ce243171d2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/b87c9933384e2c99fbdaffd323d1e6d3)
为汇编 可能存到4K之外,所以改为这个,地址定死了。这就是程序的链接地址。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/ee4fd5cf81670260da9b1a0127f0c691)
这个值要修改:(64M 中预留512K给uboot)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/46e6865b2bf09dd983aa85f61fd6c52e)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/5a01e8f44c80add3089dbdc887d4fb9d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/37f3c886b9e423f62c65d7bf26313b40)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/9be124390257d1f7157b55caeae833cb)
Ofs就是大小,r0 r1 r2 分别是源 目的 大小
(3)清bss段
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/ac12475a3e637346d2b28a2b61a591c4)
(4)从片内 跳转到SDRAM中。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/f148695765814f7897de15370ac5f4c2)
(5)修改board_init_f,把relocate_code去掉
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/a921653acc4eecb6eeb20a02ae9fb483)
(6)删掉多余的清BSS
从
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/174b85509dc2eeff929595e5736f516b)
删除到:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/caaee94521e1fd46f684e5edb34a9e6e)
(7)调用第二阶段
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/46a9b27e3eacde06e17a195a56bc27c2)
需要使用ID这个参数 上一个函数来返回这个值
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/db0a3b72f7319c397d646a554ca2513f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/a8613e4538cbfb0fda151c5c0a262623)
(8)更新修改过的文件
start.S (arch\arm\cpu\arm920t)
Board.c (arch\arm\lib)
Init.c (board\samsung\smdk2440)
Smdk2440.h (include\configs)
(9)修改makefile
viboard/samsung/smdk2440/Makefile
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/65c9ec2e7ef925784205948c65ec3b14)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/7ed7347a6cad846e3418fc640baa96db)
(10)修改去掉"-pie"选项
arch/arm/config.mk:75:LDFLAGS_u-boot +=-pie 去掉这行
viarch/arm/config.mk +75
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/048f8a84e17749d7487abf61dc9780c5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/53355d8f89527a8f132582714726ccf7)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/3b8b9b326c70b067bbc8486257c59f17)
(11)修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/3032b0c7672e795fbf39b74d4d8ad093)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/9ab43aecee2f285200f5f089b77feba2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/2f8fe601ef968d722d838dfa0ca3d80d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/c189117e5743b6fd779c43031fd47221)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/6ed9ce71073157157cf98e966dfeced9)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/d9d80110e9663e7b921d3d8c1b7aac4d)
(12)make后会出现几个错误:
函数声明错误,改成有返回值的
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/89b9178f9ba88a129c51f8b3908c6846)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/667eade967084af322bad4522cb9a23b)
函数名称已经修改
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/86e86ae7fb47dd6f4c53d48919cf2dc2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/7532330723e050fac2b0c0b72228669a)
(13)计算大小
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/a016d797df06fa2a9bc1c384028902e5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/721c3640f5bd3ca68f209f646188166d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/658e6d9d06637c714cf2f380fc3dff9f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/09cc8e005db37c6c718c13e1682356b2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/25a2b7a0a430180aca4b178baac4de0d)
(14)预留了1M给uboot,make,生成反汇编
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/02/1fb1dbcc2f896eb13f951de4bb963f3e)
(15)到此,下载到nand 从nand启动,启动成功!
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)","*(.dynsym)"(*(.rel*)","*(.dynsym)这些地址信息用于实现UBOOT可以被拷贝到任何地方,更新地址信息),但使得程序非常大,结构复杂,不利于从NAND启动(重定位之前的启动代码应该少于4K)。所提去掉了pie功能。
(1)使用一下之前写的init.c
拷贝到2440单板下:
修改init内容为:
/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))
/* GPIO */
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHUP (*(volatile unsigned long *)0x56000078)
/* UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)
#define TXD0READY (1<<2)
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void)
{
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
}
void clear_bss(void)
{
}
void nand_init_ll(void)
{
}
static void nand_select(void)
{
}
static void nand_deselect(void)
{
}
static void nand_cmd(unsigned char cmd)
{
}
static void nand_addr(unsigned int addr)
{
}
static void nand_wait_ready(void)
{
}
static unsigned char nand_data(void)
{
}
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
}
(2)使用已经设置好栈,进行nand初始化、重定位等操作
参考:
拷贝:
链接地址为:
为汇编 可能存到4K之外,所以改为这个,地址定死了。这就是程序的链接地址。
这个值要修改:(64M 中预留512K给uboot)
Ofs就是大小,r0 r1 r2 分别是源 目的 大小
(3)清bss段
(4)从片内 跳转到SDRAM中。
(5)修改board_init_f,把relocate_code去掉
(6)删掉多余的清BSS
从
删除到:
(7)调用第二阶段
需要使用ID这个参数 上一个函数来返回这个值
(8)更新修改过的文件
start.S (arch\arm\cpu\arm920t)
Board.c (arch\arm\lib)
Init.c (board\samsung\smdk2440)
Smdk2440.h (include\configs)
(9)修改makefile
viboard/samsung/smdk2440/Makefile
(10)修改去掉"-pie"选项
arch/arm/config.mk:75:LDFLAGS_u-boot +=-pie 去掉这行
viarch/arm/config.mk +75
(11)修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
(12)make后会出现几个错误:
函数声明错误,改成有返回值的
函数名称已经修改
(13)计算大小
(14)预留了1M给uboot,make,生成反汇编
(15)到此,下载到nand 从nand启动,启动成功!
相关文章推荐
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程四)支持Nand Flash+支持DM9000网卡
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程三)支持NorFlash
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程五--最终)裁剪+修改默认参数+分区设置+支持文件系统下载
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART
- 06-S3C2440学习之移植2012u-boot到S3C2440(分析过程)
- 移植u-boot学习笔记5----- 修改代码之支持NAND启动
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- 移植 u-boot 1.1.6 到 S3C2440 (nand 启动)
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- TQ2440 学习笔记—— 31、移植U-Boot【U-Boot 的启动过程第二阶段源码分析】
- TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
- 【Linux 移植 】——4、移植 u-boot-2012.04.01 之 支持NAND启动
- Uboot学习笔记③---(uboot移植及启动过程)
- [置顶] 亮仔移植u-boot系列之-- S3c2440在最新版本U-boot-2015.10移植(支持SPL模式启动) -- 3
- U-boot移植 (v2012.04.1 S3C2440平台) (二) Nand flash 启动支持
- u-boot2010.06的移植(3)——支持nand启动
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(九)NAND Flash启动支持的一种新型方法,利用U-Boot自带nand_spl/nand_boot.c
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动 .
- u-boot-1.2.0移植到s3c2440(一)主要是对NAND和NOR的支持