pure sdk for main

This commit is contained in:
divadiow
2025-08-27 09:51:58 +01:00
parent f0d033f1c9
commit 0571416e7c
3283 changed files with 1577720 additions and 1 deletions
+410
View File
@@ -0,0 +1,410 @@
#include "typesdef.h"
#include "fatfs/ff.h"
//#include "osal.h"
#include <string.h>
#include "osal_file.h"
#include "osal/string.h"
uint32_t file_mode (const char *mode)
{
if (!mode) return 0;
if (mode[0] == 'r') return FA_READ | FA_OPEN_EXISTING;
if (mode[0] == 'w') return FA_READ | FA_WRITE | FA_CREATE_ALWAYS;
if (mode[0] == 'a') return FA_READ | FA_WRITE | FA_CREATE_ALWAYS ;
return 0;
}
F_FILE *osal_open(const char *filename, int oflags, int mode)
{
uint32_t res;
FIL* fp = os_malloc(sizeof(FIL));
if(!fp){
return 0;
}
res = f_open (fp, filename, mode);
if(res == FR_OK){
return fp;
}else{
os_printf("%s res:%d\n",__FUNCTION__,res);
os_free(fp);
return 0;//return NULL;
}
}
F_FILE *osal_fopen(const char *filename,const char *mode)
{
return osal_open(filename, 0, file_mode(mode));
}
//返回值是读取到的字节数,与标准c返回值有一点点区别
uint32_t osal_fread(void *ptr,uint32_t size,uint32_t nmemb,F_FILE *fp)
{
#if WIN32 == 1
return fread(ptr,size,nmemb,fp);
#else
uint32_t readLen;
uint32_t res = f_read(fp,ptr,size*nmemb,&readLen);
if(res == FR_OK)
{
return readLen;
}
else
{
os_printf("%s res:%d\n",__FUNCTION__,res);
return 0;
}
#endif
}
uint32_t osal_fwrite(void *ptr,uint32_t size,uint32_t nmemb,F_FILE *fp)
{
#if WIN32 == 1
return fwrite(ptr,size,nmemb,fp);
#else
uint32_t writeLen;
uint32_t res = f_write(fp,ptr,size*nmemb,&writeLen);
if(res == FR_OK)
{
return writeLen;
}
else
{
return 0;
}
#endif
//return size*nmemb;
}
int osal_fclose(F_FILE *fp)
{
#if WIN32 == 1
return fclose(fp);
#else
int res = f_close(fp);
os_free(fp);
return res;
#endif
}
uint32_t osal_ftell(F_FILE *fp)
{
#if WIN32 == 1
return ftell(fp);
#else
return f_tell(fp);
#endif
}
uint32_t osal_fseek(F_FILE *fp,uint32_t offset)
{
#if WIN32 == 1
return fseek(fp,offset,SEEK_SET);
#else
return f_lseek(fp,offset);
#endif
}
uint32_t osal_fsize(F_FILE *fp)
{
#if WIN32 == 1
uint32_t tmp;
uint32_t size;
tmp = osal_ftell(fp);
fseek(fp,0,SEEK_END);
size = osal_ftell(fp);
fseek(fp,tmp,SEEK_SET);
return size;
#else
return f_size(fp);
#endif
}
uint32_t osal_fread2 (char *buf, uint32_t is, uint32_t s, void *fp)
{
uint32_t bw;
FRESULT res;
char *temp_buf = NULL;
char *read_buf_locate = NULL;
uint32_t buf_addr = (uint32_t)buf;
uint32_t fp_tell = f_tell((FIL*)fp);
uint8_t remain =0;
//计算输入buf与未读扇区是否对齐
if((buf_addr-fp_tell)%4)
{
remain = fp_tell%4;
}
//os_printf("fp_tell:%X\t%d\t%d\taddr:%X\terr:%d\r\n",fp_tell,remain,f_tell((FIL*)fp),buf_addr,(buf_addr-fp_tell)%4);
if(remain || (buf_addr-fp_tell)%4)
{
temp_buf = os_malloc(is*s+4); //申请一个缓冲buf,需要足够大小
if(!temp_buf)
{
os_printf("osal_fread2 os_malloc err!\r\n");
return 0;
}
read_buf_locate = temp_buf+remain;//remain是否4byte对齐,不对齐,代表需要填充4-remain才能4byte对齐,所以write_buf_locate长度应该为is*s+4-remain
//对应位置则为temp_buf+remain
}
else//不需要缓冲buf
{
read_buf_locate = buf;
}
res= f_read (fp, read_buf_locate, is*s, &bw);
if (FR_OK != res) {
// todo: errno
//读取不成功也需要将缓冲buf释放
if(read_buf_locate!=buf)
{
os_free(temp_buf);
}
os_printf("osal_fread err:%d\r\n!!!\r\n",res);
return 0;
}
else//读取成功的话,判断是否为同一个buf,相同,代表没有申请新的缓冲buf
{
if(read_buf_locate!=buf)
{
memcpy(buf,read_buf_locate,bw);
os_free(temp_buf);
}
}
return bw;
}
uint32_t osal_fwrite2 (const char *buf, uint32_t is, uint32_t s, void *fp)
{
uint32_t bw;
FRESULT res;
char *temp_buf = NULL;
char *write_buf_locate = NULL;
uint8_t shift = 0; //提前写入字节数
uint8_t remain =0;
uint32_t buf_addr = (uint32_t)buf;
uint32_t fp_tell = f_tell((FIL*)fp);
//计算输入buf与未读扇区是否对齐
if((buf_addr-fp_tell)%4)
{
remain = fp_tell%4;//需要填充多少byte
}
if(remain || (buf_addr-fp_tell)%4) //如果需要填充
{
if(remain)
{
shift = 4-remain;
}
//将多余的byte先写入
res = f_write (fp, buf, shift, &bw);
if (FR_OK != res) {
// todo: errno
//os_printf("1osal_fwrite2 result %d\r\n",res);
// os_printf("1fp addr = %d\r\n",fp);
return 0;
}
temp_buf = os_malloc(is*s);//写入不超过is*s
//空间不足
if(!temp_buf)
{
os_printf("osal_fwrite2 os_malloc err!\r\n");
return remain;//已经写入的remain字节
}
write_buf_locate = temp_buf;
memcpy(write_buf_locate,buf+shift,is*s-shift);
}
else
{
write_buf_locate = (char*)buf;
}
res = f_write (fp, write_buf_locate, is*s-shift, &bw);
bw += shift;//写入的总字节数
//无论写不写入,如果申请量的buf,都要释放
if(temp_buf)
{
os_free(temp_buf);
}
if (FR_OK != res) {
// todo: errno
// os_printf("osal_fwrite2 result %d\r\n",res);
// os_printf("fp addr = %d\r\n",fp);
return 0;
}
if(bw == 0)
{
os_printf("bw = %d\rwantsize = %d\r\n",bw,is*s);
}
return bw;
}
char *osal_getcwd (char *buf, uint32_t len)
{
if (FR_OK != f_getcwd (buf, len)) return NULL;
return buf;
}
int osal_chdir (char *buf)
{
int res;
if (buf[1] == ':') {
f_chdrive(buf);
if (FR_OK != f_chdir(buf+2)) return -1;
} else
{
res = f_chdir(buf);
if (FR_OK != res)
{
os_printf("buf:%s\tres:%d\r\n",buf,res);
return -1;
}
}
return 0;
}
struct diriter {
DIR dir;
FILINFO fil;
};
void *osal_opendir (char *path)
{
struct diriter *dir;
dir = os_malloc( sizeof(struct diriter) );
if (!dir) return NULL;
if( f_opendir( &dir->dir, path ) == FR_OK)
return dir;
os_free( dir );
return NULL;
}
void osal_closedir (void *HDIR)
{
struct diriter *dir = (struct diriter *)HDIR;
if( !dir ) return;
os_free( dir );
}
void *osal_readdir( void *HDIR )
{
struct diriter *dir = (struct diriter *)HDIR;
if( !dir ) return NULL;
if( f_readdir( &dir->dir, &dir->fil ) != FR_OK )
return NULL;
if( dir->dir.sect == 0 )
return NULL;
return &dir->fil;
}
char *osal_dirent_name ( void *HFIL)
{
FILINFO *fil = (FILINFO *)HFIL;
if( !fil ) return NULL;
return fil->fname;
}
int osal_dirent_isdir ( void *HFIL )
{
FILINFO *fil = (FILINFO *)HFIL;
if( !fil ) return 0;
return fil->fattrib & AM_DIR;
}
uint32_t osal_dirent_date ( void *HFIL )
{
FILINFO *fil = (FILINFO *)HFIL;
return fil->fdate;
}
uint32_t osal_dirent_size ( void *HFIL )
{
FILINFO *fil = (FILINFO *)HFIL;
return fil->fsize;
}
uint32_t osal_fmkdir(const char *dir)
{
return f_mkdir(dir);
}
FRESULT osal_stat(const TCHAR* path,FILINFO* fno)
{
return f_stat(path,fno);
}
FRESULT osal_unlink(const TCHAR* path)
{
return f_unlink (path);
}
FRESULT osal_rename(const TCHAR* oldpath,const TCHAR* newpath)
{
return f_rename (oldpath,newpath);
}
FRESULT osal_fchmod(const TCHAR* path,uint8 attr,uint8 mask)
{
return f_chmod(path,attr,mask);
}
FRESULT osal_fstat(const TCHAR* path,FILINFO* fno)
{
return f_stat(path,fno);
}
//判断是否存在某个文件
FRESULT osal_fexist (const char *name)
{
FIL *fp;
fp = osal_fopen(name,"rb");
if(fp)
{
osal_fclose(fp);
return 0;
}
return 1;
}