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

📄 chapter9.lst

📁 vC++读写HID_USB设备,包含hid_usb的固件程序和上位机程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CHAPTER9
OBJECT MODULE PLACED IN Chapter9.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Chapter9.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "ds89c4xx.h"
   2          #include "mytype.h"
   3          #include "D12CI.h"
   4          #include "D12HAL.h"
   5          #include "Chapter9.h"
   6          #include "Descriptor.h"
   7          #include "uart0.h"
   8          
   9          #ifndef _swap_data_
  10          #define _swap_data_
  11          
  12          #define SWAP16(x)  ((((uint16)(x))<<8)|(((uint16)(x))>>8))              //高低字节交换
  13          #define LSB(x) ((uint8)(x))                     //取一个整数的低字节 
  14          #define MSB(x) ((uint8)(((uint16)(x))>>8))              //取一个整数的高字节
  15          
  16          #endif
  17          
  18          //定义传输控制结构变量
  19          CONTROL_XFER idata ControlData;
  20          
  21          //定义USB事件标志变量
  22          EPPFLAGS idata bEPPflags;
  23          
  24          uint8 idata idle,protocol;
  25          
  26          //*************************************************************************
  27          //USB标准设备请求入口地址指针表
  28          //*************************************************************************
  29          void (*StandardDeviceRequest[])(void) =
  30          {
  31                  get_status,
  32                  clear_feature,
  33                  reserved,
  34                  set_feature,
  35                  reserved,
  36                  set_address,
  37                  get_descriptor,
  38                  reserved,
  39                  get_configuration,
  40                  set_configuration,
  41                  get_interface,
  42                  set_interface,
  43                  reserved,
  44                  reserved,
  45                  reserved,
  46                  reserved
  47          };
  48          
  49          void (*ClassDeviceRequest[])(void) = 
  50          {
  51                  reserved,
  52                  get_report,
  53                  get_idle,
  54                  get_protocol,
  55                  reserved,
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 2   

  56                  reserved,
  57                  reserved,
  58                  reserved,
  59                  reserved,
  60                  set_report,
  61                  set_idle,
  62                  set_protocol
  63          };
  64          
  65             //*************************************************************************
  66             // USB 协议层函数
  67             //*************************************************************************
  68             
  69          /*************************************
  70          ** 函数名称: void stall_ep0(void)
  71          ** 功能描述: 使控制端点处于停止状态
  72          **************************************/
  73          void stall_ep0(void)
  74          {
  75   1              D12_SetEndpointStatus(0, 1);
  76   1              D12_SetEndpointStatus(1, 1);
  77   1      }
  78             
  79             
  80          /*************************************
  81          ** 函数名称: void reserved(void)
  82          ** 功能描述: 保留子程序
  83          **************************************/   
  84          void reserved(void)
  85          {
  86   1              stall_ep0();                            //返回STALL
  87   1      }
  88          
  89          
  90          /**********************************************
  91          ** 函数名称: void init_unconfig(void)
  92          ** 功能描述: 进入地址状态,禁止0除外的所有端点
  93          ***********************************************/
  94          void init_unconfig(void)
  95          {
  96   1              D12_SetEndpointEnable(0);       //禁止0除外的所有端点
  97   1      }
  98          
  99          /**********************************************
 100          ** 函数名称: void init_config(void)
 101          ** 功能描述: 配置处理,允许端点收发
 102          ***********************************************/
 103          void init_config(void)
 104          {
 105   1              D12_SetEndpointEnable(1);       //使能普通/同步端点使能
 106   1      }
 107          
 108          
 109          /*********************************************************
 110          ** 函数名称: void single_transmit(uint8 * buf, uint8 len)
 111          ** 功能描述: 通过端点索引 1 发送数据(DATA 类型)
 112          ** 输    入: uint8 * buf:       发送数据指针
 113                                   uint8 len:             发送数据长度
 114          ** 输    出: 无
 115          **********************************************************/
 116          void single_transmit(uint8 *buf, uint8 len)
 117          {
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 3   

 118   1              if( len <= EP0_PACKET_SIZE) {                   //长度小于EP0最大信息包大小才允许发送
 119   2                      D12_WriteEndpoint(1, len, buf);
 120   2              }
 121   1      }
 122          
 123          /*************************************************************
 124          ** 函数名称: void code_transmit(uint8 * pRomData, uint16 len)
 125          ** 功能描述: 通过端点索引 1 发送数据(CODE类型)
 126          ** 输    入: uint8  *pRomData:  发送数据指针
 127                                   uint16 len:            发送数据长度
 128          ** 输    出: 无
 129          **************************************************************/
 130          void code_transmit(uint8 * pRomData, uint16 idata len)
 131          {
 132   1              if(!bEPPflags.bits.transmit_not_end)
 133   1              {
 134   2                      ControlData.wCount = 0;                                                         //传输字节数计数器清0
 135   2                      if(ControlData.wLength > len)
 136   2                              ControlData.wLength = len;                                              //传输数据总字节数不得超过len
 137   2              
 138   2                      ControlData.pData = pRomData;                                           //传输数据指针指向pRomData
 139   2              }       
 140   1              if( ControlData.wLength >= EP0_PACKET_SIZE)                     //传输数据总字节数大于端点0最大信息包大小
 141   1              {               
 142   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, (ControlData.pData + ControlData.wCount));        //发送端点0最大信息包大
             -小个字节
 143   2                      ControlData.wCount += EP0_PACKET_SIZE;                                          //统计已发送字节数
 144   2                      bEPPflags.bits.control_state = USB_TRANSMIT;                            //标志数据发送状态
 145   2                      bEPPflags.bits.transmit_not_end = 1;    //数据未发送完成
 146   2                      //ControlData.wLength -= EP0_PACKET_SIZE;
 147   2                      //PutUint320(ControlData.wLength,10);
 148   2              }
 149   1              else if(ControlData.wLength > 0)
 150   1              {
 151   2                      //PutUint320(ControlData.wLength,10);
 152   2                      D12_WriteEndpoint(1, ControlData.wLength, (ControlData.pData + ControlData.wCount));            //写入传输数据总字
             -节数
 153   2                      ControlData.wCount += ControlData.wLength;                                      //统计已发送字节数
 154   2                      bEPPflags.bits.control_state = USB_IDLE;                                        //标志空闲状态
 155   2                      //bEPPflags.bits.transmit_not_end = 0;  //传输结束
 156   2                      ControlData.wLength = 0;
 157   2              }
 158   1              else
 159   1              {
 160   2                      //PutUint320(ControlData.wLength,10);
 161   2                      D12_WriteEndpoint(1, 0, 0);                                     //发送完毕,发0个字节
 162   2                      bEPPflags.bits.control_state = USB_IDLE;
 163   2                      //bEPPflags.bits.transmit_not_end = 0;  //传输结束
 164   2              }
 165   1      }
 166          
 167          
 168          //*************************************************************************
 169             // USB 标准设备请求服务程序
 170             //*************************************************************************
 171          
 172          /********************************************************************
 173          ** 函数名称: void get_status(void)
 174          ** 功能描述: 主机要求获取状态,设备返回16位的状态描述给主机
 175          *********************************************************************/
 176          void get_status(void)
 177          {
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 4   

 178   1              uint8 idata endp, txdat[2], c;
 179   1              uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;       
 180   1                                                                                                                                      //取得设备请求类型      
 181   1              if (bRecipient == USB_RECIPIENT_DEVICE) //对设备请求
 182   1              {                               
 183   2                      if(bEPPflags.bits.remote_wakeup == 1)                   
 184   2                              txdat[0] = 2;                                                                           //支持远程唤醒、总线供电
 185   2                      else
 186   2                              txdat[0] = 0;                                                                           //不支持远程唤醒、总线供电
 187   2                      txdat[1]=0;                                                                                             //高8位为0
 188   2                      single_transmit(txdat, 2);                                                              //发送16位的状态到主机
 189   2              } 
 190   1              else if (bRecipient == USB_RECIPIENT_INTERFACE) //对接口请求
 191   1              {                       
 192   2                      txdat[0]=0;
 193   2                      txdat[1]=0;
 194   2                      single_transmit(txdat, 2);      //发送16位的状态到主机
 195   2              } 
 196   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT) //对端点请求
 197   1              {                       
 198   2                      endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 199   2                      if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
 200   2                              c = D12_SelectEndpoint(endp*2 + 1);                                     //读取输入端点状态
 201   2                      else
 202   2                              c = D12_SelectEndpoint(endp*2);                                         //读取输出端点状态
 203   2                      if(c & D12_STALL)
 204   2                              txdat[0] = 1;                                                                           //端点禁止
 205   2                      else
 206   2                              txdat[0] = 0;                                                                           //端点有效
 207   2                      txdat[1] = 0;
 208   2                      single_transmit(txdat, 2);                                                              //发送16位的状态到主机
 209   2              } else
 210   1                      stall_ep0();                                    //非标准请求,发STALL

⌨️ 快捷键说明

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