📄 ch375pcinterface.lst
字号:
180 mLength --;
181 }
182 return 1;
183 }
184 }
185
186 unsigned long SwapINT32(unsigned long dData)
187 {
188 dData = (dData&0xff)<<24|(dData&0xff00)<<8|(dData&0xff000000)>>24|(dData&0xff0000)>>8;
189 return dData;
190 }
191
192 unsigned int SwapINT16(unsigned int dData)
193 {
194 dData = (dData&0xff00)>>8|(dData&0x00ff)<<8;
195 return dData;
196 }
197
198 /* 从U盘中读取多个扇区的数据块到缓冲区中 */
199 unsigned char RBC_Read(unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *mBufferPoint)
200 /* iLbaStart 是读取的线起始性扇区号, iSectorCount 是读取的扇区数 */
201 {
202 unsigned char mIntStatus;
203 unsigned int mBlockCount;
204 unsigned char mLength;
205 CH375_CMD_PORT_d_out(CMD_DISK_READ); /* 从USB存储器读数据块 */
206 CH375_DAT_PORT_d_out((unsigned char)iLbaStart); /* LBA的最低8位 */
207 CH375_DAT_PORT_d_out ((unsigned char)( iLbaStart >> 8 ));
208 CH375_DAT_PORT_d_out((unsigned char)( iLbaStart >> 16 ));
209 CH375_DAT_PORT_d_out((unsigned char)( iLbaStart >> 24 )); /* LBA的最高8位 */
210 CH375_DAT_PORT_d_out( iSectorCount); /* 扇区数 */
211 // mBufferPoint = &DATA_BUFFER; /* 指向缓冲区起始地址 */
212 for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数
-*/
213 mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
214 if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */
215 CH375_CMD_PORT_d_out(CMD_RD_USB_DATA); /* 从CH375缓冲区读取数据块 */
216 mLength = CH375_DAT_PORT_in(); /* 后续数据的长度 */
217 /* 通常数据长度是64,有些U盘要求单片机必须在2mS之内取走64字节数据,否则U盘可能数据丢失 */
218 /* 建议优化下面的循环程序,确保单片机在1mS之内完成64字节的数据传输 */
219 if ( mLength ) { /* 根据长度读取数据 */
220 do { // 对于C51,这个DO+WHILE结构效率高,速度快
221 *mBufferPoint = CH375_DAT_PORT_in(); /* 读出数据并保存 */
222 mBufferPoint ++;
223 } while ( -- mLength );
224 }
225 CH375_CMD_PORT_d_out( CMD_DISK_RD_GO); /* 继续执行USB存储器的读操作 */
226 }
227 else break; /* 返回错误状态 */
228 }
229 if ( mBlockCount == 0 ) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
230 if ( mIntStatus == USB_INT_SUCCESS ) return 1; /* 操作成功 */
231 else return 0; /* 操作失败 */
232 }
C51 COMPILER V7.20 CH375PCINTERFACE 11/11/2005 10:20:32 PAGE 5
233
234
235 --------------------------------------------------------------------------------
236
237 -- 作者:lxlong
238 -- 发布时间:2004-12-6 12:59:49
239
240 --
241
242 TPBLK_STRUC idata TPBulk_Block;
243 #define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
244 #define CBW_wXferLen TPBulk_CBW.dCBW_DataXferLen
245 #define RBC_CDB TPBulk_CBW.cdbRBC
246 #define RBC_LUN TPBulk_CBW.bCBW_LUN
247 #define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
248
249 /*unsigned char TPBulk_GetMaxLUN(void)
250 {
251 usbstack.setup.bmRequest=0xa1;
252 usbstack.setup.bRequest=0xfe;
253 usbstack.setup.wValue=0;
254 usbstack.setup.wIndex=0;
255 usbstack.setup.wLength=1;
256 usbstack.buffer=DBUF;
257 return ep0Xfer();
258
259 }*/
260
261 /*
262 unsigned char SPC_READLONG(void)
263 {
264 #define cdbReadLong RBC_CDB.SpcCdb_ReadLong
265 //nsigned char retStatus=FALSE;
266 TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
267 TPBulk_CBW.dCBW_Tag=0x60a624de;
268 TPBulk_CBW.dCBW_DataXferLen=0xfc000000;
269 TPBulk_CBW.bCBW_Flag=0x80;
270 TPBulk_CBW.bCBW_LUN=0;
271 TPBulk_CBW.bCBW_CDBLen=sizeof(READ_LONG_CMD);
272
273 /////////////////////////////////////
274 cdbReadLong.OperationCode=SPC_CMD_READLONG;
275 cdbReadLong.LogicalUnitNum=0;
276 cdbReadLong.AllocationLen=0xfc;
277 //////////////////////////////////////
278 if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
279 return FALSE;
280
281 if(!epBulkRcv(DBUF,0xfc))
282 return FALSE;
283
284 if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
285 return FALSE;
286 ////////////////////////////
287 return TRUE;
288 #undef cdbReadLong
289 }
290 */
291
292 /*
293 unsigned char SPC_RequestSense(void)
294 {
C51 COMPILER V7.20 CH375PCINTERFACE 11/11/2005 10:20:32 PAGE 6
295 #define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense
296 //unsigned char retStatus=FALSE;
297 TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
298 TPBulk_CBW.dCBW_Tag=0x60a624de;
299 TPBulk_CBW.dCBW_DataXferLen=0x0e000000;
300 TPBulk_CBW.bCBW_Flag=0x80;
301 TPBulk_CBW.bCBW_LUN=0;
302 TPBulk_CBW.bCBW_CDBLen=sizeof(REQUEST_SENSE_SPC);
303
304 /////////////////////////////////////
305 cdbRequestSenseSPC.OperationCode=SPC_CMD_REQUESTSENSE;
306 cdbRequestSenseSPC.AllocationLen=0x0e;
307 //////////////////////////////////////
308 if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
309 return FALSE;
310
311 if(!epBulkRcv(DBUF,18))
312 return FALSE;
313
314 if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
315 return FALSE;
316 /////////////////////////////
317 return TRUE;
318
319 #undef cdbRequestSenseSPC
320 }
321 */
322
323 unsigned char SPC_TestUnit(void)
324 {
325 #define cdbTestUnit RBC_CDB.SpcCdb_TestUnit
326 //unsigned char retStatus=FALSE;
327 TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
328 TPBulk_CBW.dCBW_Tag=0x60a624de;
329 TPBulk_CBW.dCBW_DataXferLen=0x00000000;
330 TPBulk_CBW.bCBW_Flag=0x00;
331 TPBulk_CBW.bCBW_LUN=0;
332 TPBulk_CBW.bCBW_CDBLen=sizeof(TEST_UNIT_SPC);
333 /////////////////////////////////////
334 cdbTestUnit.OperationCode=SPC_CMD_TESTUNITREADY;
335 //////////////////////////////////////
336 if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
337 return FALSE;
338
339 if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
340 return FALSE;
341 #undef cdbTestUnit
342 ////////////////////////////
343 return TRUE;
344 }
345
346 unsigned char SPC_LockMedia(void)
347 {
348 #define cdbLockSPC RBC_CDB.SpcCdb_Remove
349 //unsigned char retStatus=FALSE;
350 TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
351 TPBulk_CBW.dCBW_Tag=0x60a624de;
352 TPBulk_CBW.dCBW_DataXferLen=0x00000000;
353 TPBulk_CBW.bCBW_Flag=0x00;
354 TPBulk_CBW.bCBW_LUN=0;
355 TPBulk_CBW.bCBW_CDBLen=sizeof(MEDIA_REMOVAL_SPC);
356 ///////////////////////////////////////////
C51 COMPILER V7.20 CH375PCINTERFACE 11/11/2005 10:20:32 PAGE 7
357 cdbLockSPC.OperationCode=SPC_CMD_PRVENTALLOWMEDIUMREMOVAL;
358 cdbLockSPC.Prevent=1;
359 ///////////////////////////////////////////
360 if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
361 return FALSE;
362
363 if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
364 return FALSE;
365 #undef cdbLockSPC
366 /////////////////////////////
367 return TRUE;
368 }
369
370
C51 COMPILATION COMPLETE. 1 WARNING(S), 7 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -