drv_sdcard.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-07-04 thread-liu the first version
  9. */
  10. #include "board.h"
  11. #if defined(BSP_USING_SDCARD)
  12. #include <dfs_fs.h>
  13. #include <drv_gpio.h>
  14. #include "stm32f4xx_hal.h"
  15. #define DRV_DEBUG
  16. //#define SDCARD_TX_DUMP
  17. //#define SDCARD_RX_DUMP
  18. #define LOG_TAG "drv.sdcard"
  19. #include <drv_log.h>
  20. //#define SDCARD_DMA
  21. static SD_HandleTypeDef SDCARD_Handler = {0};
  22. static HAL_SD_CardInfoTypeDef SDCardInfo = {0};
  23. struct stm32_sd
  24. {
  25. struct rt_device sdcard;
  26. struct rt_semaphore sd_lock;
  27. volatile rt_uint8_t write_flage;
  28. volatile rt_uint8_t read_flage;
  29. volatile rt_base_t level;
  30. };
  31. static struct stm32_sd sd_device;
  32. #define SD_TIMEOUT ((uint32_t)3 * 1000)
  33. #define DETECT_PIN GET_PIN(G, 1)
  34. #define LDO_PIN GET_PIN(F, 14)
  35. struct rt_completion tx_comp;
  36. struct rt_completion rx_comp;
  37. #define SDIO_BUFF_SIZE 512
  38. #define SDCARD_ADDR 0x2FFC0000
  39. #if defined(__ARMCC_VERSION)
  40. //__attribute__((at(SDCARD_ADDR)))
  41. static rt_uint32_t cache_buf[SDIO_BUFF_SIZE];
  42. #elif defined ( __GNUC__ )
  43. static rt_uint32_t cache_buf[SDIO_BUFF_SIZE] __attribute__((section(".SdCardSection")));
  44. #elif defined(__ICCARM__)
  45. #pragma location = SDCARD_ADDR
  46. __no_init static rt_uint32_t cache_buf[SDIO_BUFF_SIZE];
  47. #endif
  48. #if defined(SDCARD_RX_DUMP) || defined(SDCARD_TX_DUMP)
  49. #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
  50. static void dump_hex(const rt_uint8_t *ptr, rt_size_t buflen)
  51. {
  52. unsigned char *buf = (unsigned char *)ptr;
  53. int i, j;
  54. for (i = 0; i < buflen; i += 16)
  55. {
  56. rt_kprintf("%08X: ", i);
  57. for (j = 0; j < 16; j++)
  58. if (i + j < buflen)
  59. rt_kprintf("%02X ", buf[i + j]);
  60. else
  61. rt_kprintf(" ");
  62. rt_kprintf(" ");
  63. for (j = 0; j < 16; j++)
  64. if (i + j < buflen)
  65. rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
  66. rt_kprintf("\n");
  67. }
  68. }
  69. #endif
  70. static rt_err_t rt_hw_sd_is_detected(void)
  71. {
  72. return rt_pin_read(DETECT_PIN);
  73. }
  74. static rt_err_t rt_hw_sd_init(void)
  75. {
  76. #if 0
  77. /* sd ldo*/
  78. rt_pin_mode(LDO_PIN, PIN_MODE_OUTPUT);
  79. /* sd detect */
  80. rt_pin_mode(DETECT_PIN, PIN_MODE_INPUT_PULLUP);
  81. if (rt_hw_sd_is_detected() != 0x00)
  82. {
  83. LOG_E("can't find sd card!");
  84. return -RT_ERROR;
  85. }
  86. #endif
  87. SDCARD_Handler.Instance = SDIO;
  88. HAL_SD_DeInit(&SDCARD_Handler);
  89. SDCARD_Handler.Instance = SDIO;
  90. SDCARD_Handler.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  91. SDCARD_Handler.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  92. SDCARD_Handler.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  93. SDCARD_Handler.Init.BusWide = SDIO_BUS_WIDE_1B;
  94. SDCARD_Handler.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  95. SDCARD_Handler.Init.ClockDiv = 1;
  96. if (HAL_SD_Init(&SDCARD_Handler) != HAL_OK)
  97. {
  98. LOG_E("sd device init error!");
  99. return -RT_ERROR;
  100. }
  101. if (HAL_SD_ConfigWideBusOperation(&SDCARD_Handler, SDIO_BUS_WIDE_4B) != HAL_OK)
  102. {
  103. LOG_E("sd bus config error!");
  104. return -RT_ERROR;
  105. }
  106. if (HAL_SD_GetCardInfo(&SDCARD_Handler, &SDCardInfo) != HAL_OK)
  107. {
  108. LOG_E("sd get card info error!");
  109. return -RT_ERROR;
  110. }
  111. rt_thread_mdelay(100);
  112. if(HAL_SD_GetCardState(&SDCARD_Handler) != HAL_SD_CARD_TRANSFER)
  113. {
  114. LOG_E("sd get card state error!");
  115. return -RT_ERROR;
  116. }
  117. #ifdef SDCARD_DMA
  118. HAL_NVIC_EnableIRQ(SDIO_IRQn);
  119. #endif
  120. return RT_EOK;
  121. }
  122. static void rt_hw_sd_deinit(void)
  123. {
  124. HAL_SD_DeInit(&SDCARD_Handler);
  125. }
  126. static rt_err_t sdcard_wait_ok(void)
  127. {
  128. rt_uint32_t tick_start = 0;
  129. tick_start = rt_tick_get();
  130. while ((rt_tick_get() - tick_start) < SD_TIMEOUT)
  131. {
  132. if (HAL_SD_GetCardState(&SDCARD_Handler) == HAL_SD_CARD_TRANSFER)
  133. {
  134. return HAL_OK;
  135. }
  136. }
  137. return HAL_ERROR;
  138. }
  139. static rt_err_t rt_sdcard_init(rt_device_t dev)
  140. {
  141. RT_ASSERT(dev != RT_NULL);
  142. struct stm32_sd *sd = (struct stm32_sd *)dev;
  143. if (rt_sem_init(&sd->sd_lock, "sdlock", 1, RT_IPC_FLAG_FIFO) != RT_EOK)
  144. {
  145. LOG_E("init sd lock semaphore failed\n");
  146. }
  147. return RT_EOK;
  148. }
  149. static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag)
  150. {
  151. RT_ASSERT(dev != RT_NULL);
  152. return RT_EOK;
  153. }
  154. static rt_err_t rt_sdcard_close(rt_device_t dev)
  155. {
  156. RT_ASSERT(dev != RT_NULL);
  157. return RT_EOK;
  158. }
  159. /**
  160. * @brief Reads Sector(s)
  161. * @param dev : sd dev
  162. * @param sector: Sector address (LBA) Data buffer to store read data
  163. * @param *buffer: Data buffer to store read data
  164. * @param count: Number of sectors to read (1..128)
  165. * @retval DRESULT: Operation result
  166. */
  167. static rt_ssize_t rt_sdcard_read(rt_device_t dev, rt_off_t sector, void *buffer, rt_size_t count)
  168. {
  169. RT_ASSERT(dev != RT_NULL);
  170. struct stm32_sd *sd = (struct stm32_sd *)dev;
  171. rt_uint8_t ret = RT_EOK;
  172. volatile uint32_t tickstart = 0;
  173. sd->read_flage = 0;
  174. rt_memset(cache_buf, 0x00, BLOCKSIZE * count);
  175. ret = sdcard_wait_ok();
  176. if (ret != RT_EOK)
  177. {
  178. LOG_D("sdcard busy!");
  179. return 0;
  180. }
  181. #ifdef SDCARD_DMA
  182. rt_sem_take(&sd->sd_lock, RT_WAITING_FOREVER);
  183. ret = HAL_SD_ReadBlocks_DMA(&SDCARD_Handler, (rt_uint8_t *)cache_buf, (uint32_t)sector, count);
  184. rt_sem_release(&sd->sd_lock);
  185. /* Wait that writing process is completed or a timeout occurs */
  186. tickstart = rt_tick_get();
  187. if (ret == HAL_OK)
  188. {
  189. while ((sd->read_flage == 0) && (rt_tick_get() - tickstart) < SD_TIMEOUT)
  190. {
  191. }
  192. /* over time */
  193. if (sd->read_flage == 0)
  194. {
  195. return 0;
  196. }
  197. else
  198. {
  199. sd->read_flage = 0;
  200. tickstart = rt_tick_get();
  201. while ((rt_tick_get() - tickstart) < SD_TIMEOUT)
  202. {
  203. if (sdcard_wait_ok() == RT_EOK)
  204. {
  205. sd->level=rt_hw_interrupt_disable();
  206. rt_memcpy((rt_uint8_t *)(buffer), cache_buf, BLOCKSIZE * count);
  207. rt_hw_interrupt_enable(sd->level);
  208. #if defined(SDCARD_RX_DUMP)
  209. rt_kprintf("\nsd rx: \n");
  210. dump_hex(cache_buf, BLOCKSIZE * count);
  211. #endif
  212. return count;
  213. }
  214. }
  215. }
  216. }
  217. #else
  218. ret = HAL_SD_ReadBlocks(&SDCARD_Handler, (uint8_t *)cache_buf, (uint32_t)sector, count, SD_TIMEOUT);
  219. ret = sdcard_wait_ok();
  220. if (ret == RT_EOK) {
  221. return count;
  222. }
  223. else {
  224. LOG_D("sdcard busy!");
  225. }
  226. #endif
  227. return 0;
  228. }
  229. /**
  230. * @brief Writes block(s) to a specified address in an SD card, in DMA mode.
  231. * @param dev SD device
  232. * @param sector Block index from where data is to be written P
  233. * @param *buffer Pointer to the buffer that will contain the data to transmit
  234. * @param count Number of SD blocks to write
  235. * @retval BSP status
  236. */
  237. static rt_ssize_t rt_sdcard_write(rt_device_t dev, rt_off_t sector, const void *buffer, rt_size_t count)
  238. {
  239. RT_ASSERT(dev != RT_NULL);
  240. struct stm32_sd *sd = (struct stm32_sd *)dev;
  241. rt_uint32_t i = 0;
  242. rt_uint8_t ret = RT_EOK;
  243. for (i = 0; i < count; i++)
  244. {
  245. sd->level = rt_hw_interrupt_disable();
  246. rt_memset(cache_buf, 0x00, BLOCKSIZE);
  247. rt_memcpy(cache_buf, (rt_uint32_t *)((uintptr_t)buffer + BLOCKSIZE * i), BLOCKSIZE);
  248. rt_hw_interrupt_enable(sd->level);
  249. #if defined(SDCARD_TX_DUMP)
  250. rt_kprintf("\nsd tx: \n");
  251. dump_hex(cache_buf, BLOCKSIZE);
  252. #endif
  253. ret = sdcard_wait_ok();
  254. if (ret != RT_EOK)
  255. {
  256. LOG_D("sdcard busy!");
  257. return 0;
  258. }
  259. #ifdef SDCARD_DMA
  260. rt_completion_init(&tx_comp);
  261. ret = HAL_SD_WriteBlocks_DMA(&SDCARD_Handler, (rt_uint8_t *)cache_buf, (rt_uint32_t)(sector + i), 1);
  262. if (ret != HAL_OK)
  263. {
  264. rt_kprintf("sd write error!\n");
  265. return 0;
  266. }
  267. rt_completion_wait(&tx_comp,RT_WAITING_FOREVER);
  268. #else
  269. HAL_SD_WriteBlocks(&SDCARD_Handler, (uint8_t *)cache_buf, (rt_uint32_t)(sector + i), 1, SD_TIMEOUT);
  270. ret = sdcard_wait_ok();
  271. if (ret != RT_EOK)
  272. {
  273. LOG_D("sdcard busy!");
  274. return 0;
  275. }
  276. #endif
  277. }
  278. return count;
  279. }
  280. static rt_err_t rt_sdcard_control(rt_device_t dev, int cmd, void *args)
  281. {
  282. RT_ASSERT(dev != RT_NULL);
  283. if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME)
  284. {
  285. struct rt_device_blk_geometry *geometry;
  286. geometry = (struct rt_device_blk_geometry *)args;
  287. geometry->bytes_per_sector = 512;
  288. geometry->block_size = SDCARD_Handler.SdCard.BlockSize;
  289. geometry->sector_count = SDCARD_Handler.SdCard.BlockNbr;
  290. }
  291. return RT_EOK;
  292. }
  293. void SDIO_IRQHandler(void)
  294. {
  295. rt_interrupt_enter();
  296. HAL_SD_IRQHandler(&SDCARD_Handler);
  297. rt_interrupt_leave();
  298. }
  299. void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  300. {
  301. if (hsd->Instance == SDCARD_Handler.Instance)
  302. {
  303. sd_device.read_flage = 1;
  304. }
  305. }
  306. void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
  307. {
  308. if (hsd->Instance == SDCARD_Handler.Instance)
  309. {
  310. rt_completion_done(&tx_comp);
  311. }
  312. }
  313. void HAL_SD_DriveTransceiver_1_8V_Callback(FlagStatus status)
  314. {
  315. if (status == SET)
  316. {
  317. rt_pin_write(LDO_PIN, PIN_HIGH);
  318. }
  319. else
  320. {
  321. rt_pin_write(LDO_PIN, PIN_LOW);
  322. }
  323. }
  324. int rt_hw_sdcard_init(void)
  325. {
  326. if (rt_hw_sd_init() != RT_EOK)
  327. {
  328. rt_hw_sd_deinit();
  329. LOG_E("sdcard init failed");
  330. return -RT_ERROR;
  331. }
  332. /* register sdcard device */
  333. sd_device.sdcard.type = RT_Device_Class_Block;
  334. sd_device.sdcard.init = rt_sdcard_init;
  335. sd_device.sdcard.open = rt_sdcard_open;
  336. sd_device.sdcard.close = rt_sdcard_close;
  337. sd_device.sdcard.read = rt_sdcard_read;
  338. sd_device.sdcard.write = rt_sdcard_write;
  339. sd_device.sdcard.control = rt_sdcard_control;
  340. /* no private */
  341. sd_device.sdcard.user_data = &SDCardInfo;
  342. rt_device_register(&sd_device.sdcard, "sdcard", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);
  343. LOG_I("sd card init success!");
  344. return RT_EOK;
  345. }
  346. INIT_DEVICE_EXPORT(rt_hw_sdcard_init);
  347. #endif