Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

没有做嵌入式用的文件系统适配吗 #180

Open
banshanju opened this issue Jul 16, 2019 · 3 comments
Open

没有做嵌入式用的文件系统适配吗 #180

banshanju opened this issue Jul 16, 2019 · 3 comments

Comments

@banshanju
Copy link

我打开raw文件夹里,fs_os.c这个文件里面几乎是空的,在zlgopen这个github上也没找到有关嵌入式文件系统的相关适配,李老师可以做一个吗,比如适配fatfs啥的

@xianjimli
Copy link
Member

这个需要自己包装一下。

@banshanju
Copy link
Author

banshanju commented Jul 17, 2019

这是我移植fatfs的代码,没成功,希望移植成功的帮我看一下,非常感谢!

`#include "tkc/fs.h"

#ifdef WITH_FS_RES
#include "tkc/mem.h"
#include "tkc/utils.h"
#include "ff.h"
#include "usart.h"
static int32_t fs_os_file_read(fs_file_t* file, void* buffer, uint32_t size) {
UINT br;
FIL* fp = (FIL*)(file->data);
FRESULT res = f_read(fp, buffer, size, &br);
return (int32_t)res;
}
int32_t fs_os_file_write(fs_file_t* file, const void* buffer, uint32_t size) {
UINT bw;
FIL* fp = (FIL*)(file->data);
FRESULT res = f_write(fp, buffer, size, &bw);
return (int32_t)res;
}
ret_t fs_os_file_seek(fs_file_t* file, int32_t offset) {
FIL* fp = (FIL*)(file->data);
f_lseek(fp, offset);
return RET_OK ;
}
`
ret_t fs_os_file_truncate(fs_file_t* file, int32_t size) {
FIL* fp = (FIL*)(file->data);
f_sync(fp); /If not syncronized fclose can write the truncated part/
f_truncate(fp);
return RET_OK;
}

ret_t fs_os_file_close(fs_file_t* file) {
FIL* fp = (FIL*)(file->data);
f_close(fp);
TKMEM_FREE(file);

return RET_OK;
}

ret_t fs_os_dir_rewind(fs_dir_t* dir) {
DIR* d = (DIR*)(dir->data);

f_rewinddir(d);

return RET_OK;
}

ret_t fs_os_dir_read(fs_dir_t* dir, fs_item_t* item) {
FRESULT res;
FILINFO fno;
DIR* d = (DIR*)(dir->data);

memset(item, 0x00, sizeof(fs_item_t));

do {
res = f_readdir(d, &fno);
if(res != FR_OK) return RET_FAIL;

		if(fno.fattrib & AM_DIR) {
			item->is_dir = 1;
			item->is_file = 0;
			item->name[0] = '/';
			strcpy(&item->name[1], fno.fname);
		}
		else strcpy(item->name, fno.fname);

} while(strcmp(item->name, "/.") == 0 || strcmp(item->name, "/..") == 0);

return RET_OK;

}

ret_t fs_os_dir_close(fs_dir_t* dir) {
DIR* d = (DIR*)dir->data;
f_closedir(d);
TKMEM_FREE(dir);

return RET_OK;
}

static fs_file_t* fs_file_create(FIL* fp) {
fs_file_t* f = NULL;
return_value_if_fail(fp != NULL, NULL);

f = TKMEM_ZALLOC(fs_file_t);
if (f != NULL) {
f->read = fs_os_file_read;
f->write = fs_os_file_write;
f->seek = fs_os_file_seek;
f->truncate = fs_os_file_truncate;
f->close = fs_os_file_close;
f->data = fp;
} else {
f_close(fp);
}

return f;
}

fs_file_t* fs_os_open_file(fs_t* fs, const char* name, const char* mode) {
(void)fs;
FIL *fp;
char fname[MAX_PATH+1]={0};
int oflag = 0;

if (strchr(mode, 'r')) {
oflag |= FA_READ;
}

if (strchr(mode, 'w')) {
oflag |= FA_WRITE | FA_CREATE_NEW;

}
sprintf(fname,"0:/%s",name);
FRESULT res = f_open(fp, fname, oflag);
return fs_file_create(fp);
}

ret_t fs_os_remove_file(fs_t* fs, const char* name) {
(void)fs;

char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);

f_unlink(fname);

return RET_OK;
}

bool_t fs_os_file_exist(fs_t* fs, const char* name) {
FRESULT res;
FILINFO *fno;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);

(void)fs;
res = f_stat(fname,fno);
if(res == FR_EXIST)
	return TRUE;
else
	return FALSE;

}

bool_t fs_os_file_rename(fs_t* fs, const char* name, const char* new_name) {
FRESULT res;
(void)fs;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
char fname_new[MAX_PATH+1]={0};
sprintf(fname_new,"0:/%s",new_name);
res = f_rename(fname,fname_new);
if(res == FR_OK)
return TRUE;
else
return FALSE;
}

fs_dir_t* fs_dir_create(DIR* dir) {
fs_dir_t* d = NULL;
return_value_if_fail(dir != NULL, NULL);

d = TKMEM_ZALLOC(fs_dir_t);
if (d != NULL) {
d->read = fs_os_dir_read;
d->rewind = fs_os_dir_rewind;
d->close = fs_os_dir_close;
d->data = dir;
} else {
f_closedir(dir);
}

return d;
}

fs_dir_t* fs_os_open_dir(fs_t* fs, const char* name) {
DIR *dp;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
f_opendir(dp,fname);
return fs_dir_create(dp);
}

ret_t fs_os_remove_dir(fs_t* fs, const char* name) {
FRESULT res;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
(void)fs;
res = f_unlink(fname);
return res==FR_OK ? RET_OK : RET_FAIL;
}

bool_t fs_os_dir_exist(fs_t* fs, const char* name) {
FRESULT res;
FILINFO *fno;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
(void)fs;
res = f_stat(fname,fno);
if(res == FR_EXIST)
return TRUE;
else
return FALSE;

return TRUE;
}

bool_t fs_os_dir_rename(fs_t* fs, const char* name, const char* new_name) {
FRESULT res;
(void)fs;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
char fname_new[MAX_PATH+1]={0};
sprintf(fname_new,"0:/%s",new_name);
res = f_rename(fname,fname_new);

if(res == FR_OK)
return TRUE;
else
return FALSE;
}

int32_t fs_os_get_file_size(fs_t* fs, const char* name) {
DIR *dp;
FILINFO *fno;
char fname[MAX_PATH+1]={0};
sprintf(fname,"0:/%s",name);
f_opendir(dp,fname);
f_readdir(dp,fno);

return fno->fsize;
}

ret_t fs_os_get_disk_info(fs_t* fs, const char* volume, int32_t* free_kb, int32_t* total_kb) {

(void)fs;
FATFS fs1;
uint8_t res;
uint32_t fre_clust=0, fre_sect=0, tot_sect=0;
//µÃµ½´ÅÅÌÐÅÏ¢¼°¿ÕÏдØÊýÁ¿
res =(uint32_t)f_getfree((const TCHAR
)volume, (DWORD*)&fre_clust, &fs1);
if(res==0)
{
tot_sect=(fs1->n_fatent-2)fs1->csize; //µÃµ½×ÜÉÈÇøÊý
fre_sect=fre_clust
fs1->csize; //µÃµ½¿ÕÏÐÉÈÇøÊý
#if _MAX_SS!=512 //ÉÈÇø´óС²»ÊÇ512×Ö½Ú,Ôòת»»Îª512×Ö½Ú
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif
*total_kb=tot_sect>>1; //µ¥Î»ÎªKB
*free_kb=fre_sect>>1; //µ¥Î»ÎªKB
}

return RET_OK;
}

ret_t fs_os_get_exe(fs_t* fs, char path[MAX_PATH + 1]) {
uint32_t size = MAX_PATH;
(void)fs;

#if defined(LINUX)
size = readlink("/proc/self/exe", path, MAX_PATH);
if (size >= 0) {
path[size] = '\0';
return RET_OK;
} else {
*path = '\0';
return RET_FAIL;
}
#elif defined(WIN32)
(void)size;
GetModuleFileNameA(GetModuleHandle(NULL), path, MAX_PATH);
#elif defined(APPLE)
_NSGetExecutablePath(path, &size);
assert(size <= MAX_PATH);
path[size] = '\0';
#endif

return RET_OK;
}

static ret_t fs_os_get_cwd(fs_t* fs, char path[MAX_PATH + 1]) {
FRESULT res;

(void)fs;
*path = '\0';
res = f_getcwd(path, MAX_PATH);
if (res == FR_OK) {
return RET_OK;
} else {
return RET_FAIL;
}
}

static const fs_t s_os_fs = {.open_file = fs_os_open_file,
.remove_file = fs_os_remove_file,
.file_exist = fs_os_file_exist,
.file_rename = fs_os_file_rename,

                         .open_dir = fs_os_open_dir,
                         .remove_dir = fs_os_remove_dir,
                         .dir_exist = fs_os_dir_exist,
                         .dir_rename = fs_os_dir_rename,

                         .get_file_size = fs_os_get_file_size,
                         .get_disk_info = fs_os_get_disk_info,
                         .get_cwd = fs_os_get_cwd,
                         .get_exe = fs_os_get_exe};

fs_t* os_fs(void) {
return (fs_t*)&s_os_fs;
}
#else
fs_t* os_fs(void) {
return NULL;
}
#endif

`

@xianjimli
Copy link
Member

你可以创建一个awtk-fatfs的仓库,其他人也可能需要,大家一起来完善。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants