?? u_test.c
字號:
//#include "host_811.h"
#include "stdio.h"
#include "44blib.h"
#include "44b.h"
#include "flash.h"
#include "USB_SYS.h"
#define filenum 9
WORD TotalWriteSize,ErrorCapacity; //~~去掉xdata
LWORD ValidCapacity;
BYTE Directory[32];//文件信息
ShapeFile aShapeFile[20];//用來存放文件的名字,在flash中的起始存放位子和長度
LWORD flashadd =0x1c1000;
LWORD iniflashadd=0x1c1000; //存放在flash中起始地址
//WORD CheckFreeCapacity(WORD TotalWriteSize,WORD *FreeList,WORD ErrorCapacity);//查詢U盤空閑容量,得到空閑簇的地址列表
//BYTE ResultExport(WORD *FreeList);//結(jié)果導(dǎo)出到一個文件
//~~沒發(fā)現(xiàn)以上兩個函數(shù)的定義
///////////////////////////////////////////////////////////////////////
BYTE GetFileInfo(WORD whichfile)//參數(shù)是第幾個文件(第幾個目錄項),從0開始,將
{
LWORD temp,temp1,temp2,i; //文件信息放入全局變量byte Directory[32]
temp=whichfile<<5;
temp=temp/SectorSize;//sectorsize是每扇區(qū)字節(jié)數(shù)
temp=temp+RootDirAddr;//fataddr是fat表起始地址,此時temp中為此目錄項所在的扇區(qū)數(shù)
temp1=whichfile<<5;
temp2=temp1/SectorSize;
temp1=temp1-temp2*SectorSize;//temp1中是這個目錄項所在扇區(qū)中的開始字節(jié)數(shù)
if(UFLReadSector(temp))
{
for(i=0;i<32;i++)
{
Directory[i]=MassStorageDataBuf[temp1+i];
Uart_Printf("%c ",Directory[i]);//GC
}
Uart_SendString("*\n");
}
else
return FALSE;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//由于u盤中的目錄區(qū)中并不是只有各個文件的目錄項,還有很多雜項,并且有些文件的目錄項
//是占64個bytes(正常是占32個bytes),所以可以根據(jù)winhex中的信息確定要讀的文件是在第幾個
//目錄項(從0開始數(shù)),然后確定filenum的值
///////////////////////////////////////////////////////////////////////////////
BYTE GetFileSaveintoFlash(WORD whichfile,LWORD startaddinflash)//讀出u盤中文件,存放在
{ BYTE i,j; //flash中,其中的回車之類的一律按原來文件格式存放,最后一個
WORD cluster; //簇中的內(nèi)容(應(yīng)該是2個扇區(qū))全部(也就是1024個字節(jié))存在flash中
LWORD sector;
GetFileInfo(whichfile);//得到文件信息
for(i=0;i<8;i++)
aShapeFile[whichfile].name[i]=Directory[i];//填寫文件信息ashapefile
aShapeFile[whichfile].startadd=startaddinflash;
aShapeFile[whichfile].length=(LWORD)Directory[31]<<24|(LWORD)Directory[30]<<16|
(LWORD)Directory[29]<<8|(LWORD)Directory[28];
cluster=(WORD)Directory[27]<<8|(WORD)Directory[26];
Uart_Printf("%d,%d,%s,%x",cluster,aShapeFile[whichfile].length,
aShapeFile[whichfile].name,FileDataAddr);
while(!(cluster>=0xfff8&&cluster<=0xffff))
{ sector=FirstSectorofCluster(cluster);
Uart_Printf("%x\n",sector);
for(i=0;i<ClusterSize;i++)
{ if(UFLReadSector(sector))
{ for(j=0;j<0x40;j++)
{//print
Uart_Printf("%x ",MassStorageDataBuf[j]);
if((j+1)%16==0)
Uart_Printf("\n");
}
if( Program(flashadd,MassStorageDataBuf,SectorSize) == TRUE )
flashadd+=SectorSize;
else return FALSE;
}
else return FALSE;
sector++;
}
cluster=GetNextClusterNum(cluster);
}
return TRUE;
}
//將所有擴(kuò)展名為dst的文件打印到超級終端
BYTE PrintDSTFile()
{
int a=0;
int b;
while(1);
///////////////////gc
for(b=0;b<512;b++)
{
if(GetFileInfo(0))
{
if((Directory[8]=='d' || Directory[8]=='D')&(Directory[9]=='s' || Directory[9]=='S')
&(Directory[10]=='t' || Directory[10]=='T'))
{
{if(a==0)
{Uart_Printf("DST File name:\n");
Uart_Printf("%d. %c%c%c%c%c%c%c%c ",a,Directory[0],Directory[1],Directory[2],
Directory[3],Directory[4],Directory[5],Directory[6],Directory[7]);
}
else
Uart_Printf("%d. %c%c%c%c%c%c%c%c ",a,Directory[0],Directory[1],Directory[2],
Directory[3],Directory[4],Directory[5],Directory[6],Directory[7]);
}
if((a+1)%3==0)
Uart_Printf("\n");
a++;
}
}
else
return FALSE;
}
}
unsigned char U_Disk_Test(void)
{
BYTE i=0,offset,chr;
BYTE FATNum;
WORD j;
while(U_Disk_DETECT()!=0) Uart_Printf("ERR = %d \n",U_Disk_DETECT());
// 文件系統(tǒng)操作開始
/*********************************************************************************
Read Main Boot Record(MBR) Sector=0x00
MassStorageDataBuf[446]==0x80 --> First partition is active partition
MassStorageDataBuf[450]==0x04 --> FAT16
0x01 --> FAT12
0x06 --> BigFAT16
0x07 --> NTFS
0x0B --> FAT32
0x0C --> FAT32 LBA
**********************************************************************************/
/*GC
//讀起始扇區(qū)0
if(UFLReadSector(0x00))
{
DBRAddr=(WORD)MassStorageDataBuf[455]<<8|(WORD)MassStorageDataBuf[454];
USBCapacity=(LWORD)MassStorageDataBuf[461]<<24|(LWORD)MassStorageDataBuf[460]<<16|
(LWORD)MassStorageDataBuf[459]<<8|(LWORD)MassStorageDataBuf[458]; //總扇區(qū)數(shù)
}
else{
return 0x09;//USB設(shè)備不支持本通信協(xié)議
}
GC*/
/*********************************************************************************
Read DOS Boot Record Sector=DBRAddr
MassStorageDataBuf[11,12] w Byte Pre Sector
MassStorageDataBuf[13] b Sector Pre Cluster
MassStorageDataBuf[14,15] w Reserved sector
MassStorageDataBuf[16] b Number of FATs
MassStorageDataBuf[17,18] w Entry of Root
MassStorageDataBuf[22,23] w Sector Pre FAT
讀取DBR 所在扇區(qū)
**********************************************************************************/
/*GC
i=0;
while(i<20){
if(UFLReadSector(DBRAddr))
break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return 0x0a;//USB設(shè)備不支持本通信協(xié)議
Uart_Printf("get DBR info \n");
SectorSize=(WORD)MassStorageDataBuf[12]<<8|(WORD)MassStorageDataBuf[11];//每扇區(qū)字節(jié)數(shù)
ClusterSize=MassStorageDataBuf[13];//每簇扇區(qū)數(shù)
Uart_Printf("SectorSize = %d,ClusterSize = %d\n",SectorSize,ClusterSize);
FATAddr=DBRAddr+((WORD)MassStorageDataBuf[15]<<8|(WORD)MassStorageDataBuf[14]);
//fat表地址=系統(tǒng)引導(dǎo)記錄(長為一個扇區(qū))地址+保留扇區(qū)數(shù)
FATNum=MassStorageDataBuf[16]; //fat的個數(shù)
Uart_Printf("FATNum = %d \n",FATNum);
Uart_Printf("FAT Addr = %ld \n",FATAddr);
/*
//////////XXXXXXXXXXXXXXXXXXX fat16
RootDirNum=(WORD)MassStorageDataBuf[18]<<8|(WORD)MassStorageDataBuf[17];//根目錄項數(shù)
Uart_Printf("RootDirNum = %d \n",RootDirNum);
RootDirSize=(RootDirNum<<5)/SectorSize;//根目錄占多少個扇區(qū)
Uart_Printf("RootDirSize = %d \n",RootDirSize);
FATLength =(WORD)MassStorageDataBuf[23]<<8|(WORD)MassStorageDataBuf[22];//每個fat占的扇區(qū)數(shù)
RootDirAddr=FATAddr+FATLength*FATNum;//根目錄地址
FileDataAddr=RootDirAddr+RootDirSize;//數(shù)據(jù)區(qū)地址
//Uart_Printf("%x,%x,%x,%x,%x,%x,%x,%x,%x\n",SectorSize,ClusterSize,FATAddr,FATNum,RootDirNum,
// RootDirSize,FATLength,RootDirAddr,FileDataAddr);
// if(MaxLUN)//U盤為愛國者128M
// USBCapacity=(LWORD)MassStorageDataBuf[35]<<24|(LWORD)MassStorageDataBuf[34]<<16|
// (LWORD)MassStorageDataBuf[33]<<8|(LWORD)MassStorageDataBuf[32];
ValidCapacity=USBCapacity-1-RootDirSize-FATLength*FATNum;
ErrorCapacity=(LWORD)(FATLength*256-2)*ClusterSize-ValidCapacity;
*/
////////// GC CODE ///////
//RootDirNum= ???? ;//根目錄項數(shù)
//Uart_Printf("RootDirNum = %d \n",RootDirNum);
/*GC
FATLength =(WORD)MassStorageDataBuf[37]<<8|(WORD)MassStorageDataBuf[36];//每個fat占的扇區(qū)數(shù)
RootDirAddr=FATAddr+FATLength*FATNum;//根目錄地址
//得到根目錄地址 和 FAT表地址
RootDirSize=ClusterSize;//根目錄占多少個扇區(qū)
Uart_Printf("RootDirSize = %d \n\n\n",RootDirSize);
i=0;
while(i<20){
if(UFLReadSector(RootDirAddr)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return 0x0a;//USB設(shè)備不支持本通信協(xié)議
for(i=0;i<16;i++)
{
if(i==0)
Uart_Printf("DISK NAME :");
else if(i==1)
Uart_Printf("\n Found file : ");
else
Uart_Printf(" ");
for(offset=0;offset<=10;offset++)
{
if(offset==8)
Uart_Printf(".");
chr=MassStorageDataBuf[i*32+offset];
if(chr>(0x20))
Uart_Printf("%c",chr);
}
Uart_Printf("\n");
}
////////// GC CODE ///////
//讀出u盤中數(shù)據(jù)區(qū)中的第一個扇區(qū)中的內(nèi)容,并打印出來,已實驗成功
/* i=0;
while(i<20){
if(UFLRead10(FileDataAddr)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return 0x0a;
for(j=0;j<0x200;j++){
Uart_Printf("%x ",MassStorageDataBuf[j]);
if(j%16==0)
Uart_Printf("\n");
}
*/
//讀第幾個文件,存放在flash中,再從flash中讀出數(shù)據(jù),打印到超級終端
/* if(GetFileInfo(filenum)) //print the file's name
Uart_Printf("its name is: %c%c%c%c%c%c%c%c",Directory[0],Directory[1],Directory[2],
Directory[3],Directory[4],Directory[5],Directory[6],Directory[7]);
else
return FALSE;
if(!GetFileSaveintoFlash(filenum,flashadd)) //get a file from u flash, save it in flash
return FALSE;
Uart_Printf("the name is %s",aShapeFile[filenum].name);
for(j=0;j<aShapeFile[filenum].length;j++)
{ //get the file from flash, and print it
Uart_Printf("%x ",(*(volatile BYTE *)(iniflashadd+j)));
if((j+1)%16==0)
Uart_Printf("\n");
}
*/
//Uart_SendString("print *.dst !\n");
//PrintDSTFile();
Analyse_Sector0();
Analyse_DBR();
Analyse_ROOT();
Analyse_FILE();
Uart_SendString("------OK------\n");
return 0x00;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -