📄 chap_9.lst
字号:
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN E:\MCU\USB_FIRM\CHAP_9.OBJ
COMPILER INVOKED BY: C:\COMP51\C51.EXE E:\MCU\USB_FIRM\CHAP_9.C DB SB OE
stmt level source
1 #include "D12ci.h"
2 #include "chap_9.h"
3
4 #include <reg51.h>
5
6 //#define EP0_PACKET_SIZE 16
7 //#define EP2_PACKET_SIZE 64
8 #define NUM_ENDPOINTS 4
9
10 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
11 + sizeof(USB_INTERFACE_DESCRIPTOR) \
12 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
13
14
15 //extern unsigned char idata EpBuf[];
16 extern EPPFLAGS bEPPflags;
17 extern CONTROL_XFER ControlData;
18 void stall_ep0(void);
19 void single_transmit(unsigned char * buf, unsigned char len);
20
21 void get_firmware_version(void);
22 void get_buffer_size(void);
23
24
25 //USB标准设备请求入口地址指针表
26 code void (*StandardDeviceRequest[])(void) =
27 {
28 get_status,
29 clear_feature,
30 reserved,
31 set_feature,
32 reserved,
33 set_address,
34 get_descriptor,
35 reserved,
36 get_configuration,
37 set_configuration,
38 get_interface,
39 set_interface,
40 reserved,
41 reserved,
42 reserved,
43 reserved
44 };
45
46 //厂商请求入口地址
47 code void (*VendorDeviceRequest[])(void) =
48 {
49 reserved,
50 reserved,
51 reserved,
52 reserved,
53 reserved,
54 reserved,
55 reserved,
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 2
56 reserved,
57 reserved,
58 reserved,
59 reserved,
60 reserved,
61 reserved,//read_write_register,
62 reserved,
63 reserved,
64 reserved
65 };
66
67
68
69
70 /******************************************************************
71 协议控制子程序
72 当主循环检测到bEPPflags.bits.setup_packet=1时,主循环就调用协
73 议控制子程序来区分是usb标准请求,还是厂商请求,并根据请求类型
74 跳转到相应的子程序,使用的是函数指针
75 ******************************************************************/
76 void setup_handler()
77 {
78 1 unsigned char type,req;//读取请求类型,保留bits5,bits6
79 1 type=ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
80 1 //读取请求代码,保留低四位
81 1 req=ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
82 1
83 1 if(type==USB_STANDARD_REQUEST)
84 1 (*StandardDeviceRequest[req])();//标准请求
85 1 else if(type==USB_VENDOR_REQUEST)
86 1 (*VendorDeviceRequest[req])();//厂商请求
87 1 else
88 1 stall_ep0();//无效请求,返回STALL
89 1 }
90
91
92 void init_unconfig(void)
93 {
94 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
95 1 }
96
97 void init_config(void)
98 {
99 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
100 1 }
101
102
103 void single_transmit(unsigned char * buf, unsigned char len)
104 {
105 1 if( len <= EP0_PACKET_SIZE)
106 1 {
107 2 D12_WriteEndpoint(1, len, buf);
108 2 }
109 1 }
110
111 void code_transmit(unsigned char code* pRomData,unsigned short len)
112 {
113 1 ControlData.wCount=0;
114 1 if(ControlData.wLength>len)
115 1 ControlData.wLength=len;
116 1 ControlData.pData=pRomData;
117 1 if(ControlData.wLength>=EP0_PACKET_SIZE)
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 3
118 1 {
119 2 D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
120 2 ControlData.wCount+=EP0_PACKET_SIZE;
121 2 DISABLE;
122 2 bEPPflags.bits.control_state=USB_TRANSMIT;
123 2 ENABLE;
124 2 }
125 1 else
126 1 {
127 2 D12_WriteEndpoint(1,ControlData.wLength,pRomData);
128 2 ControlData.wCount+=ControlData.wLength;//发送字节统计
129 2 DISABLE;
130 2 bEPPflags.bits.control_state=USB_IDLE;
131 2 ENABLE;
132 2 }
133 1 }
134
135
136 void stall_ep0(void)
137 {
138 1 D12_SetEndpointStatus(0, 1);
139 1 D12_SetEndpointStatus(1, 1);
140 1 }
141
142 //设备描述符
143 code USB_DEVICE_DESCRIPTOR DeviceDescr =
144 {
145 sizeof(USB_DEVICE_DESCRIPTOR),
146 USB_DEVICE_DESCRIPTOR_TYPE,
147 SWAP(0x0100),
148 USB_CLASS_CODE_TEST_CLASS_DEVICE,
149 0, 0,
150 EP0_PACKET_SIZE,
151 SWAP(0x0471),
152 SWAP(0x0666),
153 SWAP(0x0100),
154 0, 0, 0,
155 1//**********************************************************************此处本来是25,现改为1
156 };
157
158 //配置描述符
159 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
160 {
161 sizeof(USB_CONFIGURATION_DESCRIPTOR),
162 USB_CONFIGURATION_DESCRIPTOR_TYPE,
163 SWAP(CONFIG_DESCRIPTOR_LENGTH),
164 1,
165 1,
166 0,
167 0x60,
168 0x1
169 };
170
171 //接口描述符
172 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
173 {
174 sizeof(USB_INTERFACE_DESCRIPTOR),
175 USB_INTERFACE_DESCRIPTOR_TYPE,
176 0,
177 0,
178 NUM_ENDPOINTS,
179 USB_CLASS_CODE_TEST_CLASS_DEVICE,
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 4
180 USB_SUBCLASS_CODE_TEST_CLASS_D12,
181 USB_PROTOCOL_CODE_TEST_CLASS_D12,
182 0
183 };
184
185 //端点描述符
186 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
187 {
188 sizeof(USB_ENDPOINT_DESCRIPTOR),
189 USB_ENDPOINT_DESCRIPTOR_TYPE,
190 0x81,
191 USB_ENDPOINT_TYPE_INTERRUPT,
192 SWAP(EP1_PACKET_SIZE),
193 10
194 };
195
196 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
197 {
198 sizeof(USB_ENDPOINT_DESCRIPTOR),
199 USB_ENDPOINT_DESCRIPTOR_TYPE,
200 0x1,
201 USB_ENDPOINT_TYPE_INTERRUPT,
202 SWAP(EP1_PACKET_SIZE),
203 10
204 };
205
206 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
207 {
208 sizeof(USB_ENDPOINT_DESCRIPTOR),
209 USB_ENDPOINT_DESCRIPTOR_TYPE,
210 0x82,
211 USB_ENDPOINT_TYPE_BULK,
212 SWAP(EP2_PACKET_SIZE),
213 10
214 };
215
216 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
217 {
218 sizeof(USB_ENDPOINT_DESCRIPTOR),
219 USB_ENDPOINT_DESCRIPTOR_TYPE,
220 0x2,
221 USB_ENDPOINT_TYPE_BULK,
222 SWAP(EP2_PACKET_SIZE),
223 10
224 };
225
226 //保留子程序
227 void reserved(void)
228 {
229 1 stall_ep0();//返回
230 1 }
231
232 //获取状态
233 void get_status(void)
234 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -