diskio.c 6.0 KB
Newer Older
W
wenjun 已提交
1 2 3 4 5 6 7 8
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2016        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/
E
evanscjv 已提交
9 10
#include "diskio.h"
#ifndef __LITEOS_M__
W
wenjun 已提交
11 12
#include "string.h"
#include "disk.h"
E
evanscjv 已提交
13 14 15 16 17 18 19 20
#else
#include "ff_gen_drv.h"
#if defined ( __GNUC__ )
#ifndef __weak
#define __weak __attribute__((weak))
#endif
#endif
#endif
W
wenjun 已提交
21 22 23 24 25

/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/

E
evanscjv 已提交
26
#ifndef __LITEOS_M__
W
wenjun 已提交
27 28 29 30 31 32 33 34
#define CARD_UNPLUGED   1
extern int get_cardstatus(int pdrv);
#define GET_CARD_STATUS					\
	do {						\
		if (get_cardstatus(pdrv) == 0)		\
			return STA_NOINIT;		\
	} while (0)
extern  struct tm tm;
E
evanscjv 已提交
35
#endif
W
wenjun 已提交
36 37 38 39 40

DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
E
evanscjv 已提交
41
#ifndef __LITEOS_M__
W
wenjun 已提交
42
	return 0;
E
evanscjv 已提交
43 44 45 46 47 48
#else
	DSTATUS stat;

	stat = g_diskDrv.drv[pdrv]->disk_status(g_diskDrv.lun[pdrv]);
	return stat;
#endif
W
wenjun 已提交
49 50 51 52 53 54 55 56 57 58 59 60
}



/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
E
evanscjv 已提交
61
#ifndef __LITEOS_M__
W
wenjun 已提交
62
	return 0;
E
evanscjv 已提交
63 64 65 66 67 68 69 70 71
#else
	DSTATUS stat = RES_OK;

	if(g_diskDrv.initialized[pdrv] == 0)
	{
		stat = g_diskDrv.drv[pdrv]->disk_initialize(g_diskDrv.lun[pdrv]);
	}
	return stat;
#endif
W
wenjun 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
}



/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/

DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	QWORD sector,	/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
E
evanscjv 已提交
87
#ifndef __LITEOS_M__
W
wenjun 已提交
88 89
	int result;

F
Far 已提交
90
	result = los_part_read((int)pdrv, (void *)buff, sector, (UINT32)count, TRUE);
W
wenjun 已提交
91 92 93 94 95

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
E
evanscjv 已提交
96 97 98 99 100 101
#else
	DRESULT res;

	res = g_diskDrv.drv[pdrv]->disk_read(g_diskDrv.lun[pdrv], buff, sector, count);
	return res;
#endif
W
wenjun 已提交
102 103
}

F
Far 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
#ifndef __LITEOS_M__
DRESULT disk_read_readdir (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	QWORD sector,		/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
	int result;

	result = los_part_read((int)pdrv, (void *)buff, sector, (UINT32)count, FALSE);

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
}
#endif


E
evanscjv 已提交
124
#ifndef __LITEOS_M__
W
wenjun 已提交
125 126 127 128
DRESULT disk_raw_read (int id, void *buff, QWORD sector, UINT32 count)
{
	int result;

F
Far 已提交
129
	result = los_disk_read(id, buff, sector, count, TRUE);
W
wenjun 已提交
130 131 132 133 134 135

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
}
E
evanscjv 已提交
136 137
#endif

W
wenjun 已提交
138 139 140 141 142 143


/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/

E
evanscjv 已提交
144 145
#if FF_FS_READONLY == 0

W
wenjun 已提交
146 147 148 149 150 151 152
DRESULT disk_write (
	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	QWORD sector,		/* Start sector in LBA */
	UINT count			/* Number of sectors to write */
)
{
E
evanscjv 已提交
153
#ifndef __LITEOS_M__
W
wenjun 已提交
154 155 156 157 158 159 160 161
	int result;

	result = los_part_write((int)pdrv, (void *)buff, sector, (UINT32)count);

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
E
evanscjv 已提交
162 163 164 165 166 167 168
#else
	DRESULT res;

	res = g_diskDrv.drv[pdrv]->disk_write(g_diskDrv.lun[pdrv], buff, sector, count);

	return res;
#endif
W
wenjun 已提交
169 170
}

E
evanscjv 已提交
171
#ifndef __LITEOS_M__
W
wenjun 已提交
172 173 174 175 176 177 178 179 180 181 182
DRESULT disk_raw_write(int id, void *buff, QWORD sector, UINT32 count){
	int result;
	void *uwBuff = buff;

	result = los_disk_write(id, (const void*)uwBuff, sector, count);

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
}
E
evanscjv 已提交
183 184 185 186
#endif

#endif /* FF_FS_READONLY == 0 */

W
wenjun 已提交
187 188 189 190 191 192 193 194 195 196 197

/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/

DRESULT disk_ioctl (
	BYTE pdrv,		/* Physical drive nmuber (0..) */
	BYTE cmd,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
E
evanscjv 已提交
198
#ifndef __LITEOS_M__
W
wenjun 已提交
199 200 201 202 203 204 205 206
	int result;

	result = los_part_ioctl((int)pdrv, (int)cmd, buff);

	if (result == 0)
		return RES_OK;
	else
		return RES_ERROR;
E
evanscjv 已提交
207 208 209 210 211 212
#else
	DRESULT res;

	res = g_diskDrv.drv[pdrv]->disk_ioctl(g_diskDrv.lun[pdrv], cmd, buff);
	return res;
#endif
W
wenjun 已提交
213 214
}

E
evanscjv 已提交
215 216 217 218 219 220 221
 /*
  * @brief  Gets Time from RTC
  * @param  None
  * @retval Time in DWORD
  */

#ifndef __LITEOS_M__
W
wenjun 已提交
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
DWORD get_fattime (void)
{
	time_t seconds = 0;
	struct tm local_time = {0};

	seconds = time(NULL);

	if (localtime_r(&seconds, &local_time) == NULL)
		return 0;
	if ((local_time.tm_year + 1900) < 1980) {	/* year must start at 1980 */
		return 0;
	}

	/* get system time */
	return  ((DWORD)(local_time.tm_year - 80) << 25) |
			((DWORD)(local_time.tm_mon + 1) << 21) |
			((DWORD)local_time.tm_mday << 16) |
			((DWORD)local_time.tm_hour << 11) |
			((DWORD)local_time.tm_min << 5) |
			((DWORD)local_time.tm_sec >> 1);
}
E
evanscjv 已提交
243 244 245 246 247 248
#else
__weak DWORD get_fattime (void)
{
	return 0;
}
#endif
W
wenjun 已提交
249