drv_nand.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* Define to prevent recursive inclusion -------------------------------------*/
  2. #ifndef __DRV_NAND_H
  3. #define __DRV_NAND_H
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. /* Includes ------------------------------------------------------------------*/
  8. #include <rtthread.h>
  9. #include <board.h>
  10. #include "stm32f4xx.h"
  11. #include <rtdevice.h>
  12. //********************************************************************************
  13. //升级说明
  14. //V1.1 20160520
  15. //1,新增硬件ECC支持(仅在以NAND_ECC_SECTOR_SIZE大小为单位进行读写时处理)
  16. //2,新增NAND_Delay函数,用于等待tADL/tWHR
  17. //3,新增NAND_WritePageConst函数,用于搜寻坏块.
  18. //V1.2 20160525
  19. //1,去掉NAND_SEC_SIZE宏定义,由NAND_ECC_SECTOR_SIZE替代
  20. //2,去掉nand_dev结构体里面的secbuf指针,用不到
  21. //////////////////////////////////////////////////////////////////////////////////
  22. #define NAND_MAX_PAGE_SIZE 4096 //定义NAND FLASH的最大的PAGE大小(不包括SPARE区),默认4096字节
  23. #define NAND_ECC_SECTOR_SIZE 512 //执行ECC计算的单元大小,默认512字节
  24. //NAND属性结构体
  25. typedef struct
  26. {
  27. uint16_t page_totalsize; //每页总大小,main区和spare区总和
  28. uint16_t page_mainsize; //每页的main区大小
  29. uint16_t page_sparesize; //每页的spare区大小
  30. uint8_t block_pagenum; //每个块包含的页数量
  31. uint16_t plane_blocknum; //每个plane包含的块数量
  32. uint16_t block_totalnum; //总的块数量
  33. uint16_t good_blocknum; //好块数量
  34. uint16_t valid_blocknum; //有效块数量(供文件系统使用的好块数量)
  35. uint32_t id; //NAND FLASH ID
  36. uint16_t *lut; //LUT表,用作逻辑块-物理块转换
  37. uint32_t ecc_hard; //硬件计算出来的ECC值
  38. uint32_t ecc_hdbuf[NAND_MAX_PAGE_SIZE/NAND_ECC_SECTOR_SIZE];//ECC硬件计算值缓冲区
  39. uint32_t ecc_rdbuf[NAND_MAX_PAGE_SIZE/NAND_ECC_SECTOR_SIZE];//ECC读取的值缓冲区
  40. }nand_attriute;
  41. extern nand_attriute nand_dev; //nand重要参数结构体
  42. //位带操作,实现51类似的GPIO控制功能
  43. //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).M4同M3类似,只是寄存器地址变了.
  44. //IO口操作宏定义
  45. #define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
  46. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  47. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
  48. #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
  49. #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
  50. #define NAND_RB PDin(6) //NAND Flash的闲/忙引脚
  51. #define NAND_ADDRESS ((rt_uint32_t)0x80000000) //nand flash的访问地址,接NCE3,地址为:0X8000 0000
  52. #define NAND_CMD (uint32_t)(0x010000) //发送命令
  53. #define NAND_ADDR (uint32_t)(0x020000) //发送地址
  54. //*((volatile rt_uint8_t *) 0X80000000)
  55. //*((volatile rt_uint8_t *) 0X80010000)
  56. //*((volatile rt_uint8_t *) 0X80020000)
  57. //NAND FLASH命令
  58. #define NAND_READID 0X90 //读ID指令
  59. #define NAND_FEATURE 0XEF //设置特性指令
  60. #define NAND_RESET 0XFF //复位NAND
  61. #define NAND_READSTA 0X70 //读状态
  62. #define NAND_AREA_A 0X00
  63. #define NAND_AREA_TRUE1 0X30
  64. #define NAND_WRITE0 0X80
  65. #define NAND_WRITE_TURE1 0X10
  66. #define NAND_ERASE0 0X60
  67. #define NAND_ERASE1 0XD0
  68. #define NAND_MOVEDATA_CMD0 0X00
  69. #define NAND_MOVEDATA_CMD1 0X35
  70. #define NAND_MOVEDATA_CMD2 0X85
  71. #define NAND_MOVEDATA_CMD3 0X10
  72. //NAND FLASH状态
  73. #define NSTA_READY 0X40 //nand已经准备好
  74. #define NSTA_ERROR 0X01 //nand错误
  75. #define NSTA_TIMEOUT 0X02 //超时
  76. #define NSTA_ECC1BITERR 0X03 //ECC 1bit错误
  77. #define NSTA_ECC2BITERR 0X04 //ECC 2bit以上错误
  78. //NAND FLASH型号和对应的ID号
  79. #define MT29F4G08ABADA 0XDC909556 //MT29F4G08ABADA
  80. #define MT29F16G08ABABA 0X48002689 //MT29F16G08ABABA
  81. struct stm32f4_nand
  82. {
  83. rt_uint8_t id[5];
  84. struct rt_mutex lock;
  85. struct rt_completion comp;
  86. };
  87. void NAND_Init(void);
  88. uint8_t NAND_ModeSet(uint8_t mode);
  89. uint32_t NAND_ReadID(void);
  90. uint8_t NAND_ReadStatus(void);
  91. uint8_t NAND_WaitForReady(void);
  92. //static rt_uint8_t nand_reset(void);
  93. uint8_t NAND_WaitRB(__IO uint8_t rb);
  94. void NAND_Delay(volatile rt_uint32_t i);
  95. uint8_t NAND_ReadPage(uint32_t PageNum,uint16_t ColNum,uint8_t *pBuffer,uint16_t NumByteToRead);
  96. uint8_t NAND_ReadPageComp(uint32_t PageNum,uint16_t ColNum,uint32_t CmpVal,uint16_t NumByteToRead,uint16_t *NumByteEqual);
  97. uint8_t NAND_WritePage(uint32_t PageNum,uint16_t ColNum,uint8_t *pBuffer,uint16_t NumByteToWrite);
  98. uint8_t NAND_WritePageConst(uint32_t PageNum,uint16_t ColNum,uint32_t cval,uint16_t NumByteToWrite);
  99. uint8_t NAND_CopyPageWithoutWrite(uint32_t Source_PageNum,uint32_t Dest_PageNum);
  100. uint8_t NAND_CopyPageWithWrite(uint32_t Source_PageNum,uint32_t Dest_PageNum,uint16_t ColNum,uint8_t *pBuffer,uint16_t NumByteToWrite);
  101. uint8_t NAND_ReadSpare(uint32_t PageNum,uint16_t ColNum,uint8_t *pBuffer,uint16_t NumByteToRead);
  102. uint8_t NAND_WriteSpare(uint32_t PageNum,uint16_t ColNum,uint8_t *pBuffer,uint16_t NumByteToRead);
  103. uint8_t NAND_EraseBlock(uint32_t BlockNum);
  104. void NAND_EraseChip(void);
  105. uint16_t NAND_ECC_Get_OE(uint8_t oe,uint32_t eccval);
  106. uint8_t NAND_ECC_Correction(uint8_t* data_buf,uint32_t eccrd,uint32_t ecccl);
  107. int nand_hy27uf_hw_init(void);
  108. #ifdef __cplusplus
  109. }
  110. #endif
  111. #endif