123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- /*
- * drv_sfc.h
- *
- * Created on: 2016Äê4ÔÂ5ÈÕ
- * Author: Urey
- */
- #ifndef DRIVER_DRV_SFC_H_
- #define DRIVER_DRV_SFC_H_
- #include <stdint.h>
- #define SFC_USE_SWAP
- #define SFC_USE_DMA
- #define SFC_USE_QUAD
- #define UNCACHE(addr) ((((uint32_t)(addr)) | 0xa0000000))
- /* SFC register */
- #define SFC_GLB (0x0000)
- #define SFC_DEV_CONF (0x0004)
- #define SFC_DEV_STA_EXP (0x0008)
- #define SFC_DEV_STA_RT (0x000c)
- #define SFC_DEV_STA_MSK (0x0010)
- #define SFC_TRAN_CONF(n) (0x0014 + (n * 4))
- #define SFC_TRAN_LEN (0x002c)
- #define SFC_DEV_ADDR(n) (0x0030 + (n * 4))
- #define SFC_DEV_ADDR_PLUS(n) (0x0048 + (n * 4))
- #define SFC_MEM_ADDR (0x0060)
- #define SFC_TRIG (0x0064)
- #define SFC_SR (0x0068)
- #define SFC_SCR (0x006c)
- #define SFC_INTC (0x0070)
- #define SFC_FSM (0x0074)
- #define SFC_CGE (0x0078)
- #define SFC_RM_DR (0x1000)
- /* For SFC_GLB */
- #define GLB_TRAN_DIR (1 << 13)
- #define GLB_TRAN_DIR_WRITE (1)
- #define GLB_TRAN_DIR_READ (0)
- #define GLB_THRESHOLD_OFFSET (7)
- #define GLB_THRESHOLD_MSK (0x3f << GLB_THRESHOLD_OFFSET)
- #define GLB_OP_MODE (1 << 6)
- #define SLAVE_MODE (0x0)
- #define DMA_MODE (0x1)
- #define GLB_PHASE_NUM_OFFSET (3)
- #define GLB_PHASE_NUM_MSK (0x7 << GLB_PHASE_NUM_OFFSET)
- #define GLB_WP_EN (1 << 2)
- #define GLB_BURST_MD_OFFSET (0)
- #define GLB_BURST_MD_MSK (0x3 << GLB_BURST_MD_OFFSET)
- /* For SFC_DEV_CONF */
- #define DEV_CONF_ONE_AND_HALF_CYCLE_DELAY (3)
- #define DEV_CONF_ONE_CYCLE_DELAY (2)
- #define DEV_CONF_HALF_CYCLE_DELAY (1)
- #define DEV_CONF_NO_DELAY (0)
- #define DEV_CONF_SMP_DELAY_OFFSET (16)
- #define DEV_CONF_SMP_DELAY_MSK (0x3 << DEV_CONF_SMP_DELAY_OFFSET)
- #define DEV_CONF_CMD_TYPE (0x1 << 15)
- #define DEV_CONF_STA_TYPE_OFFSET (13)
- #define DEV_CONF_STA_TYPE_MSK (0x1 << DEV_CONF_STA_TYPE_OFFSET)
- #define DEV_CONF_THOLD_OFFSET (11)
- #define DEV_CONF_THOLD_MSK (0x3 << DEV_CONF_THOLD_OFFSET)
- #define DEV_CONF_TSETUP_OFFSET (9)
- #define DEV_CONF_TSETUP_MSK (0x3 << DEV_CONF_TSETUP_OFFSET)
- #define DEV_CONF_TSH_OFFSET (5)
- #define DEV_CONF_TSH_MSK (0xf << DEV_CONF_TSH_OFFSET)
- #define DEV_CONF_CPHA (0x1 << 4)
- #define DEV_CONF_CPOL (0x1 << 3)
- #define DEV_CONF_CEDL (0x1 << 2)
- #define DEV_CONF_HOLDDL (0x1 << 1)
- #define DEV_CONF_WPDL (0x1 << 0)
- /* For SFC_TRAN_CONF */
- #define TRAN_CONF_TRAN_MODE_OFFSET (29)
- #define TRAN_CONF_TRAN_MODE_MSK (0x7)
- #define TRAN_CONF_ADDR_WIDTH_OFFSET (26)
- #define TRAN_CONF_ADDR_WIDTH_MSK (0x7 << ADDR_WIDTH_OFFSET)
- #define TRAN_CONF_POLLEN (1 << 25)
- #define TRAN_CONF_CMDEN (1 << 24)
- #define TRAN_CONF_FMAT (1 << 23)
- #define TRAN_CONF_DMYBITS_OFFSET (17)
- #define TRAN_CONF_DMYBITS_MSK (0x3f << DMYBITS_OFFSET)
- #define TRAN_CONF_DATEEN (1 << 16)
- #define TRAN_CONF_CMD_OFFSET (0)
- #define TRAN_CONF_CMD_MSK (0xffff << CMD_OFFSET)
- #define TRAN_CONF_CMD_LEN (1 << 15)
- /* For SFC_TRIG */
- #define TRIG_FLUSH (1 << 2)
- #define TRIG_STOP (1 << 1)
- #define TRIG_START (1 << 0)
- /* For SFC_SCR */
- #define CLR_END (1 << 4)
- #define CLR_TREQ (1 << 3)
- #define CLR_RREQ (1 << 2)
- #define CLR_OVER (1 << 1)
- #define CLR_UNDER (1 << 0)
- /* For SFC_TRAN_CONFx */
- #define TRAN_MODE_OFFSET (29)
- #define TRAN_MODE_MSK (0x7 << TRAN_MODE_OFFSET)
- #define TRAN_SPI_STANDARD (0x0)
- #define TRAN_SPI_DUAL (0x1 )
- #define TRAN_SPI_QUAD (0x5 )
- #define TRAN_SPI_IO_QUAD (0x6 )
- #define ADDR_WIDTH_OFFSET (26)
- #define ADDR_WIDTH_MSK (0x7 << ADDR_WIDTH_OFFSET)
- #define POLLEN (1 << 25)
- #define CMDEN (1 << 24)
- #define FMAT (1 << 23)
- #define DMYBITS_OFFSET (17)
- #define DMYBITS_MSK (0x3f << DMYBITS_OFFSET)
- #define DATEEN (1 << 16)
- #define CMD_OFFSET (0)
- #define CMD_MSK (0xffff << CMD_OFFSET)
- #define N_MAX 6
- #define MAX_SEGS 128
- #define CHANNEL_0 0
- #define CHANNEL_1 1
- #define CHANNEL_2 2
- #define CHANNEL_3 3
- #define CHANNEL_4 4
- #define CHANNEL_5 5
- #define ENABLE 1
- #define DISABLE 0
- #define COM_CMD 1 // common cmd
- #define POLL_CMD 2 // the cmd will poll the status of flash,ext: read status
- #define DMA_OPS 1
- #define CPU_OPS 0
- #define TM_STD_SPI 0
- #define TM_DI_DO_SPI 1
- #define TM_DIO_SPI 2
- #define TM_FULL_DIO_SPI 3
- #define TM_QI_QO_SPI 5
- #define TM_QIO_SPI 6
- #define TM_FULL_QIO_SPI 7
- #define DEFAULT_ADDRSIZE 3
- #ifndef max
- #define max(a, b) (((a) > (b)) ? (a) : (b))
- #endif
- #ifndef min
- #define min(a, b) (((a) < (b)) ? (a) : (b))
- #endif
- /*SPI NOR FLASH Instructions*/
- #define CMD_WREN 0x06 /* Write Enable */
- #define CMD_WRDI 0x04 /* Write Disable */
- #define CMD_RDSR 0x05 /* Read Status Register */
- #define CMD_RDSR_1 0x35 /* Read Status1 Register */
- #define CMD_RDSR_2 0x15 /* Read Status2 Register */
- #define CMD_WRSR 0x01 /* Write Status Register */
- #define CMD_WRSR_1 0x31 /* Write Status1 Register */
- #define CMD_WRSR_2 0x11 /* Write Status2 Register */
- #define CMD_READ 0x03 /* Read Data */
- #define CMD_DUAL_READ 0x3b /* DUAL Read Data */
- #define CMD_QUAD_READ 0x6b /* QUAD Read Data */
- #define CMD_QUAD_IO_FAST_READ 0xeb /* QUAD FAST Read Data */
- #define CMD_QUAD_IO_WORD_FAST_READ 0xe7 /* QUAD IO WORD Read Data */
- #define CMD_FAST_READ 0x0B /* Read Data at high speed */
- #define CMD_PP 0x02 /* Page Program(write data) */
- #define CMD_QPP 0x32 /* QUAD Page Program(write data) */
- #define CMD_BE_4K 0x20
- #define CMD_BE_32K 0x52 /* Block Erase */
- #define CMD_BE_64K 0XD8 /* Block Erase */
- #define CMD_CE 0xC7 /* Bulk or Chip Erase */
- #define CMD_DP 0xB9 /* Deep Power-Down */
- #define CMD_RES 0xAB /* Release from Power-Down and Read Electronic Signature */
- #define CMD_REMS 0x90 /* Read Manufacture ID/ Device ID */
- #define CMD_RDID 0x9F /* Read Identification */
- #define CMD_NON 0x00 /* Read Identification */
- #define CMD_RUID 0x4B /* ReadUnique ID */
- #define CMD_NON 0x00 /* Read Identification */
- #define CMD_EN4B 0xB7 /* Enter 4 bytes address mode */
- #define CMD_EX4B 0xE9 /* Exit 4 bytes address mode */
- struct cmd_info
- {
- uint32_t cmd;
- uint32_t cmd_len;/*reserved; not use*/
- uint32_t dataen;
- uint32_t sta_exp;
- uint32_t sta_msk;
- };
- struct sfc_transfer
- {
- uint32_t direction;
- struct cmd_info *cmd_info;
- uint32_t addr_len;
- uint32_t addr;
- uint32_t addr_plus;
- uint32_t addr_dummy_bits;/*cmd + addr_dummy_bits + addr*/
- const uint8_t *data;
- uint32_t data_dummy_bits;/*addr + data_dummy_bits + data*/
- uint32_t len;
- uint32_t cur_len;
- uint32_t sfc_mode;
- uint32_t ops_mode;
- uint32_t phase_format;/*we just use default value;phase1:cmd+dummy+addr... phase0:cmd+addr+dummy...*/
- rt_list_t transfer_list;
- };
- struct sfc_message
- {
- rt_list_t transfers;
- uint32_t actual_length;
- uint32_t status;
- };
- struct sfc
- {
- void *iomem;
- int irq;
- struct clk *clk;
- struct clk *clk_gate;
- uint32_t src_clk;
- uint32_t threshold;
- struct sfc_transfer *transfer;
- struct rt_completion done;
- };
- struct sfc_quad_mode
- {
- uint8_t RDSR_CMD;
- uint32_t RD_DATE_SIZE;//the data is write the spi status register for QE bit
- uint8_t sfc_mode;
- uint8_t WRSR_CMD;
- uint32_t WD_DATE_SIZE;//the data is write the spi status register for QE bit
- uint8_t cmd_read;
- uint32_t RDSR_DATE;//the data is write the spi status register for QE bit
- uint32_t WRSR_DATE;//this bit should be the flash QUAD mode enable
- uint32_t dummy_byte;
- };
- struct sfc_flash
- {
- struct rt_mtd_nor_device mtd;
- char *name;
- uint32_t id;
- uint8_t uid[8];
- uint32_t pagesize;
- uint32_t sectorsize;
- uint32_t chipsize;
- uint32_t erasesize;
- uint32_t writesize;
- uint32_t addrsize;
- struct sfc *sfc;
- uint32_t sfc_mode;
- #ifdef SFC_USE_QUAD
- struct sfc_quad_mode *quad_mode;
- #endif
- struct rt_mutex lock;
- };
- int sfc_norflash_probe(struct sfc_flash *flash);
- size_t sfc_norflash_read(struct sfc_flash *flash, rt_off_t from, uint8_t *buf, size_t len);
- size_t sfc_norflash_write(struct sfc_flash *flash, rt_off_t to, const uint8_t *buf, size_t len);
- int sfc_norflash_erase_sector(struct sfc_flash *flash, uint32_t addr);
- int sfc_norflash_set_addr_width_4byte(struct sfc_flash *flash,int on);
- #endif /* DRIVER_DRV_SFC_H_ */
|