2410学习笔记 07 (未整理,但对新手肯定有用)

来源:互联网 发布:开淘宝店代理怎么赚钱 编辑:程序博客网 时间:2024/05/16 17:34

继续

无意中看到一个4510B 的bootload介绍(作者杜云海)写的非常精彩。
在其中了解了一个东西,在编译后生成的iamge里, 如何确定RW的位置呢?
   因为不管是用ADS还是用MDK,生成image都是有规则的,比如一定要按照顺序 RO,RW,ZI,根据RO_BASE和RO_LENGTH,其实就可以知道RW_BASE in nand了。
在进行nandcopy时就知道copy的源地址啦。。。而RW的运行域地址,可以是在分散加载文件里面指定的。就是这么简单?自己笨了好久。

    今天试了下 DNW , SFJ2410(这个挺好,不过只能在并口下玩),回头可以研究一下这两者的代码。不知道sfj2410烧录的时候,也没有做坏块管理,没有做的话,可能会出问题的。比如提供的vivi(晚上回去用MDK烧录工具试一下能否运行哈哈),大小为85KB,满打满算的话需要14个左右的block来,这个既然能正确启动linux内核,应该说明sfj2410烧录nand时做了坏块区分的,而后vivi本身也有坏块的处理。两者结合运行才没有问题。
    
    NND不能拖了,今晚回去必须首先看MMU(正在看的过程中,有难度啊,真的是博大精深)


NND,使用MDK下载bin文件,发现下载时工具只认axf文件。。。很奇怪,为什么不是直接下载bin的呢?那生成bin有什么用???
不过暂时就不能验证VIVI用MDK烧录工具的烧录运行情况了。。。(除非在MDK环境下编译一把VIVI)

看来只好采用在ADS下加载bin文件的方式来做了。

2010/01/21 
1. 晚上回去试一下ADS下加载bin文件,直接在ADS或者MDK下无法用fopen等操作了(不知道MDK的脚本机制能不能load file到指定位置)

    尝试1.把vivi改名为vivi.axf放到out目录下,不要编译直接点击download报错,Erase Skipped,这说明原先正常生成的axf文件里面有些特殊的信息会反馈给MDK中nandlash烧写程式
              我现在直接裸把vivi改成vivi.axf,导致烧写失败;(这是MDK一个很搓的地方,不能指定烧写bin或者hex的文件,只能按照默认的来)

    尝试2.在flash download设置选项中,增加填上init file一项,添加了一个ini文件,里面下LOAD VIVI.HEX发现仍然不行(全路径也试了还是不行,报错invalid absolute module)
                并且之前的MDK工程默认的axf文件依然会被加载进入,尝试失败

    尝试3.在SDRAM调试运行环境下,把vivi改成vivi.o并放入out目录下,在sct文件中添加一项用于装载vivi的执行域。但是失败,猜想可能是因为编译生成的link文件中没有vivi.o这一项

    尝试4.把vivi通过工具
BIN2C_WIN工具先转换为C数组,之后把这个C数据的文件link到整个工程中,再在sct中指定该数据的执行域。看能否正确加载,如果OK,则直接使用这些数组中的数据
              对nand编程。 
               实验结果很意外,为什么这个数组加载不到SDRAM中来了???
                可以确vivi中的数组已经存在以axf文件中,
                已经找到原因,原来是因为我的sct写的有错误。混淆了LR 和ER 域。
                如下是正确的写法
LREGION_ROM1 0x30000000   0x01000000
{  
    EREGION_ROM1 0x30000000 0x00100000
    {  
        *.o (Init, +First)
        .ANY (+RO)
    }    
    EREGION_RAM1 0x30100000   
    {  
        .ANY (+RW +ZI)
    }
}

LREGION_ROM2 0x30200000  0x00100000
{
     EREGION_VIVI 0x30200000   
    {  
        vivi.o (+RW)        
    }
}
      


2. 读VIVI,改2410init.s, 增加badblock判断。


