打印

at91sam9260将NANDFLASH由256MB改成64MB,驱动应如何修改,求帮助!

[复制链接]
3893|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
successan034|  楼主 | 2012-12-16 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我们现在想把之前的K9F2G08U0B改成K9F1208U0B,即把NANDFLASH由256MB改成64MB。我现在主要在AT91SAM9260的BOOTSTRAP1.15中添加了支持64MB的NANDFLASH代码,其他的U-BOOT1.3.4和内核及文件系统都没有修改,通过SAM-BA2.12下载后,还是只打印出ROMBOOT,目前很急,望之前改过类似的大侠支招。万分感谢!BOOTSTRAP1.15主要修改了如下两处:

1、Bootstrap1.15/include/nand_ids.h中的增加了支持64MB NANDFLASH的一行。
       static struct SNandInitInfo NandFlash_InitInfo[] = {
       {0xecda, 0x800, 0x20000, 0x800, 0x40, 0x0, "Samsung K9F2G08U0M 256Mb\0"},
       {0xecf1, 0x400, 0x20000, 0x800, 0x40, 0x0, "Samsung K9F1G08U0M 128Mb\0"},
       {0xec76, 0x1000, 0x4000, 0x200, 0x10, 0x0, "Samsung K9F12808u0b 64Mb\0"}, //增加行
       {0x2cca, 0x800, 0x20000, 0x800, 0x40, 0x1, "Micron MT29F2G16AAB 256Mb\0"},     
       {0,}
};

2、Bootstrap1.2/board/at91sam9260ek/nandflash/at91sam9260ek.h中将
#undef    NANDFLASH_SMALL_BLOCKS /* NANDFLASH_LARGE_BLOCKS used instead */
语句也改成了
#define    NANDFLASH_SMALL_BLOCKS /*  NANDFLASH_LARGE_BLOCKS used instead */
即也支持了小块的NANDFLASH。

大侠,应该主要就是改这两项吧。在UBUNTU下编译后BIN文件也小于4K。通过SAM-BA2.12下载U-BOOT后,U-BOOT怎么也起不来。只能打印ROMBOOT!!!!!!!!

求解!谢谢!

相关帖子

沙发
jlass| | 2012-12-17 09:26 | 只看该作者
本帖最后由 jlass 于 2012-12-17 09:27 编辑

一下子也看不出什么问题,你自己加打印慢慢调吧

0xec76, 0x1000, 0x4000, 0x200, 0x10, 0x0, "Samsung K9F12808u0b 64Mb\0"
这句是关键,一定要确认其正确性。
另外我有点疑问,就算是nandflash没用,也不应该会影响uboot起不来啊

使用特权

评论回复
板凳
阿南| | 2012-12-17 09:36 | 只看该作者
9260官方应该有直接支持64MB的,找现有的Image放进去试试

使用特权

评论回复
地板
dami| | 2012-12-18 22:30 | 只看该作者
俩个NAND一个是大页,一个是小页。要改最底层的读写操作函数。

使用特权

评论回复
5
successan034|  楼主 | 2012-12-18 23:06 | 只看该作者
各位好:
      我加了打印信息,发现程序死在BOOTSTRAP1.14/drivers/nandflash.c 的int load_nandflash(unsigned int img_addr, unsigned int img_size, unsigned int img_dest)函数的如下代码处:
                     if (AT91F_NandRead(&sNandInfo, blockIdx, sectorIdx, ZONE_DATA, pOutBuffer) == FALSE)                                {
                                        blockError = 1;
                                        dbg_print("AT91F_NandRead is over...\n\r");                    //yxj
                                }
       即函数(AT91F_NandRead()的返回值是FALSE了,AT91F_NandRead()的函数如下了:

BOOL AT91F_NandRead(PSNandInfo pNandInfo, unsigned int uBlockNb, unsigned int uSectorNb, unsigned int uSpareValue, char *pOutBuffer)
{
        unsigned int uSectorAddr = uBlockNb * pNandInfo->uBlockNbData + uSectorNb * pNandInfo->uDataNbBytes;

        if (CheckBlock(pNandInfo, uBlockNb, pOutBuffer) == FALSE)
        {
                return FALSE;
                dbg_print("AT91_NANDREAD_FALSE...");                           //yxj
        }

        return AT91F_NandReadSector(pNandInfo, uSectorAddr, pOutBuffer, ZONE_DATA);
        BOOL NAND_READ_YXJ;                                                           //yxj
        NAND_READ_YXJ = AT91F_NandReadSector(pNandInfo, uSectorAddr, pOutBuffer, ZONE_DATA);
       
        dbg_print("AT91_NANDREAD_SUCCESS.....");                            //yxj
}


分析可以发现CheckBlock(pNandInfo, uBlockNb, pOutBuffer) == FALSE。 CheckBlock()函数如下:
BOOL CheckBlock(PSNandInfo pNandInfo, unsigned int uBlockNb, char *pOutBuffer)
{
        unsigned int i = 0;
        PSSectorInfo pSectorInfo;
        unsigned int uSectorAddr = uBlockNb * pNandInfo->uBlockNbData;

        // Read first page and second page spare zone to detect if block is bad
        for (i = 0; i < 2; i++)
    {
                AT91F_NandReadSector(pNandInfo, (uSectorAddr + i * pNandInfo->uDataNbBytes), pOutBuffer, ZONE_INFO);
                pSectorInfo = (PSSectorInfo)&pOutBuffer[pNandInfo->uDataNbBytes];
                if (pSectorInfo->spare[pNandInfo->uBadBlockInfoOffset] != BAD_BLOCK_TAG)
                {
                        return FALSE;
                }
    }

        return TRUE;
}


这样分析也就是if (pSectorInfo->spare[pNandInfo->uBadBlockInfoOffset] != BAD_BLOCK_TAG)这句出现问题了。但这句怎么会有问题呢。我在代码中已经指定了
#define NANDFLASH_SMALL_BLOCKS.
请各位大侠再帮我分析分析了。谢谢了啊!

使用特权

评论回复
6
successan034|  楼主 | 2012-12-19 00:16 | 只看该作者
dami 发表于 2012-12-18 22:30
俩个NAND一个是大页,一个是小页。要改最底层的读写操作函数。

K9F2G08是2048B的大页,K9F1208是512B的小页,但这在{0xec76, 0x1000, 0x4000, 0x200, 0x10, 0x0, "Samsung K9F12808u0b 64Mb\0"},这一行不是已经体现了K9F1208是512B的小页了吗?还是需要在其他地方改。谢谢指教!

使用特权

评论回复
7
successan034|  楼主 | 2012-12-20 11:43 | 只看该作者
怎么也没有人回答啊!

使用特权

评论回复
8
zifenglin| | 2013-2-28 20:54 | 只看该作者
解决了吗,我的情况是main.c 函数都没有进入,求解

使用特权

评论回复
9
ymind| | 2013-3-1 09:14 | 只看该作者
K9F1208是小页NAND (page size = 512B), 它的ids不是标准的,不能忽略第二个多余的command cycle等;
跟以后的timing比较规范化大页NAND, 小页NAND的timing还有一些特殊的地方,比如CS的使用中途不能抬起来,OOB内的索引等。
更怪(更早期)的小页NAND K9F2808甚至不支持对A,B,C区域一次性编程。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