[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/ffs/os.c b/src/bsp/lk/lib/ffs/os.c
new file mode 100644
index 0000000..37268e2
--- /dev/null
+++ b/src/bsp/lk/lib/ffs/os.c
@@ -0,0 +1,322 @@
+#include <stdio.h>
+#include <kernel/mutex.h>
+#include <malloc.h>
+#include <dev/driver.h>
+#include <dev/class/block.h>
+#include <err.h>
+
+#include "ff.h"
+#include "diskio.h"
+
+static struct {
+ FATFS work;
+ struct device *dev;
+} mount_table[_VOLUMES];
+
+status_t ffs_mount(size_t index, struct device *dev)
+{
+ FRESULT res;
+
+ if (index >= countof(mount_table))
+ return ERR_INVALID_ARGS;
+
+ if (dev && mount_table[index].dev)
+ return ERR_ALREADY_MOUNTED;
+
+ if (dev) {
+ mount_table[index].dev = dev;
+
+ res = f_mount(index, &mount_table[index].work);
+ if (res != FR_OK)
+ return ERR_INVALID_ARGS;
+ } else {
+ mount_table[index].dev = NULL;
+
+ res = f_mount(index, NULL);
+ if (res != FR_OK)
+ return ERR_NOT_FOUND;
+ }
+
+ return NO_ERROR;
+}
+
+#if _USE_LFN == 3
+void *ff_memalloc(UINT size)
+{
+ return malloc(size);
+}
+
+void ff_memfree(void *mblock)
+{
+ free(mblock);
+}
+#endif
+
+#if _FS_REENTRANT
+int ff_cre_syncobj(BYTE vol, _SYNC_t *sobj)
+{
+ *sobj = malloc(sizeof(mutex_t));
+ if (!*sobj)
+ return false;
+
+ mutex_init(*sobj);
+ return true;
+}
+
+int ff_del_syncobj(_SYNC_t sobj)
+{
+ mutex_destroy(sobj);
+ free(sobj);
+ return true;
+}
+
+int ff_req_grant(_SYNC_t sobj)
+{
+ mutex_acquire(sobj);
+ return true;
+}
+
+void ff_rel_grant(_SYNC_t sobj)
+{
+ mutex_release(sobj);
+}
+#endif
+
+DSTATUS disk_initialize(BYTE pdrv)
+{
+ return RES_OK;
+}
+
+DSTATUS disk_status(BYTE pdrv)
+{
+ return RES_OK;
+}
+
+DRESULT disk_read(BYTE pdrv, BYTE* buf, DWORD sector, BYTE count)
+{
+ ssize_t ret;
+
+ struct device *dev = mount_table[pdrv].dev;
+ if (!dev)
+ return RES_NOTRDY;
+
+ ret = class_block_read(dev, sector, buf, count);
+ if (ret < 0)
+ return RES_ERROR;
+
+ return RES_OK;
+}
+
+#if _READONLY == 0
+DRESULT disk_write(BYTE pdrv, const BYTE* buf, DWORD sector, BYTE count)
+{
+ ssize_t ret;
+
+ struct device *dev = mount_table[pdrv].dev;
+ if (!dev)
+ return RES_NOTRDY;
+
+ ret = class_block_write(dev, sector, buf, count);
+ if (ret < 0)
+ return RES_ERROR;
+
+ return RES_OK;
+}
+#endif
+
+DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buf)
+{
+ ssize_t ret;
+
+ struct device *dev = mount_table[pdrv].dev;
+ if (!dev)
+ return RES_NOTRDY;
+
+ switch (cmd) {
+ case GET_SECTOR_SIZE: {
+ WORD *val = buf;
+
+ ret = class_block_get_size(dev);
+ if (ret < 0)
+ return RES_ERROR;
+
+ *val = ret;
+ }
+ break;
+
+ case GET_BLOCK_SIZE: {
+ DWORD *val = buf;
+
+ ret = class_block_get_size(dev);
+ if (ret < 0)
+ return RES_ERROR;
+
+ *val = ret;
+ }
+ break;
+
+ case GET_SECTOR_COUNT: {
+ DWORD *val = buf;
+
+ ret = class_block_get_count(dev);
+ if (ret < 0)
+ return RES_ERROR;
+
+ *val = ret;
+ }
+ break;
+ }
+
+ return RES_OK;
+}
+
+DWORD get_fattime(void)
+{
+ return
+ ((2013 - 1980) << 25) | // year
+ (1 << 21) | // month
+ (1 << 16) | // day
+ (0 << 11) | // hour
+ (0 << 5) | // minute
+ (0 << 0) // even second
+ ;
+}
+
+FILE *fopen(const char *filename, const char *mode)
+{
+ FRESULT res;
+ BYTE flags = 0;
+ FIL *fil;
+ int i;
+
+ fil = malloc(sizeof(FIL));
+ if (!fil)
+ return NULL;
+
+ for (i=0; mode[i] != 0; i++) {
+ switch (mode[i]) {
+ case 'w':
+ flags |= FA_WRITE | FA_CREATE_ALWAYS;
+ break;
+
+ case 'r':
+ flags |= FA_READ;
+ break;
+
+ case '+':
+ flags |= FA_READ | FA_WRITE;
+ break;
+ }
+ }
+
+ res = f_open(fil, filename, flags);
+ if (res != FR_OK) {
+ free(fil);
+ return NULL;
+ }
+
+ return (FILE *) fil;
+}
+
+int fclose(FILE *stream)
+{
+ FRESULT res;
+ FIL *fil = (FIL *) stream;
+
+ res = f_close(fil);
+ if (res != FR_OK)
+ return -1;
+
+ free(fil);
+ return 0;
+}
+
+size_t fread(void *ptr, size_t size, size_t count, FILE *stream)
+{
+ FRESULT res;
+ FIL *fil = (FIL *) stream;
+ UINT bread;
+
+ res = f_read(fil, ptr, size * count, &bread);
+ if (res != FR_OK)
+ return 0;
+
+ return bread;
+}
+
+size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
+{
+ FRESULT res;
+ FIL *fil = (FIL *) stream;
+ UINT bwrite;
+
+ res = f_write(fil, ptr, size * count, &bwrite);
+ if (res != FR_OK)
+ return 0;
+
+ return bwrite;
+}
+
+int fflush(FILE *stream)
+{
+ FRESULT res;
+ FIL *fil;
+
+ if (!stream)
+ return 0;
+
+ fil = (FIL *) stream;
+
+ res = f_sync(fil);
+ if (res != FR_OK)
+ return -1;
+
+ return 0;
+}
+
+int feof(FILE *stream)
+{
+ FIL *fil = (FIL *) stream;
+
+ return f_eof(fil);
+}
+
+int fseek(FILE *stream, long offset, int whence)
+{
+ FRESULT res;
+ FIL *fil = (FIL *) stream;
+ long o;
+
+ switch (whence) {
+ case SEEK_SET:
+ o = offset;
+ break;
+
+ case SEEK_CUR:
+ o = offset + f_tell(fil);
+ break;
+
+ case SEEK_END:
+ o = f_size(fil) + offset;
+ if (o < 0)
+ o = 0;
+ break;
+
+ default:
+ return -1;
+ }
+
+ res = f_lseek(fil, o);
+ if (res != FR_OK)
+ return -1;
+
+ return 0;
+}
+
+long ftell(FILE *stream)
+{
+ FIL *fil = (FIL *) stream;
+
+ return f_tell(fil);
+}
+