Files
TAIXIN/sdk/lib/flashdisk/flashdisk.c

224 lines
4.8 KiB
C

#include "flashdisk.h"
#include "list.h"
#include "dev.h"
#include "devid.h"
#include "osal/string.h"
#include "hal/spi_nor.h"
#include "lib/syscfg/syscfg.h"
#include "diskio.h"
#include "ff.h"
struct flash_disk_device
{
struct spi_nor_flash *flash;
uint32_t addr;
uint32_t size;
};
struct spi_nor_flash *flash_disk_flash = NULL;
static struct flash_disk_device flash_disk;
static DSTATUS flashdisk_status(void *init_dev)
{
return RES_OK;
}
static DSTATUS flashdisk_init(void *init_dev)
{
struct flash_disk_device *disk = (struct flash_disk_device*)init_dev;
struct syscfg_info info;
struct spi_nor_flash *flash;
if(!flash_disk_flash)
{
os_memset(&info, 0, sizeof(info));
if (syscfg_info_get(&info, "syscfg")) {
return RES_NOTRDY;
}
flash = info.flash1;
}
else
{
flash = flash_disk_flash;
}
spi_nor_open(flash);
disk->flash = flash;
disk->addr = flash->size - (FLASH_FATFS_SIZE + flash->sector_size * 2);
disk->size = FLASH_FATFS_SIZE;
return RES_OK;
}
static DRESULT flashdisk_read(void *init_dev,BYTE* buf, DWORD sector, UINT count)
{
struct flash_disk_device *disk = (struct flash_disk_device*)init_dev;
struct spi_nor_flash *flash = disk->flash;
spi_nor_read(flash, disk->addr + sector*flash->sector_size, buf , count*flash->sector_size);
return RES_OK;
}
static DRESULT flashdisk_write(void *init_dev,BYTE* buf, DWORD sector, UINT count)
{
struct flash_disk_device *disk = (struct flash_disk_device*)init_dev;
struct spi_nor_flash *flash = disk->flash;
for (int i = 0; i < count; i++) {
spi_nor_sector_erase(flash, disk->addr + sector*flash->sector_size + i * flash->sector_size);
}
spi_nor_write(flash, disk->addr + sector*flash->sector_size, buf,count*flash->sector_size);
return RES_OK;
}
static DRESULT flashdisk_ioctl(void *init_dev, BYTE cmd, void* buf)
{
struct flash_disk_device *disk = (struct flash_disk_device*)init_dev;
struct spi_nor_flash *flash = disk->flash;
uint8 ret = RES_OK;
switch(cmd)
{
case CTRL_SYNC:
break;
case GET_SECTOR_COUNT:
*(DWORD *)buf = disk->size/flash->sector_size;
ret = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD *)buf = flash->sector_size;
ret = RES_OK;
break;
case GET_BLOCK_SIZE:
*(DWORD *)buf = 1;
ret = RES_OK;
break;
default:
ret = RES_ERROR;
printf("rtos_sd_ioctl err\n");
break;
}
return ret;
}
//固定返回值
uint8_t flashdisk_get_status()
{
return 0;
}
//usb作为u盘的接口
int flashdisk_usb_read(uint32_t sector,uint32_t count,uint8* buf)
{
if(!flash_disk.flash)
{
return 1;
}
flashdisk_read(&flash_disk,buf,sector,count);
return 0;
}
int flashdisk_usb_write(uint32_t sector,uint32_t count,uint8* buf)
{
if(!flash_disk.flash)
{
return 1;
}
flashdisk_write(&flash_disk,buf,sector,count);
return 0;
}
struct spi_nor_flash *flashdisk_usb_getdev()
{
if(!flash_disk.flash)
{
return 0;
}
return flash_disk.flash;
}
//获取flash文件系统的扇区数量
uint32_t flashdisk_get_sec_count()
{
uint32_t count = 0;
flashdisk_ioctl(&flash_disk,GET_SECTOR_COUNT,&count);
return count;
}
uint32_t flashdisk_get_sec_size()
{
uint32_t sec_size = 0;
flashdisk_ioctl(&flash_disk,GET_SECTOR_SIZE,&sec_size);
return sec_size;
}
static struct fatfs_diskio flashdisk_driver =
{
.status = flashdisk_status,
.init = flashdisk_init,
.read = flashdisk_read,
.write = flashdisk_write,
.ioctl = flashdisk_ioctl,
};
FATFS *flash_fs = NULL;
void flash_fatfs_init()
{
BYTE *work;
int res = 0;
fatfs_register_drive(DEV_FLASH,&flashdisk_driver,&flash_disk);
if(!flash_fs)
{
flash_fs = (FATFS *)os_malloc(sizeof(FATFS));
}
if(flash_fs)
{
res = f_mount(flash_fs,"FLASH:",1);
os_printf("%s:%d res:%d\n",__FUNCTION__,__LINE__,res);
//如果flash没有存在文件系统,则重新格式化
if(res)
{
work = os_malloc(4096);
//work默认申请成功,就不对之前申请的内存进行释放
if(!work)
{
os_printf("%s mkfs malloc space err:%d\n",__FUNCTION__,res);
return;
}
res = f_mkfs("FLASH:", FM_ANY | FM_SFD, 4096,work, 4096);
os_free(work);
if(res)
{
os_printf("%s mkfs fatfs err:%d\n",__FUNCTION__,res);
return;
}
else
{
//重新挂载文件系统
res = f_mount(flash_fs,"FLASH:",1);
if(res)
{
os_printf("%s mount fatfs err:%d\n",__FUNCTION__,res);
}
}
}
}
return;
}