基于MINI2440的NAND启动代码(第二版),增加下载功能,增加坏BLCOK检测。。。
更新内容:一,下载功能
进入方式:
当按下KEY1,会见到下面画片:
http://cache.amobbs.com/bbs_upload782111/files_15/ourdev_448570.JPG
(原文件名:未命名.JPG)
a 是下载镜像到NAND,进入后会提示输入BLOCK 起始地址,地址范围小于4096,输完地址后选择DNW的serial port-->transmit就可以了。下完要手工复位。
b 是下载镜像到SDRAM 并运行,进入后选择DNW的serial port-->transmit就可以了。
c 这个不说了。
二,坏BLOCK检测:
原理:坏BLOCK是不可以写入和删除的,程序中当发现第N个为坏BLOCK,就在第N-1个BLOCK的第一页512地址处写‘b’,写入或读取程序通过读取每个BLCOK的第一页的512地址判断下一个BLCOK是否坏BLCOK,从而采取是否跳过下一个BLCOK的写入和读取。
一般来说坏BLOCK的数目是比较少的,我那块NAND开始开始时检测并没有发现坏BLCOK,擦除了几次之后出现了一个坏BLOCK,汗~~看来它给我测试的机会了。
ECC校验目前还未添加。
还有对启动文件删除了SDRAM的清零部分,对NAND读取部分改了一些代码,提升了程序进入速度。
Note:如果需要使用我写的函数的朋友请看下面说明。
函数库的说明:
//******************************************************//
文件夹lib:这里放着2440的一些基本函数。
2440lib.c:
void Uart_init(int pclk,int baud);//串口初始化函数,默认设置Uart_init(0,115200)就为115200波特率。
void Uart_sel(int ch);//串口选择函数
U8 Uart_getchar(void);//从串口得到一个字符
void Uart_putchar(U8 in_char);//从串口输出一个字符
void Uart_putstring(S8 *string);//输出字符串
void dis_number(U32 number);//以16进制形式输出一个32位数
U32 Uart_download(U32 *Down_addr);//串口下载函数,Down_addr为保存起始地址
其中void dis_number(U32 number)十分有用,它可以很方便地显示一些寄存器数值,显示参数的值,显示SDRAM的内容等,我在调试中多次使用这个函数。不过对时序有严格的要求的程序要谨慎使用。
2440_exception.c
这里罗列一堆的中断或异常处理函数,太多就不列出了,当需要中断处理时就在相应的中断函数内写程序就行了,里面有例子,不难。。
nand.c
void NF_init(void);//NAND的初始化函数
void NF_busy_check(void);//NAND的忙检测
U32 NF_ID(void);//返回16位ID号,我的为EC76
void NF_read_bytes(U32 P_addr,U8 *buf);//以字节形式读出一页(512bytes)的内容,buf为缓存地址
void NF_read_words(U32 P_addr,U32 P_size,U32 *buf);//以字形式读出NAND内容,P_size为页数,buf为缓存地址
void NF_write_bytes(U32 P_addr,U8 *buf);//以字节形式写入一页(512bytes)的内容,buf为缓存地址
void NF_write_words(U32 P_addr,U32 P_size,U32 *buf);以字形式写入到NAND,P_size为页数,buf为下载地址
U8 NF_Block_erase(U16 Block_addr,U16 Block_num);//删除NAND的BLCOK,并标记坏BLOCK,Block_addr为Block起始地址,Block_num为删除的Block数目。
void NF_Block_format(void);//格式化NAND,标记坏BLOCK并列出坏Block列表。
U8 NF_read_spare(U32 P_addr,U8 offset);//读NAND的空余空间,P_addr为页地址,offset为偏移地址,当offset=0代表读取本页地址为512的字节内容,当offset=16代表读取本页地址为528的字节内容,
void NF_write_spare(U32 P_addr,U8 offset,U8 data);//写NAND的空余空间,P_addr为页地址,offset为偏移地址,当offset=0代表更新本页地址为512的字节内容,当offset=16代表更新本页地址为528的字节内容,
void NF_download(U16 Block_start,U32 *Down_addr,U32 Down_size);//用于下载程序到NAND,Block_start为Block起始地址,Down_addr为下载起始地址,Down_size(字)为下载文件大小。
void NF_read(U16 Block_start,U32 *buf_addr,U32 File_size);//用于读出NAND内容,Block_start为Block起始地址,Down_addr为读出起始地址,Down_size(字)为读出文件大小。
对于SDRAM运行的补充说明:
启动文件默认是将程序下载到地址0x32000000处运行,下载时要在ADSM内将RO BASE设置为0x32000000,entry point 设置为0x32000000;DNW内设不设没所谓。
这里并不支持中断的调试,原因是中断入口接不上,当需要调试中断时请下载NAND内调试。
调试中断时我遇到了很多郁闷费解的问题,后来发现如果将程序直接下载到NAND内运行可以避免很多问题,这是我个人看法,仅供参考。
如果还有一些不明白的可以跟帖或者看我发的另一个帖子。
接下来的时间我要准备复习考试了,没什么时间搞ARM,况且这学期我逃了很多课,平时成绩没什么指望,再不复习挂科就麻烦了。
所以一些大程序就搞不成了,只能做些小修小补。把主要精力放在复习上,考完试再搞。
点击此处下载 ourdev_448584.rar(文件大小:335K) (原文件名:2440_Uart_Download.rar) ./emotion/em052.gif
mark !! 不错,学习学习 先标记下,这学期我也把精力投在arm上了,要考试了,没时间玩了
主要在玩linux,不过,汇编自我感觉还行,以后回来仔细研究你帖子的 这里并不支持中断的调试,原因是中断入口接不上,当需要调试中断时请下载NAND内调试。----为什么没法在SDRAM中调试中断啊? mark mark 准备入手一块mini2440学习 好东西 很好很强大 rk mark Error : (Fatal) L6031U: Could not open scatter description file d:\My Documents\arm project\2440_NAND_ROOT\2440_sum.scf. MARK 好东西。。。。 学习下了,谢谢! 谢谢楼主分享 mark,厉害,计划照着楼主的代码学习学习,把nand操作学会。
页:
[1]