/* CH376оƬ Îļþϵͳ²ã V1.1 */
|
/* ÌṩÎļþϵͳ³£ÓÃ×Ó³ÌÐò,ÌṩÃüÁî´ò°ü */
|
/* ²»Ê¹ÓõÄ×Ó³ÌÐò¿ÉÒÔ×¢Ê͵ô,´Ó¶ø½ÚÔ¼µ¥Æ¬»úµÄ³ÌÐòROM¿Õ¼äºÍÊý¾ÝRAM¿Õ¼ä */
|
/* ÕâÀïµÄ×Ó³ÌÐòÊÇͨ¹ýÀ¨ºÅÖеıäÁ¿´«µÝ²ÎÊý,Èç¹û²ÎÊý½Ï¶à,ΪÁ˽ÚÔ¼RAM,Ò²¿ÉÒԲο¼CH375×Ó³ÌÐò¿â¸Ä³Éͨ¹ýͬһȫ¾Ö±äÁ¿/ÁªºÏ½á¹¹CH376_CMD_DATA´«µÝ */
|
|
/* name ²ÎÊýÊÇÖ¸¶ÌÎļþÃû, ¿ÉÒÔ°üÀ¨¸ùĿ¼·û, µ«²»º¬Óз¾¶·Ö¸ô·û, ×ܳ¤¶È²»³¬¹ý1+8+1+3+1×Ö½Ú */
|
/* PathName ²ÎÊýÊÇָȫ·¾¶µÄ¶ÌÎļþÃû, °üÀ¨¸ùĿ¼·û¡¢¶à¼¶×ÓĿ¼¼°Â·¾¶·Ö¸ô·û¡¢ÎļþÃû/Ŀ¼Ãû */
|
/* LongName ²ÎÊýÊÇÖ¸³¤ÎļþÃû, ÒÔUNICODEС¶Ë˳Ðò±àÂë, ÒÔÁ½¸ö0×Ö½Ú½áÊø, ʹÓó¤ÎļþÃû×Ó³ÌÐò±ØÐëÏȶ¨ÒåÈ«¾Ö»º³åÇøGlobalBuf, ³¤¶È²»Ð¡ÓÚ64×Ö½Ú, ¿ÉÒÔÓëÆäËü×Ó³ÌÐò¹²Óà */
|
|
/* ¶¨Òå NO_DEFAULT_CH376_INT ÓÃÓÚ½ûֹĬÈϵÄWait376Interrupt×Ó³ÌÐò,½ûÖ¹ºó,Ó¦ÓóÌÐò±ØÐë×ÔÐж¨ÒåÒ»¸öͬÃû×Ó³ÌÐò */
|
/* ¶¨Òå DEF_INT_TIMEOUT ÓÃÓÚÉèÖÃĬÈϵÄWait376Interrupt×Ó³ÌÐòÖеĵȴýÖжϵij¬Ê±Ê±¼ä/Ñ»·¼ÆÊýÖµ, 0Ôò²»¼ì²é³¬Ê±¶øÒ»Ö±µÈ´ý */
|
/* ¶¨Òå EN_DIR_CREATE ÓÃÓÚÌṩн¨¶à¼¶×ÓĿ¼µÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */
|
/* ¶¨Òå EN_DISK_QUERY ÓÃÓÚÌṩ´ÅÅÌÈÝÁ¿²éѯºÍÊ£Óà¿Õ¼ä²éѯµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */
|
/* ¶¨Òå EN_SECTOR_ACCESS ÓÃÓÚÌṩÒÔÉÈÇøÎªµ¥Î»¶ÁдÎļþµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */
|
/* ¶¨Òå EN_LONG_NAME ÓÃÓÚÌṩ֧³Ö³¤ÎļþÃûµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */
|
|
#include <util/delay.h>
|
#include "USBModule_Driver.h"
|
#include "CH376file_sys.h"
|
#include "CH376inc.h"
|
|
UINT8 GlobalBuf [LONG_NAME_BUF_LEN] = {0};
|
|
UINT8 CH376ReadBlock( PUINT8 buf ) /* ´Óµ±Ç°Ö÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é,·µ»Ø³¤¶È */
|
{
|
UINT8 s, l;
|
xWriteCH376Cmd( CMD01_RD_USB_DATA0 );
|
s = l = xReadCH376Data( ); /* ³¤¶È */
|
if ( l )
|
{
|
do {
|
*buf = xReadCH376Data( );
|
buf ++;
|
} while ( -- l );
|
}
|
return( s );
|
}
|
|
UINT8 CH376WriteReqBlock( PUINT8 buf ) /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø³¤¶È */
|
{
|
UINT8 s, l;
|
xWriteCH376Cmd( CMD01_WR_REQ_DATA );
|
s = l = xReadCH376Data( ); /* ³¤¶È */
|
if ( l )
|
{
|
do {
|
xWriteCH376Data( *buf );
|
buf ++;
|
} while ( -- l );
|
}
|
return( s );
|
}
|
|
void CH376WriteHostBlock( PUINT8 buf, UINT8 len ) /* ÏòUSBÖ÷»ú¶ËµãµÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */
|
{
|
xWriteCH376Cmd( CMD10_WR_HOST_DATA );
|
xWriteCH376Data( len ); /* ³¤¶È */
|
if ( len )
|
{
|
do {
|
xWriteCH376Data( *buf );
|
buf ++;
|
} while ( -- len );
|
}
|
}
|
|
void CH376WriteOfsBlock( PUINT8 buf, UINT8 ofs, UINT8 len ) /* ÏòÄÚ²¿»º³åÇøÖ¸¶¨Æ«ÒƵØÖ·Ð´ÈëÊý¾Ý¿é */
|
{
|
xWriteCH376Cmd( CMD20_WR_OFS_DATA );
|
xWriteCH376Data( ofs ); /* Æ«ÒÆµØÖ· */
|
xWriteCH376Data( len ); /* ³¤¶È */
|
if ( len )
|
{
|
do{
|
xWriteCH376Data( *buf );
|
buf ++;
|
} while ( -- len );
|
}
|
}
|
|
void CH376SetFileName( PUINT8 name ) /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */
|
{
|
|
UINT8 c;
|
xWriteCH376Cmd( CMD10_SET_FILE_NAME );
|
/* for ( i = MAX_FILE_NAME_LEN; i != 0; -- i )
|
{
|
c = *name;
|
xWriteCH376Data( c );
|
if ( c == 0 ) break;
|
name ++;
|
}*/
|
c = *name;
|
xWriteCH376Data( c );
|
while ( c )
|
{
|
name ++;
|
c = *name;
|
if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 ) c = 0; /* Ç¿Ðн«ÎļþÃû½ØÖ¹ */
|
xWriteCH376Data( c );
|
}
|
}
|
|
UINT32 CH376Read32bitDat( void ) // ´ÓCH376оƬ¶ÁÈ¡32λµÄÊý¾Ý²¢½áÊøÃüÁî //
|
{
|
UINT8 c0, c1, c2, c3;
|
c0 = xReadCH376Data( );
|
c1 = xReadCH376Data( );
|
c2 = xReadCH376Data( );
|
c3 = xReadCH376Data( );
|
return( c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24 );
|
}
|
|
UINT8 CH376ReadVar8( UINT8 var ) // ¶ÁCH376оƬÄÚ²¿µÄ8λ±äÁ¿ //
|
{
|
UINT8 c0;
|
xWriteCH376Cmd( CMD11_READ_VAR8 );
|
xWriteCH376Data( var );
|
c0 = xReadCH376Data( );
|
return( c0 );
|
}
|
|
void CH376WriteVar8( UINT8 var, UINT8 dat ) // дCH376оƬÄÚ²¿µÄ8λ±äÁ¿ //
|
{
|
xWriteCH376Cmd( CMD20_WRITE_VAR8 );
|
xWriteCH376Data( var );
|
xWriteCH376Data( dat );
|
}
|
|
UINT32 CH376ReadVar32( UINT8 var ) // ¶ÁCH376оƬÄÚ²¿µÄ32λ±äÁ¿ //
|
{
|
xWriteCH376Cmd( CMD14_READ_VAR32 );
|
xWriteCH376Data( var );
|
return( CH376Read32bitDat( ) ); // ´ÓCH376оƬ¶ÁÈ¡32λµÄÊý¾Ý²¢½áÊøÃüÁî //
|
}
|
|
void CH376WriteVar32( UINT8 var, UINT32 dat ) // дCH376оƬÄÚ²¿µÄ32λ±äÁ¿ //
|
{
|
xWriteCH376Cmd( CMD50_WRITE_VAR32 );
|
xWriteCH376Data( var );
|
xWriteCH376Data( (UINT8)dat );
|
xWriteCH376Data( (UINT8)( (UINT16)dat >> 8 ) );
|
xWriteCH376Data( (UINT8)( dat >> 16 ) );
|
xWriteCH376Data( (UINT8)( dat >> 24 ) );
|
}
|
|
void CH376EndDirInfo( void ) // ÔÚµ÷ÓÃCH376DirInfoRead»ñÈ¡FAT_DIR_INFO½á¹¹Ö®ºóÓ¦¸Ã֪ͨCH376½áÊø //
|
{
|
CH376WriteVar8( 0x0D, 0x00 );
|
}
|
/*
|
UINT32 CH376GetFileSize( void ) // ¶ÁÈ¡µ±Ç°Îļþ³¤¶È //
|
{
|
return( CH376ReadVar32( VAR_FILE_SIZE ) );
|
}
|
|
UINT8 CH376GetDiskStatus( void ) // »ñÈ¡´ÅÅ̺ÍÎļþϵͳµÄ¹¤×÷״̬ //
|
{
|
return( CH376ReadVar8( VAR_DISK_STATUS ) );
|
}
|
*/
|
UINT8 CH376GetIntStatus( void ) /* »ñÈ¡ÖжÏ״̬²¢È¡ÏûÖжÏÇëÇó */
|
{
|
UINT8 s;
|
xWriteCH376Cmd( CMD01_GET_STATUS );
|
s = xReadCH376Data( );
|
return( s );
|
}
|
|
//ÓÃusart ͨÐÅûÓÐʹÓÃINT#
|
UINT8 Wait376Interrupt( void ) /* µÈ´ýCH376ÖжÏ,·µ»ØÖжÏ״̬Âë, ³¬Ê±Ôò·µ»ØERR_USB_UNKNOWN */
|
{
|
for (unsigned long i = 0; i < 300000; i ++ )
|
{
|
/* ¼ÆÊý·ÀÖ¹³¬Ê±,ĬÈϵij¬Ê±Ê±¼ä,Ó뵥Ƭ»úÖ÷ƵÓÐ¹Ø */
|
if ( Query376Interrupt( ) )
|
{
|
return( CH376GetIntStatus( ) ); /* ¼ì²âµ½ÖÐ¶Ï */
|
}
|
_delay_us(1);
|
/* ÔڵȴýCH376ÖжϵĹý³ÌÖÐ,¿ÉÒÔ×öЩÐèÒª¼°Ê±´¦ÀíµÄÆäËüÊÂÇé */
|
}
|
return( ERR_USB_UNKNOWN ); /* ²»Ó¦¸Ã·¢ÉúµÄÇé¿ö */
|
}
|
|
|
UINT8 CH376SendCmdWaitInt( UINT8 mCmd ) /* ·¢³öÃüÁîÂëºó,µÈ´ýÖÐ¶Ï */
|
{
|
xWriteCH376Cmd( mCmd );
|
return( Wait376Interrupt( ) );
|
}
|
|
UINT8 CH376SendCmdDatWaitInt( UINT8 mCmd, UINT8 mDat ) /* ·¢³öÃüÁîÂëºÍÒ»×Ö½ÚÊý¾Ýºó,µÈ´ýÖÐ¶Ï */
|
{
|
xWriteCH376Cmd( mCmd );
|
xWriteCH376Data( mDat );
|
return( Wait376Interrupt( ) );
|
}
|
|
UINT8 CH376DiskReqSense( void ) /* ¼ì²éUSB´æ´¢Æ÷´íÎó */
|
{
|
UINT8 s;
|
_delay_ms( 5 );
|
s = CH376SendCmdWaitInt( CMD0H_DISK_R_SENSE );
|
_delay_ms( 5 );
|
return( s );
|
}
|
|
UINT8 CH376DiskConnect( void ) /* ¼ì²éUÅÌÊÇ·ñÁ¬½Ó,²»Ö§³ÖSD¿¨ */
|
{
|
if ( Query376Interrupt( ) ) CH376GetIntStatus( ); /* ¼ì²âµ½ÖÐ¶Ï */
|
return( CH376SendCmdWaitInt( CMD0H_DISK_CONNECT ) );
|
}
|
|
UINT8 CH376DiskMount( void ) /* ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ·ñ¾ÍÐ÷ */
|
{
|
return( CH376SendCmdWaitInt( CMD0H_DISK_MOUNT ) );
|
}
|
|
UINT8 CH376FileOpen( PUINT8 name ) /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼Ï´ò¿ªÎļþ»òÕßĿ¼(Îļþ¼Ð) */
|
{
|
CH376SetFileName( name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */
|
if ( name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2 )
|
CH376WriteVar32( VAR_CURRENT_CLUST, 0 );
|
return( CH376SendCmdWaitInt( CMD0H_FILE_OPEN ) );
|
}
|
|
UINT8 CH376FileCreate( PUINT8 name ) /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏÂн¨Îļþ,Èç¹ûÎļþÒѾ´æÔÚÄÇôÏÈɾ³ý */
|
{
|
if ( name ) CH376SetFileName( name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */
|
return( CH376SendCmdWaitInt( CMD0H_FILE_CREATE ) );
|
}
|
/*
|
UINT8 CH376DirCreate( PUINT8 name ) // ÔÚ¸ùĿ¼ÏÂн¨Ä¿Â¼(Îļþ¼Ð)²¢´ò¿ª,Èç¹ûĿ¼ÒѾ´æÔÚÄÇôֱ½Ó´ò¿ª
|
{
|
CH376SetFileName( name ); // ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû
|
if ( name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2 ) CH376WriteVar32( VAR_CURRENT_CLUST, 0 );
|
return( CH376SendCmdWaitInt( CMD0H_DIR_CREATE ) );
|
}
|
*/
|
UINT8 CH376SeparatePath( PUINT8 path ) /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼(Îļþ¼Ð)Ãû,·µ»Ø×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼ÃûµÄ×Ö½ÚÆ«ÒÆ */
|
{
|
PUINT8 pName;
|
for ( pName = path; *pName != 0; ++ pName ); /* µ½ÎļþÃû×Ö·û´®½áÊøÎ»Öà */
|
while ( *pName != DEF_SEPAR_CHAR1 && *pName != DEF_SEPAR_CHAR2 && pName != path ) pName --; /* ËÑË÷µ¹ÊýµÚÒ»¸ö·¾¶·Ö¸ô·û */
|
if ( pName != path ) pName ++; /* ÕÒµ½ÁË·¾¶·Ö¸ô·û,ÔòÐÞ¸ÄÖ¸ÏòÄ¿±êÎļþµÄ×îºóÒ»¼¶ÎļþÃû,Ìø¹ýÇ°ÃæµÄ¶à¼¶Ä¿Â¼Ãû¼°Â·¾¶·Ö¸ô·û */
|
return( pName - path );
|
}
|
|
UINT8 CH376FileOpenDir( PUINT8 PathName, UINT8 StopName ) // ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼µÄÉϼ¶Ä¿Â¼,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û //
|
// StopName Ö¸Ïò×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼Ãû //
|
{
|
UINT8 i, s;
|
s = 1;
|
i = 1; // Ìø¹ýÓпÉÄܵĸùĿ¼·û //
|
while ( 1 )
|
{
|
while ( PathName[i] != DEF_SEPAR_CHAR1 && PathName[i] != DEF_SEPAR_CHAR2 && PathName[i] != 0 ) ++ i; // ËÑË÷ÏÂÒ»¸ö·¾¶·Ö¸ô·û»òÕß·¾¶½áÊø·û //
|
if ( PathName[i] ) i ++; // ÕÒµ½ÁË·¾¶·Ö¸ô·û,ÐÞ¸ÄÖ¸ÏòÄ¿±êÎļþµÄ×îºóÒ»¼¶ÎļþÃû //
|
else i = 0; // ·¾¶½áÊø //
|
s = CH376FileOpen( &PathName[s] ); // ´ò¿ªÎļþ»òÕßĿ¼ //
|
if ( i && i != StopName )
|
{ // ·¾¶ÉÐδ½áÊø //
|
if ( s != ERR_OPEN_DIR )
|
{ // ÒòΪÊÇÖð¼¶´ò¿ª,ÉÐδµ½Â·¾¶½áÊø,ËùÒÔ,Èç¹û²»Êdzɹ¦´ò¿ªÁËĿ¼,ÄÇô˵Ã÷ÓÐÎÊÌâ //
|
if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); // Öмä·¾¶±ØÐëÊÇĿ¼Ãû,Èç¹ûÊÇÎļþÃûÔò³ö´í //
|
else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); // Öмä·¾¶µÄij¸ö×ÓĿ¼ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó //
|
else return( s ); // ²Ù×÷³ö´í //
|
}
|
s = i; // ´ÓÏÂÒ»¼¶Ä¿Â¼¿ªÊ¼¼ÌÐø //
|
}
|
else return( s ); // ·¾¶½áÊø,USB_INT_SUCCESSΪ³É¹¦´ò¿ªÎļþ,ERR_OPEN_DIRΪ³É¹¦´ò¿ªÄ¿Â¼(Îļþ¼Ð),ÆäËüΪ²Ù×÷³ö´í //
|
}
|
}
|
|
UINT8 CH376FileOpenPath( PUINT8 PathName ) // ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼(Îļþ¼Ð),Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û //
|
{
|
return( CH376FileOpenDir( PathName, 0xFF ) );
|
}
|
|
UINT8 CH376FileCreatePath( PUINT8 PathName ) /* н¨¶à¼¶Ä¿Â¼ÏµÄÎļþ,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */
|
{
|
UINT8 s;
|
UINT8 Name;
|
Name = CH376SeparatePath( PathName ); /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû,·µ»Ø×îºóÒ»¼¶ÎļþÃûµÄÆ«ÒÆ */
|
if ( Name )
|
{ /* ÊǶ༶Ŀ¼ */
|
s = CH376FileOpenDir( PathName, Name ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄ×îºóÒ»¼¶Ä¿Â¼,¼´´ò¿ªÐ½¨ÎļþµÄÉϼ¶Ä¿Â¼ */
|
if ( s != ERR_OPEN_DIR )
|
{ /* ÒòΪÊÇ´ò¿ªÉϼ¶Ä¿Â¼,ËùÒÔ,Èç¹û²»Êdzɹ¦´ò¿ªÁËĿ¼,ÄÇô˵Ã÷ÓÐÎÊÌâ */
|
if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* Öмä·¾¶±ØÐëÊÇĿ¼Ãû,Èç¹ûÊÇÎļþÃûÔò³ö´í */
|
else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* Öмä·¾¶µÄij¸ö×ÓĿ¼ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó */
|
else return( s ); /* ²Ù×÷³ö´í */
|
}
|
}
|
return( CH376FileCreate( &PathName[Name] ) ); /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏÂн¨Îļþ */
|
}
|
|
UINT8 CH376FileErase( PUINT8 PathName ) /* ɾ³ýÎļþ,Èç¹ûÒѾ´ò¿ªÔòÖ±½Óɾ³ý,·ñÔò¶ÔÓÚÎļþ»áÏÈ´ò¿ªÔÙɾ³ý,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶ */
|
{
|
UINT8 s;
|
if ( PathName )
|
{ /* ÎļþÉÐδ´ò¿ª */
|
for ( s = 1; PathName[s] != DEF_SEPAR_CHAR1 && PathName[s] != DEF_SEPAR_CHAR2 && PathName[s] != 0; ++ s ); /* ËÑË÷ÏÂÒ»¸ö·¾¶·Ö¸ô·û»òÕß·¾¶½áÊø·û */
|
if ( PathName[s] )
|
{ /* Óз¾¶·Ö¸ô·û,ÊǶ༶Ŀ¼ÏµÄÎļþ»òÕßĿ¼ */
|
s = CH376FileOpenPath( PathName ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼ */
|
if ( s != USB_INT_SUCCESS && s != ERR_OPEN_DIR ) return( s ); /* ²Ù×÷³ö´í */
|
}
|
else CH376SetFileName( PathName ); /* ûÓз¾¶·Ö¸ô·û,ÊǸùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼,ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */
|
}
|
return( CH376SendCmdWaitInt( CMD0H_FILE_ERASE ) );
|
}
|
|
UINT8 CH376FileClose( UINT8 UpdateSz ) /* ¹Ø±Õµ±Ç°ÒѾ´ò¿ªµÄÎļþ»òÕßĿ¼(Îļþ¼Ð) */
|
{
|
return( CH376SendCmdDatWaitInt( CMD1H_FILE_CLOSE, UpdateSz ) );
|
}
|
|
UINT8 CH376DirInfoRead( void ) /* ¶ÁÈ¡µ±Ç°ÎļþµÄĿ¼ÐÅÏ¢ */
|
{
|
return( CH376SendCmdDatWaitInt( CMD1H_DIR_INFO_READ, 0xFF ) );
|
}
|
|
UINT8 CH376DirInfoSave( void ) /* ±£´æÎļþµÄĿ¼ÐÅÏ¢ */
|
{
|
return( CH376SendCmdWaitInt( CMD0H_DIR_INFO_SAVE ) );
|
}
|
|
UINT8 CH376ByteLocate( UINT32 offset ) /* ÒÔ×Ö½ÚΪµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */
|
{
|
xWriteCH376Cmd( CMD4H_BYTE_LOCATE );
|
xWriteCH376Data( (UINT8)offset );
|
xWriteCH376Data( (UINT8)((UINT16)offset>>8) );
|
xWriteCH376Data( (UINT8)(offset>>16) );
|
xWriteCH376Data( (UINT8)(offset>>24) );
|
return( Wait376Interrupt( ) );
|
}
|
|
UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) // ÒÔ×Ö½ÚΪµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é //
|
{
|
UINT8 s;
|
xWriteCH376Cmd( CMD2H_BYTE_READ );
|
xWriteCH376Data( (UINT8)ReqCount );
|
xWriteCH376Data( (UINT8)(ReqCount>>8) );
|
if ( RealCount ) *RealCount = 0;
|
while ( 1 )
|
{
|
s = Wait376Interrupt( );
|
if ( s == USB_INT_DISK_READ )
|
{
|
s = CH376ReadBlock( buf ); // ´Óµ±Ç°Ö÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é,·µ»Ø³¤¶È //
|
xWriteCH376Cmd( CMD0H_BYTE_RD_GO );
|
buf += s;
|
if ( RealCount ) *RealCount += s;
|
}
|
// else if ( s == USB_INT_SUCCESS ) return( s );// // ½áÊø //
|
else return( s ); // ´íÎó //
|
}
|
}
|
|
UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */
|
{
|
UINT8 s;
|
xWriteCH376Cmd( CMD2H_BYTE_WRITE );
|
xWriteCH376Data( (UINT8)ReqCount ); //ÇëÇóÊäÈë×Ö½ÚÊý,µÍ×Ö½ÚÔÚǰ,¸ß×Ö½ÚÔÚºó
|
xWriteCH376Data( (UINT8)(ReqCount>>8) );
|
if ( RealCount ) *RealCount = 0;
|
while ( 1 )
|
{
|
s = Wait376Interrupt( );
|
if ( s == USB_INT_DISK_WRITE )
|
{
|
s = CH376WriteReqBlock( buf ); /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø³¤¶È */
|
xWriteCH376Cmd( CMD0H_BYTE_WR_GO );
|
buf += s;
|
if ( RealCount ) *RealCount += s;
|
}
|
/* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* ½áÊø */
|
else return( s ); /* ´íÎó */
|
}
|
}
|
|
UINT8 CH376SecLocate( UINT32 offset ) // ÒÔÉÈÇøÎªµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë //
|
{
|
xWriteCH376Cmd( CMD4H_SEC_LOCATE );
|
xWriteCH376Data( (UINT8)offset );
|
xWriteCH376Data( (UINT8)((UINT16)offset>>8) );
|
xWriteCH376Data( (UINT8)(offset>>16) );
|
xWriteCH376Data( 0 ); // ³¬³ö×î´óÎļþ³ß´ç //
|
return( Wait376Interrupt( ) );
|
}
|
|
#ifdef EN_LONG_NAME
|
|
UINT8 CH376LongNameWrite( PUINT8 buf, UINT16 ReqCount ) /* ³¤ÎļþÃûרÓõÄ×Ö½Úд×Ó³ÌÐò */
|
{
|
UINT8 s, c;
|
c = CH376ReadVar8( VAR_DISK_STATUS );
|
if ( c == DEF_DISK_OPEN_ROOT ) CH376WriteVar8( VAR_DISK_STATUS, DEF_DISK_OPEN_DIR );
|
xWriteCH376Cmd( CMD2H_BYTE_WRITE );
|
xWriteCH376Data( (UINT8)ReqCount );
|
xWriteCH376Data( (UINT8)(ReqCount>>8) );
|
while ( 1 )
|
{
|
s = Wait376Interrupt( );
|
if ( s == USB_INT_DISK_WRITE )
|
{
|
if ( buf ) buf += CH376WriteReqBlock( buf ); /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø³¤¶È */
|
else
|
{
|
xWriteCH376Cmd( CMD01_WR_REQ_DATA ); /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é */
|
s = xReadCH376Data( ); /* ³¤¶È */
|
while ( s -- ) xWriteCH376Data( 0 ); /* Ìî³ä0 */
|
}
|
xWriteCH376Cmd( CMD0H_BYTE_WR_GO );
|
}
|
/* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* ½áÊø */
|
else
|
{
|
if ( c == DEF_DISK_OPEN_ROOT ) CH376WriteVar8( VAR_DISK_STATUS, c );
|
return( s ); /* ´íÎó */
|
}
|
}
|
}
|
|
UINT8 CH376CheckNameSum( PUINT8 DirName ) /* ¼ÆË㳤ÎļþÃûµÄ¶ÌÎļþÃû¼ìÑéºÍ,ÊäÈëΪÎÞСÊýµã·Ö¸ô·ûµÄ¹Ì¶¨11×Ö½Ú¸ñʽ */
|
{
|
UINT8 NameLen;
|
UINT8 CheckSum;
|
CheckSum = 0;
|
for ( NameLen = 0; NameLen != 11; NameLen ++ )
|
CheckSum = ( CheckSum & 1 ? 0x80 : 0x00 ) + ( CheckSum >> 1 ) + *DirName++;
|
return( CheckSum );
|
}
|
|
UINT8 CH376LocateInUpDir( PUINT8 PathName ) // ÔÚÉϼ¶Ä¿Â¼(Îļþ¼Ð)ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇø //
|
// ÁíÍâ,˳±ã½«µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇøµÄǰһ¸öÉÈÇøµÄLBAµØÖ·Ð´ÈëCH376ÄÚ²¿VAR_FAT_DIR_LBA±äÁ¿(ΪÁË·½±ãÊÕ¼¯³¤ÎļþÃûʱÏòǰËÑË÷,·ñÔòÒª¶àÒÆ¶¯Ò»´Î) //
|
// ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ12¸ö×Ö½Ú //
|
{
|
UINT8 s;
|
PUINT8 D_= (PUINT8)("/");
|
xWriteCH376Cmd( CMD14_READ_VAR32 );
|
xWriteCH376Data( VAR_FAT_DIR_LBA ); // µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇøLBAµØÖ· //
|
for ( s = 4; s != 8; s ++ ) GlobalBuf[ s ] = xReadCH376Data( ); // ÁÙʱ±£´æÓÚÈ«¾Ö»º³åÇøÖÐ,½ÚÔ¼RAM //
|
s = CH376SeparatePath( PathName ); // ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼Ãû,·µ»Ø×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼ÃûµÄÆ«ÒÆ //
|
if ( s ) s = CH376FileOpenDir( PathName, s ); // ÊǶ༶Ŀ¼,´ò¿ª¶à¼¶Ä¿Â¼ÏµÄ×îºóÒ»¼¶Ä¿Â¼,¼´´ò¿ªÎļþµÄÉϼ¶Ä¿Â¼ //
|
else
|
{
|
s = CH376FileOpen( D_ ); // ¸ùĿ¼ÏµÄÎļþ,Ôò´ò¿ª¸ùĿ¼ //
|
}
|
if ( s != ERR_OPEN_DIR ) return( s );
|
*(PUINT32)(&GlobalBuf[0]) = 0; // Ŀ¼ÉÈÇøÆ«ÒÆÉÈÇøÊý,±£´æÔÚÈ«¾Ö»º³åÇøÖÐ,½ÚÔ¼RAM //
|
while ( 1 )
|
{ // ²»¶ÏÒÆ¶¯ÎļþÖ¸Õë,Ö±µ½Ó뵱ǰÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇøLBAµØÖ·Æ¥Åä //
|
s = CH376SecLocate( *(PUINT32)(&GlobalBuf[0]) ); // ÒÔÉÈÇøÎªµ¥Î»ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õë //
|
if ( s != USB_INT_SUCCESS ) return( s );
|
CH376ReadBlock( &GlobalBuf[8] ); // ´ÓÄڴ滺³åÇø¶ÁÈ¡CH376_CMD_DATA.SectorLocate.mSectorLbaÊý¾Ý¿é,·µ»Ø³¤¶È×ÜÊÇsizeof(CH376_CMD_DATA.SectorLocate) //
|
if ( *(PUINT32)(&GlobalBuf[8]) == *(PUINT32)(&GlobalBuf[4]) ) return( USB_INT_SUCCESS ); // Òѵ½µ±Ç°ÎļþĿ¼ÐÅÏ¢ÉÈÇø //
|
xWriteCH376Cmd( CMD50_WRITE_VAR32 );
|
xWriteCH376Data( VAR_FAT_DIR_LBA ); // µÃµ½Ç°Ò»¸öÉÈÇø,ÉèÖÃΪеÄÎļþĿ¼ÐÅÏ¢ÉÈÇøLBAµØÖ· //
|
for ( s = 8; s != 12; s ++ ) xWriteCH376Data( GlobalBuf[ s ] );
|
++ *(PUINT32)(&GlobalBuf[0]);
|
}
|
}
|
|
UINT8 CH376GetLongName( PUINT8 PathName, PUINT8 LongName ) // ÓɶÌÎļþÃû»òÕßĿ¼(Îļþ¼Ð)Ãû»ñµÃÏàÓ¦µÄ³¤ÎļþÃû */
|
/* ÐèÒªÊäÈë¶ÌÎļþÃûµÄÍêÕû·¾¶PathName,ÐèÒªÌṩ»º³åÇø½ÓÊÕ³¤ÎļþÃûLongName(ÒÔUNICODEС¶Ë±àÂë,ÒÔË«0½áÊø) */
|
/* ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ34¸ö×Ö½Ú,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)+2 */
|
{
|
UINT16 s;
|
UINT16 NameCount; /* ³¤ÎļþÃû×Ö½Ú¼ÆÊý */
|
s = CH376FileOpenPath( PathName ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼ */
|
if ( s != USB_INT_SUCCESS && s != ERR_OPEN_DIR ) return( s );
|
s = CH376DirInfoRead( ); /* ¶ÁÈ¡µ±Ç°ÎļþµÄĿ¼ÐÅÏ¢FAT_DIR_INFO,½«Ïà¹ØÊý¾Ýµ÷µ½ÄÚ´æÖÐ */
|
if ( s != USB_INT_SUCCESS ) return( s );
|
CH376ReadBlock( GlobalBuf ); /* ´ÓÄڴ滺³åÇø¶ÁÈ¡FAT_DIR_INFOÊý¾Ý¿é,·µ»Ø³¤¶È×ÜÊÇsizeof(FAT_DIR_INFO) */
|
CH376EndDirInfo( ); /* »ñÈ¡ÍêFAT_DIR_INFO½á¹¹ */
|
GlobalBuf[32] = CH376CheckNameSum( GlobalBuf ); /* ¼ÆË㳤ÎļþÃûµÄ¶ÌÎļþÃû¼ìÑéºÍ,±£´æÔÚÈ«¾Ö»º³åÇøÖÐ,½ÚÔ¼RAM */
|
GlobalBuf[33] = CH376ReadVar8( VAR_FILE_DIR_INDEX ); /* µ±Ç°ÎļþĿ¼ÐÅÏ¢ÔÚÉÈÇøÄÚµÄË÷ÒýºÅ,±£´æÔÚÈ«¾Ö»º³åÇøÖÐ,½ÚÔ¼RAM */
|
NameCount = 0;
|
while ( 1 )
|
{
|
if ( GlobalBuf[33] == 0 )
|
{ /* µ±Ç°µÄÎļþĿ¼ÐÅÏ¢ÉÈÇø´¦Àí½áÊø,תµ½Ç°Ò»¸öÉÈÇø */
|
s = CH376LocateInUpDir( PathName ); /* ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇø */
|
if ( s != USB_INT_SUCCESS ) break;
|
if ( CH376ReadVar32( VAR_CURRENT_OFFSET ) == 0 )
|
{ /* µ±Ç°ÒѾ´¦ÓÚĿ¼ÉÈÇøµÄ¿ªÊ¼,ÎÞ·¨»ñÈ¡³¤ÎļþÃû */
|
s = ERR_LONG_NAME_ERR;
|
break;
|
}
|
GlobalBuf[33] = DEF_SECTOR_SIZE / sizeof( FAT_DIR_INFO ); /* Ö¸Ïòǰһ¸öÉÈÇøµÄ×îºóÒ»¸öÎļþĿ¼ÐÅÏ¢ */
|
}
|
GlobalBuf[33] --; /* ´ÓºóÏòǰËÑË÷ÎļþĿ¼ÐÅÏ¢ */
|
s = CH376SendCmdDatWaitInt( CMD1H_DIR_INFO_READ, GlobalBuf[33] ); /* ¶Áȡָ¶¨µÄĿ¼ÐÅÏ¢FAT_DIR_INFO,½«Ïà¹ØÊý¾Ýµ÷µ½ÄÚ´æÖÐ */
|
if ( s != USB_INT_SUCCESS ) break;
|
CH376ReadBlock( GlobalBuf ); /* ´ÓÄڴ滺³åÇø¶ÁÈ¡FAT_DIR_INFOÊý¾Ý¿é,·µ»Ø³¤¶È×ÜÊÇsizeof(FAT_DIR_INFO) */
|
CH376EndDirInfo( ); /* »ñÈ¡ÍêFAT_DIR_INFO½á¹¹ */
|
if ( ( GlobalBuf[11] & ATTR_LONG_NAME_MASK ) != ATTR_LONG_NAME || GlobalBuf[13] != GlobalBuf[32] )
|
{ /* ÀàÐÍ´íÎó»òÕßУÑéºÍ´íÎó */
|
s = ERR_LONG_NAME_ERR;
|
break; /* ûÓÐÖ±½Ó·µ»ØÊÇÒòΪÈç¹ûÊÇ´ò¿ªÁ˸ùĿ¼ÄÇô±ØÐëÒª¹Ø±Õºó²ÅÄÜ·µ»Ø */
|
}
|
for ( s = 1; s < sizeof( FAT_DIR_INFO ); s += 2 )
|
{ /* ÊÕ¼¯³¤ÎļþÃû,³¤ÎļþÃûµÄ×Ö·ûÔÚ´ÅÅÌÉÏUNICODEÓÃС¶Ë·½Ê½´æ·Å */
|
if ( s == 1 + 5 * 2 ) s = 14; /* ´Ó³¤ÎļþÃûµÄµÚÒ»×é1-5¸ö×Ö·ûÌøµ½µÚ¶þ×é6-11¸ö×Ö·û */
|
else if ( s == 14 + 6 * 2 ) s = 28; /* ´Ó³¤ÎļþÃûµÄµÚ¶þ×é6-11¸ö×Ö·ûÌøµ½µÚÈý×é12-13¸ö×Ö·û */
|
LongName[ NameCount++ ] = GlobalBuf[ s ];
|
LongName[ NameCount++ ] = GlobalBuf[ s + 1 ];
|
if ( GlobalBuf[ s ] == 0 && GlobalBuf[ s + 1 ] == 0 ) break; /* ³¤ÎļþÃû½áÊø */
|
if ( NameCount >= LONG_NAME_BUF_LEN )
|
{ /* ³¤ÎļþÃû»º³åÇøÒç³ö */
|
s = ERR_LONG_BUF_OVER;
|
goto CH376GetLongNameE;
|
}
|
}
|
if ( GlobalBuf[0] & 0x40 )
|
{ /* ³¤ÎļþÃûĿ¼ÐÅÏ¢¿é½áÊø */
|
if ( s >= sizeof( FAT_DIR_INFO ) ) *(PUINT16)( &LongName[ NameCount ] ) = 0x0000; /* ÉÐδÊÕ¼¯µ½³¤ÎļþÃûµÄ½áÊø·û,ÔòÇ¿ÖÆ½áÊø */
|
s = USB_INT_SUCCESS; /* ³É¹¦Íê³É³¤ÎļþÃûÊÕ¼¯Íê³É */
|
break;
|
}
|
}
|
CH376GetLongNameE:
|
CH376FileClose( FALSE ); /* ¶ÔÓÚ¸ùĿ¼Ôò±ØÐëÒª¹Ø±Õ */
|
return( s );
|
}
|
|
UINT8 CH376CreateLongName( PUINT8 PathName, PUINT8 LongName ) /* н¨¾ßÓг¤ÎļþÃûµÄÎļþ,¹Ø±ÕÎļþºó·µ»Ø,LongNameÊäÈë·¾¶±ØÐëÔÚRAMÖÐ */
|
/* ÐèÒªÊäÈë¶ÌÎļþÃûµÄÍêÕû·¾¶PathName(ÇëÊÂÏȲο¼FAT¹æ·¶Óɳ¤ÎļþÃû×ÔÐвúÉú),ÐèÒªÊäÈëÒÔUNICODEС¶Ë±àÂëµÄÒÔË«0½áÊøµÄ³¤ÎļþÃûLongName */
|
/* ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ64¸ö×Ö½Ú,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)*2 */
|
{
|
|
UINT8 i;
|
UINT16 s;
|
//UINT8 DirBlockCnt; /* ³¤ÎļþÃûÕ¼ÓÃÎļþĿ¼½á¹¹µÄ¸öÊý */
|
unsigned int DirBlockCnt;
|
UINT16 count; /* ÁÙʱ±äÁ¿,ÓÃÓÚ¼ÆÊý,ÓÃÓÚ×Ö½Ú¶ÁÎļþ·½Ê½ÏÂʵ¼Ê¶ÁÈ¡µÄ×Ö½ÚÊý */
|
UINT16 NameCount; /* ³¤ÎļþÃû×Ö½Ú¼ÆÊý */
|
UINT32 NewFileLoc; /* µ±Ç°ÎļþĿ¼ÐÅÏ¢ÔÚÉϼ¶Ä¿Â¼ÖÐµÄÆðʼλÖÃ,Æ«ÒÆµØÖ· */
|
for ( count = 0; count < LONG_NAME_BUF_LEN; count += 2 ) if ( *(PUINT16)(&LongName[count]) == 0 ) break; /* µ½½áÊøÎ»Öà ²é³¤ÎļþÃûÓжàÉÙ¸ö×Ö½Ú*/
|
if ( count == 0 || count >= LONG_NAME_BUF_LEN || count > LONE_NAME_MAX_CHAR ) return( ERR_LONG_NAME_ERR ); /*ÅÐ¶Ï ³¤ÎļþÃû³¤¶ÈÊÇ·ñÓÐÎÞЧ */
|
DirBlockCnt = count / LONG_NAME_PER_DIR; /* ³¤ÎļþÃûÕ¼ÓÃÎļþĿ¼½á¹¹µÄ¸öÊý */
|
i = count - DirBlockCnt * LONG_NAME_PER_DIR;
|
if ( i )
|
{ /* ÓÐÁãÍ· */
|
if ( ++ DirBlockCnt > LONG_NAME_BUF_LEN ) return( ERR_LONG_BUF_OVER ); /* »º³åÇøÒç³ö */
|
count += 2; /* ¼ÓÉÏ0½áÊø·ûºóµÄ³¤¶È */
|
i += 2;
|
if ( i < LONG_NAME_PER_DIR )
|
{ /* ×îÄ©µÄÎļþĿ¼½á¹¹²»Âú */
|
while ( i++ < LONG_NAME_PER_DIR ) LongName[count++] = 0xFF; /* °ÑÊ£ÓàÊý¾ÝÌîΪ0xFF */
|
}
|
}
|
/*
|
s = CH376FileOpenPath( PathName ); // ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ //
|
if ( s == USB_INT_SUCCESS )
|
{ // ¶ÌÎļþÃû´æÔÚÔò·µ»Ø´íÎó //
|
s = ERR_NAME_EXIST;
|
goto CH376CreateLongNameE;
|
}
|
|
if ( s != ERR_MISS_FILE ) return( s );
|
*/
|
s = CH376FileCreatePath( PathName ); /* н¨¶à¼¶Ä¿Â¼ÏµÄÎļþ */
|
if ( s != USB_INT_SUCCESS ) return( s );
|
|
i = CH376ReadVar8( VAR_FILE_DIR_INDEX ); /* ÁÙʱÓÃÓÚ±£´æµ±Ç°ÎļþĿ¼ÐÅÏ¢ÔÚÉÈÇøÄÚµÄË÷ÒýºÅ */
|
s = CH376LocateInUpDir( PathName ); /* ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇø */
|
if ( s != USB_INT_SUCCESS )
|
goto CH376CreateLongNameE; /* ûÓÐÖ±½Ó·µ»ØÊÇÒòΪÈç¹ûÊÇ´ò¿ªÁ˸ùĿ¼ÄÇô±ØÐëÒª¹Ø±Õºó²ÅÄÜ·µ»Ø */
|
NewFileLoc = (UINT32)CH376ReadVar32( VAR_CURRENT_OFFSET ) + ((UINT32)i) *((UINT32) sizeof(FAT_DIR_INFO)); /* ¼ÆË㵱ǰÎļþĿ¼ÐÅÏ¢ÔÚÉϼ¶Ä¿Â¼ÖÐµÄÆðʼλÖÃ,Æ«ÒÆµØÖ· */
|
s = CH376ByteLocate( NewFileLoc ); /* ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢µÄλÖà */
|
if ( s != USB_INT_SUCCESS )
|
goto CH376CreateLongNameE;
|
s = CH376ByteRead( &GlobalBuf[ sizeof(FAT_DIR_INFO) ], sizeof(FAT_DIR_INFO), NULL ); /* ÒÔ×Ö½ÚΪµ¥Î»¶ÁÈ¡Êý¾Ý,»ñµÃµ±Ç°ÎļþµÄĿ¼ÐÅÏ¢FAT_DIR_INFO */
|
if ( s != USB_INT_SUCCESS )
|
goto CH376CreateLongNameE;
|
|
for ( i = DirBlockCnt; i != 0; -- i ) //iÉÈÇøÄÚµÄË÷ÒýºÅ
|
{ /* ËÑË÷¿ÕÏеÄÎļþĿ¼½á¹¹ÓÃÓÚ´æ·Å³¤ÎļþÃû */
|
s = CH376ByteRead( GlobalBuf, sizeof(FAT_DIR_INFO), &count ); /* ÒÔ×Ö½ÚΪµ¥Î»¶ÁÈ¡Êý¾Ý,»ñµÃÏÂÒ»¸öÎļþĿ¼ÐÅÏ¢FAT_DIR_INFO */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
if ( count == 0 ) break; /* ÎÞ·¨¶Á³öÊý¾Ý,Éϼ¶Ä¿Â¼½áÊøÁË */
|
if ( GlobalBuf[0] && GlobalBuf[0] != 0xE5 )
|
{ /* ºóÃæÓÐÕýÔÚʹÓõÄÎļþĿ¼½á¹¹,ÓÉÓÚ³¤ÎļþÃû±ØÐëÁ¬½Ó´æ·Å,ËùÒԿռ䲻¹»,±ØÐë·ÅÆúµ±Ç°Î»Öò¢Ïòºó×ªÒÆ */
|
s = CH376ByteLocate( NewFileLoc ); /* ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢µÄλÖà */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
GlobalBuf[ 0 ] = 0xE5; /* Îļþɾ³ý±êÖ¾ */
|
for ( s = 1; s != sizeof(FAT_DIR_INFO); s ++ ) GlobalBuf[ s ] = GlobalBuf[ sizeof(FAT_DIR_INFO) + s ];
|
s = CH376LongNameWrite( GlobalBuf, sizeof(FAT_DIR_INFO) ); /* дÈëÒ»¸öÎļþĿ¼½á¹¹,ÓÃÓÚɾ³ý֮ǰн¨µÄÎļþ,ʵ¼ÊÉÏÉÔºó»á½«Ö®×ªÒƵ½Ä¿Â¼µÄ×îĩλÖà */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
do { /* ÏòºóËÑË÷¿ÕÏеÄÎļþĿ¼½á¹¹ */
|
s = CH376ByteRead( GlobalBuf, sizeof(FAT_DIR_INFO), &count ); /* ÒÔ×Ö½ÚΪµ¥Î»¶ÁÈ¡Êý¾Ý,»ñµÃÏÂÒ»¸öÎļþĿ¼ÐÅÏ¢FAT_DIR_INFO */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
} while ( count && GlobalBuf[0] ); /* Èç¹ûÈÔÈ»ÊÇÕýÔÚʹÓõÄÎļþĿ¼½á¹¹Ôò¼ÌÐøÏòºóËÑË÷,Ö±µ½Éϼ¶Ä¿Â¼½áÊø»òÕßÓÐÉÐδʹÓùýµÄÎļþĿ¼½á¹¹ */
|
NewFileLoc = CH376ReadVar32( VAR_CURRENT_OFFSET ); /* ÓÃÉϼ¶Ä¿Â¼µÄµ±Ç°ÎļþÖ¸Õë×÷Ϊµ±Ç°ÎļþĿ¼ÐÅÏ¢ÔÚÉϼ¶Ä¿Â¼ÖÐµÄÆðʼλÖà */
|
i = DirBlockCnt + 1; /* ÐèÒªµÄ¿ÕÏеÄÎļþĿ¼½á¹¹µÄ¸öÊý,°üÀ¨¶ÌÎļþÃû±¾ÉíÒ»¸öºÍ³¤ÎļþÃû */
|
if ( count == 0 ) break; /* ÎÞ·¨¶Á³öÊý¾Ý,Éϼ¶Ä¿Â¼½áÊøÁË */
|
NewFileLoc -= sizeof(FAT_DIR_INFO); /* µ¹»Øµ½¸Õ²ÅËÑË÷µ½µÄ¿ÕÏеÄÎļþĿ¼½á¹¹µÄÆðʼλÖà */
|
}
|
}
|
if ( i )
|
{ /* ¿ÕÏеÄÎļþĿ¼½á¹¹²»×ãÒÔ´æ·Å³¤ÎļþÃû,ÔÒòÊÇÉϼ¶Ä¿Â¼½áÊøÁË,ÏÂÃæÔö¼ÓÉϼ¶Ä¿Â¼µÄ³¤¶È */
|
s = CH376ReadVar8( VAR_SEC_PER_CLUS ); /* ÿ´ØÉÈÇøÊý */
|
if ( s == 128 )
|
{ /* FAT12/FAT16µÄ¸ùĿ¼,ÈÝÁ¿Êǹ̶¨µÄ,ÎÞ·¨Ôö¼ÓÎļþĿ¼½á¹¹ */
|
s = ERR_FDT_OVER; /* FAT12/FAT16¸ùĿ¼ÏµÄÎļþÊýÓ¦¸ÃÉÙÓÚ512¸ö,ÐèÒª´ÅÅÌÕûÀí */
|
goto CH376CreateLongNameE;
|
}
|
count = s * DEF_SECTOR_SIZE; /* ÿ´Ø×Ö½ÚÊý */
|
if ( count < i * sizeof(FAT_DIR_INFO) ) count <<= 1; /* Ò»´Ø²»¹»ÔòÔö¼ÓÒ»´Ø,ÕâÖÖÇé¿öÖ»»á·¢ÉúÓÚÿ´ØÎª512×Ö½ÚµÄÇé¿öÏ */
|
s = CH376LongNameWrite( NULL, count ); /* ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÈ«0Êý¾Ý¿é,Çå¿ÕÐÂÔö¼ÓµÄÎļþĿ¼´Ø */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
}
|
s = CH376ByteLocate( NewFileLoc ); /* ÔÚÉϼ¶Ä¿Â¼ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢µÄλÖà */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
GlobalBuf[11] = ATTR_LONG_NAME;
|
GlobalBuf[12] = 0x00;
|
GlobalBuf[13] = CH376CheckNameSum( &GlobalBuf[ sizeof(FAT_DIR_INFO) ] ); /* ¼ÆË㳤ÎļþÃûµÄ¶ÌÎļþÃû¼ìÑéºÍ */
|
GlobalBuf[26] = 0x00;
|
GlobalBuf[27] = 0x00;
|
for ( s = 0; DirBlockCnt != 0; )
|
{ /* ³¤ÎļþÃûÕ¼ÓõÄÎļþĿ¼½á¹¹¼ÆÊý */
|
GlobalBuf[0] = s ? DirBlockCnt : DirBlockCnt | 0x40; /* Ê×´ÎÒªÖó¤ÎļþÃûÈë¿Ú±êÖ¾ */
|
DirBlockCnt --;
|
NameCount = DirBlockCnt * LONG_NAME_PER_DIR;
|
for ( s = 1; s < sizeof( FAT_DIR_INFO ); s += 2 )
|
{ /* Êä³ö³¤ÎļþÃû,³¤ÎļþÃûµÄ×Ö·ûÔÚ´ÅÅÌÉÏUNICODEÓÃС¶Ë·½Ê½´æ·Å */
|
if ( s == 1 + 5 * 2 ) s = 14; /* ´Ó³¤ÎļþÃûµÄµÚÒ»×é1-5¸ö×Ö·ûÌøµ½µÚ¶þ×é6-11¸ö×Ö·û */
|
else if ( s == 14 + 6 * 2 ) s = 28; /* ´Ó³¤ÎļþÃûµÄµÚ¶þ×é6-11¸ö×Ö·ûÌøµ½µÚÈý×é12-13¸ö×Ö·û */
|
GlobalBuf[ s ] = LongName[ NameCount++ ];
|
GlobalBuf[ s + 1 ] = LongName[ NameCount++ ];
|
}
|
s = CH376LongNameWrite( GlobalBuf, sizeof(FAT_DIR_INFO) ); /* ÒÔ×Ö½ÚΪµ¥Î»Ð´ÈëÒ»¸öÎļþĿ¼½á¹¹,³¤ÎļþÃû */
|
if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;
|
}
|
s = CH376LongNameWrite( &GlobalBuf[ sizeof(FAT_DIR_INFO) ], sizeof(FAT_DIR_INFO) ); /* ÒÔ×Ö½ÚΪµ¥Î»Ð´ÈëÒ»¸öÎļþĿ¼½á¹¹,ÕâÊÇ×ªÒÆÀ´µÄ֮ǰн¨µÄÎļþµÄĿ¼ÐÅÏ¢ */
|
CH376CreateLongNameE:
|
CH376FileClose( FALSE ); /* ¶ÔÓÚ¸ùĿ¼Ôò±ØÐëÒª¹Ø±Õ */
|
return( s );
|
}
|
|
#endif
|
//--------------------------------------------------------------------------------------------------
|