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

📄 chap9.c

📁 采用Atmeag162单片机来制作的U盘程序源码
💻 C
字号:
#include <macros.h>
#include <stdio.h>
#include <string.h>

#include "D12CI.H"
#include "MAIN.H"
#include "USB100.H"
#include "CHAP9.H"

extern void single_transmit(unsigned char *buf,unsigned char len);
extern void code_transmit(const unsigned char * pRomData,unsigned short len);
extern void stall_ep0(void);
extern void init_unconfig(void);
extern void init_config(void);

#define NUM_ENDPOINTS 4
#define CONFIG_DESCRIPTOR_LENGTH  sizeof(USB_CONFIGURATION_DESCRIPTOR)\
                                 +sizeof(USB_INTERFACE_DESCRIPTOR)\
                                 +(NUM_ENDPOINTS*sizeof(USB_ENDPOINT_DESCRIPTOR))
extern CONTROL_XFER ControlData;
extern IO_REQUEST   ioRequest;
extern EPPFLAGS     bEPPflags;

const USB_DEVICE_DESCRIPTOR DeviceDescr=
{
  sizeof(USB_DEVICE_DESCRIPTOR),
  USB_DEVICE_DESCRIPTOR_TYPE,
  0x0001,//SWAP(0x0100),
  0,//USB_CLASS_CODE_TEST_CLASS_DEVICE,
  0,
  0,
  EP0_PACKET_SIZE,
  0x8405,//SWAP(0x0471),
  0x0100,//SWAP(0x0666),
  0x0001,//SWAP(0x0100),
  0,
  0,
  0,
  0x01
};
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
{
  sizeof(USB_CONFIGURATION_DESCRIPTOR),
  USB_CONFIGURATION_DESCRIPTOR_TYPE,
  CONFIG_DESCRIPTOR_LENGTH,//SWAP(CONFIG_DESCRIPTOR_LENGTH),
  1,
  1,
  0,
  0x80,
  0xfa
};
const USB_INTERFACE_DESCRIPTOR InterfaceDescr=
{
  sizeof(USB_INTERFACE_DESCRIPTOR),
  USB_INTERFACE_DESCRIPTOR_TYPE,
  0,
  0,
  NUM_ENDPOINTS,
  USB_DEVICE_CLASS_STORAGE,
  0x06,//SCSI
  0x50,//bulk only Transport
  0
};
const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr=
{
  sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x81,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
  10
};
const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr=
{
  sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x1,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
  10
};
const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr=
{
  sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x82,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
  10
};
const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr=
{
  sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x2,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
  10
};
//USB Protocol layer
void reserved(void)
{
  stall_ep0();
}
//USB standard device requests
void get_status(void)
{
  unsigned char endp,txdat[2];
  unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
  unsigned char c;
  if(bRecipient==USB_RECIPIENT_DEVICE)
  {
    if(bEPPflags.bits.remote_wakeup==1)
       txdat[0]=3;
    else
       txdat[0]=1;
    txdat[1]=0;
    single_transmit(txdat,2);
  }
  else if(bRecipient==USB_RECIPIENT_INTERFACE)
  {
    txdat[0]=0;
    txdat[1]=0;
    single_transmit(txdat,2);
  }
  else if(bRecipient==USB_RECIPIENT_ENDPOINT)
  {
    endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
    if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
       c=D12_SelectEndpoint(endp*2+1);
    else
       c=D12_SelectEndpoint(endp*2);
    if(c&D12_STALL)
       txdat[0]=1;
    else
       txdat[0]=0;
    txdat[1]=0;
    single_transmit(txdat,2);
   }
  else  stall_ep0();
}
void clear_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
  if(bRecipient==USB_RECIPIENT_DEVICE
        &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
  {
     DISABLE;
     bEPPflags.bits.remote_wakeup=0;
     ENABLE;
     single_transmit(0,0);
  }
  else if(bRecipient==USB_RECIPIENT_ENDPOINT
       &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
  {
        endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
        if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
            D12_SetEndpointStatus(endp*2+1,0);
        else
            D12_SetEndpointStatus(endp*2,0);
        single_transmit(0,0);
  }
  else  stall_ep0();
}
void set_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
  if(bRecipient==USB_RECIPIENT_DEVICE
        &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
  {
     DISABLE;
     bEPPflags.bits.remote_wakeup=1;
     ENABLE;
     single_transmit(0,0);
  }
  else if(bRecipient==USB_RECIPIENT_ENDPOINT
       &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
  {
        endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
        if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
            D12_SetEndpointStatus(endp*2+1,1);
        else
            D12_SetEndpointStatus(endp*2,1);
        single_transmit(0,0);
  }
  else  stall_ep0();
}
void set_address(void)
{
  D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&DEVICE_ADDRESS_MASK),1);
  single_transmit(0,0);
}
void get_descriptor(void)
{
  unsigned char bDescriptor=MSB(ControlData.DeviceRequest.wValue);
  if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)
  {
     code_transmit((unsigned char*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
  }
  else if(bDescriptor==USB_CONFIGURATION_DESCRIPTOR_TYPE)
  {
     code_transmit((unsigned char *)&ConfigDescr,CONFIG_DESCRIPTOR_LENGTH);
  }
  else  stall_ep0();
}
void get_configuration(void)
{
  unsigned char c=bEPPflags.bits.configuration;
  single_transmit(&c,1);
}
void set_configuration(void)
{
  if(ControlData.DeviceRequest.wValue==0)
  {
     single_transmit(0,0);
     DISABLE;
     bEPPflags.bits.configuration=0;
     ENABLE;
     init_unconfig();
  }
  else if(ControlData.DeviceRequest.wValue==1)
  {
     single_transmit(0,0);
     init_unconfig();
     init_config();
     DISABLE;
     bEPPflags.bits.configuration=1;
     ENABLE;
  }
  else stall_ep0();
}
void get_interface(void)
{
  unsigned char txdat=0;
  single_transmit(&txdat,1);
}
void set_interface(void)
{
   if(ControlData.DeviceRequest.wValue==0&&ControlData.DeviceRequest.wIndex==0)
      single_transmit(0,0);
   else stall_ep0();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -