modify XiUOS DIR : (1.add plc_demo in APP_Framework/control_app; 2.add industrial_network、industrial_fieldbus and industrial_wlan; 3.add XiZi_AIoT and modify XiZi as XiZi_IIoT.)
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
SRC_FILES := ch376fs.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
@@ -0,0 +1,644 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file ch376fs.c
|
||||
* @brief CH376 file system implementation
|
||||
* @version 1.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2021.03.18
|
||||
*/
|
||||
|
||||
#include <ch376fs.h>
|
||||
|
||||
#define CMD_RESET_ALL 0x05
|
||||
#define CMD_CHECK_EXIST 0x06
|
||||
#define CMD_GET_FILE_SIZE 0x0C
|
||||
#define CMD_SET_FILE_SIZE 0x0D
|
||||
#define CMD_SET_USB_MODE 0x15
|
||||
#define CMD_RD_USB_DATA0 0x27
|
||||
#define CMD_WR_REQ_DATA 0x2D
|
||||
#define CMD_SET_FILE_NAME 0x2F
|
||||
#define CMD_DISK_CONNECT 0x30
|
||||
#define CMD_DISK_MOUNT 0x31
|
||||
#define CMD_FILE_OPEN 0x32
|
||||
#define CMD_FILE_ENUM_GO 0x33
|
||||
#define CMD_FILE_CREATE 0x34
|
||||
#define CMD_FILE_ERASE 0x35
|
||||
#define CMD_FILE_CLOSE 0x36
|
||||
#define CMD_DIR_INFO_READ 0x37
|
||||
#define CMD_BYTE_LOCATE 0x39
|
||||
#define CMD_BYTE_READ 0x3A
|
||||
#define CMD_BYTE_RD_GO 0x3B
|
||||
#define CMD_BYTE_WRITE 0x3C
|
||||
#define CMD_BYTE_WR_GO 0x3D
|
||||
#define CMD_DIR_CREATE 0x40
|
||||
#define CMD_WRITE_VAR32 0x0D
|
||||
|
||||
#define USB_INT_SUCCESS 0x14
|
||||
#define USB_INT_DISK_READ 0x1D
|
||||
#define USB_INT_DISK_WRITE 0x1E
|
||||
|
||||
#define ERR_OPEN_DIR 0x41
|
||||
#define ERR_MISS_FILE 0x42
|
||||
#define ERR_FOUND_NAME 0x43
|
||||
#define ERR_FILE_CLOSE 0xB4
|
||||
|
||||
/* The flag bit for whether the folder was first opened */
|
||||
static uint8 dir_flag = 0;
|
||||
|
||||
/* Save the read directory information */
|
||||
static struct Ch376FatDirInfo dir;
|
||||
|
||||
/* Send the command */
|
||||
static struct BusConfigureInfo cfg;
|
||||
|
||||
/* Command following parameters */
|
||||
static uint8 cmd;
|
||||
static struct BusBlockWriteParam write_cmd = {
|
||||
0,
|
||||
&cmd,
|
||||
1,
|
||||
};
|
||||
|
||||
/* Reply to command */
|
||||
static uint8 reply;
|
||||
static struct BusBlockReadParam read_reply = {
|
||||
0,
|
||||
&reply,
|
||||
1,
|
||||
1,
|
||||
};
|
||||
|
||||
/**
|
||||
* @description: Set file or directory path
|
||||
* @param bus - CH376 device bus
|
||||
* @param name - path name
|
||||
*/
|
||||
static void SetFileName(BusType bus, uint8* name)
|
||||
{
|
||||
cfg.configure_cmd = CMD_SET_FILE_NAME;
|
||||
BusDrvConfigure(bus->owner_driver, &cfg);
|
||||
|
||||
cmd = *name;
|
||||
BusDevWriteData(bus->owner_haldev, &write_cmd);
|
||||
while (cmd) {
|
||||
name++;
|
||||
cmd = *name;
|
||||
if((cmd == 0x5c) || (cmd == 0x2f))
|
||||
cmd = 0;
|
||||
BusDevWriteData(bus->owner_haldev, &write_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Back to the root directory
|
||||
* @param bus - CH376 device bus
|
||||
*/
|
||||
static void OpenRoot(BusType bus)
|
||||
{
|
||||
SetFileName(bus, "/");
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(bus->owner_driver, &cfg);
|
||||
BusDevReadData(bus->owner_haldev, &read_reply);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Open file
|
||||
* @param fdp - file descriptor
|
||||
* @param path - path name
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsOpen(struct FileDescriptor *fdp, const char *path)
|
||||
{
|
||||
uint32 len, idx;
|
||||
idx = 0;
|
||||
len = strlen(path);
|
||||
char buff[len + 1];
|
||||
strncpy(buff, path, len);
|
||||
buff[len] = 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (buff[i] == '/') {
|
||||
buff[i] = 0;
|
||||
SetFileName(fdp->mntp->bus, &buff[idx]);
|
||||
idx = i + 1;
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
break;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
OpenRoot(fdp->mntp->bus);
|
||||
return -ERROR;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
SetFileName(fdp->mntp->bus, &buff[idx]);
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
return EOK;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
cfg.configure_cmd = CMD_FILE_CREATE;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
return EOK;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Close file
|
||||
* @param fdp - file descriptor
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsClose(struct FileDescriptor *fdp)
|
||||
{
|
||||
cfg.configure_cmd = CMD_FILE_CLOSE;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
cmd = 0x01;
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
if (reply == USB_INT_SUCCESS) {
|
||||
OpenRoot(fdp->mntp->bus);
|
||||
return EOK;
|
||||
}
|
||||
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Read file
|
||||
* @param fdp - file descriptor
|
||||
* @param dst - store the read data
|
||||
* @param len - need data length
|
||||
* @return length of data
|
||||
*/
|
||||
static ssize_t Ch376fsRead(struct FileDescriptor *fdp, void *dst, size_t len)
|
||||
{
|
||||
ssize_t size = 0;
|
||||
uint8 buff[PARAM_LEN];
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.pos = 0;
|
||||
read_param.buffer = buff;
|
||||
|
||||
cfg.configure_cmd = CMD_BYTE_READ;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
cmd = (uint8)len;
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
cmd = (uint8)(len >> 8);
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
|
||||
while (1) {
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
return size;
|
||||
|
||||
case USB_INT_DISK_READ:
|
||||
cfg.configure_cmd = CMD_RD_USB_DATA0;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_param);
|
||||
memcpy(dst + size, &buff[1], buff[0]);
|
||||
size += buff[0];
|
||||
cfg.configure_cmd = CMD_BYTE_RD_GO;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Write file
|
||||
* @param fdp - file descriptor
|
||||
* @param src - store the write data
|
||||
* @param len - write data length
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static ssize_t Ch376fsWrite(struct FileDescriptor *fdp, const void *src, size_t len)
|
||||
{
|
||||
struct BusBlockWriteParam write_param;
|
||||
char WriteBuff[len], temp[len];
|
||||
write_param.pos = 0;
|
||||
write_param.buffer = WriteBuff;
|
||||
size_t size = 0;
|
||||
|
||||
memcpy(temp, src, len);
|
||||
|
||||
cfg.configure_cmd = CMD_BYTE_WRITE;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
cmd = (uint8)len;
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
cmd = (uint8)(len >> 8);
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
|
||||
while (1) {
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
return EOK;
|
||||
|
||||
case USB_INT_DISK_WRITE:
|
||||
cfg.configure_cmd = CMD_WR_REQ_DATA;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
strncpy(WriteBuff, &temp[size], reply);
|
||||
write_param.size = reply;
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_param);
|
||||
size += reply;
|
||||
|
||||
cfg.configure_cmd = CMD_BYTE_WR_GO;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Moves pointer to end of file
|
||||
* @param fdp - file descriptor
|
||||
* @param offset - the old offset
|
||||
* @param whence - moving position
|
||||
* @param new_offset - the new offset
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsSeek(struct FileDescriptor *fdp, off_t offset, int whence, off_t *new_offset)
|
||||
{
|
||||
cfg.configure_cmd = CMD_BYTE_LOCATE;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
|
||||
uint8 i = 4;
|
||||
cmd = 0xFF;
|
||||
while (i--)
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
if(reply == USB_INT_SUCCESS)
|
||||
return EOK;
|
||||
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Open directory
|
||||
* @param fdp - file descriptor
|
||||
* @param path - directory path name
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsOpenDir(struct FileDescriptor *fdp, const char *path)
|
||||
{
|
||||
uint32 len, idx;
|
||||
idx = 0;
|
||||
len = strlen(path);
|
||||
char buff[len + 1];
|
||||
strncpy(buff, path, len);
|
||||
buff[len] = 0;
|
||||
|
||||
dir_flag = 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if(buff[i] == '/') {
|
||||
buff[i] = 0;
|
||||
SetFileName(fdp->mntp->bus, &buff[idx]);
|
||||
idx = i + 1;
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
break;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
OpenRoot(fdp->mntp->bus);
|
||||
return -ERROR;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
SetFileName(fdp->mntp->bus, &buff[idx]);
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
return EOK;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
OpenRoot(fdp->mntp->bus);
|
||||
return -ERROR;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Close directory
|
||||
* @param fdp - file descriptor
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsCloseDir(struct FileDescriptor *fdp)
|
||||
{
|
||||
cfg.configure_cmd = CMD_FILE_CLOSE;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
cmd = 0x01;
|
||||
BusDevWriteData(fdp->mntp->bus->owner_haldev, &write_cmd);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
dir_flag = 0;
|
||||
if ((reply == ERR_FILE_CLOSE) || (reply == USB_INT_SUCCESS)) {
|
||||
OpenRoot(fdp->mntp->bus);
|
||||
return EOK;
|
||||
}
|
||||
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Read directory
|
||||
* @param fdp - file descriptor
|
||||
* @param dirent - transmit directory info
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsReadDir(struct FileDescriptor *fdp, struct dirent *dirent)
|
||||
{
|
||||
memset(&dir, 0, sizeof(dir));
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.pos = 0;
|
||||
read_param.buffer = &dir;
|
||||
|
||||
if (dir_flag == 0) {
|
||||
char seek[2];
|
||||
seek[0] = '*';
|
||||
seek[1] = 0x00;
|
||||
|
||||
dir_flag = 1;
|
||||
|
||||
SetFileName(fdp->mntp->bus, seek);
|
||||
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
cfg.configure_cmd = CMD_FILE_ENUM_GO;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
|
||||
__exit:
|
||||
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_DISK_READ:
|
||||
cfg.configure_cmd = CMD_RD_USB_DATA0;
|
||||
BusDrvConfigure(fdp->mntp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(fdp->mntp->bus->owner_haldev, &read_param);
|
||||
dir.dir_attr = 0;
|
||||
strncpy(dirent->d_name, dir.dir_name, 11);
|
||||
return EOK;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
memset(dirent->d_name, 0, strlen(dirent->d_name));
|
||||
return EOK;
|
||||
|
||||
default:
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Create directory
|
||||
* @param mp - mount point
|
||||
* @param path - directory path name
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsCreateDir(struct MountPoint *mp, const char *path)
|
||||
{
|
||||
uint32 len, idx;
|
||||
len = strlen(path);
|
||||
idx = 0;
|
||||
char buff[len + 1];
|
||||
strncpy(buff, path, len);
|
||||
buff[len] = 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (buff[i] == '/') {
|
||||
buff[i] = 0;
|
||||
SetFileName(mp->bus, &buff[idx]);
|
||||
idx = i + 1;
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
break;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
cfg.configure_cmd = CMD_DIR_CREATE;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
break;
|
||||
|
||||
default:
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetFileName(mp->bus, &buff[idx]);
|
||||
cfg.configure_cmd = CMD_DIR_CREATE;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
break;
|
||||
|
||||
case ERR_FOUND_NAME:
|
||||
KPrintf("File of the same name exists\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
OpenRoot(mp->bus);
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Create directory
|
||||
* @param mp - mount point
|
||||
* @param path - file path name
|
||||
* @param buf - file state info
|
||||
* @return EOK
|
||||
*/
|
||||
static int Ch376fsStat(struct MountPoint *mp, const char *path, struct FileStat *buf)
|
||||
{
|
||||
strncpy(buf->name, dir.dir_name, strlen(dir.dir_name));
|
||||
if(dir.dir_ntres == 0x10)
|
||||
buf->type = FTYPE_DIR;
|
||||
else if(dir.dir_ntres == 0x20)
|
||||
buf->type = FTYPE_FILE;
|
||||
buf->size = dir.dir_file_size >> 8;
|
||||
buf->mtime = 1580486400;
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Mount CH376 file system
|
||||
* @param mp - mount point
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsMount(struct MountPoint *mp)
|
||||
{
|
||||
cfg.configure_cmd = CMD_CHECK_EXIST;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
cmd = 0x55;
|
||||
BusDevWriteData(mp->bus->owner_haldev, &write_cmd);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
if(reply != 0xAA)
|
||||
goto __exit;
|
||||
|
||||
cfg.configure_cmd = CMD_SET_USB_MODE;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
if (mp->bus->bus_type == TYPE_SDIO_BUS)
|
||||
cmd = 0x03;
|
||||
else if (mp->bus->bus_type == TYPE_USB_BUS)
|
||||
cmd = 0x06;
|
||||
BusDevWriteData(mp->bus->owner_haldev, &write_cmd);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
if(reply != 0x51)
|
||||
goto __exit;
|
||||
|
||||
cfg.configure_cmd = CMD_DISK_MOUNT;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
if(reply != 0x14)
|
||||
goto __exit;
|
||||
|
||||
return EOK;
|
||||
|
||||
__exit:
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: Unlink file
|
||||
* @param mp - mount point
|
||||
* @param path - file path name
|
||||
* @return success: EOK, failure: -ERROR
|
||||
*/
|
||||
static int Ch376fsUnlink(struct MountPoint *mp, const char *path)
|
||||
{
|
||||
uint32 len, idx;
|
||||
idx = 0;
|
||||
len = strlen(path);
|
||||
char buff[len + 1];
|
||||
strncpy(buff, path, len);
|
||||
buff[len] = 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (buff[i] == '/') {
|
||||
buff[i] = 0;
|
||||
SetFileName(mp->bus, &buff[idx]);
|
||||
idx = i + 1;
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
break;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
default:
|
||||
OpenRoot(mp->bus);
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
SetFileName(mp->bus, &buff[idx]);
|
||||
cfg.configure_cmd = CMD_FILE_OPEN;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
switch (reply) {
|
||||
case USB_INT_SUCCESS:
|
||||
case ERR_OPEN_DIR:
|
||||
cfg.configure_cmd = CMD_FILE_ERASE;
|
||||
BusDrvConfigure(mp->bus->owner_driver, &cfg);
|
||||
BusDevReadData(mp->bus->owner_haldev, &read_reply);
|
||||
OpenRoot(mp->bus);
|
||||
return EOK;
|
||||
|
||||
case ERR_MISS_FILE:
|
||||
default:
|
||||
OpenRoot(mp->bus);
|
||||
return -ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static struct Filesystem ch376fs = {
|
||||
.open = Ch376fsOpen,
|
||||
.close = Ch376fsClose,
|
||||
.read = Ch376fsRead,
|
||||
.write = Ch376fsWrite,
|
||||
.seek = Ch376fsSeek,
|
||||
.tell = NONE,
|
||||
.truncate = NONE,
|
||||
.sync = NONE,
|
||||
.ioctl = NONE,
|
||||
.poll = NONE,
|
||||
.opendir = Ch376fsOpenDir,
|
||||
.closedir = Ch376fsCloseDir,
|
||||
.readdir = Ch376fsReadDir,
|
||||
.seekdir = NULL,
|
||||
.mount = Ch376fsMount,
|
||||
.unmount = NONE,
|
||||
.unlink = Ch376fsUnlink,
|
||||
.rename = NONE,
|
||||
.mkdir = Ch376fsCreateDir,
|
||||
.stat = Ch376fsStat,
|
||||
.statvfs = NONE,
|
||||
};
|
||||
|
||||
/**
|
||||
* @description: Init CH376 file system
|
||||
* @return success: EOK, failure: other
|
||||
*/
|
||||
int Ch376fsInit()
|
||||
{
|
||||
return RegisterFilesystem(FSTYPE_CH376, &ch376fs);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file ch376fs.h
|
||||
* @brief CH376 file system define
|
||||
* @version 1.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2021.03.18
|
||||
*/
|
||||
|
||||
#ifndef __INC_CH376FS_H__
|
||||
#define __INC_CH376FS_H__
|
||||
|
||||
#include <xizi.h>
|
||||
|
||||
#if defined(FS_VFS)
|
||||
#include <iot-vfs.h>
|
||||
#endif
|
||||
|
||||
#define PARAM_LEN 256
|
||||
|
||||
/* CH376 file system directory info */
|
||||
struct Ch376FatDirInfo
|
||||
{
|
||||
uint8 dir_name[11];
|
||||
uint8 dir_attr;
|
||||
uint8 dir_ntres;
|
||||
uint8 dir_crt_time_tenth;
|
||||
uint16 dir_crt_time;
|
||||
uint16 dir_crt_date;
|
||||
uint16 dir_lst_acc_date;
|
||||
uint16 dir_fst_clus_hi;
|
||||
uint16 dir_wrt_time;
|
||||
uint16 dir_wrt_date;
|
||||
uint16 dir_fst_clus_lo;
|
||||
uint32 dir_file_size;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user