ARMEBS4  revision-26.06.2015
stm32_sd_fatfs.c
1 /**
2  * \file heivs/stm32_sd_fatfs.h
3  * \brief SD memory driver for FAT fs
4  * \author marc dot pignat at hevs dot ch
5  */
6 
7 #include "fatfs/driver_sdcard.h"
8 #include "stm32/stm32f4xx_misc.h"
9 #include "heivs/stm32_sd.h"
10 #include "heivs/stm32_sd_fatfs.h"
11 #include <time.h>
12 
13 #define BLOCK_SIZE 512 /* Block Size in Bytes */
14 
15 DSTATUS SD_disk_initialize()
16 {
17  status_e status;
18 
19  status = SD_LowLevel_Init();
20  if (status != NO_ERROR)
21  {
22  return STA_NOINIT;
23  }
24 
25  status = SD_Detect();
26  if (status != NO_ERROR)
27  {
28  return STA_NODISK;
29  }
30 
31  status = SD_Init();
32  if (status != NO_ERROR)
33  {
34  return STA_NOINIT;
35  }
36 
37  return 0;
38 }
39 
40 DSTATUS SD_disk_status(void)
41 {
42  if (SD_Detect() != NO_ERROR)
43  {
44  return STA_NODISK;
45  }
46 
47  if (SD_GetStatus() != NO_ERROR)
48  {
49  return STA_NOINIT;
50  }
51 
52  return 0;
53 }
54 
55 DRESULT SD_disk_read(BYTE *buff, DWORD sector, BYTE count)
56 {
57  status_e status;
58  int i;
59 
60  for (i = 0 ; i < count ; i++)
61  {
62  status = SD_ReadSingleBlock(buff, sector);
63  if (status != NO_ERROR)
64  {
65  return RES_ERROR;
66  }
67  sector++;
68  buff += BLOCK_SIZE;
69  }
70 
71  return RES_OK;
72 }
73 
74 #if _READONLY == 0
75 DRESULT SD_disk_write(const BYTE *buff, DWORD sector, BYTE count)
76 {
77  status_e status;
78  int i;
79 
80  for (i = 0 ; i < count ; i++)
81  {
82  status = SD_WriteSingleBlock(buff, sector);
83  if (status != NO_ERROR)
84  {
85  return RES_ERROR;
86  }
87  sector++;
88  buff += BLOCK_SIZE;
89  }
90 
91  return RES_OK;
92 }
93 #endif /* _READONLY == 0 */
94 
95 #if _USE_IOCTL != 0
96 DRESULT SD_disk_ioctl(BYTE ctrl, void *buff)
97 {
98  status_e status;
99 
100  switch (ctrl)
101  {
102  case CTRL_SYNC:
103  return RES_OK;
104  break;
105 
106  case GET_SECTOR_COUNT:
107  status = SD_GetSectorCount((uint32_t *)buff);
108  if (status != NO_ERROR)
109  {
110  return RES_NOTRDY;
111  }
112 
113  return RES_OK;
114  break;
115 
116  case GET_SECTOR_SIZE:
117  *(WORD*) buff = BLOCK_SIZE;
118  return RES_OK;
119  break;
120 
121  case GET_BLOCK_SIZE:
122  *(DWORD*) buff = 32;
123  return RES_OK;
124  break;
125 
126  default:
127  return RES_PARERR;
128  break;
129  }
130 
131  return RES_PARERR;
132 }
133 #endif /* _USE_IOCTL != 0 */
134 
135 /**
136  * @brief Get Time from RTC
137  * @param None
138  * @retval Time in DWORD
139  */
140 
141 DWORD get_fattime(void)
142 {
143  DWORD val = 0;
144 
145  time_t now;
146  struct tm tm;
147  time(&now);
148  localtime_r(&now, &tm);
149 
150  /* Pack date and time into a DWORD variable */
151  val =
152  (
153  // Unix time base is 1900 and window's 1980
154  (DWORD) ((tm.tm_year + (1900-1980)) << 25)
155 
156  // January is 0 for unix, 1 for windows
157  | (DWORD) ((tm.tm_mon + 1) << 21)
158 
159  | (DWORD) (tm.tm_mday << 16)
160  | (WORD) (tm.tm_hour << 11)
161  | (WORD) (tm.tm_min << 5)
162  | (WORD) (tm.tm_sec >> 1)
163  );
164  return val;
165 }
166 
167 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
uint8_t ctrl
Controller number (0 for GPIOA, 1 for GPIOB, ...)
Definition: stm32_gpio.h:98
simple time abstraction
SD memory card access for STM32 boards.
SD memory driver for FAT fs.
status_e
Known errors.
Definition: error.h:21
No error.
Definition: error.h:28