S3C2440之NAND FLASH移植到S3C2410的驱动分析

发布时间: 2024-06-11
来源: 电子工程世界

S3C2440A的NAND FLASH驱动移植到S3C2410还是有些不一样的,最主要的这两个IC的NAND FLASH的寄存器有些不一样,请看下面的两者之间不同:

  1. //   

  2. // Copyright (c) Microsoft Corporation.  All rights reserved.   

  3. //   

  4. //   

  5. // Use of this source code is subject to the terms of the Microsoft end-user   

  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.   

  7. // If you did not accept the terms of the EULA, you are not authorized to use   

  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your   

  9. // install media.   

  10. //   

  11. //------------------------------------------------------------------------------   

  12. //   

  13. //  Header: s3c2410x_nand.h   

  14. //   

  15. //  Defines the NAND controller CPU register layout and definitions.   

  16. //   

  17. #ifndef __S3C2410X_NAND_H   

  18. #define __S3C2410X_NAND_H   

  19.   

  20. #if __cplusplus   

  21.     extern "C"   

  22.     {  

  23. #endif   

  24.   

  25.   

  26. //------------------------------------------------------------------------------   

  27. //  Type: S3C2410X_NAND_REG       

  28. //   

  29. //  NAND Flash controller register layout. This register bank is located    

  30. //  by the constant CPU_BASE_REG_XX_NAND in the configuration file    

  31. //  cpu_base_reg_cfg.h.   

  32. //   

  33.   

  34. typedef struct    

  35. {  

  36.     UINT32  NFCONF;             // configuration reg   

  37.     UINT8   NFCMD;              // command set reg   

  38.     UINT8   pad1[3];            // pad    

  39.     UINT8   NFADDR;             // address set reg   

  40.     UINT8   pad2[3];            // pad    

  41.     UINT8   NFDATA;             // data reg   

  42.     UINT8   pad3[3];            // pad   

  43.     UINT32  NFSTAT;             // operation status reg   

  44.     UINT32  NFECC;             // error correction code 0   

  45.   

  46. } S3C2410X_NAND_REG, *PS3C2410X_NAND_REG;      

  47.   

  48.   

  49. #if __cplusplus   

  50.     }  

  51. #endif   

  52.   

  53. #endif   

上面的代码是S3C2410A的寄存器,我们在看看S3C2440A的寄存器地址说明:

  1. //   

  2. // Copyright (c) Microsoft Corporation.  All rights reserved.   

  3. //   

  4. //   

  5. // Use of this source code is subject to the terms of the Microsoft end-user   

  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.   

  7. // If you did not accept the terms of the EULA, you are not authorized to use   

  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your   

  9. // install media.   

  10. //   

  11. //------------------------------------------------------------------------------   

  12. //   

  13. //  Header: s3c2440a_nand.h   

  14. //   

  15. //  Defines the NAND controller CPU register layout and definitions.   

  16. //   

  17. #ifndef __S3C2440A_NAND_H   

  18. #define __S3C2440A_NAND_H   

  19.   

  20. #if __cplusplus   

  21.     extern "C"   

  22.     {  

  23. #endif   

  24.   

  25.   

  26. //------------------------------------------------------------------------------   

  27. //  Type: S3C2440A_NAND_REG       

  28. //   

  29. //  NAND Flash controller register layout. This register bank is located    

  30. //  by the constant CPU_BASE_REG_XX_NAND in the configuration file    

  31. //  cpu_base_reg_cfg.h.   

  32. //   

  33.   

  34. typedef struct    

  35. {  

  36.     UINT32  NFCONF;             // configuration reg   

  37.     UINT32  NFCONT;  

  38.     UINT8   NFCMD;              // command set reg   

  39.     UINT8   d0[3];  

  40.     UINT8   NFADDR;             // address set reg   

  41.     UINT8   d1[3];  

  42.     UINT8   NFDATA;             // data reg   

  43.     UINT8   d2[3];  

  44.     UINT32  NFMECCD0;  

  45.     UINT32  NFMECCD1;  

  46.     UINT32  NFSECCD;      

  47.     UINT32  NFSTAT;             // operation status reg   

  48.     UINT32  NFESTAT0;  

  49.     UINT32  NFESTAT1;  

  50.     UINT32  NFMECC0;             // error correction code 0   

  51.     UINT32  NFMECC1;             // error correction code 1   

  52.     UINT32  NFSECC;  

  53.     UINT32  NFSBLK;  

  54.     UINT32  NFEBLK;             // error correction code 2   

  55.   

  56. } S3C2440A_NAND_REG, *PS3C2440A_NAND_REG;      

  57.   

  58.   

  59. #if __cplusplus   

  60.     }  

  61. #endif   

  62.   

  63. #endif   

这两者之间的差别是很大的。因此移植起来的难点主要是ECC部分,同时还有个别寄存器位地址不一样,需要修改,见下面:

  1. //  Use Macros here to avoid extra over head for c function calls   

  2. #define READ_REGISTER_BYTE(p)       (*(PBYTE)(p))   

  3. #define WRITE_REGISTER_BYTE(p, v)   (*(PBYTE)(p)) = (v)   

  4. #define READ_REGISTER_USHORT(p)     (*(PUSHORT)(p))   

  5. #define WRITE_REGISTER_USHORT(p, v) (*(PUSHORT)(p)) = (v)   

  6. #define READ_REGISTER_ULONG(p)      (*(PULONG)(p))   

  7. #define WRITE_REGISTER_ULONG(p, v)  (*(PULONG)(p)) = (v)  

以上的代码不论S3C2410还是S3C2440都可以用,我在移植的时候,这两部是一样的。当然至于S3C2443和S3C2450这部分的寄存器改变并不多,不过S3C2450的BSP中NAND FLASH驱动还是有很大的变化,那以后再来分析吧,现在还是分析这个,WINCE5.0下的。WINCE6.0的我还没有来得急移植呢。我一般喜欢动手自己移植一遍,这样能深入的了解WINCE的流程,同时对这颗IC,也更熟悉。看看两者之间的不同吧。


S3C2440A的寄存器宏定义:

  1. //  MACROS   

  2. #define NF_CE_L()           WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) & ~(1<<1)))   

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。