2410裸板调试笔记之 5 (未整理的,可能还有错误)

接上之前的继续

    使用MDK 工具包中自带的FLASH编程算法,可以实现对nor或者nand操作,我开发板上的nand为 k9f 1208 64MB的nand
MDK自带的flash算法中不包括着款,可以自己新增一个针对K9F1208的编程算法,但要放在 ../Flash目录下

    该flash烧写的project层次如下:
        Device Description
                FlashDev.c
        Program Functions
                FlashPrg.c
                FlashHW.c

   层次还算清晰,但是我有个疑问:
        我看到 FlashDev.c 和 FlashPrg.c都包含一个头文件flashos.h
在flashos.h中主要包含一些全局变量的设置,数据结构建立,一些nand操作的函数声明
而我们使用MDK上flash下载功能时,为什么MDK就通过ulink2操作nand了呢?在这过程中
MDK通过什么机制来调用nand的一些函数来操作nand呢?
        个人猜测:MDK通过FlashOS.h文件,这个FlashOS.h直接和MDK挂钩,具体如何实现待查。

    我重新改写了nandflash的编程算法,但现在发现仍然出现Flash Timeout的错误提示,经过利用led定位方法,我查到是在 FindBlock() 函数里的 CheckBlock_HW() 出现了问题,其一直返回不了 NAND_OK, 但看了CheckBlock_HW(addr)也没有发现问题,经了解,sumsung的nand保证block开始的1stblock肯定不会是坏块。
    增加串口显示功能,这样可以有更丰富的调试信息,便于我定位问题;

    问题已经得到解决,经分析,肯定是自带flash编程算法有问题,因为 nandflash 能保证 Block0 肯定是好块 , 即block0的page0或者page1的第517个字节肯定为0xFF,但现在查block0其仍然为坏块。明显是有问题的,通过对比 datasheet发现自带的程序中都把NFDATA当做32位寄存器来处理,但其实NFDATA是16位的,且低8位有效。所以需要把NFDATA当做 uchar来处理,按照这种思路处理后,烧写nand正常了。
    (但存在一个问题,在我使用FULL CHIP ERASE时,当进行到一定地址的时候出现 FLASH TIMEOUT错误)

    但是我的跑马灯程序烧写到nand之后运行并不正常,其一直亮着(应该有规律闪动的),估计原因应该是启动代码里出问题???(缺少把RW和ZI区数据搬运到RAM中的过程)
我们来分析一下:
Vectors      LDR     PC, Reset_Addr         //上电后PC指针指向的1st位置 放置RESET向量
                LDR     PC, Undef_Addr              
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
                LDR     PC, IRQ_Addr
                LDR     PC, FIQ_Addr
如果是在SDRAM(0x30000000)中调试运行,启动后PC指向0x30000000,那么在0x30000000放上Reset向量地址,在0x30000004放上Undef向量地址,依次类推(这句好像不对)。

IntVTAddress    EQU    0x33FFFF20

一旦进入调试状态后SP = 0x31000480?为什么会是这个数值呢?

在MDK下调试时,发现该工具有个缺点,因为在RAM中调试运行时,事先需要设计个调试配置脚本,里面需要加AXF文件,但是如果其axf文件路径设置不正确的话,其编译和debug的时候竟然没有任何错误提示音。这对于用户
来说很不方面,总需要花时间在查错上面?希望MDK可以改进一下。

现在在调试UART,暂且先用2410里的测试程序,开发板上的UART0,1 均运行正常。
[
    1. 在这个基础上,研读一下UART程序,了解原理(使用什么mode)。
    2. 整理好这个UART模块,作为以后的SDK一部分。
    3. 增加UART的输入响应功能,比如按键p--代表开始编程 等等
    4. 掌握其可变参函数"
Uart_Printf(...)"的写法  (网上文摘: http://blog.csdn.net/ZhouHM/archive/2004/04/07/14721.aspx)
]

因为据我了解往开发板上的nand烧写boot.bin的方法有好几种,通过MDK的自动方式只是其中一种,现在我来实现通过在SDRAM中运行的nandPro程序来烧写nandflash,烧写过程中使用UART0来打印过程信息,烧录完成后
且校验OK后,打印“nand(k9f 1208)program done ok”
目前遇到个问题,查看第一个block是否为坏块的时候返回结果竟然又是BadBlock,这肯定是错误。难道I/O没有配置好。
靠仔细检查了下代码,还是没有查出原因,继续查找原因。。。。。。
这个问题的原因已经找到了,果然是NAND 控制寄存器都忘记配置,运行已经OK!!!


但是让我有点欣慰的是 2410init.s + led.c的程序生成的bin文件下载到nand的block0后,可以运行了(脱离ULINK2运行,但是这个程序很小,1.55KB)~。。~

我接着感觉把2410的 mon.bin(34KB)下载到nand中,在校验的时候在 0x4000处提示contents missmatch错误,注意这里的0x4000地址正好为16384 = 512 * 32,这之间有什么联系吗?待查
难道超过一个block尺寸的bin文件,用MDK烧录都会出现这个问题,flash编程算法还有缺陷吗?或者是MDK软件的版权限制了烧录功能?NND

隔了一个礼拜未调2410,我现在又回来了!!!现在公司,手头没带开发板,只能靠找了。决定还是依靠UART打印程序信息的方式来调试
之前已经由LED显示,现在再把串口设置也加到编程算法中,加个宏定义。
在添加串口的过程中,发现如果添加了
void Uart_Printf(char *fmt,...)可变参函数,则编译时报错“L6967E: entry point(0x00000000) points to a THUMB instruction but is not a valid THUMB code pointer”暂时不知道为什么,
所以暂时不添加这个可变参函数。

你可能感兴趣的:(bootload)