?? mainloop.lst
字號:
265 4 printf("DMA_State = DMA_RUNNING.\n");
266 4 else if(bEPPflags.bits.dma_state == DMA_PENDING)
267 4 printf("DMA_State = DMA_PENDING.\n");
268 4
269 4 printf("Last Device Request: bmRequestType = 0x%bx, bRequest= 0x%bx, wValue = 0x%x, wLength = 0x%x, w
-Index = 0x%x.\n",
270 4
271 4 ControlData.DeviceRequest.bmRequestType,
272 4 ControlData.DeviceRequest.bRequest,
273 4 ControlData.DeviceRequest.wValue,
274 4 ControlData.DeviceRequest.wLength,
275 4 ControlData.DeviceRequest.wIndex);
276 4
277 4 printf("Data: ");
278 4 for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
279 4 printf("0x%bx, ", *((ControlData.dataBuffer)+i));
280 4 printf("\n");
281 4
282 4 break;
283 4 case '\r':
284 4 reconnect_USB();
285 4 break;
286 4
287 4 case 'v':
288 4 if(bEPPflags.bits.verbose == 0) {
289 5 printf("Verbose Mode = ON.\n");
290 5 DISABLE;
291 5 bEPPflags.bits.verbose = 1;
292 5 ENABLE;
293 5 }
294 4 else {
295 5 printf("Verbose Mode = OFF.\n");
296 5 DISABLE;
297 5 bEPPflags.bits.verbose = 0;
298 5 ENABLE;
299 5 }
300 4 break;
C51 COMPILER V7.02b MAINLOOP 11/08/2003 21:22:47 PAGE 6
301 4 default:
302 4 break;
303 4 }
304 3 }
305 2
306 2 if (bEPPflags.bits.bus_reset) {//設(shè)備復(fù)位處理
307 3 DISABLE;
308 3 bEPPflags.bits.bus_reset = 0;
309 3 ENABLE;
310 3 // Release D12's SUSPEND pin after bus reset
311 3 // Enable 74HCT123 pulse generation before disconnect
312 3 D12SUSPD = 1;
313 3 } // if bus reset
314 2
315 2 if (bEPPflags.bits.suspend) {//掛起改變處理
316 3 DISABLE;
317 3 bEPPflags.bits.suspend= 0;
318 3 ENABLE;
319 3
320 3 if(D12SUSPD == 1) {//掛起處理
321 4 D12SUSPD = 0;
322 4 P0 = 0xFF;
323 4 P1 = 0xFF;
324 4 P2 = 0xFF;
325 4 P3 = 0xFF;
326 4 D12_SetDMA(0xC3);
327 4 D12SUSPD = 1;
328 4 PCON |= 0x02;
329 4 while (1);
330 4 }
331 3 } // if suspend change
332 2
333 2 if (bEPPflags.bits.setup_packet){//Setup包處理
334 3 DISABLE;
335 3 bEPPflags.bits.setup_packet = 0;
336 3 ENABLE;
337 3 control_handler();//調(diào)用請求處理子程序
338 3 D12SUSPD = 1;
339 3 } // if setup_packet
340 2
341 2 if(bEPPflags.bits.setup_dma != 0) {//DMA狀態(tài)改變處理
342 3 DISABLE;
343 3 bEPPflags.bits.setup_dma --;
344 3 ENABLE;
345 3 setup_dma();
346 3 } // if setup_dma
347 2
348 2 } // Main Loop
349 1 }
350
351
352 /**************************************************************************************************/
353 /*************************************************************************************************/
354
355
356
357 //返回stall應(yīng)答
358 void stall_ep0(void)
359 {
360 1 D12_SetEndpointStatus(0, 1);
361 1 D12_SetEndpointStatus(1, 1);
362 1 }
C51 COMPILER V7.02b MAINLOOP 11/08/2003 21:22:47 PAGE 7
363
364 //斷開USB總線
365 void disconnect_USB(void)
366 {
367 1 // Initialize D12 configuration
368 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
369 1 }
370
371 //連接USB總線
372 void connect_USB(void)
373 {
374 1 // reset event flags
375 1 DISABLE;
376 1 bEPPflags.value = 0;//清除所有狀態(tài)
377 1 ENABLE;
378 1
379 1 // V2.1 enable normal+sof interrupt
380 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
381 1
382 1 // Initialize D12 configuration
383 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
384 1 }
385
386 //重新連接到USB總線
387 void reconnect_USB(void)
388 {
389 1 unsigned long clk_cnt;
390 1
391 1 MCU_LED0 = 0;
392 1 MCU_LED1 = 0;
393 1
394 1 // Pull-down D12's SUSPEND pin
395 1 // Disable 74HCT123 pulse generation before disconnect
396 1 // Release D12's SUSPEND pin after receiving bus reset from host
397 1 D12SUSPD = 0;
398 1 disconnect_USB();
399 1
400 1 printf("Wait for 1 second ...\n");
401 1
402 1 clk_cnt = ClockTicks;
403 1 while(ClockTicks < clk_cnt + 20)
404 1 ;
405 1
406 1 connect_USB();
407 1
408 1 MCU_LED0 = 1;
409 1 MCU_LED1 = 1;
410 1 }
411
412 //恢復(fù)到未配置狀態(tài)
413 void init_unconfig(void)
414 {
415 1 // unsigned char i;
416 1
417 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
418 1 }
419
420 //設(shè)置配置狀態(tài)
421 void init_config(void)
422 {
423 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
424 1 }
C51 COMPILER V7.02b MAINLOOP 11/08/2003 21:22:47 PAGE 8
425
426 //從端點號1發(fā)送數(shù)據(jù)
427 void single_transmit(unsigned char * buf, unsigned char len)
428 {
429 1 if( len <= EP0_PACKET_SIZE) {
430 2 D12_WriteEndpoint(1, len, buf);
431 2 }
432 1 }
433
434 //發(fā)送端點號1建立代碼
435 void code_transmit(unsigned char code * pRomData, unsigned short len)
436 {
437 1 ControlData.wCount = 0;
438 1 if(ControlData.wLength > len)
439 1 ControlData.wLength = len;
440 1
441 1 ControlData.pData = pRomData;
442 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
443 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//發(fā)送16字節(jié)數(shù)據(jù)
444 2 ControlData.wCount += EP0_PACKET_SIZE;
445 2 DISABLE;
446 2 bEPPflags.bits.control_state = USB_TRANSMIT;
447 2 ENABLE;
448 2 }
449 1 else {
450 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//發(fā)送16字節(jié)內(nèi)數(shù)據(jù)
451 2 ControlData.wCount += ControlData.wLength;
452 2 DISABLE;
453 2 bEPPflags.bits.control_state = USB_IDLE;
454 2 ENABLE;
455 2 }
456 1 }
457
458 //LED和按鍵處理子程序
459 void check_key_LED(void)
460 {
461 1 static unsigned char c, last_key = 0xf;
462 1
463 1 c = MCU_SWM0 & MCU_SWM1;
464 1 c &= 0x0f;
465 1 if (c != last_key) {
466 2 D12_WriteEndpoint(3, 1, &c);//發(fā)送按鍵狀態(tài)
467 2 }
468 1
469 1 last_key = c;
470 1
471 1 if(bEPPflags.bits.ep1_rxdone) {
472 2 DISABLE;
473 2 bEPPflags.bits.ep1_rxdone = 0;
474 2 ENABLE;
475 2 MCU_LED0 = !(GenEpBuf[3] & 0x1);//改變LED狀態(tài)
476 2 MCU_LED1 = !(GenEpBuf[3] & 0x2);
477 2 }
478 1 }
479
480 //DMA建立子程序
481 void setup_dma()
482 {
483 1 ioSize = ioRequest.uSize;
484 1 ioCount = 0;
485 1
486 1 DISABLE;
C51 COMPILER V7.02b MAINLOOP 11/08/2003 21:22:47 PAGE 9
487 1 bEPPflags.bits.dma_state = DMA_RUNNING;
488 1 ENABLE;
489 1
490 1 single_transmit(0, 0);
491 1
492 1 if(ioRequest.bCommand & 0x1) {
493 2 if(ioSize > 64 || ioSize == 0) {
494 3 //傳輸大于64字節(jié)數(shù)據(jù)
495 3 D12_WriteEndpoint(5, 64, EpBuf);
496 3 ioCount += 64;
497 3 }
498 2 else {
499 3 //傳輸64字節(jié)數(shù)據(jù)
500 3 D12_WriteEndpoint(5, ioSize, EpBuf);
501 3 ioCount += ioSize;
502 3 }
503 2 }
504 1 }
505
506 //請求處理子程序
507 void control_handler()
508 {
509 1 unsigned char type, req;
510 1
511 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
512 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
513 1
514 1 help_devreq(type, req); //顯示設(shè)備請求
515 1
516 1 if (type == USB_STANDARD_REQUEST)
517 1 (*StandardDeviceRequest[req])();//調(diào)用標(biāo)準(zhǔn)請求
518 1 else if (type == USB_VENDOR_REQUEST)
519 1 (*VendorDeviceRequest[req])();//調(diào)用廠商請求
520 1 else
521 1 stall_ep0();
522 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1324 ----
CONSTANT SIZE = 919 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -