1e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
2e6865dcdSopenharmony_ci/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */
3e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
4e6865dcdSopenharmony_ci/* If a working storage control module is available, it should be        */
5e6865dcdSopenharmony_ci/* attached to the FatFs via a glue function rather than modifying it.   */
6e6865dcdSopenharmony_ci/* This is an example of glue functions to attach various exsisting      */
7e6865dcdSopenharmony_ci/* storage control modules to the FatFs module with a defined API.       */
8e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
9e6865dcdSopenharmony_ci#include "ff.h"			/* Obtains integer types */
10e6865dcdSopenharmony_ci#include "diskio.h"		/* Declarations of disk functions */
11e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
12e6865dcdSopenharmony_ci#include "string.h"
13e6865dcdSopenharmony_ci#include "disk.h"
14e6865dcdSopenharmony_ci#else
15e6865dcdSopenharmony_ci#include "ff_gen_drv.h"
16e6865dcdSopenharmony_ci#if defined ( __GNUC__ )
17e6865dcdSopenharmony_ci#ifndef __weak
18e6865dcdSopenharmony_ci#define __weak __attribute__((weak))
19e6865dcdSopenharmony_ci#endif
20e6865dcdSopenharmony_ci#endif
21e6865dcdSopenharmony_ci#endif
22e6865dcdSopenharmony_ci
23e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
24e6865dcdSopenharmony_ci/* Get Drive Status                                                      */
25e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
26e6865dcdSopenharmony_ci
27e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
28e6865dcdSopenharmony_ci#define CARD_UNPLUGED   1
29e6865dcdSopenharmony_ciextern int get_cardstatus(int pdrv);
30e6865dcdSopenharmony_ci#define GET_CARD_STATUS					\
31e6865dcdSopenharmony_ci	do {						\
32e6865dcdSopenharmony_ci		if (get_cardstatus(pdrv) == 0)		\
33e6865dcdSopenharmony_ci			return STA_NOINIT;		\
34e6865dcdSopenharmony_ci	} while (0)
35e6865dcdSopenharmony_ciextern  struct tm tm;
36e6865dcdSopenharmony_ci#endif
37e6865dcdSopenharmony_ci
38e6865dcdSopenharmony_ciDSTATUS disk_status (
39e6865dcdSopenharmony_ci	BYTE pdrv		/* Physical drive nmuber to identify the drive */
40e6865dcdSopenharmony_ci)
41e6865dcdSopenharmony_ci{
42e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
43e6865dcdSopenharmony_ci	return 0;
44e6865dcdSopenharmony_ci#else
45e6865dcdSopenharmony_ci	DSTATUS stat;
46e6865dcdSopenharmony_ci
47e6865dcdSopenharmony_ci	stat = g_diskDrv.drv[pdrv]->disk_status(g_diskDrv.lun[pdrv]);
48e6865dcdSopenharmony_ci	return stat;
49e6865dcdSopenharmony_ci#endif
50e6865dcdSopenharmony_ci}
51e6865dcdSopenharmony_ci
52e6865dcdSopenharmony_ci
53e6865dcdSopenharmony_ci
54e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
55e6865dcdSopenharmony_ci/* Inidialize a Drive                                                    */
56e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
57e6865dcdSopenharmony_ci
58e6865dcdSopenharmony_ciDSTATUS disk_initialize (
59e6865dcdSopenharmony_ci	BYTE pdrv				/* Physical drive nmuber to identify the drive */
60e6865dcdSopenharmony_ci)
61e6865dcdSopenharmony_ci{
62e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
63e6865dcdSopenharmony_ci	return 0;
64e6865dcdSopenharmony_ci#else
65e6865dcdSopenharmony_ci	DSTATUS stat = RES_OK;
66e6865dcdSopenharmony_ci
67e6865dcdSopenharmony_ci	if(g_diskDrv.initialized[pdrv] == 0)
68e6865dcdSopenharmony_ci	{
69e6865dcdSopenharmony_ci		stat = g_diskDrv.drv[pdrv]->disk_initialize(g_diskDrv.lun[pdrv]);
70e6865dcdSopenharmony_ci	}
71e6865dcdSopenharmony_ci	return stat;
72e6865dcdSopenharmony_ci#endif
73e6865dcdSopenharmony_ci}
74e6865dcdSopenharmony_ci
75e6865dcdSopenharmony_ci
76e6865dcdSopenharmony_ci
77e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
78e6865dcdSopenharmony_ci/* Read Sector(s)                                                        */
79e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
80e6865dcdSopenharmony_ci
81e6865dcdSopenharmony_ciDRESULT disk_read (
82e6865dcdSopenharmony_ci	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
83e6865dcdSopenharmony_ci	BYTE *buff,		/* Data buffer to store read data */
84e6865dcdSopenharmony_ci	LBA_t sector,	/* Start sector in LBA */
85e6865dcdSopenharmony_ci	UINT count		/* Number of sectors to read */
86e6865dcdSopenharmony_ci)
87e6865dcdSopenharmony_ci{
88e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
89e6865dcdSopenharmony_ci	int result;
90e6865dcdSopenharmony_ci
91e6865dcdSopenharmony_ci	result = los_part_read((int)pdrv, (void *)buff, sector, (UINT32)count, TRUE);
92e6865dcdSopenharmony_ci
93e6865dcdSopenharmony_ci	if (result == 0)
94e6865dcdSopenharmony_ci		return RES_OK;
95e6865dcdSopenharmony_ci	else
96e6865dcdSopenharmony_ci		return RES_ERROR;
97e6865dcdSopenharmony_ci#else
98e6865dcdSopenharmony_ci        return (DRESULT)g_diskDrv.drv[pdrv]->disk_read(g_diskDrv.lun[pdrv], buff, sector, count);
99e6865dcdSopenharmony_ci#endif
100e6865dcdSopenharmony_ci}
101e6865dcdSopenharmony_ci
102e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
103e6865dcdSopenharmony_ciDRESULT disk_read_readdir (
104e6865dcdSopenharmony_ci	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
105e6865dcdSopenharmony_ci	BYTE *buff,		/* Data buffer to store read data */
106e6865dcdSopenharmony_ci	LBA_t sector,		/* Start sector in LBA */
107e6865dcdSopenharmony_ci	UINT count		/* Number of sectors to read */
108e6865dcdSopenharmony_ci)
109e6865dcdSopenharmony_ci{
110e6865dcdSopenharmony_ci	int result;
111e6865dcdSopenharmony_ci
112e6865dcdSopenharmony_ci	result = los_part_read((int)pdrv, (void *)buff, sector, (UINT32)count, FALSE);
113e6865dcdSopenharmony_ci
114e6865dcdSopenharmony_ci	if (result == 0)
115e6865dcdSopenharmony_ci		return RES_OK;
116e6865dcdSopenharmony_ci	else
117e6865dcdSopenharmony_ci		return RES_ERROR;
118e6865dcdSopenharmony_ci}
119e6865dcdSopenharmony_ci#endif
120e6865dcdSopenharmony_ci
121e6865dcdSopenharmony_ci
122e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
123e6865dcdSopenharmony_ciDRESULT disk_raw_read (int id, void *buff, LBA_t sector, UINT32 count)
124e6865dcdSopenharmony_ci{
125e6865dcdSopenharmony_ci	int result;
126e6865dcdSopenharmony_ci
127e6865dcdSopenharmony_ci	result = los_disk_read(id, buff, sector, count, TRUE);
128e6865dcdSopenharmony_ci
129e6865dcdSopenharmony_ci	if (result == 0)
130e6865dcdSopenharmony_ci		return RES_OK;
131e6865dcdSopenharmony_ci	else
132e6865dcdSopenharmony_ci		return RES_ERROR;
133e6865dcdSopenharmony_ci}
134e6865dcdSopenharmony_ci#endif
135e6865dcdSopenharmony_ci
136e6865dcdSopenharmony_ci
137e6865dcdSopenharmony_ci
138e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
139e6865dcdSopenharmony_ci/* Write Sector(s)                                                       */
140e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
141e6865dcdSopenharmony_ci
142e6865dcdSopenharmony_ci#if FF_FS_READONLY == 0
143e6865dcdSopenharmony_ci
144e6865dcdSopenharmony_ciDRESULT disk_write (
145e6865dcdSopenharmony_ci	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
146e6865dcdSopenharmony_ci	const BYTE *buff,	/* Data to be written */
147e6865dcdSopenharmony_ci	LBA_t sector,		/* Start sector in LBA */
148e6865dcdSopenharmony_ci	UINT count			/* Number of sectors to write */
149e6865dcdSopenharmony_ci)
150e6865dcdSopenharmony_ci{
151e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
152e6865dcdSopenharmony_ci	int result;
153e6865dcdSopenharmony_ci
154e6865dcdSopenharmony_ci	result = los_part_write((int)pdrv, (void *)buff, sector, (UINT32)count);
155e6865dcdSopenharmony_ci
156e6865dcdSopenharmony_ci	if (result == 0)
157e6865dcdSopenharmony_ci		return RES_OK;
158e6865dcdSopenharmony_ci	else
159e6865dcdSopenharmony_ci		return RES_ERROR;
160e6865dcdSopenharmony_ci#else
161e6865dcdSopenharmony_ci        return (DRESULT)g_diskDrv.drv[pdrv]->disk_write(g_diskDrv.lun[pdrv], buff, sector, count);
162e6865dcdSopenharmony_ci#endif
163e6865dcdSopenharmony_ci}
164e6865dcdSopenharmony_ci
165e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
166e6865dcdSopenharmony_ciDRESULT disk_raw_write(int id, void *buff, QWORD sector, UINT32 count){
167e6865dcdSopenharmony_ci	int result;
168e6865dcdSopenharmony_ci	void *uwBuff = buff;
169e6865dcdSopenharmony_ci
170e6865dcdSopenharmony_ci	result = los_disk_write(id, (const void*)uwBuff, sector, count);
171e6865dcdSopenharmony_ci
172e6865dcdSopenharmony_ci	if (result == 0)
173e6865dcdSopenharmony_ci		return RES_OK;
174e6865dcdSopenharmony_ci	else
175e6865dcdSopenharmony_ci		return RES_ERROR;
176e6865dcdSopenharmony_ci}
177e6865dcdSopenharmony_ci#endif
178e6865dcdSopenharmony_ci
179e6865dcdSopenharmony_ci#endif /* FF_FS_READONLY == 0 */
180e6865dcdSopenharmony_ci
181e6865dcdSopenharmony_ci
182e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
183e6865dcdSopenharmony_ci/* Miscellaneous Functions                                               */
184e6865dcdSopenharmony_ci/*-----------------------------------------------------------------------*/
185e6865dcdSopenharmony_ci
186e6865dcdSopenharmony_ciDRESULT disk_ioctl (
187e6865dcdSopenharmony_ci	BYTE pdrv,		/* Physical drive nmuber (0..) */
188e6865dcdSopenharmony_ci	BYTE cmd,		/* Control code */
189e6865dcdSopenharmony_ci	void *buff		/* Buffer to send/receive control data */
190e6865dcdSopenharmony_ci)
191e6865dcdSopenharmony_ci{
192e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
193e6865dcdSopenharmony_ci	int result;
194e6865dcdSopenharmony_ci
195e6865dcdSopenharmony_ci	result = los_part_ioctl((int)pdrv, (int)cmd, buff);
196e6865dcdSopenharmony_ci
197e6865dcdSopenharmony_ci	if (result == 0)
198e6865dcdSopenharmony_ci		return RES_OK;
199e6865dcdSopenharmony_ci	else
200e6865dcdSopenharmony_ci		return RES_ERROR;
201e6865dcdSopenharmony_ci#else
202e6865dcdSopenharmony_ci        return (DRESULT)g_diskDrv.drv[pdrv]->disk_ioctl(g_diskDrv.lun[pdrv], cmd, buff);
203e6865dcdSopenharmony_ci#endif
204e6865dcdSopenharmony_ci}
205e6865dcdSopenharmony_ci
206e6865dcdSopenharmony_ci /*
207e6865dcdSopenharmony_ci  * @brief  Gets Time from RTC
208e6865dcdSopenharmony_ci  * @param  None
209e6865dcdSopenharmony_ci  * @retval Time in DWORD
210e6865dcdSopenharmony_ci  */
211e6865dcdSopenharmony_ci
212e6865dcdSopenharmony_ci#ifndef __LITEOS_M__
213e6865dcdSopenharmony_ciDWORD get_fattime (void)
214e6865dcdSopenharmony_ci{
215e6865dcdSopenharmony_ci	time_t seconds = 0;
216e6865dcdSopenharmony_ci	struct tm local_time = {0};
217e6865dcdSopenharmony_ci
218e6865dcdSopenharmony_ci	seconds = time(NULL);
219e6865dcdSopenharmony_ci
220e6865dcdSopenharmony_ci	if (localtime_r(&seconds, &local_time) == NULL)
221e6865dcdSopenharmony_ci		return 0;
222e6865dcdSopenharmony_ci	if ((local_time.tm_year + 1900) < 1980) {	/* year must start at 1980 */
223e6865dcdSopenharmony_ci		return 0;
224e6865dcdSopenharmony_ci	}
225e6865dcdSopenharmony_ci
226e6865dcdSopenharmony_ci	/* get system time */
227e6865dcdSopenharmony_ci	return  ((DWORD)(local_time.tm_year - 80) << 25) |
228e6865dcdSopenharmony_ci			((DWORD)(local_time.tm_mon + 1) << 21) |
229e6865dcdSopenharmony_ci			((DWORD)local_time.tm_mday << 16) |
230e6865dcdSopenharmony_ci			((DWORD)local_time.tm_hour << 11) |
231e6865dcdSopenharmony_ci			((DWORD)local_time.tm_min << 5) |
232e6865dcdSopenharmony_ci			((DWORD)local_time.tm_sec >> 1);
233e6865dcdSopenharmony_ci}
234e6865dcdSopenharmony_ci#else
235e6865dcdSopenharmony_ci__weak DWORD get_fattime (void)
236e6865dcdSopenharmony_ci{
237e6865dcdSopenharmony_ci	return 0;
238e6865dcdSopenharmony_ci}
239e6865dcdSopenharmony_ci#endif
240e6865dcdSopenharmony_ci
241