📄 ch375udevice.lst
字号:
138 // 以下是非常简单的FAT文件系统的分析,正式应用绝对不应该如此简单
139 // 识别分析当前逻辑盘
140 UINT8 mIdenDisk( void )
141 {
142 1 UINT8 Status;
143 1
144 1 DiskStart = 0;
145 1 Status = mReadSector( 0, 1, FILE_DATA_BUF ); // 读取逻辑盘引导信息
146 1 if ( Status != 0 ) return( Status );
147 1
148 1 // if ( (FILE_DATA_BUF[0] != 0xEB) && (FILE_DATA_BUF[0] != 0xE9) )// 不是逻辑引导扇区
149 1 // 不是逻辑引导扇区( EB 3E 90 )
150 1 if ( (FILE_DATA_BUF[0] != 0xEB) && (FILE_DATA_BUF[1] != 0x3E) && (FILE_DATA_BUF[2] != 0x90) )
151 1 {
152 2 DiskStart = FILE_DATA_BUF[0x1C6] | (UINT16)FILE_DATA_BUF[0x1C7] << 8 | (UINT32)FILE_DATA_BUF[0x1C8] << 1
-6 | (UINT32)FILE_DATA_BUF[0x1C9] << 24;
153 2 Status = mReadSector( DiskStart, 1, FILE_DATA_BUF );
154 2 if ( Status != 0 ) return( Status );
155 2 }
156 1 SecPerClus = FILE_DATA_BUF[0x0D]; // 每簇扇区数
157 1 ResvdSecCnt = FILE_DATA_BUF[0x0E]; // 逻辑盘的保留扇区数
158 1 // ResvdSecCnt = mGetPointWord( &FILE_DATA_BUF[0x0E] ); // 逻辑盘的保留扇区数
159 1 FATSize16 = mGetPointWord( &FILE_DATA_BUF[0x16] ); // FAT表占用扇区数
160 1
161 1 return( 0 ); // 成功
162 1 }
163
164 //-------------------------------------------------------------------------------------------------
165 // 获得指定簇号的链接簇
166 // 输入: iCluster 当前簇号
167 // 返回: 原链接簇号, 如果为 0 则说明错误
168 UINT16 mLinkCluster( UINT16 iCluster )
169 {
170 1 UINT8 Status;
171 1
172 1 Status = mReadSector( DiskStart + ResvdSecCnt + iCluster / 256, 1, FILE_DATA_BUF );
173 1 if ( Status != 0 ) return( 0 ); // 错误
174 1
175 1 return( mGetPointWord( &FILE_DATA_BUF[ ( iCluster + iCluster ) & 0x01FF ] ) );
176 1 }
177
178 //-------------------------------------------------------------------------------------------------
C51 COMPILER V7.20 CH375UDEVICE 11/15/2005 22:07:19 PAGE 4
179 // 将簇号转换为绝对LBA扇区地址
180 UINT32 mClusterToLba( UINT16 iCluster )
181 {
182 1 return( DiskStart + ResvdSecCnt + FATSize16 * 2 + 32 + ( iCluster - 2 ) * SecPerClus );
183 1 }
184
185 //=================================================================================================
186 //=================================================================================================
187 // 用于调试
188 //=================================================================================================
189 //=================================================================================================
190 //
191 //-------------------------------------------------------------------------------------------------
192 // 仅用于调试用途及显示内容到PC机,与该程序功能完全无关
193 void mInitSTDIO( void )
194 {
195 1 SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; TR1=1; TI=1; // 24MHz, 9600bps
196 1 }
197
198 //-------------------------------------------------------------------------------------------------
199 // 如果错误则停止运行并显示错误状态
200 void mStopIfError( UINT8 iErrCode )
201 {
202 1 if ( iErrCode == 0 ) return;
203 1 printf( "Error status, %02X\n", (UINT16)iErrCode );
204 1 }
205
206 //=================================================================================================
207 //=================================================================================================
208 // Main
209 //=================================================================================================
210 //=================================================================================================
211 //
212 void main( void )
213 {
214 1 UINT8 Status;
215 1 UINT8X *CurrentDir;
216 1 UINT16 Cluster;
217 1
218 1 mDelaymS( 200 ); // 延时200毫秒
219 1 mInitSTDIO( );
220 1
221 1 xWriteCH375Cmd( CMD_SET_USB_MODE ); // 初始化CH375,设置USB工作模式
222 1 xWriteCH375Data( 6 ); // 模式代码,自动检测USB设备连接
223 1
224 1 while ( 1 )
225 1 {
226 2 printf( "Insert USB disk\n" );
227 2 while ( mWaitInterrupt( ) != USB_INT_CONNECT ); // 等待U盘连接
*** WARNING C206 IN LINE 227 OF CH375UDEVICE.C: 'mWaitInterrupt': missing function-prototype
228 2 mDelaymS( 250 ); // 延时等待U盘进入正常工作状态
229 2
230 2 Status = mInitDisk( ); // 初始化U盘,实际是识别U盘的类型,必须进行此步骤
231 2 mStopIfError( Status );
232 2 Status = mIdenDisk( ); // 识别分析U盘文件系统,必要操作
233 2 mStopIfError( Status );
234 2
235 2 // 读取FAT16逻辑盘的根目录,通常根目录占用32个扇区
236 2 Status = mReadSector( DiskStart + ResvdSecCnt + FATSize16 * 2, 32, FILE_DATA_BUF );
237 2 mStopIfError( Status );
238 2 for ( CurrentDir = FILE_DATA_BUF; CurrentDir[0] != 0; CurrentDir += 32 )
239 2 {
C51 COMPILER V7.20 CH375UDEVICE 11/15/2005 22:07:19 PAGE 5
240 3 if ( ( CurrentDir[0x0B] & 0x08 ) == 0 && CurrentDir[0] != 0xE5 )
241 3 {
242 4 CurrentDir[0x0B] = 0; // 为了便于显示,设置文件名或者目录名的结束标志
243 4 printf( "Name: %s\n", CurrentDir ); // 通过串口输出显示
244 4 }
245 3 }
246 2
247 2 // 以上显示根目录下的所有文件名,以下打开第一个文件,如果是C文件的话
248 2 if ( (FILE_DATA_BUF[0x0B]&0x08)==0 && FILE_DATA_BUF[0]!=0xE5 && FILE_DATA_BUF[8]=='C' )
249 2 {
250 3 Cluster = mGetPointWord( &FILE_DATA_BUF[0x1A] ); // 文件的首簇
251 3 while ( Cluster < 0xFFF8 ) // 文件簇未结束
252 3 {
253 4 if ( Cluster == 0 ) mStopIfError( 0x8F ); // 对于首簇,可能是0长度文件
254 4 Status = mReadSector( mClusterToLba( Cluster ), SecPerClus, FILE_DATA_BUF );
255 4 mStopIfError( Status ); // 读取首簇到缓冲区
256 4 FILE_DATA_BUF[30] = 0;
257 4 printf( "Data: %s\n", FILE_DATA_BUF );// 显示首行
258 4 Cluster = mLinkCluster( Cluster ); // 获取链接簇,返回0说明错误
259 4 }
260 3 }
261 2
262 2 while ( mWaitInterrupt( ) != USB_INT_DISCONNECT ); // 等待U盘拔出
263 2 mDelaymS( 250 );
264 2 }
265 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1015 ----
CONSTANT SIZE = 57 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -