Hardware Abstraction Layer for FreeRTOS
sd.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Author: Andreas Werner <kernel@andy89.org>
4  * Date: 2016
5  */
6 #ifndef SD_H_
7 #define SD_H_
8 #include <FreeRTOS.h>
9 #include <stdint.h>
10 #include <stdbool.h>
11 #include <system.h>
12 #include <semphr.h>
13 #include <hal.h>
25 #define SD_ERROR_AKE_SEQ_ERROR -2
26 
29 #define SD_ERROR_ERROR -3
30 
33 #define SD_ERROR_CC_ERROR -4
34 
37 #define SD_ERROR_CARD_ECC_FAIELD -5
38 
41 #define SD_ERROR_ILLEGAL_COMMAND -6
42 
45 #define SD_ERROR_COM_CRC_ERROR -7
46 
49 #define SD_ERROR_LOCK_UNLOCK_FAILED -8
50 
53 #define SD_ERROR_CARD_IS_LOCKED -9
54 
57 #define SD_ERROR_WP_VIOLATION -10
58 
61 #define SD_ERROR_ERASE_PARAM -11
62 
65 #define SD_ERROR_ERASE_SEQ_ERROR -12
66 
70 #define SD_ERROR_ERASE_LEN_ERROR -13
71 
74 #define SD_ERROR_ADDRESS_ERROR -14
75 
78 #define SD_ERROR_OUT_OF_RANGE -15
79 
82 #define SD_ERROR_FUNCTION_NUMBER -16
83 
88 #define CMD(x) (x)
89 
95 #define ACMD(x) (x)
96 
99 struct sd;
100 #ifdef CONFIG_SD_MULTI
101 
104 struct sd_ops {
105  struct sd *(*sd_init)(uint32_t index, struct sd_setting *settings);
106  int32_t (*sd_deinit)(struct sd *sd);
107  int32_t (*sd_setBlockSize)(struct sd *sd, enum sd_block_size blockSize);
108  int32_t (*sd_setBusWide)(struct sd *sd, enum sd_bus_wide buswide);
109  int32_t (*sd_setClock)(struct sd *sd, uint64_t clock);
110  int32_t (*sd_sendCommand)(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response, TickType_t waittime);
111  int32_t (*sd_write)(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime);
112  int32_t (*sd_read)(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime);
113  int32_t (*sd_sendCommandISR)(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response);
114  int32_t (*sd_writeISR)(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data);
115  int32_t (*sd_readISR)(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data);
116 };
117 #endif
118 
121 enum sd_mode {
133  SD_SDIO
134 };
138 struct sd_generic {
143  bool init;
144 #ifdef CONFIG_INSTANCE_NAME
145 
148  const char *name;
149 #endif
150 #ifdef CONFIG_SD_THREAD_SAVE
151 
155 #endif
156 #ifdef CONFIG_SD_MULTI
157 
160  const struct sd_ops *ops;
161 #endif
162 
165  enum sd_mode mode;
170 };
184 };
188 struct sd_response {
196  uint32_t data[4];
197 };
202 };
206 struct sd_setting {
210  uint64_t clock;
214  enum sd_bus_wide wide;
218  enum sd_mode mode;
219 };
220 #ifndef CONFIG_SD_MULTI
221 
227 struct sd *sd_init(uint32_t index, struct sd_setting *settings);
233 int32_t sd_deinit(struct sd *sd);
240 int32_t sd_setBlockSize(struct sd *sd, enum sd_block_size blockSize);
247 int32_t sd_setBusWide(struct sd *sd, enum sd_bus_wide busWide);
254 int32_t sd_setClock(struct sd *sd, uint64_t clock);
296 int32_t sd_sendCommand(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response, TickType_t waittime);
339 int32_t sd_write(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime);
382 int32_t sd_read(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime);
423 int32_t sd_sendCommandISR(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response);
465 int32_t sd_writeISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data);
508 int32_t sd_readISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data);
509 #else
510 inline struct sd *sd_init(uint32_t index, struct sd_setting *settings) {
512  struct sd_generic *p = (struct sd_generic *) HAL_GET_DEV(sd, index);
513  if (p == NULL) {
514  return NULL;
515  }
516  return p->ops->sd_init(index, settings);
517 }
518 inline int32_t sd_deinit(struct sd *sd) {
519  struct sd_generic *p = (struct sd_generic *) sd;
520  return p->ops->sd_deinit(sd);
521 }
522 int32_t sd_setBlockSize(struct sd *sd, enum sd_block_size blockSize) {
523  struct sd_generic *p = (struct sd_generic *) sd;
524  return p->ops->sd_setBlockSize(sd, blockSize);
525 }
526 int32_t sd_setBusWide(struct sd *sd, enum sd_bus_wide busWide) {
527  struct sd_generic *p = (struct sd_generic *) sd;
528  return p->ops->sd_setBusWide(sd, busWide);
529 }
530 int32_t sd_setClock(struct sd *sd, uint64_t clock) {
531  struct sd_generic *p = (struct sd_generic *) sd;
532  return p->ops->sd_setClock(sd, clock);
533 }
534 inline int32_t sd_write(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime) {
535  struct sd_generic *p = (struct sd_generic *) sd;
536  return p->ops->sd_write(sd, command, argument, size, data, waittime);
537 }
538 inline int32_t sd_read(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime) {
539  struct sd_generic *p = (struct sd_generic *) sd;
540  return p->ops->sd_read(sd, command, argument, size, data, waittime);
541 }
542 inline int32_t sd_writeISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data) {
543  struct sd_generic *p = (struct sd_generic *) sd;
544  return p->ops->sd_write(sd, command, argument, size, data);
545 }
546 inline int32_t sd_readISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data) {
547  struct sd_generic *p = (struct sd_generic *) sd;
548  return p->ops->sd_read(sd, command, argument, size, data);
549 }
550 #endif
551 
552 #endif
SD_BLOCK_SIZE_2048B
@ SD_BLOCK_SIZE_2048B
Definition: sd.h:183
SD_BusWide_4b
@ SD_BusWide_4b
Definition: sd.h:200
sd_setClock
int32_t sd_setClock(struct sd *sd, uint64_t clock)
SD_SD
@ SD_SD
Definition: sd.h:129
OS_DEFINE_MUTEX_RECURSIVE
#define OS_DEFINE_MUTEX_RECURSIVE(name)
Definition: os.h:59
sd_generic::init
bool init
Definition: sd.h:143
SD_BLOCK_SIZE_256B
@ SD_BLOCK_SIZE_256B
Definition: sd.h:180
hal.h
SD_BLOCK_SIZE_16B
@ SD_BLOCK_SIZE_16B
Definition: sd.h:176
SD_BLOCK_SIZE_1024B
@ SD_BLOCK_SIZE_1024B
Definition: sd.h:182
sd_mode
sd_mode
Definition: sd.h:121
sd_setting
Definition: sd.h:206
SD_BLOCK_SIZE_512B
@ SD_BLOCK_SIZE_512B
Definition: sd.h:181
sd_response
Definition: sd.h:188
sd_readISR
int32_t sd_readISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data)
HAL_DEFINE_GLOBAL_ARRAY
#define HAL_DEFINE_GLOBAL_ARRAY(gns)
Definition: hal.h:149
sd_init
struct sd * sd_init(uint32_t index, struct sd_setting *settings)
sd_generic
Definition: sd.h:138
sd_read
int32_t sd_read(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime)
HAL_GET_DEV
#define HAL_GET_DEV(gns, index)
Definition: hal.h:182
sd_write
int32_t sd_write(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data, TickType_t waittime)
SD_BLOCK_SIZE_32B
@ SD_BLOCK_SIZE_32B
Definition: sd.h:177
SD_BLOCK_SIZE_4B
@ SD_BLOCK_SIZE_4B
Definition: sd.h:174
sd_setBusWide
int32_t sd_setBusWide(struct sd *sd, enum sd_bus_wide busWide)
SD_SPI
@ SD_SPI
Definition: sd.h:125
SD_BLOCK_SIZE_2B
@ SD_BLOCK_SIZE_2B
Definition: sd.h:173
SD_BusWide_1b
@ SD_BusWide_1b
Definition: sd.h:199
sd_deinit
int32_t sd_deinit(struct sd *sd)
sd_setBlockSize
int32_t sd_setBlockSize(struct sd *sd, enum sd_block_size blockSize)
system.h
sd_sendCommandISR
int32_t sd_sendCommandISR(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response)
SD_BLOCK_SIZE_8B
@ SD_BLOCK_SIZE_8B
Definition: sd.h:175
sd_generic::selectACMD
bool selectACMD
Definition: sd.h:169
sd_writeISR
int32_t sd_writeISR(struct sd *sd, uint32_t command, uint32_t argument, size_t size, uint32_t *data)
SD_BusWide_8b
@ SD_BusWide_8b
Definition: sd.h:201
sd_setting::mode
enum sd_mode mode
Definition: sd.h:218
SD_SDIO
@ SD_SDIO
Definition: sd.h:133
sd_bus_wide
sd_bus_wide
Definition: sd.h:198
sd_generic::mode
enum sd_mode mode
Definition: sd.h:165
SD_BLOCK_SIZE_1B
@ SD_BLOCK_SIZE_1B
Definition: sd.h:172
sd_block_size
sd_block_size
Definition: sd.h:171
sd_setting::clock
uint64_t clock
Definition: sd.h:210
sd_response::data
uint32_t data[4]
Definition: sd.h:196
SD_BLOCK_SIZE_64B
@ SD_BLOCK_SIZE_64B
Definition: sd.h:178
SD_BLOCK_SIZE_128B
@ SD_BLOCK_SIZE_128B
Definition: sd.h:179
sd_setting::wide
enum sd_bus_wide wide
Definition: sd.h:214
sd_sendCommand
int32_t sd_sendCommand(struct sd *sd, uint32_t command, uint32_t argument, struct sd_response *response, TickType_t waittime)