⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.lst

📁 usb接口的移动硬盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -