📄 fw2hid.lst
字号:
174 3 IN0BUF[0] = 0;
175 3 IN0BUF[1] = 0;
176 3 EZUSB_SET_EP_BYTES(IN0BUF_ID,2);
177 3 break;
178 3 case GS_ENDPOINT: // End Point
C51 COMPILER V6.10 FW2HID 07/11/2005 20:41:13 PAGE 4
179 3 IN0BUF[0] = EPIO[EPID(SETUPDAT[wIndexL])].cntrl & bmEPSTALL;
180 3 IN0BUF[1] = 0;
181 3 EZUSB_SET_EP_BYTES(IN0BUF_ID,2);
182 3 break;
183 3 default: // Invalid Command
184 3 EZUSB_STALL_EP0();
185 3 }
186 2 break;
187 2 case SC_CLEAR_FEATURE: // *** Clear Feature
188 2 if(DR_ClearFeature())
189 2 switch(SETUPDAT[bmRequestType])
190 2 {
191 3 case FT_DEVICE: // Device
192 3 if(SETUPDAT[wValueL] == 1)
193 3 Rwuen = FALSE; // Disable Remote Wakeup
194 3 else
195 3 EZUSB_STALL_EP0(); // we only recognize '1'
196 3 break;
197 3 case FT_ENDPOINT: // End Point
198 3 if(SETUPDAT[wValueL] == 0)
199 3 {
200 4 EZUSB_UNSTALL_EP(EPID(SETUPDAT[wIndexL]));
201 4 EZUSB_RESET_DATA_TOGGLE(SETUPDAT[wIndexL]);
202 4 }
203 3 else
204 3 EZUSB_STALL_EP0();
205 3 break;
206 3 }
207 2 break;
208 2 case SC_SET_FEATURE: // *** Set Feature
209 2 if(DR_SetFeature())
210 2 switch(SETUPDAT[bmRequestType])
211 2 {
212 3 case FT_DEVICE: // Device
213 3 if(SETUPDAT[wValueL] == 1)
214 3 Rwuen = TRUE; // Enable Remote Wakeup
215 3 else
216 3 EZUSB_STALL_EP0();
217 3 break;
218 3 case FT_ENDPOINT: // End Point
219 3 if(SETUPDAT[wValueL] == 0)
220 3 EZUSB_STALL_EP( EPID(SETUPDAT[wIndexL]) );
221 3 else
222 3 EZUSB_STALL_EP0();
223 3 break;
224 3 }
225 2 break;
226 2 default: // *** Invalid Command
227 2 EZUSB_STALL_EP0();
228 2 } // end switch
229 1 } // end process_request()
230
231 void process_descriptor()
232 {
233 1 unsigned int j,k,ReportSize;
234 1 switch(SETUPDAT[wValueH])
235 1 {
236 2 case GD_DEVICE: // Device
237 2 SUDPTRH = MSB(&DeviceDescr);
238 2 SUDPTRL = LSB(&DeviceDescr);
239 2 break;
240 2 case GD_CONFIGURATION: // Configuration
C51 COMPILER V6.10 FW2HID 07/11/2005 20:41:13 PAGE 5
241 2 SUDPTRH = MSB(&ConfigDescr);
242 2 SUDPTRL = LSB(&ConfigDescr);
243 2 break;
244 2 case GD_STRING: // String
245 2 {
246 3 switch(SETUPDAT[wValueL])
247 3 {
248 4 case 0: // string index 1
249 4 SUDPTRH = MSB(&String0);
250 4 SUDPTRL = LSB(&String0);
251 4 break;
252 4 case 1: // string index 1
253 4 SUDPTRH = MSB(&String1);
254 4 SUDPTRL = LSB(&String1);
255 4 break;
256 4 case 2: // string index 2
257 4 SUDPTRH = MSB(&String2);
258 4 SUDPTRL = LSB(&String2);
259 4 break;
260 4 default: // Invalid string requested
261 4 EZUSB_STALL_EP0();
262 4 } // end switch
263 3 } // end case
264 2 break;
265 2 case GD_HID: // Get-Descriptor: HID
266 2 SUDPTRH = MSB(&HIDDescr);
267 2 SUDPTRL = LSB(&HIDDescr);
268 2 break;
269 2 case GD_REPORT: // Get-Descriptor: Report
270 2 /*
271 2 Note: A HID report does not have a length field which the SIE can read to determine how many
272 2 bytes to send using the Setup Data Pointer. Therefore we need to 'manually' send the data.
273 2 */
274 2 ReportSize = (WORD)&ReportDescr_end - (WORD)&ReportDescr;
275 2 AUTOPTRH = MSB(&ReportDescr);
276 2 AUTOPTRL = LSB(&ReportDescr);
277 2 while(ReportSize)
278 2 {
279 3 k = min(ReportSize,64); // smaller of ReportSize or IN0 Buffer (64 bytes)
280 3 for(j=0;j<k;j++)
281 3 IN0BUF[j]=AUTODATA;
282 3 IN0BC = j; // arm the IN transfer
283 3 ReportSize = ReportSize-j;
284 3 while(EP0CS & bmIN); // wait for it to go out and get ACK'd
285 3 }
286 2 break;
287 2 default: // *** Invalid Command
288 2 EZUSB_STALL_EP0();
289 2 } // end switch
290 1 } // end function
291
292 void process_class_request(void) // Handle the HID class
293 {
294 1 switch(SETUPDAT[bRequest])
295 1 {
296 2 case SET_REPORT:
297 2 switch(SETUPDAT[wValueH]) // wValueH has report type
298 2 {
299 3 case rt_INPUT:
300 3 break;
301 3 case rt_OUTPUT:
302 3 break;
C51 COMPILER V6.10 FW2HID 07/11/2005 20:41:13 PAGE 6
303 3 case rt_FEATURE:
304 3 break;
305 3 default:
306 3 EZUSB_STALL_EP0();
307 3 }
308 2 break;
309 2 case GET_REPORT:
310 2 switch(SETUPDAT[wValueH]) // wValueH has report type
311 2 {
312 3 case rt_INPUT:
313 3 break;
314 3 case rt_OUTPUT:
315 3 break;
316 3 case rt_FEATURE:
317 3 break;
318 3 default:
319 3 EZUSB_STALL_EP0();
320 3 }
321 2 break;
322 2 case SET_IDLE:
323 2 IdleRate = SETUPDAT[wValueH];
324 2 break;
325 2 case GET_IDLE:
326 2 IN0BUF[0]=IdleRate;
327 2 IN0BC = 1; // arm the IN transfer
328 2 break;
329 2 default:
330 2 EZUSB_STALL_EP0(); // this includes 'GET/SET_PROTOCOL'
331 2 } // end switch
332 1 }
333
334 void resume_isr(void) interrupt WKUP_VECT // Wakeup interrupt handler
335 {
336 1 EZUSB_CLEAR_RSMIRQ();
337 1 }
338
339
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 832 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 3
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -