From fb7380a3ee5d4a7325f3c7e8e485231957547426 Mon Sep 17 00:00:00 2001 From: Bernhard Tittelbach Date: Fri, 22 Jun 2012 00:25:03 +0000 Subject: ttyACM instead of usb_hid git-svn-id: https://svn.spreadspace.org/mur.sat@544 7de4ea59-55d0-425e-a1af-a3118ea81d4c --- software/hhd70dongle/Makefile | 19 +- software/hhd70dongle/c1101lib.c | 98 ++-- software/hhd70dongle/hhd70dongle.c | 101 +++- software/hhd70dongle/usb_rawhid.c | 940 ------------------------------------- software/hhd70dongle/usb_rawhid.h | 85 ---- software/hhd70dongle/util.c | 2 +- software/hhd70dongle/util.h | 2 +- 7 files changed, 155 insertions(+), 1092 deletions(-) delete mode 100644 software/hhd70dongle/usb_rawhid.c delete mode 100644 software/hhd70dongle/usb_rawhid.h (limited to 'software') diff --git a/software/hhd70dongle/Makefile b/software/hhd70dongle/Makefile index dc10371..b481287 100644 --- a/software/hhd70dongle/Makefile +++ b/software/hhd70dongle/Makefile @@ -22,8 +22,23 @@ NAME := hhd70dongle BOARD_TYPE := hhd70dongle -OBJ := $(NAME).o hhd70.o usb_rawhid.o c1101lib.o util.o -LIBS := led +OBJ := $(NAME).o hhd70.o c1101lib.o util.o +LIBS := led lufa-descriptor-usbserial RESET_FUNC := ../../tools/atmega324u_usbhid/reset +EXTERNAL_LIBS := lufa + +LUFA_PATH := ../../contrib/LUFA-120219 +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT + +LUFA_OPTS += -D USB_MANUFACTURER="L\"mur.sat\"" +LUFA_OPTS += -D USB_PRODUCT="L\"$(NAME)\"" + include ../avr.include.mk diff --git a/software/hhd70dongle/c1101lib.c b/software/hhd70dongle/c1101lib.c index 79187b9..47a446a 100644 --- a/software/hhd70dongle/c1101lib.c +++ b/software/hhd70dongle/c1101lib.c @@ -34,13 +34,37 @@ #include "c1101lib.h" #include "hhd70.h" -#include "usb_rawhid.h" #include "util.h" /**** Helper Functions ****/ #define SPIC1101_MAX_WAIT 21 + + +/* ###### ###### + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ +//#include +#include + + /* Global I/O Buffers: */ +//static RingBuffer_t SPItoUSB_Buffer; +//static uint8_t SPItoUSB_Buffer_Data[8]; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +extern USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface; +/* ###### end LUFA CDC-ACM specific definitions ###### */ + + + int16_t c1101_spi_write_byte_ok_get_status(char data) { //~ uint8_t debug_sb[6]; @@ -53,9 +77,9 @@ int16_t c1101_spi_write_byte_ok_get_status(char data) // i.e. we won't get Fifo Byte count or overflow status on normal command and so on // e.g. we only get TX Fifo Free Byte count while writing to TX Fifo // thus it makes sense to only check for CHIP_RDY here - //~ usb_rawhid_send((uint8_t*)"spi byte exchanged ",255); + //~ ((uint8_t*)"spi byte exchanged ",255); //~ debug_sprint_int16hex(debug_sb, sb); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); if (attempts++ > SPIC1101_MAX_WAIT) return -1; } while ( SPIC1101_SB_CHIP_NOT_RDY(sb) ); @@ -111,16 +135,16 @@ int16_t c1101_spi_write_register(char address, char byte) void c1101_spi_dump_registers_to_usb(void) { int c = 0; - uint8_t debug_sb[6]; + char debug_sb[6]; hhd70_spi_cs_enable(); hhd70_c1101_wait_chip_rdy(); if (c1101_spi_write_byte_ok_get_status(0xC0) < 0) return; - usb_rawhid_send((uint8_t*)"dump all 46 registers:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"dump all 46 registers:"); for (c=0; c<47; c++) { debug_sprint_int16hex(debug_sb, hhd70_spi_read_byte()); - usb_rawhid_send(debug_sb,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface, debug_sb); } hhd70_spi_cs_disable(); } @@ -176,12 +200,8 @@ int c1101_spi_write_txfifo(char *buffer, int len) sb = c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_FIFO_WRITE_BURST); if (sb < 0) return -1; - //~ uint8_t debug_sb[6]; while (len-- > 0 && SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb) > 2) { - //~ usb_rawhid_send((uint8_t*)"TXFifo bytes available",255); - //~ debug_sprint_int16hex(debug_sb, SPIC1101_SB_FIFO_BYTES_AVAILABLE(sb)); - //~ usb_rawhid_send(debug_sb,255); sb = c1101_spi_write_byte_ok_get_status(buffer[num_written++]); } hhd70_spi_cs_disable(); @@ -261,7 +281,6 @@ void c1101_setFrequency(uint32_t freq, uint8_t freq_offset, uint8_t if_freq) sb = c1101_getStatus(); } while (! (SPIC1101_SB_IDLE(sb))); //programm frequency - usb_rawhid_send((uint8_t*)"setting frequency",255); c1101_spi_write_register(SPIC1101_ADDR_FREQ0, freq & 0xFF); c1101_spi_write_register(SPIC1101_ADDR_FREQ1, (freq >> 8) & 0xFF); c1101_spi_write_register(SPIC1101_ADDR_FREQ2, (freq >> 16) & 0x3F); @@ -298,13 +317,13 @@ void c1101_handleStatusByte(char sb) if (SPIC1101_SB_RXFIFO_OVERFLOW(sb)) { c1101_spi_strobe_command(SPIC1101_ADDR_SFRX); - usb_rawhid_send((uint8_t*)"RX fifo flushed",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"RX fifo flushed"); } //on TXFifo Overflow, Flush TX Fifo if (SPIC1101_SB_TXFIFO_OVERFLOW(sb)) { c1101_spi_strobe_command(SPIC1101_ADDR_SFTX); - usb_rawhid_send((uint8_t*)"TX fifo flushed",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"TX fifo flushed"); } } @@ -316,10 +335,10 @@ char c1101_getStatus(void) sb = c1101_spi_write_byte_ok_get_status(SPIC1101_ADDR_SNOP); hhd70_spi_cs_disable(); //debug start - uint8_t debug_sb[6]; - usb_rawhid_send((uint8_t*)"c1101 status:",255); + char debug_sb[6]; + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 status:"); debug_sprint_int16hex(debug_sb, sb); - usb_rawhid_send(debug_sb,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,debug_sb); //debug end c1101_handleStatusByte(sb); return sb; @@ -331,10 +350,10 @@ char c1101_getMARCState(void) sb = c1101_spi_read_register(SPIC1101_ADDR_MARCSTATE); sb &= 0x1F; //debug start - uint8_t debug_sb[6]; - usb_rawhid_send((uint8_t*)"c1101 MARCSate:",255); + char debug_sb[6]; + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 MARCSate:"); debug_sprint_int16hex(debug_sb, sb); - usb_rawhid_send(debug_sb,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,debug_sb); //debug end return sb; } @@ -346,7 +365,7 @@ uint8_t c1101_getNumBytesInTXFifo(void) void c1101_transmitData(char *buffer, unsigned int len) { - uint8_t debug_sb[6]; + //~ uint8_t debug_sb[6]; uint8_t num_written = 0; //~ uint8_t mcsm1 = c1101_spi_read_register(SPIC1101_ADDR_MCSM1); //~ //configure state machine to automatically go to IDLE, once packet was transmitted @@ -355,9 +374,6 @@ void c1101_transmitData(char *buffer, unsigned int len) //~ c1101_spi_write_register(SPIC1101_ADDR_PKTCTRL0, 0b0000000001); //crc disabled; use FIFOs; variable packet length mode (first TX FIFO byte must be length) // flush TX FIFO num_written = c1101_spi_strobe_command(SPIC1101_ADDR_SFTX); - usb_rawhid_send((uint8_t*)"Flush TX Fifo",255); - debug_sprint_int16hex(debug_sb, num_written); - usb_rawhid_send(debug_sb,255); num_written = (uint8_t) len; //variable packet length: write length of packet to TX FIFO: @@ -368,24 +384,24 @@ void c1101_transmitData(char *buffer, unsigned int len) //~ buffer += num_written; //~ len -= num_written; - //~ usb_rawhid_send((uint8_t*)"TX num written",255); + //~ ((uint8_t*)"TX num written",255); //~ debug_sprint_int16hex(debug_sb, num_written); - //~ usb_rawhid_send(debug_sb,255); - //~ usb_rawhid_send((uint8_t*)"TX len",255); + //~ (debug_sb,255); + //~ ((uint8_t*)"TX len",255); //~ debug_sprint_int16hex(debug_sb, len); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); //~ c1101_getStatus(); - //~ usb_rawhid_send((uint8_t*)"TX bytes",255); + //~ ((uint8_t*)"TX bytes",255); //~ debug_sprint_int16hex(debug_sb, c1101_getNumBytesInTXFifo()); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); //start transmitting //num_written = c1101_spi_strobe_command(SPIC1101_ADDR_STX); //~ num_written = hhd70_spi_exchange_byte(SPIC1101_ADDR_STX); - //~ usb_rawhid_send((uint8_t*)"Strobe STX",255); + //~ ((uint8_t*)"Strobe STX",255); //~ debug_sprint_int16hex(debug_sb, num_written); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); //enable Power Amplifier hhd70_palna_txmode(); @@ -403,19 +419,19 @@ void c1101_transmitData(char *buffer, unsigned int len) { //from state IDLE or RX go to TX num_written = c1101_spi_strobe_command(SPIC1101_ADDR_STX); - //~ usb_rawhid_send((uint8_t*)"Strobe STX",255); + //~ ((uint8_t*)"Strobe STX",255); //~ debug_sprint_int16hex(debug_sb, num_written); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); } - //~ usb_rawhid_send((uint8_t*)"TX2 num written",255); + //~ ((uint8_t*)"TX2 num written",255); //~ debug_sprint_int16hex(debug_sb, num_written); - //~ usb_rawhid_send(debug_sb,255); - //~ usb_rawhid_send((uint8_t*)"TX2 len",255); + //~ (debug_sb,255); + //~ ((uint8_t*)"TX2 len",255); //~ debug_sprint_int16hex(debug_sb, len); - //~ usb_rawhid_send(debug_sb,255); - //~ usb_rawhid_send((uint8_t*)"TX2 bytes",255); + //~ (debug_sb,255); + //~ ((uint8_t*)"TX2 bytes",255); //~ debug_sprint_int16hex(debug_sb, c1101_getNumBytesInTXFifo()); - //~ usb_rawhid_send(debug_sb,255); + //~ (debug_sb,255); } while (len > 0); //disable Power Amplifier @@ -447,8 +463,8 @@ void c1101_recieveData(void) num_leave_in_fifo = (recv_data[0] - num_recv_total < 64)? 0 : 1; } while (num_recv > 0); recv_data[num_recv_total]=0; - usb_rawhid_send((uint8_t*)"RX: Data Recieved:",255); - usb_rawhid_send((uint8_t*)recv_data,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"RX: Data Recieved:"); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,recv_data); c1101_getStatus(); // get status and handle possiblble RX Fifo Overflow } diff --git a/software/hhd70dongle/hhd70dongle.c b/software/hhd70dongle/hhd70dongle.c index fd92527..3f7f344 100644 --- a/software/hhd70dongle/hhd70dongle.c +++ b/software/hhd70dongle/hhd70dongle.c @@ -37,11 +37,11 @@ #include "util.h" #include "hhd70.h" #include "c1101lib.h" -#include "usb_rawhid.h" + #define CPU_PRESCALE(n) do { CLKPR = 0x80; CLKPR = (n); } while(0) -uint8_t read_buffer[64]; // buffer for reading usb signals -uint8_t write_buffer[64]; // buffer for writing usb signals +char read_buffer[64]; // buffer for reading usb signals +char write_buffer[64]; // buffer for writing usb signals //TODOs: //* make adc work ? @@ -53,48 +53,105 @@ uint8_t write_buffer[64]; // buffer for writing usb signals // * safely save state in eeprom (2 memory regions, only use the one with the "written successfully bit" which is written last) // * what if c1101 resets spuriously and clears it's settings ? -> check peridically ? + +/* ###### ###### + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ +//#include +//#include +#include +#include "lufa-descriptor-usbserial.h" + + /* Global I/O Buffers: */ +//static RingBuffer_t SPItoUSB_Buffer; +//static uint8_t SPItoUSB_Buffer_Data[8]; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + + .DataINEndpointNumber = CDC_TX_EPNUM, + .DataINEndpointSize = CDC_TXRX_EPSIZE, + .DataINEndpointDoubleBank = false, + + .DataOUTEndpointNumber = CDC_RX_EPNUM, + .DataOUTEndpointSize = CDC_TXRX_EPSIZE, + .DataOUTEndpointDoubleBank = false, + + .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, + .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, + .NotificationEndpointDoubleBank = false, + }, + }; + +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); +} + +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} +/* ###### end LUFA CDC-ACM specific definitions ###### */ + + + int main(void) { CPU_PRESCALE(0); led_init(); hhd70_init(); - usb_init(); + USB_Init(); DDRB &= ~(1<= 64) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 63) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 62) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 61) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 60) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 59) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 58) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 57) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 56) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 55) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 54) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 53) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 52) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 51) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 50) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 49) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 48) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 47) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 46) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 45) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 44) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 43) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 42) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 41) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 40) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 39) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 38) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 37) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 36) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 35) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 34) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 33) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 32) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 31) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 30) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 29) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 28) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 27) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 26) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 25) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 24) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 23) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 22) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 21) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 20) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 19) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 18) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 17) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 16) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 15) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 14) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 13) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 12) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 11) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 10) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 9) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 8) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 7) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 6) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 5) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 4) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 3) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 2) - *buffer++ = UEDATX; - #endif - #if (RAWHID_RX_SIZE >= 1) - *buffer++ = UEDATX; - #endif - // release the buffer - UEINTX = 0x6B; - SREG = intr_state; - return RAWHID_RX_SIZE; -} - -// send a packet, with timeout -int8_t usb_rawhid_send(const uint8_t *buffer, uint8_t timeout) -{ - uint8_t intr_state; - - // if we're not online (enumerated and configured), error - if (!usb_configuration) return -1; - intr_state = SREG; - cli(); - tx_timeout_count = timeout; - UENUM = RAWHID_TX_ENDPOINT; - // wait for the FIFO to be ready to accept data - while (1) { - if (UEINTX & (1<= 64) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 63) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 62) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 61) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 60) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 59) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 58) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 57) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 56) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 55) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 54) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 53) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 52) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 51) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 50) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 49) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 48) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 47) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 46) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 45) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 44) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 43) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 42) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 41) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 40) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 39) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 38) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 37) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 36) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 35) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 34) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 33) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 32) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 31) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 30) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 29) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 28) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 27) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 26) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 25) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 24) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 23) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 22) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 21) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 20) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 19) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 18) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 17) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 16) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 15) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 14) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 13) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 12) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 11) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 10) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 9) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 8) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 7) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 6) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 5) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 4) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 3) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 2) - UEDATX = *buffer++; - #endif - #if (RAWHID_TX_SIZE >= 1) - UEDATX = *buffer++; - #endif - // transmit it now - UEINTX = 0x3A; - SREG = intr_state; - return RAWHID_TX_SIZE; -} - - - - -/************************************************************************** - * - * Private Functions - not intended for general user consumption.... - * - **************************************************************************/ - - -#if (GCC_VERSION >= 40300) && (GCC_VERSION < 40302) -#error "Buggy GCC 4.3.0 compiler, please upgrade!" -#endif - - -// USB Device Interrupt - handle all device-level events -// the transmit buffer flushing is triggered by the start of frame -// -ISR(USB_GEN_vect) -{ - uint8_t intbits, t; - - intbits = UDINT; - UDINT = 0; - if (intbits & (1<= NUM_DESC_LIST) { - UECONX = (1< desc_length) len = desc_length; - do { - // wait for host ready for IN packet - do { - i = UEINTX; - } while (!(i & ((1<= 1 && i <= MAX_ENDPOINT) { - usb_send_in(); - UENUM = i; - if (bRequest == SET_FEATURE) { - UECONX = (1< - -void usb_init(void); // initialize everything -uint8_t usb_configured(void); // is the USB port configured -int8_t usb_rawhid_recv(uint8_t *buffer, uint8_t timeout); // receive a packet, with timeout -int8_t usb_rawhid_send(const uint8_t *buffer, uint8_t timeout); // send a packet, with timeout - -// This file does not include the HID debug functions, so these empty -// macros replace them with nothing, so users can compile code that -// has calls to these functions. -#define usb_debug_putchar(c) -#define usb_debug_flush_output() - - -// Everything below this point is only intended for usb_serial.c -#ifdef USB_PRIVATE_INCLUDE -#include -#include -#include - -#define EP_TYPE_CONTROL 0x00 -#define EP_TYPE_BULK_IN 0x81 -#define EP_TYPE_BULK_OUT 0x80 -#define EP_TYPE_INTERRUPT_IN 0xC1 -#define EP_TYPE_INTERRUPT_OUT 0xC0 -#define EP_TYPE_ISOCHRONOUS_IN 0x41 -#define EP_TYPE_ISOCHRONOUS_OUT 0x40 - -#define EP_SINGLE_BUFFER 0x02 -#define EP_DOUBLE_BUFFER 0x06 - -#define EP_SIZE(s) ((s) > 32 ? 0x30 : \ - ((s) > 16 ? 0x20 : \ - ((s) > 8 ? 0x10 : \ - 0x00))) - -#define MAX_ENDPOINT 4 - -#define LSB(n) (n & 255) -#define MSB(n) ((n >> 8) & 255) - -#if defined(__AVR_AT90USB162__) -#define HW_CONFIG() -#define PLL_CONFIG() (PLLCSR = ((1<