#include "znfat.h"
#include "template.h"
#include "gb2uni.h"
#include "deviceio.h"
/*==================================================================================
振南的znFAT 一种较为完备的嵌入式平台上的FAT32文件系统解决方案 V10.85
===================================================================================*/
#ifdef IS_PIC //如果CPU是PIC要作出专门处理,同时请在lkr文件中进行相应设置
#pragma udata directive
#pragma udata BUFFER
#endif
UINT8 tmpBuf[ZNFAT_BUF_SIZE];
#ifdef IS_PIC
#pragma udata
#endif
UINT8 *znFAT_Buffer=tmpBuf; //znFAT的内部缓冲区,使用者不可私自使用
//先定义tmpBuf,再用znFAT_Buffer指向它,是因为在一些架构的CPU中
//受限于RAM的特殊结构,只能用指针来访问大数组,比如PIC
//--------------------------------------------------------------------------------------------------
struct znFAT_Init_Args *pInit_Args; //初始化参数结构体指针,用以指向某一存储设备的初始化参数集合
//使用之前*必须*先指向结构化变量
extern struct znFAT_IO_Ctl ioctl;
UINT8 Dev_No=0; //设备号,用于实现多设备
//--------------------------------------------------------------------------------------------------
struct FileInfo *just_file=(struct FileInfo *)0; //用于记录最近操作的文件
//-------------------SCCCB相关变量定义----------------------
#ifndef RT_UPDATE_CLUSTER_CHAIN //用于定义共享CCCB的变量及缓冲实体
#ifndef USE_ALONE_CCCB
UINT32 scccb_buf[CCCB_LEN]; //CCCB的缓冲区,以连续簇段的方式来记录簇链
UINT8 scccb_counter=0;
UINT32 scccb_curval=0;
UINT8 scccb_curdev=(UINT8)(-1);
#endif
#endif
#ifndef RT_UPDATE_CLUSTER_CHAIN
#ifndef USE_ALONE_CCCB //不使用独立簇链缓冲,而是使用共享簇链缓冲,以下变量用于完成共享CCCB使用过程中的争抢
UINT32 *pcccb_buf=scccb_buf;
UINT32 *pcccb_curval=&scccb_curval;
UINT8 *pcccb_counter=&scccb_counter;
UINT8 *pcccb_curdev=&scccb_curdev;
struct FileInfo *pcccb_cur_oc=(struct FileInfo *)0;
struct znFAT_Init_Args *pcccb_cur_initargs=(struct znFAT_Init_Args *)0;
#else
UINT32 *pcccb_buf=(UINT32 *)0;
UINT32 *pcccb_curval=(UINT32 *)0;
UINT8 *pcccb_counter=(UINT8 *)0;
#endif
UINT8 get_next_cluster_in_cccb=0; //用以标志是否在CCCB中查找下一簇
#endif
//----------------------------------------------------------
//------------------EXB相关变量定义-------------------------
#ifdef USE_EXCHANGE_BUFFER
#ifndef USE_ALONE_EXB
UINT8 sexb_buf[ZNFAT_BUF_SIZE];
UINT8 sexb_cur_dev=(UINT8)(-1);
UINT32 sexb_cur_sec=0;
struct FileInfo *psexb_cur_oc=(struct FileInfo *)0; //指示当前EXB被哪个文件占用
#endif
#endif
#ifdef USE_EXCHANGE_BUFFER
#ifndef USE_ALONE_EXB
UINT8 *pexb_buf=sexb_buf;
#else
UINT8 *pexb_buf=(UINT8 *)0;
#endif
#endif
//----------------------------------------------------------
//====================一些常用函数================================================================
//znFAT中使用到的公共函数,其中包含了对ROM类型 字节、字、双字的读取以及ROM到RAM之间拷贝操作
//如果要使长文件名或格式化功能,则这些ROM相关的函数是必须正确予以实现的
UINT8 Memory_Set(UINT8 *pmem,UINT32 len,UINT8 value)
{
UINT32 i=0;
for(i=0;i<len;i++)
{
pmem[i]=value;
}
return 0;
}
UINT8 Memory_Compare(UINT8 *psmem,UINT8 *pdmem,UINT32 len)
{
UINT32 i=0;
for(i=0;i<len;i++)
{
if(psmem[i]!=pdmem[i])
{
return 0;
}
}
return 1;
}
UINT8 * Memory_Copy(UINT8 *pdmem,UINT8 *psmem,UINT32 len)
{
UINT32 i=0;
for(i=0;i<len;i++)
{
pdmem[i]=psmem[i];
}
return pdmem;
}
INT8 * StringCopy(INT8 *dest_str,INT8 *src_str)
{
UINT8 i=0;
while('\0'!=src_str[i])
{
dest_str[i]=src_str[i];
i++;
}
dest_str[i]='\0';
return dest_str;
}
UINT32 StringLen(INT8 *pstr)
{
UINT32 len=0;
while('\0'!=pstr[len])
{
len++;
}
return len;
}
UINT32 WStringLen(UINT16 *str)
{
UINT32 i=0;
while(0!=str[i])
{
i++;
}
return i;
}
//=============================FLASHROM 操作相关函数=====================
UINT8 PGM_BYTE_FUN(ROM_TYPE_UINT8 *ptr)
{
return *(ptr);
}
UINT16 PGM_WORD_FUN(ROM_TYPE_UINT16 *ptr)
{
return *(ptr);
}
UINT32 PGM_DWORD_FUN(ROM_TYPE_UINT32 *ptr)
{
return *(ptr);
}
UINT8 * PGM2RAM(UINT8 *pdmem,ROM_TYPE_UINT8 *psmem,UINT32 len)
{
UINT32 i=0;
for(i=0;i<len;i++)
{
pdmem[i]=PGM_BYTE_FUN((psmem+i));
}
return pdmem;
}
//================================================================================================
/*****************************************************************************
功能:选定一个存储设备
形参:devno:设备号 pinitargs:指向存储设备所对应的文件系统初始化参数集合的指针
返回:0
详解:znFAT是支持多设备的,因此在对设备进行文件系统相关操作之前,必须要先选定
一个存储设备。此函数对Dev_No这个全局的用于区分存储设备驱动的变量进行设
定,同时将pInit_Args指向存储设备相应的文件系统初始化参数集合
*****************************************************************************/
UINT8 znFAT_Select_Device(UINT8 devno,struct znFAT_Init_Args *pinitargs) //选择设备
{
pInit_Args=pinitargs; //将znFAT的初始化参数集合指针指向设备的初始化参数集合
Dev_No=devno; //设置设备号
return 0;
}
/***********************************************************************************
功能:由一个小端排列的字节序列,计算得到其在某一字符长度下所表达的整型值
形参:dat:指向字节序列的指针 len:将字节序列的前len个字节计算整型值
返回:计算得到的整型值
详解:这一函数是屏蔽不同CPU在大小端上的差异的主要手段。比如对于一个小端的4字节序列
unsigned char *p={0X12,0X34,0X56,0X78} 如果我们想把它合成为一个4字节整型,如
unsigned long,那么可以这样来作 *((unsigned long *)p),但对于不同的CPU,因变
量在RAM中的字节排列顺序不同,即大小端问题,则其所表达的整型值可能为0X12345678
或 0X78563412,这将会出现错误。为了屏蔽这种差异,引入了此函数,通过对字节序列
进行计算,最后将可以得到正确的值,对于上例中的字节序列,通过此函数的计算Bytes
2Value(p,4)值一定为0X12345678。
***********************************************************************************/
UINT32 Bytes2Value(UINT8 *dat,UINT8 len)
{
UINT32 temp=0;
if(len>=1) temp|=((UINT32)(dat[0])) ;
if(len>=2) temp|=((UINT32)(dat[1]))<<8 ;
if(len>=3) temp|=((UINT32)(dat[2]))<<16;
if(len>=4) temp|=((UINT32)(dat[3]))<<24;
return temp;
}
/***********************************************************************************
功能:查找FSINFO扇区的物理地址
形参:fsinfosec:一个指向用于记录FSINFO扇区物理地址的变量的指针
返回:运行结果,成功或失败
详解:一般来说FSINFO扇区在DBR扇区的后一个扇区,但不乏有特殊情况,因此这里对DBR+1到
FAT1的前一个扇区进行遍历,以FSINFO扇区的标志字作为认定是FSINFO扇区的条件。
***********************************************************************************/
UINT8 Find_FSINFO_Sec(UINT32 *fsinfosec) //寻找FSINFO扇区,里面有剩余簇数与可用的空簇
{
UINT32 iSec=0;
struct FSInfo *pfsinfo;
UINT8 head[4]={'R','R','a','A'};
UINT8 sign[4]={'r','r','A','a'}; //FSINFO扇区的标志
for(iSec=(pInit_Args->BPB_Sector_No+1);iSec<(pInit_Args->FirstFATSector);iSec++)
{
znFAT_Device_Read_Sector(iSec,znFAT_Buffer);
pfsinfo=((struct FSInfo *)znFAT_Buffer);
if(Memory_Compare(pfsinfo->Head,head,4) //判断扇区是否是FSINFO扇区
&& Memory_Compare(pfsinfo->Sign,sign,4))
{
*fsinfosec=iSec;
return ERR_SUCC;
}
}
return ERR_FAIL;
}
/***********************************************************************************
功能:从FAT表的最头上开始查找可用的空簇,即找到第一个可用空簇
形参:nFreeCluster:指向用于记录有用的空簇的变量的指针
返回:运行结果,成功或失败
详解:从FAT表的最开始位置开始顺次查找,直到第一个可用的空簇出现,此空簇值将会被记录
在文件系统初始化参数集合中的pInit_Args->Next_Free_Cluster,为文件操作过程中需
使用空簇时提供可用空簇的参考值。
***********************************************************************************/
UINT8 Sea
没有合适的资源?快使用搜索试试~ 我知道了~
非常好用的xmodem协议
共41个文件
h:11个
obj:6个
c:6个
5星 · 超过95%的资源 需积分: 50 38 下载量 108 浏览量
2017-12-20
19:55:04
上传
评论 2
收藏 363KB ZIP 举报
温馨提示
128字节的xmodem协议传输................................................................................................................................................
资源推荐
资源详情
资源评论
收起资源包目录
xmodem.zip (41个子文件)
xmodem
sdx.h 2KB
xmodem.lnp 113B
xmodem.hex 91KB
xmodem 191KB
deviceio.lst 12KB
xmodem.M51 127KB
uart.LST 9KB
znfat.h 12KB
xmodem.Uv2 2KB
myfun.h 856B
myfun.LST 4KB
znFAT.lst 257KB
myfun.OBJ 5KB
_main.LST 4KB
znFAT
gb2uni.h 192KB
znFAT.c 168KB
config.h 5KB
znfat.h 12KB
template.h 4KB
deviceio.c 7KB
deviceio.h 591B
cc_macro.h 6KB
mytype.h 707B
xmodem.uvopt 66KB
_main.c 2KB
sdx.LST 23KB
sdx.OBJ 24KB
xmodem.Opt 1KB
xmodem_Opt.Bak 1KB
deviceio.obj 11KB
xmodem_uvproj.bak 0B
xmodem_Uv2.Bak 2KB
myfun.c 2KB
xmodem.plg 5KB
_main.OBJ 25KB
uart.h 459B
znFAT.obj 153KB
uart.OBJ 8KB
sdx.c 14KB
xmodem.uvproj 580B
uart.c 5KB
共 41 条
- 1
资源评论
- 小小二-yan2023-07-28通过使用这个文件中提到的 xmodem 协议,我的文件传输速度明显提升,效率大幅度提高。
- SLHJ-Translator2023-07-28对于需要频繁进行文件传输的用户来说,这个文件提供的 xmodem 协议是一个很好的选择,简洁实用。
- 一曲歌长安2023-07-28这个文件给出的使用示例非常清晰,让我很快就能够使用 xmodem 协议进行文件传输。
- lowsapkj2023-07-28这个文件详细介绍了 xmodem 协议的使用方法,对于初学者来说非常容易理解和上手。
- 丽龙2023-07-28这个文件介绍的 xmodem 协议非常实用,让我在文件传输时省去了很多麻烦。
莫问归期丶
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功