📄 bulkcmd.lst
字号:
217 {
218 1 PCMD_STATUS_WRAPPER StatusWrapper;
219 1
220 1 BulkCmdRunning = false;
221 1
222 1 SetBulkInFull();
223 1
224 1 StatusWrapper = (CMD_STATUS_WRAPPER xdata *)(FIFO_ADDRESS_IN);
225 1 // 1. Set CSW.
226 1 StatusWrapper->Sign = CSW_SIGNATURE;
227 1 StatusWrapper->Tag = WrapperTag;
228 1 StatusWrapper->DataResidueLen = 0;
229 1 StatusWrapper->Status = Status;
230 1 // 2. Set DMA related parameters and enable.
231 1 BulkSetDmaIn(CSW_LENGTH);
232 1 // 3. Wait for replying CSW.
233 1 BulkState = CSW_REPLY_COMPLETED;
234 1
235 1 }
236
237 //----------------------------------------------------------------------------
238 void InitBulkPipe()
239 {
240 1 BulkState = CBW_GET_COMPLETED;
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 5
241 1 CmdStatus = COMMAND_PASSED;
242 1
243 1 // Init Scsi Used Params.
244 1 ScsiInit();
245 1 }
246
247 //----------------------------------------------------------------------------
248 void UsbBulkIntHandler(BYTE IntEvent)
249 {
250 1 STATUS Status;
251 1 bool GoodCBW = true;
252 1 UINT16 CmdLen;
253 1
254 1 if(IntEvent & bmEPAINT)
255 1 {
256 2 if(BusResetFlag)//如果有bus reset发生
257 2 {
258 3 //BulkState = CBW_GET_COMPLETED;
259 3 //CmdStatus = COMMAND_PASSED;
260 3
261 3 Status = SdStopCmd();
262 3 SdCtrlReset();
263 3 BusResetFlag = false;
264 3 }
265 2 }
266 1
267 1 switch (BulkState)
268 1 {
269 2 case CBW_GET_COMPLETED:
270 2 case CSW_REPLY_COMPLETED:
271 2
272 2 BulkState = CBW_GET_COMPLETED;
273 2
274 2 if((IntEvent & bmEPAINT)==0) //
275 2 {
276 3 break;
277 3 }
278 2 SelectOutFifo();//Derek 12.26
279 2 if(FIFO_ADDRESS_OUT == DMA_FIFOA0)
280 2 { //Derek 12.26
281 3 ((TDataCast *)&CmdLen)->ucByte[0] = EPACNTH & 0x07;
282 3 ((TDataCast *)&CmdLen)->ucByte[1] = EPACNT0L;
283 3 } else {
284 3 ((TDataCast *)&CmdLen)->ucByte[0] = (EPACNTH & 0x70) >> 4;
285 3 ((TDataCast *)&CmdLen)->ucByte[1] = EPACNT1L;
286 3 }
287 2
288 2 if(BulkOutTogErr()) //是否发生DATA toggle错误
289 2 {
290 3 BulkFreeBuffer();
291 3 break;
292 3 }
293 2
294 2 if((CmdLen != CBW_LENGTH) && //CBW必须是31或32字节
295 2 (CmdLen != CBW_LENGTH_98))
296 2 {
297 3 BulkFreeBuffer();
298 3 break;
299 3 }
300 2
301 2 BulkCmdRunning = true;
302 2 ScsiCheckCmd();
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 6
303 2
304 2 break;
305 2
306 2 case BULK_DMA_IN_COMPLETED:
307 2
308 2 if((IntEvent & bmEPBINT) == 0)
309 2 break;
310 2
311 2 if(SectorCount == 0)
312 2 {
313 3 BulkPrepareCSW(CmdStatus);
314 3 }
315 2 else
316 2 {
317 3 Status = ReadNextSector();
318 3
319 3 if(Status != STATUS_SUCCESS)
320 3 {
321 4 CmdStatus = COMMAND_FAILED;
322 4 SetSenseDataRd(Status);
323 4 BulkInStall();
324 4 BulkState = STALL_IN_COMPLETED;
325 4 }
326 3 }
327 2 break;
328 2
329 2 case BULK_DMA_OUT_COMPLETED:
330 2
331 2 if((IntEvent & bmEPAINT) == 0)
332 2 break;
333 2
334 2 Status = STATUS_SUCCESS;
335 2
336 2 if(BulkOutTogErr())
337 2 {
338 3 SelectOutFifo();//SelectOutfifo()和BulkFreeBuffer配对使用!切记!
339 3 BulkFreeBuffer();
340 3 break;
341 3 }
342 2
343 2 if(ScsiDetectWriteProtect(ScsiLun))
344 2 {
345 3 Status = STATUS_WRITE_PROTECT;
346 3 CmdStatus = COMMAND_FAILED;
347 3 SelectOutFifo();//SelectOutfifo()和BulkFreeBuffer配对使用!切记!
348 3 BulkFreeBuffer();
349 3 }
350 2 else
351 2 {
352 3 if(FirstWrite)
353 3 {
354 4 Status = WriteSector();
355 4 FirstWrite = false;
356 4 }
357 3 else
358 3 Status = WriteNextSector();
359 3
360 3 }
361 2
362 2 if(Status != STATUS_SUCCESS)
363 2 {
364 3 CmdStatus = COMMAND_FAILED;
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 7
365 3 SetSenseDataWr(Status);
366 3 BulkInStall();
367 3 BulkState = STALL_IN_COMPLETED;
368 3 break;
369 3 }
370 2
371 2 if(SectorCount == 0)
372 2 BulkPrepareCSW(CmdStatus);
373 2 break;
374 2
375 2 case STALL_IN_COMPLETED: //读写过程有错后,进入此状态
376 2 if (IntEvent & bmEPAINT) // Keep receving out packets.
377 2 { SelectOutFifo(); //SelectOutfifo()和BulkFreeBuffer配对使用!切记!
378 3 BulkFreeBuffer(); //Derek 2007.01.11
379 3 }
380 2 if(EPBCS & bmTX0_SESTALL) //如果IN EP的STALL位被置1
381 2 {
382 3 if(CmdStatus == PHASE_ERROR)
383 3 CmdStatus = COMMAND_PASSED;
384 3
385 3 BulkState = CBW_GET_COMPLETED;
386 3
387 3 ScsiCmdSTALLed = true; //STALL标志变量置1
388 3
389 3 // Set RXTXEN to receive next OUT packet.
390 3 if(!(EPACS & bmEP_RXTXEN))
391 3 BulkSetDmaOut(); //允许OUT 端点再次接收数据,为下次传输做准备
392 3 }
393 2 break;
394 2
395 2 default:
396 2 BulkInStall();
397 2 BulkState = STALL_IN_COMPLETED;
398 2 break;
399 2 }
400 1 }
401 //-----------------------
402 //用作BUS RESET后的处理
403 //-----------------------
404 void BusResetDeal(void)//2007.01.22
405 {
406 1 STINT = STINT & (~bmUSBRSTINT);
407 1 while (!(USBGCTRL & bmHS_DETECTED)); // detect USB speed
408 1 HighSpeed = USBGCTRL & bmSPEED; // High speed
409 1 //无论低速高速,reset后都要将FIFO_TOGGLE位清零。
410 1 if (HighSpeed)
411 1 {
412 2 EPAFIFOCS = 0xF0; //06.08.28
413 2 EPBFIFOCS = 0xF0; //06.08.28
414 2 }else
415 1 { //如果是低速主机接口-06.08.28//Derek
416 2 EPAFIFOCS = 0xF2; //06.08.28
417 2 EPBFIFOCS = 0xF2; //06.08.28
418 2 }
419 1 SW_RST |= bmUSB_RST; //USB software reset Derek 10.23
420 1 UsbInit(); //重新配置端点属性
421 1 BusResetFlag = true; //Derek 09.06
422 1 SW_IN_FIFO_Toggle = 0; //12.29 software toggle bit reset
423 1 SW_OUT_FIFO_Toggle = 0;
424 1 }
C51 COMPILER V7.02b BULKCMD 02/27/2008 12:54:50 PAGE 8
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 983 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 27 6
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -