Keyboard firmwares for Atmel AVR and Cortex-M
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

usb_extra.c 955B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <util/delay.h>
  2. #include <avr/interrupt.h>
  3. #include "host.h"
  4. #include "usb_extra.h"
  5. int8_t usb_extra_send(uint8_t report_id, uint16_t data)
  6. {
  7. uint8_t intr_state, timeout;
  8. if (!usb_configured()) return -1;
  9. intr_state = SREG;
  10. cli();
  11. UENUM = EXTRA_ENDPOINT;
  12. timeout = UDFNUML + 50;
  13. while (1) {
  14. // are we ready to transmit?
  15. if (UEINTX & (1<<RWAL)) break;
  16. SREG = intr_state;
  17. // has the USB gone offline?
  18. if (!usb_configured()) return -1;
  19. // have we waited too long?
  20. if (UDFNUML == timeout) return -1;
  21. // get ready to try checking again
  22. intr_state = SREG;
  23. cli();
  24. UENUM = EXTRA_ENDPOINT;
  25. }
  26. UEDATX = report_id;
  27. UEDATX = data&0xFF;
  28. UEDATX = (data>>8)&0xFF;
  29. UEINTX = 0x3A;
  30. SREG = intr_state;
  31. return 0;
  32. }
  33. int8_t usb_extra_consumer_send(uint16_t bits)
  34. {
  35. return usb_extra_send(REPORT_ID_CONSUMER, bits);
  36. }
  37. int8_t usb_extra_system_send(uint16_t bits)
  38. {
  39. return usb_extra_send(REPORT_ID_SYSTEM, bits);
  40. }