S3C2410支持64M到1GB的NAND FLASH

来源:互联网 发布:js array的方法和属性 编辑:程序博客网 时间:2024/04/29 21:37

参考其它的ARM的NAND FLASH驱动,发现别人的NAND FLASH是采用一个表格来检测不同的NAND FLASH,现在已经移植到S3C2410中了。测试也是OK滴。。。只测试过64M的NAND FLASH,我想1G也是差不多滴,只需要看看SPEC。就知道怎么去做了。

这是S3C2410下的NAND FLASH驱动表格:

#define BW_X08                              0
#define BW_X16                              1
#define BW_X32                              2

/*****************************************************************************/
/* S2410 Internal Data Structure Definition                                    */
/*****************************************************************************/
typedef struct
{
 UINT16          nMID;           /* Manufacturer ID               */
 UINT16          nDID;           /* Device ID                     */

 UINT16          nNumOfBlks;     /* Number of Blocks              */
 UINT16          nPgsPerBlk;     /* Number of Pages per block     */
 UINT16          nSctsPerPg;     /* Number of Sectors per page    */
 UINT16          nNumOfPlanes;   /* Number of Planes              */
 UINT16          nBlksInRsv;     /* The Number of Blocks in Reservior for Bad Blocks   */
 UINT8           nBadPos;        /* BadBlock Information Poisition*/
 UINT8           nLsnPos;        /* LSN Position                  */
 UINT8           nECCPos;        /* ECC Policy : HW_ECC, SW_ECC   */
 UINT16          nBWidth;        /* Nand Organization X8 or X16   */

} S2410Spec;

static S2410Spec     astNandSpec[] = {
 /*************************************************************************/
 /* nMID, nDID,                                                           */
 /*            nNumOfBlks                                                 */
 /*                  nPgsPerBlk                                           */
 /*                      nSctsPerPg                                       */
 /*                         nNumOfPlanes                                  */
 /*                            nBlksInRsv                                 */
 /*                                nBadPos                                */
 /*                                   nLsnPos                             */
 /*                                      nECCPos                          */
 /*                                         nBWidth                       */
 /*************************************************************************/
 /* 8Gbit DDP NAND Flash */
 { 0xEC, 0xD3, 8192, 64, 4, 2,160, 0, 2, 8, BW_X08},
 /* 4Gbit DDP NAND Flash */
 { 0xEC, 0xAC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X08},
 { 0xEC, 0xDC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X08},
 //{ 0xEC, 0xBC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X16},
 //{ 0xEC, 0xCC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X16},
 /* 2Gbit NAND Flash */
 { 0xEC, 0xAA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X08},
 { 0xEC, 0xDA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X08},
 //{ 0xEC, 0xBA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X16},
 //{ 0xEC, 0xCA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X16},
 /* 2Gbit DDP NAND Flash */
 { 0xEC, 0xDA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X08},
 { 0xEC, 0xAA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X08},
 //{ 0xEC, 0xBA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X16},
 //{ 0xEC, 0xCA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X16},
 /*1Gbit NAND Flash */
 { 0xEC, 0xA1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X08},
 { 0xEC, 0xF1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X08},
 //{ 0xEC, 0xB1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X16},
 //{ 0xEC, 0xC1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X16},
 /* 1Gbit NAND Flash */ 
 { 0xEC, 0x79, 8192, 32, 1, 4,120, 5, 0, 6, BW_X08},
 { 0xEC, 0x78, 8192, 32, 1, 4,120, 5, 0, 6, BW_X08},
 //{ 0xEC, 0x74, 8192, 32, 1, 4,120,11, 0, 6, BW_X16},
 //{ 0xEC, 0x72, 8192, 32, 1, 4,120,11, 0, 6, BW_X16},
 /* 512Mbit NAND Flash */
 { 0xEC, 0x76, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08},
 { 0xEC, 0x36, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08},
 //{ 0xEC, 0x56, 4096, 32, 1, 4, 70,11, 0, 6, BW_X16},
 //{ 0xEC, 0x46, 4096, 32, 1, 4, 70,11, 0, 6, BW_X16},
 /* 256Mbit NAND Flash */  
 { 0xEC, 0x75, 2048, 32, 1, 1, 35, 5, 0, 6, BW_X08},
 { 0xEC, 0x35, 2048, 32, 1, 1, 35, 5, 0, 6, BW_X08},
 //{ 0xEC, 0x55, 2048, 32, 1, 1, 35,11, 0, 6, BW_X16},
 //{ 0xEC, 0x45, 2048, 32, 1, 1, 35,11, 0, 6, BW_X16},
 /* 128Mbit NAND Flash */
 { 0xEC, 0x73, 1024, 32, 1, 1, 20, 5, 0, 6, BW_X08},
 { 0xEC, 0x33, 1024, 32, 1, 1, 20, 5, 0, 6, BW_X08},
 //{ 0xEC, 0x53, 1024, 32, 1, 1, 20,11, 0, 6, BW_X16},
 //{ 0xEC, 0x43, 1024, 32, 1, 1, 20,11, 0, 6, BW_X16},

 { 0x00, 0x00,    0,  0, 0, 0,  0, 0, 0, 0,      0}
};

嘿嘿,总算是搞定NAND FLASH的编程了。可以支持64M到1GB的FLASH了。可以直接换IC即可。不需要更换驱动程序。在驱动中作了一个表格,从64M的到1GB的芯片信息全部在这个表格中,驱动采用查表得方式找到对应的IC。从而确定需要支持多大的NAND FLASH。。S3C2410的驱动和S3C2440的驱动还是有很多不一样的地方,相比较而言。。。S3C2440的驱动好写些。而S3C2410的不太好写。特别是ECC的校验。方式有点不一样。写法也不一样。前期老是出现:WARNING: OEMPlatformInit failed to initialize Boot Media。很头痛。后来仔细分析了这两颗IC发现寄存器还是有点不一样呀。汗颜啦。不动手实践,还是不知道答案滴。行动产生效率。。。。

原创粉丝点击