📄 usbimpl.lst
字号:
249 0x81, 0x02, // Input (data, variable, absolute)
250
251 /// The Output report
252 0x09, 0x05, // Usage (vendor defined)
253 0x09, 0x06, // Usage (vendor defined)
254 0x15, 0x80, // Logical minimum (0x80 or -128)
255 0x25, 0x7F, // Logical maximum (0x7F or 127)
256 0x35, 0x00, // Physical minimum (0)
257 0x45, 0xFF, // Physical maximum (255)
258 0x75, 0x08, // Report size (8 bits)
259 0x95, 0x40, // Report count (64 fields)
260 0x91, 0x02, // Output (data, variable, absolute)
261
262 0xC0, // End Collection 0x(Pysical)
263 0xC0 // End Collection (Application)
264 };
265 #endif //_HID_DEVICE
266
267 code void (*StandardDeviceRequest[])(void) =
268 {
269 get_status,
270 clear_feature,
271 reserved,
272 set_feature,
273 reserved,
274 set_address,
275 get_descriptor,
276 reserved,
277 get_configuration,
278 set_configuration,
279 get_interface,
280 set_interface,
281 reserved,
282 reserved,
283 reserved,
284 reserved
285 };
286 code void (*VendorDeviceRequest[])(void) =
287 {
288 reserved,
289 reserved,
290 reserved,
291 reserved,
292 reserved,
293 reserved,
294 reserved,
295 reserved,
296 reserved,
297 reserved,
298 reserved,
299 reserved,
300 read_write_register,
301 reserved,
302 reserved,
303 reserved
C51 COMPILER V7.01 USBIMPL 06/30/2007 11:42:51 PAGE 6
304 };
305
306 #ifdef _HID_DEVICE
307 code void (*HidDeviceReuest[])(void) =
308 {
309 reserved,
310 get_report, //0x1 mandatory request and must be support by all devices
311 get_idle,
312 get_protocol, //required only for boot devices
313 reserved, //0x4
314 reserved,
315 reserved,
316 reserved,
317 reserved, //0x8
318 set_report,
319 set_idle,
320 set_protocol
321 };
322 #endif //_HID_DEVICE
323
324 /*
325 //*************************************************************************
326 // USB Protocol Layer
327 //*************************************************************************
328 */
329 void init_unconfig(void)
330 {
331 1 // u8 i;
332 1 D12_SetEndpointEnable(false); /* DISABLE all endpoints but EPP0. */
333 1 }
334 void init_config(void)
335 {
336 1 D12_SetEndpointEnable(true); /* ENABLE generic/iso endpoints. */
337 1 }
338 void single_transmit(u8 * buf, u8 len)
339 {
340 1 if( len <= EP0_PACKET_SIZE) {
341 2 D12_WriteEndpointBuffer(1, buf, len);
342 2 }
343 1 }
344
345 void code_transmit(u8 code * pRomData, u16 len)
346 {
347 1 ControlData.wCount = 0;
348 1 if(ControlData.wLength > len)
349 1 ControlData.wLength = len;
350 1 ControlData.pData = pRomData;
351 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
352 2 D12_WriteEndpointBuffer(1, ControlData.pData, EP0_PACKET_SIZE);
353 2 ControlData.wCount += EP0_PACKET_SIZE;
354 2 DISABLE_INTERRUPT;
355 2 bEppflags.flags.control_state = USB_TRANSMIT;
356 2 ENABLE_INTERRUPT;
357 2 }
358 1 else {
359 2 D12_WriteEndpointBuffer(1, pRomData, ControlData.wLength);
360 2 ControlData.wCount += ControlData.wLength;
361 2 DISABLE_INTERRUPT;
362 2 bEppflags.flags.control_state = USB_IDLE;
363 2 ENABLE_INTERRUPT;
364 2 }
365 1 }
C51 COMPILER V7.01 USBIMPL 06/30/2007 11:42:51 PAGE 7
366
367 void stall_ep0(void)
368 {
369 1 D12_SetEndpointStatus(0, 1);
370 1 D12_SetEndpointStatus(1, 1);
371 1 }
372
373 void reserved(void)
374 {
375 1 stall_ep0();
376 1 }
377
378 void control_handler()
379 {
380 1 u8 type, req;
381 1 type = ControlData.DevRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
382 1 req = ControlData.DevRequest.bRequest & USB_REQUEST_MASK;
383 1
384 1 if (type == USB_STANDARD_REQUEST)
385 1 (*StandardDeviceRequest[req])();
386 1 #ifdef _HID_DEVICE
387 1 else if (type == USB_CLASS_REQUEST //class request & receive is interface
388 1 && ControlData.DevRequest.bmRequestType&0x1)
389 1 (*HidDeviceReuest[req])();
390 1 #endif //_HID_DEVICE
391 1 else if (type == USB_VENDOR_REQUEST)
392 1 (*VendorDeviceRequest[req])();
393 1 else
394 1 stall_ep0();
395 1 }
396
397 /*
398 //*************************************************************************
399 // USB standard device requests
400 //*************************************************************************
401 */
402 void get_status(void)
403 {
404 1 //send 2B to pc
405 1 u8 endp, txdat[2];
406 1 u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
407 1 u8 c;
408 1
409 1 // PRINT("get_status ");
410 1 if (bRecipient == USB_RECIPIENT_DEVICE)
411 1 {
412 2 // if(bEppflags.flags.remote_wakeup == 1)
413 2 // txdat[0] = 3;
414 2 // else
415 2 // txdat[0] = 1;
416 2 txdat[0] = 0; //bus power, don't support remote wakeup
417 2 txdat[1]=0;
418 2 single_transmit(txdat, 2);
419 2 }
420 1 else if (bRecipient == USB_RECIPIENT_INTERFACE)
421 1 {
422 2 txdat[0]=0;
423 2 txdat[1]=0;
424 2 single_transmit(txdat, 2);
425 2 }
426 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT)
427 1 {
C51 COMPILER V7.01 USBIMPL 06/30/2007 11:42:51 PAGE 8
428 2 endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
429 2 if (ControlData.DevRequest.wIndex & USB_ENDPOINT_DIRECTION_MASK)
430 2 c = D12_SelectEndpoint(endp*2 + 1); // Control-in
431 2 else
432 2 c = D12_SelectEndpoint(endp*2); // Control-out
433 2 if(c & D12_STALL)
434 2 txdat[0] = 1; //ep stall
435 2 else
436 2 txdat[0] = 0; //ep work
437 2 txdat[1] = 0;
438 2 single_transmit(txdat, 2);
439 2 }
440 1 else
441 1 stall_ep0();
442 1 }
443
444 void clear_feature(void)
445 {
446 1 u8 endp;
447 1 u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
448 1
449 1 // PRINT("clear_feature ");
450 1
451 1 if (bRecipient == USB_RECIPIENT_DEVICE
452 1 && ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
453 1 {
454 2 // DISABLE_INTERRUPT;
455 2 // bEppflags.flags.remote_wakeup = 0;
456 2 // ENABLE_INTERRUPT;
457 2 single_transmit(0, 0);
458 2 }
459 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
460 1 && ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
461 1 {
462 2 endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
463 2 if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
464 2 /* clear TX stall for IN on EPn. */
465 2 D12_SetEndpointStatus(endp*2 + 1, 0);
466 2 else
467 2 /* clear RX stall for OUT on EPn. */
468 2 D12_SetEndpointStatus(endp*2, 0);
469 2 single_transmit(0, 0);
470 2 }
471 1 else
472 1 stall_ep0();
473 1 }
474 void set_feature(void)
475 {
476 1 u8 endp;
477 1 u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
478 1
479 1 // PRINT("set_feature ");
480 1
481 1 if (bRecipient == USB_RECIPIENT_DEVICE
482 1 && ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
483 1 {
484 2 // DISABLE_INTERRUPT;
485 2 // bEppflags.flags.remote_wakeup = 1;
486 2 // ENABLE_INTERRUPT;
487 2 single_transmit(0, 0);
488 2 }
489 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V7.01 USBIMPL 06/30/2007 11:42:51 PAGE 9
490 1 && ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
491 1 {
492 2 endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
493 2 if (ControlData.DevRequest.wIndex & (u8)USB_ENDPOINT_DIRECTION_MASK)
494 2 /* clear TX stall for IN on EPn. */
495 2 D12_SetEndpointStatus(endp*2 + 1, 1);
496 2 else
497 2 /* clear RX stall for OUT on EPn. */
498 2 D12_SetEndpointStatus(endp*2, 1);
499 2 single_transmit(0, 0);
500 2 }
501 1 else
502 1 stall_ep0();
503 1 }
504 void set_address(void)
505 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -