224 lines
4.8 KiB
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;
|
|
|
|
}
|