u-boot2010.06的移植(3)——支持nand启动
2015-09-15 08:38
323 查看
为什么要支持nand启动?这是面试的时候问的一个问题,结果我说是就是多一种支持,事后想想回答的太笨了啊,最起码也得回答个nand便宜啊,至于从sd卡驱动,以后再说。。
nand启动原理很简单,就是用nand的读方法从当前地址拷贝到链接地址,其中的难点是写地址。
以K9F2G08 (256M*8bit) 为例,其地址周期如下图:
![](http://blog.csdn.net/attachment/201402/22/27097876_1393056540S0LL.bmp)
其中列地址A0-A10也称为页内地址;行地址A12-A28也成为页号,即页的号码,第五周期的A28也成为块号。而A11是给OOB用的对OOB没有研究,先略过。。。
所以对于向页内的某个地址读写,其实际的地址排布是A28、A27、A26、... ...A13、A12、A10[/u]、A9、A8、... ...A2、A1、A0 (没有A11)。
另一个难点(也说不上难点,我掌握的不好而已)是关于内存的步长。开始我是这么写的:
#define NFDATA (*((volatile unsigned long *)0x4E000010))
。。。。。。
static unsigned long nand_read_data(void)
{
return NFDATA;
}
。。。。。。
static void nand_read_to_buf(unsigned char *buf, unsigned long addr, unsigned long count)
{
volatile int i = 0;
unsigned long col = addr & 0x7ff;
nand_select();
while (i < count)
{
nand_write_cmmd(0x00);
nand_write_addr(addr);
nand_write_cmmd(0x30);
nand_wait_ready();
for (; (col < 2048) && (i < count); i++, addr++, col++)
{
buf[i] = nand_read_data();
}
col = 0;
}
nand_deselect();
}
但是启动不起来,原因是nand_read_to_buf()的第一个参数buf是char *类型的,而nand_read_data()的返回值类型是unsigned long,肯定不对了,所以应该把nand_read_data()的返回值类型改为unsigned char,#define NFDATA (*((volatile unsigned char*)0x4E000010))。
另一种改法就是步长为四字节的处理,但这样的话要求判断是否对齐,而且大小端的问题也要注意到,等系统学习完一遍了在研究。
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
阅读(150) | 评论(0) | 转发(0) |
0
上一篇:UBOOT-2012-10在OK6410平台的移植(三)uboot 2012.10编译配置
下一篇: u-boot2010.06的移植(4)——支持norflash
相关热门文章
SHTML是什么_SSI有什么用...
shell中字符串操作
shell中的特殊字符
关于java中的“错误:找不到或...
linux设备驱动归纳总结...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
nand启动原理很简单,就是用nand的读方法从当前地址拷贝到链接地址,其中的难点是写地址。
以K9F2G08 (256M*8bit) 为例,其地址周期如下图:
![](http://blog.csdn.net/attachment/201402/22/27097876_1393056540S0LL.bmp)
其中列地址A0-A10也称为页内地址;行地址A12-A28也成为页号,即页的号码,第五周期的A28也成为块号。而A11是给OOB用的对OOB没有研究,先略过。。。
所以对于向页内的某个地址读写,其实际的地址排布是A28、A27、A26、... ...A13、A12、A10[/u]、A9、A8、... ...A2、A1、A0 (没有A11)。
另一个难点(也说不上难点,我掌握的不好而已)是关于内存的步长。开始我是这么写的:
#define NFDATA (*((volatile unsigned long *)0x4E000010))
。。。。。。
static unsigned long nand_read_data(void)
{
return NFDATA;
}
。。。。。。
static void nand_read_to_buf(unsigned char *buf, unsigned long addr, unsigned long count)
{
volatile int i = 0;
unsigned long col = addr & 0x7ff;
nand_select();
while (i < count)
{
nand_write_cmmd(0x00);
nand_write_addr(addr);
nand_write_cmmd(0x30);
nand_wait_ready();
for (; (col < 2048) && (i < count); i++, addr++, col++)
{
buf[i] = nand_read_data();
}
col = 0;
}
nand_deselect();
}
但是启动不起来,原因是nand_read_to_buf()的第一个参数buf是char *类型的,而nand_read_data()的返回值类型是unsigned long,肯定不对了,所以应该把nand_read_data()的返回值类型改为unsigned char,#define NFDATA (*((volatile unsigned char*)0x4E000010))。
另一种改法就是步长为四字节的处理,但这样的话要求判断是否对齐,而且大小端的问题也要注意到,等系统学习完一遍了在研究。
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
阅读(150) | 评论(0) | 转发(0) |
0
上一篇:UBOOT-2012-10在OK6410平台的移植(三)uboot 2012.10编译配置
下一篇: u-boot2010.06的移植(4)——支持norflash
相关热门文章
SHTML是什么_SSI有什么用...
shell中字符串操作
shell中的特殊字符
关于java中的“错误:找不到或...
linux设备驱动归纳总结...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- UBOOT-2012-10在OK6410平台的移植(三)uboot 2012.10编译配置
- u-boot2010.06的移植(2)—— 时钟、SDRAM、UART
- ORR R0,R0,#R1_nF:OR:R1_iA
- 关于静态变量和变量初始化问题
- set_irq_reg()函数
- read 函数返回值
- c语言编译常见错误改正
- Linux下的device_create创建字符设备节点流程
- mdev.txt
- mdev.c(二)
- mdev.c分析
- VirtualBox虚拟机网络环境解析和搭建-NAT、桥接、Host-Only、Internal、端口映射
- 运行不息的内核线程kthread
- iOS开发中UITableView和UItableViewCell的几种形式
- 内联函数
- HAL层开发框架介绍
- linux程序设计---多线程
- 关于might_sleep的一点说明
- proc函数
- 三星S3C2440 Datasheet LCD Controller 章节翻译(2)