📄 usb_setup.lst
字号:
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE USB_SETUP
OBJECT MODULE PLACED IN Usb_Setup.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\c51.exe Usb_Setup.c DB OE
stmt level source
*** WARNING C500 IN LINE 1 OF USB_SETUP.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1 #include "c8051F320.h"
2 #include "stdio.h"
3 #include "intrins.h"
4 /////////////////////////////
5 #include "Usb_Descreptor.h"
6 #include "Usb_FunDec.h"
7 #include "Usb_Parameter.h"
8 #include "Usb_Register.h"
9 #include "Usb_Request.h"
10
11 //全局变量
12 static unsigned int DataSize; // 需要端点0发送的数据大小
13 static unsigned int DataSent; // 端点0已经发送的数据大小
14 static unsigned char *DataPtr; // 端点0发送数据的指针
15 static unsigned char ONES_PACKET[2] = {0x01, 0x00}; // 在Get_Status等命令中应用的数组
16 static unsigned char ZERO_PACKET[2] = {0x00, 0x00}; // 在Get_Status等命令中应用的数组
17
18 unsigned char Ep_Status[3] ={EP_IDLE,EP_STALL,EP_STALL}; // 定义端点的状态
19 unsigned char USB_State =DEV_ATTACHED; // 定义设备的状态
20 struct Usb_Setup // Setup阶段收到的8字节的命令,此处定义为结构
21 {
22 unsigned char bmRequestType;
23 unsigned char bRequest;
24 unsigned char wValue[2];
25 unsigned char wIndex[2];
26 unsigned char wLength[2];
27 }Setup;
28
29 ///////////////////////////////////////////////////////////////////////////////////////////////
30 void Handle_Setup() //端点0中断处理函数
31 {
32 1 unsigned char ControlReg=0; // 存放端点0控制/状态寄存器值的变量
33 1 UWrite_Byte(INDEX, 0); // 指向端点0
34 1 URead_Byte(E0CSR, ControlReg); // 读端点0控制寄存器
35 1 if (ControlReg & rbSUEND) // 如果上次数据阶段提前结束
36 1 {
37 2 UWrite_Byte(E0CSR, rbDATAEND); // 当前数据传完
38 2 UWrite_Byte(E0CSR, rbSSUEND); // 清除SUEND标志
39 2 Ep_Status[0] = EP_IDLE; // 端点返回到空闲状态
40 2 }
41 1 if (ControlReg & rbSTSTL) // 如果上次传输因错误而发送了STALL使传输提前结束
42 1 {
43 2 UWrite_Byte(E0CSR, 0); // 清除STALL
44 2 Ep_Status[0] = EP_IDLE; // 端点0返回到空闲状态
45 2 }
46 1
47 1 if (ControlReg & rbOPRDY) // 如果接收到输出数据包
48 1 {
49 2 if (Ep_Status[0] == EP_IDLE) // 如果端点0空闲
50 2 {
51 3 Fifo_Read(FIFO_EP0,8,(unsigned char *)&Setup); // 读取设置数据包,8个字节
52 3 switch(Setup.bRequest) // 判断请求类型
53 3 {
54 4 case GET_STATUS: Get_Status(); break;
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 2
55 4 case CLEAR_FEATURE: Clear_Feature(); break;
56 4 case SET_FEATURE: Set_Feature(); break;
57 4 case SET_ADDRESS: Set_Address(); break;
58 4 case GET_DESCRIPTOR: Get_Descriptor(); break;
59 4 case GET_CONFIGURATION: Get_Configuration();break;
60 4 case SET_CONFIGURATION: Set_Configuration();break;
61 4 case GET_INTERFACE: Get_Interface(); break;
62 4 case SET_INTERFACE: Set_Interface(); break;
63 4 case GET_MAXLUN: Get_Maxlun(); break;
64 4 default: Force_Stall(); break;
65 4 }
66 3
67 3 /////////////////////////////////////////////////////////////////////////////////////////////
68 3 }
69 2 else if(Ep_Status[0]==EP_RX) // 如果在OUT状态,此程序中不会从端点0接收其它信息,所以没相关的操作
70 2 {}
71 2 }
72 1 if (Ep_Status[0] == EP_TX) // 如果在IN状态
73 1 {
74 2 unsigned char ControlReg=0,TempReg=0; // 存放寄存器值的变量
75 2 URead_Byte(E0CSR, ControlReg); // 读端点0控制寄存器
76 2 TempReg = rbINPRDY; // 输出数据准备好
77 2 if (DataSize >= EP0_PACKET_SIZE) // 如果待发送数据的长度大于端点0长度
78 2 {
79 3 Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE,DataPtr); // 发送数据包
80 3 DataPtr += EP0_PACKET_SIZE; // 更新数据指针
81 3 DataSize -= EP0_PACKET_SIZE; // 更新待发送的数据量
82 3 DataSent += EP0_PACKET_SIZE; // 更新已发送的数据量
83 3 }
84 2 else // 如果待发送数据的长度小于端点0长度
85 2 {
86 3 Fifo_Write(FIFO_EP0, DataSize,DataPtr); // 发送剩余的数据
87 3 TempReg |= rbDATAEND; // 指示数据发送完备,进入状态阶段
88 3 Ep_Status[0] = EP_IDLE; // 端点返回到空闲状态
89 3 }
90 2 if (DataSent == (Setup.wLength[0]+256*Setup.wLength[1])) //如果发送的数据量正好是端点0的整数倍
91 2
92 2 {
93 3 TempReg |= rbDATAEND; // 指示数据发送完备,进入状态阶段
94 3 Ep_Status[0] = EP_IDLE; // 端点返回到空闲状态
95 3 }
96 2 UWrite_Byte(E0CSR, TempReg); // 写端点0控制寄存器
97 2 }
98 1 }
99
100 void Force_Stall()
101 {
102 1 UWrite_Byte(INDEX, 0);
103 1 UWrite_Byte(E0CSR, rbSDSTL); // 发送STALL
104 1 Ep_Status[0] = EP_STALL; // 端点0到STALL状态,直到下次复位
105 1 }
106
107 //处理标准请求的函数
108 void Get_Status()
109 {
110 1 switch(Setup.bmRequestType)
111 1 {
112 2 case IN_DEVICE: // 如果是设备的状态
113 2 DataPtr = ZERO_PACKET; // 发送 0x00, 总线供电,不支持远程唤醒
114 2 DataSize = 2;
115 2 break;
116 2 case IN_INTERFACE: // 接口状态
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 3
117 2 DataPtr = ZERO_PACKET; // 接口状态永远返回0
118 2 DataSize = 2;
119 2 break;
120 2 case IN_ENDPOINT: // 端点状态
121 2 if (Setup.wIndex[0] == IN_EP1) // 如果是端点1
122 2 {
123 3 if (Ep_Status[1] == EP_HALT)
124 3 { // 如果端点1在EN_HALT状态
125 4 DataPtr = ONES_PACKET; // 发送ONES_PACKET,指示端点1在HALT状态
126 4 DataSize = 2;
127 4 }
128 3 else
129 3 {
130 4 DataPtr = ZERO_PACKET; // 否则发送ZERO_PACKET,指示端点1在空闲状态
131 4 DataSize = 2;
132 4 }
133 3 }
134 2 if (Setup.wIndex[0] == OUT_EP2)
135 2 {
136 3 if (Ep_Status[2] == EP_HALT)
137 3 {
138 4 DataPtr = ONES_PACKET;
139 4 DataSize = 2;
140 4 }
141 3 else
142 3 {
143 4 DataPtr = ZERO_PACKET;
144 4 DataSize = 2;
145 4 }
146 3 }
147 2 break;
148 2 default: Force_Stall(); break;
149 2 }
150 1 if (Ep_Status[0] != EP_STALL)
151 1 {
152 2 UWrite_Byte(E0CSR, rbSOPRDY);
153 2 Ep_Status[0] = EP_TX; // 端点0在EP_TX状态
154 2 DataSent = 0; // 已发送数据量清零
155 2 }
156 1 }
157
158 void Clear_Feature()
159 {
160 1 if ((Setup.bmRequestType & 0x02)&& // 如果是端点
161 1 (Setup.wValue[0] == ENDPOINT_HALT) && // 并且这些端点的状态是EP_HALT
162 1 ((Setup.wIndex[0] == IN_EP1) || // 并且选择的是端点1 IN
163 1 (Setup.wIndex[0] == OUT_EP2))) // 或端点2 OUT
164 1 {
165 2 if (Setup.wIndex[0] == IN_EP1)
166 2 {
167 3 UWrite_Byte (INDEX, 1); // 使toggle复位为零
168 3 UWrite_Byte (EINCSRL, rbInCLRDT);
169 3 Ep_Status[1] = EP_IDLE; // 端点1到空闲状态
170 3 }
171 2 else
172 2 {
173 3 UWrite_Byte (INDEX, 2);
174 3 UWrite_Byte (EOUTCSRL, rbOutCLRDT);
175 3 Ep_Status[2] = EP_IDLE;
176 3 }
177 2 }
178 1 else
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -