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

📄 chap_9.c

📁 使用MSP430的IAR开发环境
💻 C
字号:
 #include <stdio.h>
#include <string.h>

#include <msp430x13x.h>
#include "chap_9.h"
#include "mainloop.h"
#include "usb100.h"
#include "d12ci.h"
#include "epphal.h"


extern void single_transmit(unsigned char * buf, unsigned char len);
extern void code_transmit(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  0x2e
                                  /*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 = 
{
  0x12,
  0x01,
  0x0100,
  0xDC,
  0,
  0,
  0x10,
  0x0471,
  0x0666,
  0x0100,
  0,
  0,
  0,
  25
};
*/
/*
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
  0x09,
  0x02,
  SWAP(CONFIG_DESCRIPTOR_LENGTH),
  //0x2E,  
  //0x002E,
  //0x00,
  1,
  1,
  0,
  0x60,
  0xf0   //??
}; 
const USB_INTERFACE_DESCRIPTOR InterfaceDescr = 
{
  0x09,
  0x04,
  0,
  0,
  NUM_ENDPOINTS,
  0xDC,
  0xA0,
  0xB0,
  0
};
//Endpoint1 IN
const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = 
{
  0x07,
  0x05,
  0X81,
  USB_ENDPOINT_TYPE_INTERRUPT,
  SWAP(EP1_PACKET_SIZE),
  //EP1_PACKET_SIZE,
  //0,
  10 
};

//Endpoint1 OUT
const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
  0x07,
  0x05,
  0X01,
  USB_ENDPOINT_TYPE_INTERRUPT,
  SWAP(EP1_PACKET_SIZE),
  //EP1_PACKET_SIZE,
  //0,
  10
};

//Endpoint2 IN
const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
  0x07,
  0x05,
  0X82,
  USB_ENDPOINT_TYPE_BULK,
  SWAP(EP2_PACKET_SIZE),
  //EP2_PACKET_SIZE,
  //0,
  10
};

//Endpoint2 OUT
const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
  0x07,
  0x05,
  0x02,
  USB_ENDPOINT_TYPE_BULK,
  SWAP(EP2_PACKET_SIZE),
  //EP2_PACKET_SIZE,
  //0,
  10 
}; 
*/

const char DeviceDescr[] = 
{
  0x12,
  0x01,
  0x00,
  0x01,
  0xDC,
  0,
  0,
  0x10,
  0x71,
  0x04,
  0x66,
  0x06,
  0x00,
  0x01,
  0,
  0,
  0,
  25
};

const char ConfigDescr[] =
{
  0x09,
  0x02,  
  0x2E,
  0x00,
  //0x2E,
  1,
  1,
  0,
  0xA0,
  0x32,
  
//const USB_INTERFACE_DESCRIPTOR InterfaceDescr = 

  0x09,
  0x04,
  0,
  0,
  NUM_ENDPOINTS,
  0xDC,
  0xA0,
  0xB0,
  0,

//Endpoint1 IN
//const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = 
//{
  0x07,
  0x05,
  0X81,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,
  0,
  10,
 
//};

//Endpoint1 OUT
//const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
//{
  0x07,
  0x05,
  0X01,
  USB_ENDPOINT_TYPE_INTERRUPT,
  EP1_PACKET_SIZE,
  0,
  10,
  

//};

//Endpoint2 IN
//const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
//{
  0x07,
  0x05,
  0X82,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,
  0,
  10,
  
//};

//Endpoint2 OUT
//const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
//{
  0x07,
  0x05,
  0x02,
  USB_ENDPOINT_TYPE_BULK,
  EP2_PACKET_SIZE,
  0,
  10 
};  
 

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);                                 //Read input endpoint status
    else 
      c = D12_SelectEndpoint(endp * 2);                                     //Read output endpoint status
    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)
  {
    _DINT();
    bEPPflags.bits.remote_wakeup = 0;
    _EINT();
    single_transmit(0, 0);
  }
  else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
  {
    //Clear Stalled Feature of Endpoint, resume 
    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)
  {
    _DINT();
    bEPPflags.bits.remote_wakeup = 1;
    _EINT();
    single_transmit(0, 0);
  }
  else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
  {
    //Clear Stalled Feature of Endpoint, resume 
    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);                                        //Send response
}

void get_descriptor(void)
{
  //Read Descriptor type
  unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
  if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
  {
    //Get Device descriptor
    code_transmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));       
  } 
  else if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
  {
    //if(ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
     // ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;    
    //Get Configuration descriptor + Interface descriptor + Endpoint descriptor
    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)
  {
    //Configuration value is not proper. Device is in no-config state
    single_transmit(0, 0);
    _DINT();
    bEPPflags.bits.configuration = 0;
    _EINT();
    init_unconfig();                        //进入地址状态,禁止0除外的所有端点    
  }
  else if(ControlData.DeviceRequest.wValue == 1)
  {
    //Configrate device
    single_transmit(0, 0);
    init_unconfig();                        //进入地址状态,禁止0除外的所有端点
    init_config();                           //配置处理,允许端点收发
    _DINT();
    bEPPflags.bits.configuration = 1;
    _EINT();
  }  
  else
  {
    stall_ep0();
   }
}

void get_interface(void)
{
  unsigned char txdat = 0;                    //Only one interface
  single_transmit(&txdat, 1);
}

void set_interface(void)
{
  if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
  {
    single_transmit(0, 0);
   }
  else
  {
    stall_ep0();
   }
}

void reserved(void)
{
  stall_ep0();
}

⌨️ 快捷键说明

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