3. 做个试验,在nand的操作时,增加坏块判断,看编程和擦出操作是否OK
!!!
   需要明确我开发板上面这个nandflash现在是不是有很多坏块了,是不是还能用了
    整理下这个nandblockcheck程序检测思路

    显示方式:uart打印
    输入方式:按键PC上键盘,通过串口接收
    控制流程:1. 强行从第二个block开始标记所有block为valid block,对应API,ForceMark_AllBlockValid()
                 2. 从第一个块开始执行对所有block的擦除操作,对应API,Erase_AllBlock(U32 mode)
                 3. 在擦除过程中可以发现擦除失败,则把当前块标记为坏块。
                 4. 在以上的操作结束后,才可以确定哪些是好块哪些是坏块。
                 5. 再做boot的东西。
                                    


    API:      Get_BlockStatus---
                从第一个坏块开始检查,若当前块为坏块,则串口打印出来信息"this is a bad block, handle it?"
                1. skip and go on.          
                2. mark as bad block and go on.

                调试运行后,出现功能选项
                1. Force mark all as valid block
                    force mark done.

                2. Erase nandflash all block
                    erase all done.

                3. Programe nandflash
                    enter the start block: ___
                    ......programming, pls wait.
                    ......program done.
                    Current nand programe statics:
                        start block:
                        finded bad block cnt:
                        used valid block cnt:
                        last used block index:

                 4. Report check statistics  

                 5. Exit
                
     OK,已经成功实现通过上述方式把bin文件下载到nand中运行。


2010/01/24
    开始测试2410的中断模块
        因为现在还没有外扩按键,所以可以先测试定时中断效果。借此把2410init.s改写一下。

2010/01/25
    1. 继续测试MDk自带的nandflash烧录工具问题
        思路:把测试程序生成bin文件,把bin文件加载到SDRAM中之后通过nand烧写程序下载到nand看是是否有现象。
        如果仍然不行,则在nandboot部分nandcopy时增加blockcheck。

    2. 完成 2010/01/24 的事情,测试定时中断,看中断触发后的PC跳转。

    3. 批处理总算搞了一点点,语法很多,很不习惯。网上下载了个rename程序凑合着用了。
        了解到 在call xx.bat时需要关注到当前的路径。
         

2010/01/26
    1.  经过昨晚试验发现很多问题,vivi bin还是按照原来的方式下载到nand中竟然无法运行了。
    2.  加载时vivi image尺寸有问题 KKK(怀疑是由于在 iamge 数据前添加了 __Align(4)所致,但测试发现也不是,很奇怪
        早上来公司用sfj烧写了一次后,就SDRAM加载又正常了)

    3.  决定好好做这个nandflash管理的问题(MDK下调试运行的程序)
         新增功能:print page in block
         bin文件的零头如何处理?即bin中剩余的数据已经不够一个page大小,怎么处理。
   
     4.  首先需要一个方法来验证我这个调试工具的正确性。比如通过这个工具在特定page写特定值,之后试用sfj2410的print功能打印看时候匹配
        现在的现象很诡异:用sfj烧好程序后可以正常加载运行,但是用我的工具烧录后,nand中所有block的page都变成0xff了?

2010/01/26  傍晚
    1. 测试发现atoi函数无效,是不是因为clib中此函数是个空壳,待查
    2. 在MDK下增加了page打印功能,现在发现一旦用上面的烧写功能,nandflash中全部是0xff,这肯定有问题的。  问题定位到 Programe_Nandflash_Test() 
        已经解决,就是这个函数写的有问题,改正过来就好了。

    3. 我把我自己编译好的一个小程序bin文件中自己的工具烧录进nand,无法运行,这说明不是坏块的问题,而是2410init.s中的问题,问题定位于此。
    4. 又发现的一个奇怪的问题是:通过MDK自带的nand烧录工具则会把block2标记为坏块。并且表现为0~22全部为坏页
        因为这个自带的烧录工具很难跟踪BUG,暂时先放弃它,用自己的方式来烧写bin。

2010/01/26  23:32
    1. 经过仔细核对2410init.s写法发现很多不妥的地方。比如在nandcopy之后没有为pc给合理的值,导致无法跳转到main函数。
      思路应该是在nandcopy之后,程序就应该在SDRAM中运行了,所以PC必须要知道SDRAM以0x30000000为起始的某个地方。这时候因为SDRAM中有何SRAM种完全相同的一个image,所以pc并没有指导    SDRAM的起始地方,而是指向在SRAM中nandcopy代码后面的位置,记住这是一个相对位置,这里就是相对于0x30000000的,这程序就无缝的衔接起来了。
    
        接着以上部分还要强调一点,就是在运行nandcopy之前包括nandcopy本身的所有代码,必须保证在烧录到nandflash的前4KB以内。
        否则会出现程序无法运行,直接死掉,因为找不到有效的指令或者数据。

(注意:此时我的2410init.s中nandcopy部分依然没有增加badblockcheck)

      go on
                       


















原创粉丝点击