?? usb.lst
字號:
315
316 unsigned char read_a_usb_data(void) //讀一字節USB數據
317 {
318 1 unsigned char temp;
319 1 USB_A0=USB_DATA_ADD;
320 1 USB_RD=0;
321 1 temp=USB_DATA;
322 1 USB_RD=1;
323 1 return temp;
324 1 }
325
326
327 void read_interrupt_register(void) //讀USB中斷寄存器
328 {
329 1 write_usb_command(Read_Interrupt_Register);
330 1 Interrupt_Register[0]=read_a_usb_data();
331 1 Interrupt_Register[1]=read_a_usb_data();
332 1 }
333
334 void set_usb_addr(unsigned char addr) //設置USB地址
335 {
336 1 write_usb_command(Set_Address);
337 1 write_a_usb_data(0x80|addr);
338 1 }
339
340 void set_endpoint_enable(void) //端點使能
341 {
342 1 write_usb_command(Set_Endpoint_Enable);
343 1 write_a_usb_data(0x01);
344 1 }
345
346 unsigned char select_endpoint(unsigned char endp) //選擇終端點
347 {
348 1 write_usb_command(Select_EndPoint+endp);
349 1 return read_a_usb_data();
350 1 }
351
352 unsigned char read_last_status(unsigned char endp) //讀端點最后狀態
353 {
354 1 write_usb_command(Read_Last_Status+endp);
355 1 return read_a_usb_data();
356 1 }
357
358 void set_endpoint_status(unsigned char endp,unsigned char status) //設置端點狀態
359 {
360 1 write_usb_command(0x40+endp);
361 1 write_a_usb_data(!status);
362 1 }
C51 COMPILER V7.06 USB 03/02/2006 23:51:19 PAGE 7
363
364 unsigned char read_endpoint_status(unsigned char endp) //讀端點狀態
365 {
366 1 write_usb_command(0x80+endp);
367 1 return read_a_usb_data();
368 1 }
369
370 void clear_buffer(void) //清緩沖,在讀取緩沖數據后調用
371 {
372 1 write_usb_command(Clear_Buffer);
373 1 }
374
375 void validate_buffer(void) //緩沖區數據有效,在寫緩沖后調用
376 {
377 1 write_usb_command(Validate_Buffer);
378 1 }
379
380 void ack_setup(unsigned char endp) //應答建立包
381 {
382 1 select_endpoint(endp);
383 1 write_usb_command(Ack_Setup);
384 1 }
385
386 void error(unsigned char number) //出錯處理
387 {
388 1 // unsigned char Error[]={"ERROR: "};
389 1 // prints(Error);
390 1 // printc(number);
391 1 number=0;
392 1 }
393
394 unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff) //讀終端點緩
-沖
395 {
396 1 unsigned char i,j;
397 1 read_last_status(endp);
398 1 if(!(select_endpoint(endp))&0x01){error(0); return 0;}
399 1 read_endpoint_status(endp);
400 1 write_usb_command(Read_Buffer);
401 1 read_a_usb_data();
402 1 j=read_a_usb_data();
403 1 if(j>len)
404 1 j=len;
405 1 for(i=0;i<j;i++)
406 1 {
407 2 USB_RD=0;
408 2 buff[i]=USB_DATA;
409 2 USB_RD=1;
410 2 }
411 1 clear_buffer();
412 1 return j;
413 1 }
414
415 unsigned char write_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff) //寫終端點
-緩沖
416 {
417 1 unsigned char i;
418 1 read_last_status(endp);
419 1 select_endpoint(endp);
420 1 write_usb_command(Write_Buffer);
421 1 write_a_usb_data(0);
422 1 write_a_usb_data(len);
C51 COMPILER V7.06 USB 03/02/2006 23:51:19 PAGE 8
423 1 for(i=0;i<len;i++)
424 1 {
425 2 USB_DATA=*(buff+i);
426 2 USB_WR=0;
427 2 USB_WR=1;
428 2 }
429 1 USB_DATA=0XFF;
430 1 validate_buffer();
431 1 return len;
432 1 }
433
434 void disconnect_usb(void)
435 {
436 1 write_usb_command(0xf3);
437 1 write_a_usb_data(0x0e);
438 1 write_a_usb_data(0x47);
439 1 delay(100);
440 1 }
441
442 void connect_usb(void) //連接USB
443 {
444 1 write_usb_command(0xf3); //初始化USBD12
445 1 write_a_usb_data(0x1e); //連接USB
446 1 write_a_usb_data(0x47); //設置頻率
447 1 }
448
449 void init_usb(void) //初始化USB
450 {
451 1 set_usb_addr(0);
452 1 set_endpoint_enable();
453 1 }
454
455 void usb_bus_reset(void) //USB總線復位處理
456 {
457 1 // code unsigned char Usb_Bus_Reset[]={"USB BUS RESET"};
458 1 // prints(Usb_Bus_Reset);
459 1 usb_flags_Register=0;
460 1 set_endpoint_enable();
461 1 SCSI_Command=1;
462 1 SCSI_Data=0;
463 1 csw.dCSWSignature=0x55534253;
464 1
465 1 }
466
467 void usb_bus_suspend(void) //USB總線掛起處理
468 {
469 1 // code unsigned char Usb_Bus_Suspend[]={"USB BUS SUSPEND"};
470 1 // prints(Usb_Bus_Suspend);
471 1 // send_to_comport(10);
472 1 }
473
474 void set_usb_address(void) //設置地址
475 {
476 1 USB_set_addr=1;
477 1 while(select_endpoint(1)&0x01);
478 1 write_endpoint_buff(1,0,0);
479 1 set_usb_addr(Control_Data.DeviceRequest.wValue);
480 1 USB_usb_endp0_in=0;
481 1 USB_setup_packet_out=0;
482 1 }
483
484 void get_status(unsigned char receiver) //獲取狀態響應
C51 COMPILER V7.06 USB 03/02/2006 23:51:19 PAGE 9
485 {
486 1 unsigned char status[2];
487 1 switch (receiver)
488 1 {
489 2 case 0: //獲取設備狀態
490 2 status[0]=0x00;
491 2 status[1]=0x00;
492 2 break;
493 2 case 1: //獲取接口狀態
494 2 status[0]=0x00;
495 2 status[0]=0x00;
496 2 break;
497 2 case 2: //獲取端點狀態
498 2 status[0]=0x00;
499 2 status[1]=0x00;
500 2 break;
501 2 }
502 1 write_endpoint_buff(1,2,status);
503 1 USB_usb_endp0_in=0;
504 1 }
505
506 void clear_feature(unsigned char receiver)
507 {
508 1 receiver=0;
509 1 write_endpoint_buff(1,0,0);
510 1 USB_usb_endp0_in=0;
511 1 USB_setup_packet_out=0;
512 1 }
513
514 void set_feature(unsigned char receiver)
515 {
516 1 receiver=0;
517 1 write_endpoint_buff(1,0,0);
518 1 USB_usb_endp0_in=0;
519 1 USB_setup_packet_out=0;
520 1 }
521
522 void set_descriptor(void)
523 {
524 1 USB_usb_endp0_in=0;
525 1 USB_setup_packet_out=0;
526 1 }
527
528 void set_configuration(void)
529 {
530 1 write_endpoint_buff(1,0,0);
531 1 USB_usb_endp0_in=0;
532 1 USB_setup_packet_out=0;
533 1 }
534
535 void get_configuration(void) //獲取配置狀態
536 {
537 1 unsigned char value=0x01;
538 1 write_endpoint_buff(1,1,&value);
539 1 USB_usb_endp0_in=0;
540 1 }
541
542 void set_interface(void) //設置接口
543 {
544 1 write_endpoint_buff(1,0,0);
545 1 USB_usb_endp0_in=0;
546 1 USB_setup_packet_out=0;
C51 COMPILER V7.06 USB 03/02/2006 23:51:19 PAGE 10
547 1 }
548
549 void get_interface(void) //獲取接口狀態
550 {
551 1 unsigned char value=0x01;
552 1 write_endpoint_buff(1,1,&value);
553 1 USB_usb_endp0_in=0;
554 1 }
555
556 void get_max_LUN(void) //獲取磁盤最大邏輯單元號
557 {
558 1 unsigned char max_LUN=MAX_LUN; //只有一個邏輯單元
559 1 write_endpoint_buff(1,1,&(max_LUN));
560 1 USB_usb_endp0_in=0;
561 1 }
562
563 void mass_storage_reset(void) //USB大容量存儲設備復位
564 {
565 1 write_endpoint_buff(1,0,0);
566 1 USB_usb_endp0_in=0;
567 1 USB_setup_packet_out=0;
568 1 SCSI_Command=1;
569 1 SCSI_Data=0;
570 1 }
571
572
573 void get_descriptor(void) //獲取描述符
574 {
575 1 if(!USB_not_end)
576 1 {
577 2 switch(MSB(Control_Data.DeviceRequest.wValue))
578 2 {
579 3 case DEVICE_DESCRIPTOR:
580 3 Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
581 3 Control_Data.pData=(unsigned char *)(&device_descriptor);
582 3 break;
583 3 case CONFIGURATION_DESCRIPTOR:
584 3 Control_Data.wCount=SWAP(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
585 3 Control_Data.pData=(unsigned char *)(&con_int_endp_descriptor);
586 3 if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
587 3 break;
588 3 case STRING_DESCRIPTOR:
589 3 if(LSB(Control_Data.DeviceRequest.wValue)==0)
590 3 {
591 4 Control_Data.wCount=LANGUAGE_ID[0];
592 4 Control_Data.pData=LANGUAGE_ID;
593 4 }
594 3 if(LSB(Control_Data.DeviceRequest.wValue)==2)
595 3 {
596 4 Control_Data.wCount=device_serial_number[0];
597 4 Control_Data.pData=device_serial_number;
598 4 }
599 3 break;
600 3 }
601 2 if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
602 2 }
603 1
604 1 if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
605 1 {
606 2 write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
607 2 Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
608 2 Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
C51 COMPILER V7.06 USB 03/02/2006 23:51:19 PAGE 11
609 2 if(USB_set_addr)USB_not_end=1;
610 2 else USB_usb_endp0_in=0;
611 2 return;
612 2 }
613 1 else
614 1 {
615 2 write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
616 2 USB_setup_packet_in=0;
617 2 USB_usb_endp0_in=0;
618 2 return;
619 2 }
620 1 }
621
622 void endp0_out(void) //終端點0輸出中斷處理
623 {
624 1 Last_Status_Register=read_last_status(0);
625 1 if(Last_Status_setup_packet)
626 1 {
627 2 Control_Data.wLength=0;
628 2 Control_Data.wCount=0;
629 2 if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceReque
-st)))!=sizeof(REQUESTCMD))
630 2 {
631 3 set_endpoint_status(0,0);
632 3 set_endpoint_status(1,0);
633 3 return;
634 3 }
635 2 Control_Data.DeviceRequest.wValue=SWAP(Control_Data.DeviceRequest.wValue);
636 2 Control_Data.DeviceRequest.wIndex=SWAP(Control_Data.DeviceRequest.wIndex);
637 2 Control_Data.DeviceRequest.wLength=SWAP(Control_Data.DeviceRequest.wLength);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -