Files
luban-lite-t3e-pro/packages/third-party/dfs/filesystems/elmfat/sdmc_disk/sdmc_disk.c

116 lines
2.1 KiB
C
Raw Normal View History

2023-08-30 16:21:18 +08:00
/*
* Copyright (c) 2022, ArtInChip Technology Co., Ltd
*
* SPDX-License-Identifier: Apache-2.0
*
* Authors: matteo <duanmt@artinchip.com>
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <dfs_bare.h>
#include "aic_osal.h"
#include "sdmc_disk.h"
2024-01-27 08:47:24 +08:00
#include "block_dev.h"
2024-04-03 16:40:57 +08:00
#include "aic_utils.h"
2023-08-30 16:21:18 +08:00
#include "mmc.h"
2024-01-27 08:47:24 +08:00
DRESULT sdmc_disk_write(void *hdisk, const uint8_t *buf, uint32_t sector, uint8_t cnt)
2023-08-30 16:21:18 +08:00
{
2024-01-27 08:47:24 +08:00
struct block_dev *dev = hdisk;
2023-08-30 16:21:18 +08:00
rt_size_t size = 0;
2024-01-27 08:47:24 +08:00
if (!dev)
2023-08-30 16:21:18 +08:00
return RES_NOTRDY;
2024-01-27 08:47:24 +08:00
size = block_write(dev, sector, cnt, (u8 *)buf);
2023-08-30 16:21:18 +08:00
if (size != cnt) {
pr_err("write() return %d/%d\n", size, cnt);
return RES_ERROR;
}
return RES_OK;
}
2024-01-27 08:47:24 +08:00
DRESULT sdmc_disk_read(void *hdisk, uint8_t *buf, uint32_t sector, uint8_t cnt)
2023-08-30 16:21:18 +08:00
{
2024-01-27 08:47:24 +08:00
struct block_dev *dev = hdisk;
2023-08-30 16:21:18 +08:00
rt_size_t size = 0;
2024-01-27 08:47:24 +08:00
if (!dev)
2023-08-30 16:21:18 +08:00
return RES_NOTRDY;
2024-01-27 08:47:24 +08:00
size = block_read(dev, sector, cnt, buf);
2023-08-30 16:21:18 +08:00
if (size != cnt) {
pr_err("read() return %d/%d\n", size, cnt);
return RES_ERROR;
}
return RES_OK;
}
2024-01-27 08:47:24 +08:00
DRESULT sdmc_disk_ioctl(void *hdisk, uint8_t command, void *buf)
2023-08-30 16:21:18 +08:00
{
2024-01-27 08:47:24 +08:00
struct block_dev *dev = hdisk;
2023-08-30 16:21:18 +08:00
DRESULT result = RES_OK;
2024-01-27 08:47:24 +08:00
if (!dev)
return RES_NOTRDY;
2023-08-30 16:21:18 +08:00
switch (command) {
case GET_SECTOR_COUNT:
if (buf) {
2024-01-27 08:47:24 +08:00
*(uint32_t *)buf = dev->blk_cnt;
2023-08-30 16:21:18 +08:00
} else {
result = RES_PARERR;
}
break;
case GET_SECTOR_SIZE:
if (buf) {
2024-01-27 08:47:24 +08:00
*(uint32_t *)buf = dev->blk_size;
2023-08-30 16:21:18 +08:00
} else {
result = RES_PARERR;
}
break;
case GET_BLOCK_SIZE:
if (buf) {
2024-01-27 08:47:24 +08:00
*(uint32_t *)buf = dev->blk_size;
2023-08-30 16:21:18 +08:00
} else {
result = RES_PARERR;
}
break;
case CTRL_SYNC:
result = RES_OK;
break;
default:
result = RES_PARERR;
break;
}
return result;
}
2024-01-27 08:47:24 +08:00
DSTATUS sdmc_disk_status(void *hdisk)
2023-08-30 16:21:18 +08:00
{
return RES_OK;
}
2024-01-27 08:47:24 +08:00
void *sdmc_disk_initialize(const char *device_name)
2023-08-30 16:21:18 +08:00
{
2024-01-27 08:47:24 +08:00
struct block_dev *dev;
2023-08-30 16:21:18 +08:00
2024-01-27 08:47:24 +08:00
dev = block_get_device(device_name);
2023-08-30 16:21:18 +08:00
2024-01-27 08:47:24 +08:00
return dev;
2023-08-30 16:21:18 +08:00
}