spinand.h 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2021-1-13 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #ifndef __SPINAND_H__
  13. #define __SPINAND_H__
  14. #include <rtthread.h>
  15. #include <drivers/mtd_nand.h>
  16. #include "drv_spi.h"
  17. #include <board.h>
  18. struct spinand_ops
  19. {
  20. rt_err_t (*block_erase)(struct rt_qspi_device *qspi, uint8_t u8Addr2, uint8_t u8Addr1, uint8_t u8Addr0);
  21. uint8_t (*block_isbad)(struct rt_qspi_device *qspi, uint32_t u32PageAddr);
  22. rt_err_t (*block_markbad)(struct rt_qspi_device *qspi, uint32_t u32PageAddr);
  23. rt_err_t (*die_select)(struct rt_qspi_device *qspi, uint8_t select_die);
  24. rt_err_t (*jedecid_get)(struct rt_qspi_device *qspi, uint32_t *pu32ID);
  25. rt_err_t (*program_dataload)(struct rt_qspi_device *qspi, uint8_t u8AddrH, uint8_t u8AddrL, uint8_t *pu8DataBuff,
  26. uint32_t u32DataCount, uint8_t *pu8SpareBuff, uint32_t u32SpareCount);
  27. rt_err_t (*program_execute)(struct rt_qspi_device *qspi, uint8_t u8Addr2, uint8_t u8Addr1, uint8_t u8Addr0);
  28. rt_err_t (*read_dataload)(struct rt_qspi_device *qspi, uint8_t u8Addr2, uint8_t u8Addr1, uint8_t u8Addr0);
  29. rt_err_t (*read_quadoutput)(struct rt_qspi_device *qspi, uint8_t u8AddrH, uint8_t u8AddrL, uint8_t *pu8DataBuff, uint32_t u32DataCount);
  30. };
  31. typedef struct spinand_ops *nu_spinand_ops_t;
  32. #define SPINAND_FLASH_JEDECID g_spinandflash_dev.info.u32JEDECID
  33. #define SPINAND_FLASH_PAGE_SIZE g_spinandflash_dev.info.u16PageSize
  34. #define SPINAND_FLASH_OOB_SIZE g_spinandflash_dev.info.u16OOBSize
  35. #define SPINAND_FLASH_QUADREAD_CMDID g_spinandflash_dev.info.u8QuadReadCmdId
  36. #define SPINAND_FLASH_DUMMYBYTE g_spinandflash_dev.info.u8DummyByte
  37. #define SPINAND_FLASH_BLOCK_NUM g_spinandflash_dev.info.u32BlockPerFlash
  38. #define SPINAND_FLASH_PAGE_PER_BLOCK_NUM g_spinandflash_dev.info.u32PagePerBlock
  39. #define SPINAND_FLASH_DESCRIPTION g_spinandflash_dev.info.szDescription
  40. #define SPINAND_FLASH_MCP g_spinandflash_dev.info.u8IsDieSelect
  41. #define SPINAND_FLASH_INFO &g_spinandflash_dev.info
  42. #define SPINAND_FLASH_QSPI g_spinandflash_dev.qspi_device
  43. #define SPINAND_FLASH_LOCK &g_spinandflash_dev.lock
  44. #define SPINAND_FLASH_OPS g_spinandflash_dev.ops
  45. #define SPINAND_DIE_ID0 (0)
  46. #define SPINAND_DIE_ID1 (1)
  47. #define SPINAND_SPARE_LAYOUT_SIZE 16
  48. /* SPI NAND flash information */
  49. struct nu_spinand_info
  50. {
  51. uint32_t u32JEDECID;
  52. uint16_t u16PageSize;
  53. uint16_t u16OOBSize;
  54. uint8_t u8QuadReadCmdId;
  55. uint8_t u8ReadStatusCmdId;
  56. uint8_t u8WriteStatusCmdid;
  57. uint8_t u8StatusValue;
  58. uint8_t u8DummyByte;
  59. uint32_t u32BlockPerFlash;
  60. uint32_t u32PagePerBlock;
  61. uint8_t u8IsDieSelect;
  62. const char *szDescription;
  63. uint8_t au8DataLayout[SPINAND_SPARE_LAYOUT_SIZE];
  64. uint8_t au8EccLayout[SPINAND_SPARE_LAYOUT_SIZE];
  65. };
  66. typedef struct nu_spinand_info *nu_spinand_info_t;
  67. struct nu_spinand
  68. {
  69. struct nu_spinand_info info;
  70. struct rt_qspi_device *qspi_device;
  71. nu_spinand_ops_t ops;
  72. struct rt_mutex lock;
  73. };
  74. typedef struct nu_spinand *nu_spinand_t;
  75. rt_err_t rt_hw_mtd_spinand_register(const char *device_name);
  76. rt_size_t nu_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message);
  77. rt_err_t nu_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length);
  78. rt_err_t nu_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length);
  79. rt_err_t spinand_flash_init(struct rt_qspi_device *qspi);
  80. extern struct nu_spinand g_spinandflash_dev;
  81. extern rt_uint8_t spinand_flash_data_layout[SPINAND_SPARE_LAYOUT_SIZE];
  82. extern rt_uint8_t spinand_flash_ecc_layout[SPINAND_SPARE_LAYOUT_SIZE];
  83. #endif /* __SPINAND_H__ */