📄 ch375hft.c
字号:
}
i = CH375FileOpen(); // 打开上级目录
if( i == ERR_OPEN_DIR )
{
while( 1 ) // 循环填写 直到完成
{
mCmdParam.Locate.mSectorOffset = Secoffset;
i = CH375FileLocate( );
if( i == ERR_SUCCESS )
{
if( Fbit ) // 第二次进入次写扇区
{
if( mCmdParam.Locate.mSectorOffset != 0x0FFFFFFFF )
{
BackFdtSector = mCmdParam.Locate.mSectorOffset;
Backoffset = 0;
}
else
{
for( i=0; i!=MAX_PATH_LEN; i++ )// 还原文件路径
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH375FileCreate( ); // 进行空间扩展
if( i != ERR_SUCCESS )
return i;
CH375FileErase( );
goto P_RETRY; // 重新打开上级目录
}
}
if( BackFdtSector == mCmdParam.Locate.mSectorOffset )
{
mCmdParam.ReadX.mSectorCount = 1; // 读一个扇区到磁盘缓冲区
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH375FileReadX( );
CH375DirtyBuffer( ); // 清除磁盘缓冲区
if( i!= ERR_SUCCESS )
return i;
i = ( CH375vSectorSize - Backoffset ) / 32;
if( Mult > i )
Mult = Mult - i; // 剩余的倍数
else
{
i = Mult;
Mult = 0;
}
for( len=i; len!=0; len-- )
{
indexBak -= 26;
index = indexBak;
for( i=0; i!=5; i++) // 长文件名的1-5个字符
{ // 在磁盘上UNICODE用小端方式存放
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + i*2 + 2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + i*2 + 1 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + i*2 + 2 ] =
LongNameBuf[index++];
#endif
}
for( i =0; i!=6; i++) // 长文件名的6-11个字符
{
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + 14 + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 14 + i*2 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + 14 + i*2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 14 + i*2 + 1 ] =
LongNameBuf[index++];
#endif
}
for( i=0; i!=2; i++) // 长文件名的12-13个字符
{
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + 28 + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 28 + i*2 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + 28 + i*2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 28 + i*2 + 1 ] =
LongNameBuf[index++];
#endif
}
DISK_BASE_BUF[Backoffset + 0x0b] = 0x0f;
DISK_BASE_BUF[Backoffset + 0x0c] = 0x00;
DISK_BASE_BUF[Backoffset + 0x0d] = sum;
DISK_BASE_BUF[Backoffset + 0x1a] = 0x00;
DISK_BASE_BUF[Backoffset + 0x1b] = 0x00;
DISK_BASE_BUF[Backoffset] = MultBak--;
Backoffset += 32;
}
if( !Fbit )
{
Fbit = TRUE;
DISK_BASE_BUF[ BackoffsetBak ] |= 0x40;
}
mCmdParam.WriteB.mLbaCount = 1;
mCmdParam.WriteB.mLbaStart = BackFdtSector;
mCmdParam.WriteB.mDataBuffer = DISK_BASE_BUF;
i = CH375WriteBlock();
if( i!= ERR_SUCCESS )
return i;
if( Mult==0 )
{ // 还原文件路径
for( i=0; i!=MAX_PATH_LEN; i++ )
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH375FileCreate( );
return i;
}
}
}
else
return i;
Secoffset++;
}
}
}
return i;
}
/*==============================================================================
函数名: GetUpSectorData
函数作用: 由当前扇区得到上一个扇区的数据,放在磁盘缓冲区
==============================================================================*/
UINT8 GetUpSectorData( UINT32 *NowSector )
{
UINT8 i;
UINT8 len; // 存放路径的长度
UINT32 index; // 目录扇区偏移扇区数
index = 0;
for(len=0; len!=MAX_PATH_LEN; len++)
{
if(mCmdParam.Open.mPathName[len] == 0) // 得到字符串长度
break;
}
for(i=len-1; i!=0xff; i--) // 得到上级目录位置
{
if((mCmdParam.Open.mPathName[i] == '\\') || (mCmdParam.Open.mPathName[i] == '/'))
break;
}
mCmdParam.Open.mPathName[i] = 0x00;
if( i==0 ) // 打开一级目录注意:处在根目录开始的特殊情况
{
mCmdParam.Open.mPathName[0] = '/';
mCmdParam.Open.mPathName[1] = 0;
i = CH375FileOpen();
if ( i == ERR_OPEN_DIR )
goto P_NEXT0;
}
else
{
i = CH375FileOpen();
if ( i == ERR_OPEN_DIR )
{
while( 1 )
{
P_NEXT0:
mCmdParam.Locate.mSectorOffset = index;
i = CH375FileLocate( );
if( i == ERR_SUCCESS )
{
if( *NowSector == mCmdParam.Locate.mSectorOffset )
{
if( index==0 ) // 处于根目录扇区的开始
return ERR_NO_NAME;
mCmdParam.Locate.mSectorOffset = --index;
i = CH375FileLocate( ); // 读上一个扇区的数据
if( i == ERR_SUCCESS )
{ // 以下保存当前所在扇区数
*NowSector = mCmdParam.Locate.mSectorOffset;
mCmdParam.ReadX.mSectorCount = 1; // 读一个扇区到磁盘缓冲区
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH375FileReadX( );
CH375DirtyBuffer( ); // 清除磁盘缓冲区
return i;
}
else
return i;
}
}
else
return i;
index++;
}
}
}
return i;
}
/*==============================================================================
函数名: CH375GetLongName
函数作用: 由完整短文件名路径(可以是文件或文件夹)得到相应的长文件名
==============================================================================*/
UINT8 CH375GetLongName( void )
{
// 需要变量扇区大小
// 第一步:打开文件是否找到文件,分析文件是否存在,并得到FDT在此扇区的偏移和所在扇区
// 第二步:分析上面的信息看是否有长文件名存在,是否处于目录的第一个扇区的开始
// 第三步:实现向后偏移一个扇区?读取长文件名(扇区512字节的U盘)
UINT8 i;
UINT16 index; // 在长文件名缓冲区内的索引
UINT32 BackFdtSector; // 保寸偏移上一个扇区
UINT8 sum; // 保存长文件名的校验和
UINT16 Backoffset; // 保存文件偏移备份
UINT16 offset; // 扇区内文件偏移32倍数
UINT8 FirstBit; // 长文件名跨越两个扇区标志位
UINT8 xdata BackPathBuf[MAX_PATH_LEN]; // 保存文件路径
i = CH375FileOpen( );
if( ( i == ERR_SUCCESS ) || ( i == ERR_OPEN_DIR ) )
{
for( i=0; i!=MAX_PATH_LEN; i++ )
BackPathBuf[i] = mCmdParam.Open.mPathName[i];
// 以上完成对路径的备份
sum = CheckNameSum( &DISK_BASE_BUF[CH375vFdtOffset] );
index = 0;
FirstBit = FALSE;
Backoffset = CH375vFdtOffset;
BackFdtSector = CH375vFdtLba;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -