📄 filesystemcomtrol.c
字号:
printk("Del %s directory or file error!!!\n", CmdTable->Argu[0].Str);
u8Drive = CurrentDrive;
return ERROR_COMMAND;
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
UINT32 USB_RenameCmd(CommandTableStruct_T *CmdTable)
{
// Change u8Drive to Drive whitch we want to operate, and do SCSI command check,
// This check is important.
vScsi_Device_Check(CmdTable->Argu[0].Str);
if(rename(CmdTable->Argu[0].Str, CmdTable->Argu[1].Str) != 0)
{
printk("Can not rename %s file!!!\n", CmdTable->Argu[0].Str);
u8Drive = CurrentDrive;
return ERROR_COMMAND;
}
printk("%s file has been rename to %s!\n", CmdTable->Argu[0].Str, CmdTable->Argu[1].Str);
u8Drive = CurrentDrive;
return OK_COMMAND;
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
UINT32 USB_CopyCmd(CommandTableStruct_T *CmdTable)
{
FILE *src, *dst;
INT8 *buf;
INT32 nRead;
// Change u8Drive to Drive whitch we want to operate, and do SCSI command check,
// This check is important.
vScsi_Device_Check(CmdTable->Argu[0].Str);
if((src = fopen(CmdTable->Argu[0].Str, "r")) == NULL)
{
printk("Can not open %s file for reading\n", CmdTable->Argu[0].Str);
u8Drive = CurrentDrive;
return ERROR_COMMAND;
}
// fseek(src,1025,SEEK_SET);
vScsi_Device_Check(CmdTable->Argu[1].Str);
if((dst = fopen(CmdTable->Argu[1].Str, "w")) == NULL)
{
printk("Can not open %s file for writting\n", CmdTable->Argu[1].Str);
u8Drive = CurrentDrive;
fclose(src);
return ERROR_COMMAND;
}
buf = malloc(65536);
while(!feof(src))
{
nRead = fread(buf, 1, 65536, src);
//printk("nread=%d\n", nRead);
fwrite(buf, 1, nRead, dst);
}
fclose(dst);
fclose(src);
free(buf);
u8Drive = CurrentDrive;
return OK_COMMAND;
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
// Compare file
UINT32 USB_CmpCmd(CommandTableStruct_T *CmdTable)
{
FILE *src, *dst;
INT8 *f1buf,*f2buf;
INT32 nRead1,nRead2,nTotalRead;
BOOL bResult=TRUE;
int i;
// Change u8Drive to Drive whitch we want to operate, and do SCSI command check,
// This check is important.
vScsi_Device_Check(CmdTable->Argu[0].Str);
if((src = fopen(CmdTable->Argu[0].Str, "r")) == NULL)
{
printk("Can not open %s file for reading\n", CmdTable->Argu[0].Str);
u8Drive = CurrentDrive;
return ERROR_COMMAND;
}
// fseek(src,1025,SEEK_SET);
vScsi_Device_Check(CmdTable->Argu[1].Str);
if((dst = fopen(CmdTable->Argu[1].Str, "r")) == NULL)
{
printk("Can not open %s file for writting\n", CmdTable->Argu[1].Str);
u8Drive = CurrentDrive;
fclose(src);
return ERROR_COMMAND;
}
f1buf = malloc(65536);
f2buf = malloc(65536);
nTotalRead = 0;
bResult=TRUE;
while( (!feof(src)) && (!feof(dst)) )
{
nRead1 = fread(f1buf, 1, 65536, src);
nRead2 = fread(f2buf, 1, 65536, dst);
if ( nRead1 != nRead2 )
{
printk("Compare data error Read bytes does not equal nRead1=%d,nRead2=%d\n",nRead1,nRead2);
bResult=FALSE;
break;
}
for(i=0;i<nRead1;i++)
{
if ( f1buf[i] != f2buf[i] )
{
printk("Compare data error [%dth byte]\n",nTotalRead+i);
bResult=FALSE;
break;
}
}
nTotalRead+=nRead1;
if ( bResult == FALSE )
break;
}
fclose(dst);
fclose(src);
free(f1buf);
free(f2buf);
u8Drive = CurrentDrive;
if ( bResult == TRUE )
{
printk("Compare Ok..Files are the same!!\n");
return OK_COMMAND;
}
return ERROR_COMMAND;;
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
UINT32 USB_OpCmd(CommandTableStruct_T *CmdTable)
{
switch ( CmdTable->Argu[0].Value)
{
case 0:
bQuit = 1;
break;
case 1:
bQuit = 1;
break;
}
return OK_COMMAND;
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
void vScsi_Device_Check(INT8U* u8Str)
{
INT8U u8Tmp;
u8Tmp = u8Drive;
if(u8Str[1] == ':')
{
if(isupper(u8Str[0]))
u8Drive = u8Str[0] - 'A';
else if(islower(u8Str[0]))
u8Drive = u8Str[0] - 'a';
}
//Check if access SD disk but mass storage at remote side
if ( u8Drive == 18 )
{
u8Drive = u8Tmp;
printk("Access SD card...\n");
return;
}
if((Mass_stor_us->Mass_stor_device[u8Drive].bDeviceReady == FALSE))
bUSBDisk_FileSystem_Initial();
if(GetFileSystem((INT32U)u8Drive) == NULL)
return;
// Before execut any command, must do these SCSI check.
bSCSI_TEST_UNIT_READY();
//john mark for STALL bSCSI_MODE_SENSE();
}
//***************************************************************************************
// Function Name:
// Description:
// Input:
// Output:
// Status:
//***************************************************************************************
void vGetCurrentPath(INT8U* u8Path)
{
INT8U u8CurrentDrive[2];
u8CurrentDrive[0] = 'A'+(INT8U)CurrentDrive;
u8CurrentDrive[1] = NULL;
sprintf(u8Path,"%s:%s",u8CurrentDrive,(Mass_stor_us->Mass_stor_device[CurrentDrive].FileSys.CurrDir.DirName));
}
//===============================================================================================
//===============================================================================================
//===============================================================================================
//============================= Group-3: Main Function Implement ================================
//===============================================================================================
//===============================================================================================
//===============================================================================================
//***************************************************************************************
// Function Name: Host20_MSCD_MassStorage_Main
// Description:
// Input:
// Output:
// Status:S
//***************************************************************************************
void Host20_MSCD_MassStorage_Main(void)
{
char Buf[80],u8Tmp,DirPath[128];
UINT32 i;
UINT32 status;
fLib_InsertCommand(UsbDisk_CmdTable);
fLib_InitUserSymbol(NULL);
//<1>.Init Bulk Transfer
OTGH_PT_Bulk_Init();
//<2>.Init Control Transfer
// Host20_MSCD_Init_Control_Transfer();
//<2>.To get the max Lun
// Host20_MSCD_GetMaxLUN();
//<3>.Init the File System
//Get Max LUN
Mass_stor_us=&us_data_Signal;
Mass_stor_us->Mass_stor_device=&Mass_stor_device_1;
Mass_stor_us->max_lun=1;//Only support 1 LUN
bUSBDisk_FileSystem_Initial();
Mass_stor_us->bFileSystemInit = TRUE;
//<4>.Enter the Command-Line mode
printf("==================================================\n");
printf(">>> Enter the USB MassStorage Command-Line Mode...\n");
printf("==================================================\n");
bQuit = 0;
while(bQuit==0)
{
printk("\nUSB Disk>>");
vGetCurrentPath(DirPath);
printk("%s\\\n",DirPath);
memset(Buf, 0x00, 80);
for(i = 0; i<80; i++)
{
do
{
status=inw(DebugSerialPort+SERIAL_LSR);
}while (!((status & SERIAL_LSR_DR)==SERIAL_LSR_DR)); // wait until Rx ready
u8Tmp = inw(DebugSerialPort + SERIAL_RBR);
fLib_DebugPrintChar(u8Tmp);
if(u8Tmp == 0x8)
{
if(i > 0)
{
fLib_DebugPrintChar(0x20);
fLib_DebugPrintChar(u8Tmp);
Buf[i-1]=0;
i = i-2;
}
else if(i == 0)
i--;
}
else if(u8Tmp == 0xD)
break;
else
Buf[i] = u8Tmp;
}//for(i = 0; i<80; i++)
if( (Mass_stor_us != NULL) || ( (Buf[0] == 'o') && (Buf[1] == 'p') ) )
{
fLib_ExecuteCommand(Buf);
}
else
{
printk("no device attach now!!\n");
}
}//while(bQuit == FALSE)
OTGH_PT_Bulk_Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -