📄 kchap9.lst
字号:
21 #define NUM_ENDPOINTS 4
22
23 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
24 + sizeof(USB_INTERFACE_DESCRIPTOR) \
25 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
26
27 extern CONTROL_XFER ControlData;
28 extern IO_REQUEST idata ioRequest;
29 extern EPPFLAGS bEPPflags;
30
31 code USB_DEVICE_DESCRIPTOR DeviceDescr =
32 {
33 sizeof(USB_DEVICE_DESCRIPTOR),
34 USB_DEVICE_DESCRIPTOR_TYPE,
35 SWAP(0x0100),
36 USB_CLASS_CODE_TEST_CLASS_DEVICE,
37 0,
38 0,
39 EP0_PACKET_SIZE,
40 SWAP(0x0471), //VID
41 SWAP(0x0666), //PID
42 SWAP(0x0100),
43 0, //Manufactory
44 0, //Product
45 0, //Serial Number
46 25 //Number of possible configurations
47 };
48
49 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
50 {
51 sizeof(USB_CONFIGURATION_DESCRIPTOR),
52 USB_CONFIGURATION_DESCRIPTOR_TYPE,
53 SWAP(CONFIG_DESCRIPTOR_LENGTH),
54 1,
55 1,
C51 COMPILER V7.06 KCHAP9 11/11/2003 20:11:02 PAGE 15
56 0,
57 0x60,
58 0xf0
59 //0x1
60 };
61
62 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
63 {
64 sizeof(USB_INTERFACE_DESCRIPTOR),
65 USB_INTERFACE_DESCRIPTOR_TYPE,
66 0,
67 0,
68 NUM_ENDPOINTS,
69 USB_CLASS_CODE_TEST_CLASS_DEVICE,
70 USB_SUBCLASS_CODE_TEST_CLASS_D12,
71 USB_PROTOCOL_CODE_TEST_CLASS_D12,
72 0
73 };
74
75 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
76 {
77 sizeof(USB_ENDPOINT_DESCRIPTOR),
78 USB_ENDPOINT_DESCRIPTOR_TYPE,
79 0x81,
80 USB_ENDPOINT_TYPE_INTERRUPT,
81 SWAP(EP1_PACKET_SIZE),
82 10
83 };
84
85 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
86 {
87 sizeof(USB_ENDPOINT_DESCRIPTOR),
88 USB_ENDPOINT_DESCRIPTOR_TYPE,
89 0x1,
90 USB_ENDPOINT_TYPE_INTERRUPT,
91 SWAP(EP1_PACKET_SIZE),
92 10
93 };
94
95 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
96 {
97 sizeof(USB_ENDPOINT_DESCRIPTOR),
98 USB_ENDPOINT_DESCRIPTOR_TYPE,
99 0x82,
100 USB_ENDPOINT_TYPE_BULK,
101 SWAP(EP2_PACKET_SIZE),
102 10
103 };
104
105 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
106 {
107 sizeof(USB_ENDPOINT_DESCRIPTOR),
108 USB_ENDPOINT_DESCRIPTOR_TYPE,
109 0x2,
110 USB_ENDPOINT_TYPE_BULK,
111 SWAP(EP2_PACKET_SIZE),
112 10
113 };
114
115 /*
116 //*************************************************************************
117 // USB Protocol Layer
C51 COMPILER V7.06 KCHAP9 11/11/2003 20:11:02 PAGE 16
118 //*************************************************************************
119 */
120
121 void reserved(void)
122 {
123 1 stall_ep0();
124 1 }
125
126 /*
127 //*************************************************************************
128 // USB standard device requests
129 //*************************************************************************
130 */
131
132 void get_status(void)
133 {
134 1 unsigned char endp, txdat[2];
135 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
136 1 unsigned char c;
137 1
138 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
139 2 if(bEPPflags.bits.remote_wakeup == 1)
140 2 txdat[0] = 3;
141 2 else
142 2 txdat[0] = 1;
143 2 txdat[1]=0;
144 2 single_transmit(txdat, 2);
145 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
146 2 txdat[0]=0;
147 2 txdat[1]=0;
148 2 single_transmit(txdat, 2);
149 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
150 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
151 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
152 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
153 2
154 2
155 2 else
156 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
157 2 if(c & D12_STALL)
158 2 txdat[0] = 1;
159 2 else
160 2 txdat[0] = 0;
161 2 txdat[1] = 0;
162 2 single_transmit(txdat, 2);
163 2 } else
164 1 stall_ep0();
165 1 }
166
167 void clear_feature(void)
168 {
169 1 unsigned char endp;
170 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
171 1
172 1 if (bRecipient == USB_RECIPIENT_DEVICE
173 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
174 2 DISABLE;
175 2 bEPPflags.bits.remote_wakeup = 0;
176 2 ENABLE;
177 2 single_transmit(0, 0);
178 2 }
179 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V7.06 KCHAP9 11/11/2003 20:11:02 PAGE 17
180 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
181 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
182 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
183 2 // clear TX stall for IN on EPn.
184 2 D12_SetEndpointStatus(endp*2 + 1, 0);
185 2 else
186 2 // clear RX stall for OUT on EPn.
187 2 D12_SetEndpointStatus(endp*2, 0);
188 2 single_transmit(0, 0);
189 2 } else
190 1 stall_ep0();
191 1 }
192
193 void set_feature(void)
194 {
195 1 unsigned char endp;
196 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
197 1
198 1 if (bRecipient == USB_RECIPIENT_DEVICE
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
200 2 DISABLE;
201 2 bEPPflags.bits.remote_wakeup = 1;
202 2 ENABLE;
203 2 single_transmit(0, 0);
204 2 }
205 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
206 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
207 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
208 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
209 2 // clear TX stall for IN on EPn.
210 2 D12_SetEndpointStatus(endp*2 + 1, 1);
211 2 else
212 2 // clear RX stall for OUT on EPn.
213 2 D12_SetEndpointStatus(endp*2, 1);
214 2 single_transmit(0, 0);
215 2 } else
216 1 stall_ep0();
217 1 }
218
219 void set_address(void)
220 {
221 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
222 1 DEVICE_ADDRESS_MASK), 1);
223 1 single_transmit(0, 0);
224 1 }
225
226 void get_descriptor(void)
227 {
228 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
229 1
230 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
231 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
232 2 }
233 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
234 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
235 2 }
236 1 else
237 1 stall_ep0();
238 1 }
239
240 void get_configuration(void)
241 {
C51 COMPILER V7.06 KCHAP9 11/11/2003 20:11:02 PAGE 18
242 1 unsigned char c = bEPPflags.bits.configuration;
243 1
244 1 single_transmit(&c, 1);
245 1 }
246
247 void set_configuration(void)
248 {
249 1 if (ControlData.DeviceRequest.wValue == 0) {
250 2 //* put device in unconfigured state
251 2 single_transmit(0, 0);
252 2 DISABLE;
253 2 bEPPflags.bits.configuration = 0;
254 2 ENABLE;
255 2 init_unconfig();
256 2 } else if (ControlData.DeviceRequest.wValue == 1) {
257 2 // Configure device
258 2 single_transmit(0, 0);
259 2
260 2 init_unconfig();
261 2 init_config();
262 2
263 2 DISABLE;
264 2 bEPPflags.bits.configuration = 1;
265 2 ENABLE;
266 2 } else
267 1 stall_ep0();
268 1 }
269
270 void get_interface(void)
271 {
272 1 unsigned char txdat = 0; // Only/Current interface = 0
273 1 single_transmit(&txdat, 1);
274 1 }
275
276 void set_interface(void)
277 {
278 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
279 1 single_transmit(0, 0);
280 1 else
281 1 stall_ep0();
282 1 }
C51 COMPILER V7.06 KCHAP9 11/11/2003 20:11:02 PAGE 19
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION reserved (BEGIN)
; SOURCE LINE # 121
; SOURCE LINE # 122
; SOURCE LINE # 123
0000 020000 E LJMP stall_ep0
; FUNCTION reserved (END)
; FUNCTION get_status (BEGIN)
; SOURCE LINE # 132
; SOURCE LINE # 133
; SOURCE LINE # 135
0000 E500 E MOV A,ControlData
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -