xref: /nrf52832-nimble/rt-thread/components/drivers/spi/spi_msd.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2009-04-17     Bernard      first version.
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #ifndef SPI_MSD_H_INCLUDED
12*10465441SEvalZero #define SPI_MSD_H_INCLUDED
13*10465441SEvalZero 
14*10465441SEvalZero #include <stdint.h>
15*10465441SEvalZero #include <drivers/spi.h>
16*10465441SEvalZero 
17*10465441SEvalZero /* SD command (SPI mode) */
18*10465441SEvalZero #define GO_IDLE_STATE                       0   /* CMD0  R1  */
19*10465441SEvalZero #define SEND_OP_COND                        1   /* CMD1  R1  */
20*10465441SEvalZero #define SWITCH_FUNC                         6   /* CMD6  R1  */
21*10465441SEvalZero #define SEND_IF_COND                        8   /* CMD8  R7  */
22*10465441SEvalZero #define SEND_CSD                            9   /* CMD9  R1  */
23*10465441SEvalZero #define SEND_CID                            10  /* CMD10 R1  */
24*10465441SEvalZero #define STOP_TRANSMISSION                   12  /* CMD12 R1B */
25*10465441SEvalZero #define SEND_STATUS                         13  /* CMD13 R2  */
26*10465441SEvalZero #define SET_BLOCKLEN                        16  /* CMD16 R1  */
27*10465441SEvalZero #define READ_SINGLE_BLOCK                   17  /* CMD17 R1  */
28*10465441SEvalZero #define READ_MULTIPLE_BLOCK                 18  /* CMD18 R1  */
29*10465441SEvalZero #define WRITE_BLOCK                         24  /* CMD24 R1  */
30*10465441SEvalZero #define WRITE_MULTIPLE_BLOCK                25  /* CMD25 R1  */
31*10465441SEvalZero #define PROGRAM_CSD                         27  /* CMD27 R1  */
32*10465441SEvalZero #define SET_WRITE_PROT                      28  /* CMD28 R1B */
33*10465441SEvalZero #define CLR_WRITE_PROT                      29  /* CMD29 R1B */
34*10465441SEvalZero #define SEND_WRITE_PROT                     30  /* CMD30 R1  */
35*10465441SEvalZero #define ERASE_WR_BLK_START_ADDR             32  /* CMD32 R1  */
36*10465441SEvalZero #define ERASE_WR_BLK_END_ADDR               33  /* CMD33 R1  */
37*10465441SEvalZero #define ERASE                               38  /* CMD38 R1B */
38*10465441SEvalZero #define LOCK_UNLOCK                         42  /* CMD42 R1  */
39*10465441SEvalZero #define APP_CMD                             55  /* CMD55 R1  */
40*10465441SEvalZero #define GEN_CMD                             56  /* CMD56 R1  */
41*10465441SEvalZero #define READ_OCR                            58  /* CMD58 R3  */
42*10465441SEvalZero #define CRC_ON_OFF                          59  /* CMD59 R1  */
43*10465441SEvalZero 
44*10465441SEvalZero /* Application-Specific Command */
45*10465441SEvalZero #define SD_STATUS                           13  /* ACMD13 R2 */
46*10465441SEvalZero #define SEND_NUM_WR_BLOCKS                  22  /* ACMD22 R1 */
47*10465441SEvalZero #define SET_WR_BLK_ERASE_COUNT              23  /* ACMD23 R1 */
48*10465441SEvalZero #define SD_SEND_OP_COND                     41  /* ACMD41 R1 */
49*10465441SEvalZero #define SET_CLR_CARD_DETECT                 42  /* ACMD42 R1 */
50*10465441SEvalZero #define SEND_SCR                            51  /* ACMD51 R1 */
51*10465441SEvalZero 
52*10465441SEvalZero /* Start Data tokens  */
53*10465441SEvalZero /* Tokens (necessary because at nop/idle (and CS active) only 0xff is on the data/command line) */
54*10465441SEvalZero #define MSD_TOKEN_READ_START                0xFE  /* Data token start byte, Start Single Block Read */
55*10465441SEvalZero #define MSD_TOKEN_WRITE_SINGLE_START        0xFE  /* Data token start byte, Start Single Block Write */
56*10465441SEvalZero 
57*10465441SEvalZero #define MSD_TOKEN_WRITE_MULTIPLE_START      0xFC  /* Data token start byte, Start Multiple Block Write */
58*10465441SEvalZero #define MSD_TOKEN_WRITE_MULTIPLE_STOP       0xFD  /* Data toke stop byte, Stop Multiple Block Write */
59*10465441SEvalZero 
60*10465441SEvalZero /* MSD reponses and error flags */
61*10465441SEvalZero #define MSD_RESPONSE_NO_ERROR               0x00
62*10465441SEvalZero #define MSD_IN_IDLE_STATE                   0x01
63*10465441SEvalZero #define MSD_ERASE_RESET                     0x02
64*10465441SEvalZero #define MSD_ILLEGAL_COMMAND                 0x04
65*10465441SEvalZero #define MSD_COM_CRC_ERROR                   0x08
66*10465441SEvalZero #define MSD_ERASE_SEQUENCE_ERROR            0x10
67*10465441SEvalZero #define MSD_ADDRESS_ERROR                   0x20
68*10465441SEvalZero #define MSD_PARAMETER_ERROR                 0x40
69*10465441SEvalZero #define MSD_RESPONSE_FAILURE                0xFF
70*10465441SEvalZero 
71*10465441SEvalZero /* Data response error */
72*10465441SEvalZero #define MSD_DATA_OK                         0x05
73*10465441SEvalZero #define MSD_DATA_CRC_ERROR                  0x0B
74*10465441SEvalZero #define MSD_DATA_WRITE_ERROR                0x0D
75*10465441SEvalZero #define MSD_DATA_OTHER_ERROR                0xFF
76*10465441SEvalZero #define MSD_DATA_RESPONSE_MASK              0x1F
77*10465441SEvalZero #define MSD_GET_DATA_RESPONSE(res)          (res & MSD_DATA_RESPONSE_MASK)
78*10465441SEvalZero 
79*10465441SEvalZero #define MSD_CMD_LEN                         6           /**< command, arg and crc. */
80*10465441SEvalZero #define MSD_RESPONSE_MAX_LEN                5           /**< response max len  */
81*10465441SEvalZero #define MSD_CSD_LEN                         16          /**< SD crad CSD register len */
82*10465441SEvalZero #define SECTOR_SIZE                         512         /**< sector size, default 512byte */
83*10465441SEvalZero 
84*10465441SEvalZero /* card try timeout, unit: ms */
85*10465441SEvalZero #define CARD_TRY_TIMES                      3000
86*10465441SEvalZero #define CARD_TRY_TIMES_ACMD41               800
87*10465441SEvalZero #define CARD_WAIT_TOKEN_TIMES               800
88*10465441SEvalZero 
89*10465441SEvalZero #define MSD_USE_PRE_ERASED                              /**< id define MSD_USE_PRE_ERASED, before CMD25, send ACMD23 */
90*10465441SEvalZero 
91*10465441SEvalZero /**
92*10465441SEvalZero  * SD/MMC card type
93*10465441SEvalZero  */
94*10465441SEvalZero typedef enum
95*10465441SEvalZero {
96*10465441SEvalZero 	MSD_CARD_TYPE_UNKNOWN = 0,                      /**< unknown */
97*10465441SEvalZero 	MSD_CARD_TYPE_MMC,                              /**< MultiMedia Card */
98*10465441SEvalZero 	MSD_CARD_TYPE_SD_V1_X,                          /**< Ver 1.X  Standard Capacity SD Memory Card */
99*10465441SEvalZero 	MSD_CARD_TYPE_SD_V2_X,                          /**< Ver 2.00 or later Standard Capacity SD Memory Card */
100*10465441SEvalZero 	MSD_CARD_TYPE_SD_SDHC,                          /**< High Capacity SD Memory Card */
101*10465441SEvalZero 	MSD_CARD_TYPE_SD_SDXC,                          /**< later Extended Capacity SD Memory Card */
102*10465441SEvalZero }msd_card_type;
103*10465441SEvalZero 
104*10465441SEvalZero typedef enum
105*10465441SEvalZero {
106*10465441SEvalZero     response_type_unknown = 0,
107*10465441SEvalZero     response_r1,
108*10465441SEvalZero     response_r1b,
109*10465441SEvalZero     response_r2,
110*10465441SEvalZero     response_r3,
111*10465441SEvalZero     response_r4,
112*10465441SEvalZero     response_r5,
113*10465441SEvalZero     response_r7,
114*10465441SEvalZero }response_type;
115*10465441SEvalZero 
116*10465441SEvalZero struct msd_device
117*10465441SEvalZero {
118*10465441SEvalZero     struct rt_device                parent;      /**< RT-Thread device struct */
119*10465441SEvalZero     struct rt_device_blk_geometry   geometry;    /**< sector size, sector count */
120*10465441SEvalZero     struct rt_spi_device *          spi_device;  /**< SPI interface */
121*10465441SEvalZero     msd_card_type                   card_type;   /**< card type: MMC SD1.x SD2.0 SDHC SDXC */
122*10465441SEvalZero     uint32_t                        max_clock;   /**< MAX SPI clock */
123*10465441SEvalZero };
124*10465441SEvalZero 
125*10465441SEvalZero extern rt_err_t msd_init(const char * sd_device_name, const char * spi_device_name);
126*10465441SEvalZero 
127*10465441SEvalZero #endif // SPI_MSD_H_INCLUDED
128