Line data Source code
1 1 : /*
2 : * Copyright 2022 NXP
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public API for SD subsystem
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_SD_SD_H_
13 : #define ZEPHYR_INCLUDE_SD_SD_H_
14 :
15 : #include <zephyr/device.h>
16 : #include <zephyr/drivers/sdhc.h>
17 : #include <zephyr/kernel.h>
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 : /**
24 : * @brief card status. Used internally by subsystem.
25 : */
26 1 : enum card_status {
27 : CARD_UNINITIALIZED = 0, /*!< card has not been initialized */
28 : CARD_ERROR = 1, /*!< card state is error */
29 : CARD_INITIALIZED = 2, /*!< card is in valid state */
30 : };
31 :
32 : /**
33 : * @brief card type. Used internally by subsystem.
34 : */
35 1 : enum card_type {
36 : CARD_SDMMC = 0, /*!< SD memory card */
37 : CARD_SDIO = 1, /*!< SD I/O card */
38 : CARD_COMBO = 2, /*!< SD memory and I/O card */
39 : CARD_MMC = 3, /*!< MMC memory card */
40 : };
41 :
42 : /**
43 : * @brief SDIO function definition
44 : *
45 : * SDIO function definition. Used to store function information
46 : * per each SDIO function
47 : */
48 1 : struct sdio_func {
49 1 : enum sdio_func_num num; /*!< Function number */
50 1 : struct sd_card *card; /*!< Card this function is present on */
51 1 : struct sdio_cis cis; /*!< CIS tuple data for this function */
52 1 : uint16_t block_size; /*!< Current block size for this function */
53 : };
54 :
55 :
56 : /**
57 : * @brief SD card structure
58 : *
59 : * This structure is used by the subsystem to track an individual SD
60 : * device connected to the system. The application may access these
61 : * fields, but use caution when changing values.
62 : */
63 1 : struct sd_card {
64 1 : const struct device *sdhc; /*!< SD host controller for card */
65 1 : struct sdhc_io bus_io; /*!< Current bus I/O props for SDHC */
66 1 : enum sd_voltage card_voltage; /*!< Card signal voltage */
67 1 : struct k_mutex lock; /*!< card mutex */
68 1 : struct sdhc_host_props host_props; /*!< SDHC host properties */
69 1 : uint32_t ocr; /*!< Raw card OCR content */
70 1 : struct sd_switch_caps switch_caps; /*!< SD switch capabilities */
71 1 : unsigned int num_io: 3; /*!< I/O function count. 0 for SD cards */
72 1 : uint16_t relative_addr; /*!< Card relative address */
73 1 : uint32_t block_count; /*!< Number of blocks in SD card */
74 1 : uint16_t block_size; /*!< SD block size */
75 1 : uint8_t sd_version; /*!< SD specification version */
76 1 : uint8_t card_speed; /*!< Card timing mode */
77 1 : enum card_status status; /*!< Card status */
78 1 : enum card_type type; /*!< Card type */
79 1 : uint16_t flags; /*!< Card flags */
80 1 : uint8_t bus_width; /*!< Desired bus width */
81 1 : uint32_t cccr_flags; /*!< SDIO CCCR data */
82 1 : struct sdio_func func0; /*!< Function 0 common card data */
83 :
84 : /* NOTE: The buffer is accessed as a uint32_t* by the SD subsystem, so must be
85 : * aligned to 4 bytes for platforms that don't support unaligned access...
86 : * Systems where the buffer is accessed by DMA may require wider alignment, in
87 : * which case, use CONFIG_SDHC_BUFFER_ALIGNMENT.
88 : */
89 0 : uint8_t card_buffer[CONFIG_SD_BUFFER_SIZE]
90 : __aligned(MAX(4, CONFIG_SDHC_BUFFER_ALIGNMENT)); /* Card internal buffer */
91 : };
92 :
93 : /**
94 : * @brief Initialize an SD device
95 : *
96 : * Initializes an SD device to use with the subsystem. After this call,
97 : * only the SD card structure is required to access the card.
98 : * @param sdhc_dev SD host controller device for this card
99 : * @param card SD card structure for this card
100 : * @retval 0 card was initialized
101 : * @retval -ETIMEDOUT: card initialization timed out
102 : * @retval -EBUSY: card is busy
103 : * @retval -EIO: IO error while starting card
104 : */
105 1 : int sd_init(const struct device *sdhc_dev, struct sd_card *card);
106 :
107 : /**
108 : * @brief checks to see if card is present in the SD slot
109 : *
110 : * @param sdhc_dev SD host controller to check for card presence on
111 : * @retval true card is present
112 : * @retval false card is not present
113 : */
114 1 : bool sd_is_card_present(const struct device *sdhc_dev);
115 :
116 :
117 : #ifdef __cplusplus
118 : }
119 : #endif
120 :
121 : #endif /* ZEPHYR_INCLUDE_SD_SD_H_ */
|