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