Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
223
sdk/lib/flashdisk/flashdisk.c
Normal file
223
sdk/lib/flashdisk/flashdisk.c
Normal file
@@ -0,0 +1,223 @@
|
||||
|
||||
#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;
|
||||
|
||||
}
|
||||
17
sdk/lib/flashdisk/flashdisk.h
Normal file
17
sdk/lib/flashdisk/flashdisk.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef __FLASHDISK_H
|
||||
#define __FLASHDISK_H
|
||||
#include "sys_config.h"
|
||||
#include "typesdef.h"
|
||||
#include "diskio.h"
|
||||
#include "ff.h"
|
||||
#ifndef FLASH_FATFS_SIZE
|
||||
#define FLASH_FATFS_SIZE 512*1024
|
||||
#endif
|
||||
|
||||
void flash_fatfs_init();
|
||||
int flashdisk_usb_read(uint32_t sector,uint32_t count,uint8* buf);
|
||||
int flashdisk_usb_write(uint32_t sector,uint32_t count,uint8* buf);
|
||||
struct spi_nor_flash *flashdisk_usb_getdev();
|
||||
uint32_t flashdisk_get_sec_count();
|
||||
uint32_t flashdisk_get_sec_size();
|
||||
#endif
|
||||
Reference in New Issue
Block a user