📄 mainloop.lst
字号:
264 3 if(BOTFSM_IDLE) //BOTFSM_IDLE = BOTFSMstate^0
265 3 {
266 4 Hal4Sys_D12CmdPortOutB( 0x04);// SelectEP BulkOut
267 4 FlexByte = Hal4Sys_D12DataPortInB();
268 4 if(FlexByte_b0 == 1) // BulkOut Full
269 4 TPBulk_CBWHandler(); // Goto BOTFSMstate_CBWProc
270 4 // Hal4D12_ReadLastTransactionStatus(5);
271 4 } // if BOT in IDLE
272 3
273 3
274 3 while(BOTFSM_DataOut) //BOTFSM_DataOut = BOTFSMstate^3
275 3 {
276 4 Hal4Sys_D12CmdPortOutB( 0x04);// 选择端点4
277 4 FlexByte = Hal4Sys_D12DataPortInB(); //读取端点状态
278 4 if(FlexByte_b0 == 0) // 端点为空退出
279 4 break;
280 4
281 4 Hal4Sys_D12CmdPortOutB( 0xF0); // 发读D12数据指令
282 4 Hal4Sys_D12DataPortInB(); // 没效数据
283 4 FlexByte = Hal4Sys_D12DataPortInB();// 读取D12缓冲区数据长度
284 4
285 4 if(BOTXfer_atATA) //BOTXfer_atATA = Xfer_Space^5
286 4 MLsup_XferPktFrUSB2IDE();
287 4 else
288 4 if(BOTXfer_atRAM || BOTXfer_atROM)
289 4 MLsup_XferPktFrUSB2MEM(FlexByte);
290 4
291 4 BOTXfer_pdata += FlexByte; // 已传输数据地址指针
292 4 BOTXfer_wResidue -= FlexByte; // 沉余字节数
293 4 if(BOTXfer_wResidue == 0)
294 4 {
295 5 TPBulk_CSWHandler(); // Goto BOTFSMstate_CSWProc
296 5 }
297 4 }//BOTFSM_DATAOUT
298 3
299 3
300 3 while(BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
301 3 {
302 4 Hal4Sys_D12CmdPortOutB( 0x05);// SelectEP BulkIn
303 4 FlexByte = Hal4Sys_D12DataPortInB();
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 6
304 4 if(FlexByte_b0 == 1) // BulkIn is full
305 4 break;
306 4
307 4 if(BOTXfer_atATA)
308 4 {
309 5 MLsup_XferPktFrIDE2USB(); //从IDE写到USB
310 5 FlexByte = EP2_PACKET_SIZE; //EP2_PACKET_SIZE=64
311 5 }
312 4 else if(BOTXfer_atRAM || BOTXfer_atROM)
313 4 FlexByte = MLsup_XferPktFrMEM2USB(); //从MEMORY 写到 USB
314 4
315 4 BOTXfer_pdata += FlexByte;
316 4 BOTXfer_wResidue -= FlexByte; //沉余字节数
317 4 if(BOTXfer_wResidue == 0)
318 4 { TPBulk_CSWHandler();// Goto BOTFSMstate_CSWProc
319 5 BOTFSM_DataIn = 0 ;//*******
320 5 }
321 4 } // BOTFSM_DataIn
322 3
323 3
324 3 if(BOTFSM_CSW) //BOTFSM_CSW = BOTFSMstate^5
325 3 {
326 4 Hal4Sys_D12CmdPortOutB( 0x05);// SelectEP BulkIn
327 4 FlexByte = Hal4Sys_D12DataPortInB();
328 4 if(FlexByte_b0 == 0) // BulkIn is empty
329 4 {
330 5 FlexByte = MLsup_XferPktFrMEM2USB();
331 5 BOTXfer_pdata += FlexByte;
332 5 BOTXfer_wResidue -= FlexByte;
333 5 if(BOTXfer_wResidue == 0)
334 5
335 5 Hal4D12_ReadLastTransactionStatus(5);
336 5 BOTFSMstate = USBFSM4BOT_IDLE; // Goto BOTFSMstate_IDLE
337 5 }
338 4 }
339 3 }
340 2 LowerIRQL();
341 2 }
342 1 }
343
344
345 void MLsup_DisconnectUSB(void) //断开USB
346 {
347 1 RaiseIRQL();
348 1 // Initialize D12 configuration
349 1 Hal4D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
350 1 }
351
352
353 void MLsup_ConnectUSB(void) //联接USB
354 {
355 1 // reset event flags
356 1 RaiseIRQL();
357 1 // No DMA, No IRQ from EPI4 & EPI5
358 1 Hal4D12_SetDMA(0);
359 1 // Initialize D12 configuration
360 1 Hal4D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_4M);
361 1 }
362
363
364 void MLsup_ReconnectUSB(void) //重接USB
365 {
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 7
366 1 D12SUSPD = 0;
367 1 MLsup_DisconnectUSB();
368 1 // Make sure disconnect time > 2.5 uS
369 1 LowerIRQL();
370 1 Hal4Sys_WaitInMS(100);
371 1 MLsup_ConnectUSB();
372 1 }
373
374
375 void MLsup_USBSetupTokenHandler(void)
376 {
377 1 D12BF_SetupOverwritten = 0;
378 1 DCPXfer_wResidue = 0;
379 1
380 1 tempvars4UsbReq.chars.c0 = Hal4D12_ReadEndpoint(0, sizeof(DEVICE_REQUEST),(INT8 *)(&(DCPDeviceRequest)
-));
381 1 if( tempvars4UsbReq.chars.c0 == sizeof(DEVICE_REQUEST) )
382 1 {
383 2 DCPDeviceRequest.wValue = Hal4Sys_SwapINT16(DCPDeviceRequest.wValue);
384 2 DCPDeviceRequest.wIndex = Hal4Sys_SwapINT16(DCPDeviceRequest.wIndex);
385 2 DCPDeviceRequest.wLength = Hal4Sys_SwapINT16(DCPDeviceRequest.wLength);
386 2
387 2 if(DCPDeviceRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)//USB_ENDPOINT_DIRECTION_MASK=0x80
388 2 {
389 3 // get command
390 3 REQBF_DCPRequest_dir = 1; // REQBF_DCPRequest_dir = bFlags.value^3
391 3 }
392 2 else
393 2 {
394 3 // Set command without Data stage
395 3 // or
396 3 // Set command with Data Buffer
397 3 REQBF_DCPRequest_dir = 0;
398 3 }
399 2
400 2 if(DCPDeviceRequest.wIndex & USB_ENDPOINT_DIRECTION_MASK)
401 2 {
402 3 REQBF_DCPRequest_EPdir = 1;
403 3 }
404 2 else
405 2 {
406 3 REQBF_DCPRequest_EPdir = 0;
407 3 }
408 2
409 2 // USBDeviceRequest_Handler();
410 2 UsbReq_Recipient = DCPDeviceRequest.bmRequestType & USB_RECIPIENT;
411 2
412 2 UsbReq_Type = DCPDeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
413 2 UsbReq_Request = DCPDeviceRequest.bRequest & USB_REQUEST_MASK;
414 2
415 2 if ( REQBF_DCPRequest_dir || (DCPDeviceRequest.wLength == 0))
416 2 {
417 3 // For Get command via Control In
418 3 // For Set command without Data Stage via Control Out
419 3 // First of all, AckSetup to make it available for BUFFER fill in fifo
420 3 MLsup_AcknowledgeSETUP(); // A needle hole for Setup TK overwritten
421 3 if(D12BF_SetupOverwritten)
422 3 return;
423 3 }
424 2
425 2
426 2 // REQBF_StallDCPRequest = 0; // has been cleared already!
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 8
427 2 if ( (UsbReq_Type == USB_STANDARD_REQUEST) && (UsbReq_Request<MAX_STD_REQUEST))
428 2 {
429 3 (*StandardDeviceRequest[UsbReq_Request])();
430 3 }
431 2 else if((UsbReq_Type == USB_CLASS_REQUEST))
432 2 {
433 3 UsbReq_Request = 0xFF - UsbReq_Request;
434 3 if(UsbReq_Request < MAX_CLASS_REQUEST)
435 3 (*ClassDeviceRequest[UsbReq_Request])();
436 3 }
437 2 /* else if((UsbReq_Type == USB_VENDOR_REQUEST) &&(UsbReq_Request<MAX_VENDOR_REQUEST))
438 2 {
439 2 (*VendorDeviceRequest[UsbReq_Request])();
440 2 }
441 2 */
442 2 else
443 2 {
444 3 REQBF_StallDCPRequest = 1;
445 3 }
446 2
447 2 if(REQBF_StallDCPRequest)
448 2 {
449 3 MLsup_StallEP0();
450 3 }
451 2 else if ( (!REQBF_DCPRequest_dir) && (DCPDeviceRequest.wLength != 0))
452 2 {
453 3 // For Set command with Data Stage via Control Out
454 3 // First of all, AckSetup to make it available for Buffer Out Clearing
455 3 MLsup_AcknowledgeSETUP(); // A needle hole for Setup TK overwritten
456 3 }
457 2 }
458 1 else
459 1 {
460 2 MLsup_StallEP0();
461 2 }
462 1
463 1 }
464
465
466 void MLsup_AcknowledgeSETUP(void)
467 {
468 1 // Give a needle hole for Setup Overwritten as well as ISR
469 1 LowerIRQL();
470 1 RaiseIRQL();
471 1 if(!D12BF_SetupOverwritten)
472 1 Hal4D12_AcknowledgeSETUP();
473 1 }
474
475
476 void MLsup_StallEP0(void)
477 {
478 1 // Give a needle hole for Setup Overwritten as well as ISR
479 1 LowerIRQL();
480 1 RaiseIRQL();
481 1 if(!D12BF_SetupOverwritten)
482 1 {
483 2 DCPFSMstate = USBFSM4DCP_STALL;
484 2 Hal4D12_StallEP0();
485 2 }
486 1 }
487
488
C51 COMPILER V7.06 MAINLOOP 02/17/2004 14:42:22 PAGE 9
489 void MLsup_XferPktFrUSB2MEM(INT8 Len) // 从D12读取数据到MEMORY
490 {
491 1 TPBulksup_ReadFrBOEP(Len); // 批量读取数据
492 1 }
493
494
495 INT8 MLsup_XferPktFrMEM2USB(void)
496 {
497 1 if(BOTXfer_wResidue > EP2_PACKET_SIZE )
498 1 return TPBulksup_WriteToBIEP(EP2_PACKET_SIZE);
499 1 else
500 1 return TPBulksup_WriteToBIEP((INT8)BOTXfer_wResidue);
501 1 }
502
503
504 void MLsup_XferPktFrUSB2IDE(void)
505 {
506 1 INT8 c0;
507 1 for(c0=EP2_PACKET_SIZE/2 ; c0!=0; c0--)
508 1 MLsup_XferWordFrUSB2IDE();
509 1 Hal4Sys_D12CmdPortOutB( 0xF2); // 清D12缓冲区
510 1 Hal4ATA_SectCntInBlk -- ;
511 1 if( Hal4ATA_SectCntInBlk == 0) //写满扇区
512 1 {
513 2 Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
514 2 // Hal4ATA_WaitOnBusyNDrq();
515 2 Hal4ATA_WaitOnBusy();
516 2 }
517 1 }
518
519
520 void MLsup_XferPktFrIDE2USB(void)
521 {
522 1 INT8 c0;
523 1 Hal4Sys_D12CmdPortOutB( 0xF0); // 发写缓冲区指令
524 1 Hal4Sys_D12DataPortOutB(0); // 第一字节没效总为0
525 1 Hal4Sys_D12DataPortOutB(EP2_PACKET_SIZE); // LO BYTE of Buffer Len
526 1 for(c0=EP2_PACKET_SIZE/2 ; c0!=0; c0--)
527 1 MLsup_XferWordFrIDE2USB(); //从IDE写一个字(16位)到USB
528 1
529 1 Hal4Sys_D12CmdPortOutB( 0xFA); //使缓冲区有效
530 1
531 1 Hal4ATA_SectCntInBlk -- ;
532 1 if( Hal4ATA_SectCntInBlk == 0)
533 1 {
534 2 Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;//传送的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -