diff options
Diffstat (limited to 'software')
-rw-r--r-- | software/hhd70dongle/Makefile | 19 | ||||
-rw-r--r-- | software/hhd70dongle/c1101lib.c | 98 | ||||
-rw-r--r-- | software/hhd70dongle/hhd70dongle.c | 101 | ||||
-rw-r--r-- | software/hhd70dongle/usb_rawhid.c | 940 | ||||
-rw-r--r-- | software/hhd70dongle/usb_rawhid.h | 85 | ||||
-rw-r--r-- | software/hhd70dongle/util.c | 2 | ||||
-rw-r--r-- | software/hhd70dongle/util.h | 2 |
7 files changed, 155 insertions, 1092 deletions
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 <LUFA/Drivers/Misc/RingBuffer.h> +#include <LUFA/Drivers/USB/USB.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. + */ +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 <LUFA/Drivers/Peripheral/SPI.h> +//#include <LUFA/Drivers/Misc/RingBuffer.h> +#include <LUFA/Drivers/USB/USB.h> +#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<<DDB5); // set PB5/ADC12 to INPUT (c1101 temp sensor) - while (!usb_configured()) /* wait */ ; - usb_rawhid_send((uint8_t*)"hhd70dongle ready",17); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"hhd70dongle ready"); _delay_ms(500); c1101_init(); hhd70_palna_rxmode(); for(;;) { + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + c1101_spi_strobe_command(SPIC1101_ADDR_SRX); // enter RX - Mode _delay_ms(1000); + /* usb_rawhid_recv(read_buffer,20); if (read_buffer[0] == 'r') reset(); - + */ if (hhd70_rx_data_available() == 1) { led_on(); - usb_rawhid_send((uint8_t*)"RX: GDO2 pin HIGH",100); - usb_rawhid_send((uint8_t*)"c1101 rx bytes:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"RX: GDO2 pin HIGH"); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 rx bytes:"); debug_sprint_int16hex(write_buffer, c1101_spi_read_register(SPIC1101_ADDR_RXBYTES)); - usb_rawhid_send(write_buffer,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer); c1101_recieveData(); led_off(); } - usb_rawhid_send((uint8_t*)"c1101 rssi:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 rssi:"); debug_sprint_int16hex(write_buffer, c1101_spi_read_register(SPIC1101_ADDR_RSSI)); - usb_rawhid_send(write_buffer,255); - usb_rawhid_send((uint8_t*)"c1101 tx bytes:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 tx bytes:"); debug_sprint_int16hex(write_buffer, c1101_spi_read_register(SPIC1101_ADDR_TXBYTES)); - usb_rawhid_send(write_buffer,255); - usb_rawhid_send((uint8_t*)"c1101 rx bytes:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"c1101 rx bytes:"); debug_sprint_int16hex(write_buffer, c1101_spi_read_register(SPIC1101_ADDR_RXBYTES)); - usb_rawhid_send(write_buffer,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer); c1101_spi_dump_registers_to_usb(); write_buffer[0]='T'; write_buffer[1]='e'; @@ -104,22 +161,22 @@ int main(void) write_buffer[5]=':'; adc_on(); _delay_ms(250); - usb_rawhid_send((uint8_t*)"temp c1101:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"temp c1101:"); debug_sprint_int16hex(write_buffer+6, c1101_measureTemp()); - usb_rawhid_send(write_buffer+6,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer+6); _delay_ms(250); - usb_rawhid_send((uint8_t*)"temp atmega:",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"temp atmega:"); debug_sprint_int16hex(write_buffer+10, adc_read(ADCMUX_ADC12)); - usb_rawhid_send(write_buffer+10,255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,write_buffer+10); adc_off(); _delay_ms(250); led_on(); - usb_rawhid_send((uint8_t*)"TX Data: String",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"TX Data: String"); c1101_transmitData("OE6EOF test mur.sat GFSK r:9k6 fdev:3mhz 1234567890123456789012345678901234567890 End of Test",93); led_off(); _delay_ms(100); led_on(); - usb_rawhid_send((uint8_t*)"TX Data: Temps",255); + CDC_Device_SendString(&VirtualSerial_CDC_Interface,"TX Data: Temps"); c1101_transmitData((char*) write_buffer,14); led_off(); } diff --git a/software/hhd70dongle/usb_rawhid.c b/software/hhd70dongle/usb_rawhid.c deleted file mode 100644 index 2b1a590..0000000 --- a/software/hhd70dongle/usb_rawhid.c +++ /dev/null @@ -1,940 +0,0 @@ -/* Teensy RawHID example - * http://www.pjrc.com/teensy/rawhid.html - * Copyright (c) 2009 PJRC.COM, LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above description, website URL and copyright notice and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -// Version 1.0: Initial Release -// Version 1.1: fixed bug in analog - -#define USB_PRIVATE_INCLUDE -#include "usb_rawhid.h" - -/************************************************************************** - * - * Configurable Options - * - **************************************************************************/ - -// You can change these to give your code its own name. -#define STR_MANUFACTURER L"mur.sat" -#define STR_PRODUCT L"hdd70dongle" - -// These 4 numbers identify your device. Set these to -// something that is (hopefully) not used by any others! -#define VENDOR_ID 0x16C0 -#define PRODUCT_ID 0x0481 -#define RAWHID_USAGE_PAGE 0xFFAB // recommended: 0xFF00 to 0xFFFF -#define RAWHID_USAGE 0x0200 // recommended: 0x0100 to 0xFFFF - -// These determine the bandwidth that will be allocated -// for your communication. You do not need to use it -// all, but allocating more than necessary means reserved -// bandwidth is no longer available to other USB devices. -#define RAWHID_TX_SIZE 64 // transmit packet size -#define RAWHID_TX_INTERVAL 2 // max # of ms between transmit packets -#define RAWHID_RX_SIZE 64 // receive packet size -#define RAWHID_RX_INTERVAL 8 // max # of ms between receive packets - - -/************************************************************************** - * - * Endpoint Buffer Configuration - * - **************************************************************************/ - -#define ENDPOINT0_SIZE 32 -#define RAWHID_INTERFACE 0 -#define RAWHID_TX_ENDPOINT 1 -#define RAWHID_RX_ENDPOINT 2 - -#if defined(__AVR_AT90USB162__) -#define RAWHID_TX_BUFFER EP_SINGLE_BUFFER -#define RAWHID_RX_BUFFER EP_SINGLE_BUFFER -#else -#define RAWHID_TX_BUFFER EP_DOUBLE_BUFFER -#define RAWHID_RX_BUFFER EP_DOUBLE_BUFFER -#endif - -static const uint8_t PROGMEM endpoint_config_table[] = { - 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(RAWHID_TX_SIZE) | RAWHID_TX_BUFFER, - 1, EP_TYPE_INTERRUPT_OUT, EP_SIZE(RAWHID_RX_SIZE) | RAWHID_RX_BUFFER, - 0, - 0 -}; - - -/************************************************************************** - * - * Descriptor Data - * - **************************************************************************/ - -// Descriptors are the data that your computer reads when it auto-detects -// this USB device (called "enumeration" in USB lingo). The most commonly -// changed items are editable at the top of this file. Changing things -// in here should only be done by those who've read chapter 9 of the USB -// spec and relevant portions of any USB class specifications! - - -static uint8_t PROGMEM device_descriptor[] = { - 18, // bLength - 1, // bDescriptorType - 0x00, 0x02, // bcdUSB - 0, // bDeviceClass - 0, // bDeviceSubClass - 0, // bDeviceProtocol - ENDPOINT0_SIZE, // bMaxPacketSize0 - LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor - LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct - 0x00, 0x01, // bcdDevice - 1, // iManufacturer - 2, // iProduct - 0, // iSerialNumber - 1 // bNumConfigurations -}; - -static uint8_t PROGMEM rawhid_hid_report_desc[] = { - 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), - 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), - 0xA1, 0x01, // Collection 0x01 - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - 0x95, RAWHID_TX_SIZE, // report count - 0x09, 0x01, // usage - 0x81, 0x02, // Input (array) - 0x95, RAWHID_RX_SIZE, // report count - 0x09, 0x02, // usage - 0x91, 0x02, // Output (array) - 0xC0 // end collection -}; - - -#define CONFIG1_DESC_SIZE (9+9+9+7+7) -#define RAWHID_HID_DESC_OFFSET (9+9) -static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = { - // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10 - 9, // bLength; - 2, // bDescriptorType; - LSB(CONFIG1_DESC_SIZE), // wTotalLength - MSB(CONFIG1_DESC_SIZE), - 1, // bNumInterfaces - 1, // bConfigurationValue - 0, // iConfiguration - 0xC0, // bmAttributes - 50, // bMaxPower - - // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 - 9, // bLength - 4, // bDescriptorType - RAWHID_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 2, // bNumEndpoints - 0x03, // bInterfaceClass (0x03 = HID) - 0x00, // bInterfaceSubClass (0x01 = Boot) - 0x00, // bInterfaceProtocol (0x01 = Keyboard) - 0, // iInterface - // HID interface descriptor, HID 1.11 spec, section 6.2.1 - 9, // bLength - 0x21, // bDescriptorType - 0x11, 0x01, // bcdHID - 0, // bCountryCode - 1, // bNumDescriptors - 0x22, // bDescriptorType - sizeof(rawhid_hid_report_desc), // wDescriptorLength - 0, - // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 - 7, // bLength - 5, // bDescriptorType - RAWHID_TX_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (0x03=intr) - RAWHID_TX_SIZE, 0, // wMaxPacketSize - RAWHID_TX_INTERVAL, // bInterval - // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 - 7, // bLength - 5, // bDescriptorType - RAWHID_RX_ENDPOINT, // bEndpointAddress - 0x03, // bmAttributes (0x03=intr) - RAWHID_RX_SIZE, 0, // wMaxPacketSize - RAWHID_RX_INTERVAL // bInterval -}; - -// If you're desperate for a little extra code memory, these strings -// can be completely removed if iManufacturer, iProduct, iSerialNumber -// in the device desciptor are changed to zeros. -struct usb_string_descriptor_struct { - uint8_t bLength; - uint8_t bDescriptorType; - int16_t wString[]; -}; -static struct usb_string_descriptor_struct PROGMEM string0 = { - 4, - 3, - {0x0409} -}; -static struct usb_string_descriptor_struct PROGMEM string1 = { - sizeof(STR_MANUFACTURER), - 3, - STR_MANUFACTURER -}; -static struct usb_string_descriptor_struct PROGMEM string2 = { - sizeof(STR_PRODUCT), - 3, - STR_PRODUCT -}; - -// This table defines which descriptor data is sent for each specific -// request from the host (in wValue and wIndex). -static struct descriptor_list_struct { - uint16_t wValue; - uint16_t wIndex; - const uint8_t *addr; - uint8_t length; -} PROGMEM descriptor_list[] = { - {0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)}, - {0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)}, - {0x2200, RAWHID_INTERFACE, rawhid_hid_report_desc, sizeof(rawhid_hid_report_desc)}, - {0x2100, RAWHID_INTERFACE, config1_descriptor+RAWHID_HID_DESC_OFFSET, 9}, - {0x0300, 0x0000, (const uint8_t *)&string0, 4}, - {0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)}, - {0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)} -}; -#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct)) - - -/************************************************************************** - * - * Variables - these are the only non-stack RAM usage - * - **************************************************************************/ - -// zero when we are not configured, non-zero when enumerated -static volatile uint8_t usb_configuration=0; - -// these are a more reliable timeout than polling the -// frame counter (UDFNUML) -static volatile uint8_t rx_timeout_count=0; -static volatile uint8_t tx_timeout_count=0; - - - -/************************************************************************** - * - * Public Functions - these are the API intended for the user - * - **************************************************************************/ - - -// initialize USB -void usb_init(void) -{ - HW_CONFIG(); - USB_FREEZE(); // enable USB - PLL_CONFIG(); // config PLL - while (!(PLLCSR & (1<<PLOCK))) ; // wait for PLL lock - USB_CONFIG(); // start USB clock - UDCON = 0; // enable attach resistor - usb_configuration = 0; - UDIEN = (1<<EORSTE)|(1<<SOFE); - sei(); -} - -// return 0 if the USB is not configured, or the configuration -// number selected by the HOST -uint8_t usb_configured(void) -{ - return usb_configuration; -} - - -// receive a packet, with timeout -int8_t usb_rawhid_recv(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(); - rx_timeout_count = timeout; - UENUM = RAWHID_RX_ENDPOINT; - // wait for data to be available in the FIFO - while (1) { - if (UEINTX & (1<<RWAL)) break; - SREG = intr_state; - if (rx_timeout_count == 0) return 0; - if (!usb_configuration) return -1; - intr_state = SREG; - cli(); - UENUM = RAWHID_RX_ENDPOINT; - } - // read bytes from the FIFO - #if (RAWHID_RX_SIZE >= 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<<RWAL)) break; - SREG = intr_state; - if (tx_timeout_count == 0) return 0; - if (!usb_configuration) return -1; - intr_state = SREG; - cli(); - UENUM = RAWHID_TX_ENDPOINT; - } - // write bytes from the FIFO - #if (RAWHID_TX_SIZE >= 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<<EORSTI)) { - UENUM = 0; - UECONX = 1; - UECFG0X = EP_TYPE_CONTROL; - UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER; - UEIENX = (1<<RXSTPE); - usb_configuration = 0; - } - if ((intbits & (1<<SOFI)) && usb_configuration) { - t = rx_timeout_count; - if (t) rx_timeout_count = --t; - t = tx_timeout_count; - if (t) tx_timeout_count = --t; - } -} - - - -// Misc functions to wait for ready and send/receive packets -static inline void usb_wait_in_ready(void) -{ - while (!(UEINTX & (1<<TXINI))) ; -} -static inline void usb_send_in(void) -{ - UEINTX = ~(1<<TXINI); -} -static inline void usb_wait_receive_out(void) -{ - while (!(UEINTX & (1<<RXOUTI))) ; -} -static inline void usb_ack_out(void) -{ - UEINTX = ~(1<<RXOUTI); -} - - - -// USB Endpoint Interrupt - endpoint 0 is handled here. The -// other endpoints are manipulated by the user-callable -// functions, and the start-of-frame interrupt. -// -ISR(USB_COM_vect) -{ - uint8_t intbits; - const uint8_t *list; - const uint8_t *cfg; - uint8_t i, n, len, en; - uint8_t bmRequestType; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - uint16_t desc_val; - const uint8_t *desc_addr; - uint8_t desc_length; - - UENUM = 0; - intbits = UEINTX; - if (intbits & (1<<RXSTPI)) { - bmRequestType = UEDATX; - bRequest = UEDATX; - wValue = UEDATX; - wValue |= (UEDATX << 8); - wIndex = UEDATX; - wIndex |= (UEDATX << 8); - wLength = UEDATX; - wLength |= (UEDATX << 8); - UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI) | (1<<TXINI)); - if (bRequest == GET_DESCRIPTOR) { - list = (const uint8_t *)descriptor_list; - for (i=0; ; i++) { - if (i >= NUM_DESC_LIST) { - UECONX = (1<<STALLRQ)|(1<<EPEN); //stall - return; - } - desc_val = pgm_read_word(list); - if (desc_val != wValue) { - list += sizeof(struct descriptor_list_struct); - continue; - } - list += 2; - desc_val = pgm_read_word(list); - if (desc_val != wIndex) { - list += sizeof(struct descriptor_list_struct)-2; - continue; - } - list += 2; - desc_addr = (const uint8_t *)pgm_read_word(list); - list += 2; - desc_length = pgm_read_byte(list); - break; - } - len = (wLength < 256) ? wLength : 255; - if (len > desc_length) len = desc_length; - do { - // wait for host ready for IN packet - do { - i = UEINTX; - } while (!(i & ((1<<TXINI)|(1<<RXOUTI)))); - if (i & (1<<RXOUTI)) return; // abort - // send IN packet - n = len < ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE; - for (i = n; i; i--) { - UEDATX = pgm_read_byte(desc_addr++); - } - len -= n; - usb_send_in(); - } while (len || n == ENDPOINT0_SIZE); - return; - } - if (bRequest == SET_ADDRESS) { - usb_send_in(); - usb_wait_in_ready(); - UDADDR = wValue | (1<<ADDEN); - return; - } - if (bRequest == SET_CONFIGURATION && bmRequestType == 0) { - usb_configuration = wValue; - usb_send_in(); - cfg = endpoint_config_table; - for (i=1; i<5; i++) { - UENUM = i; - en = pgm_read_byte(cfg++); - UECONX = en; - if (en) { - UECFG0X = pgm_read_byte(cfg++); - UECFG1X = pgm_read_byte(cfg++); - } - } - UERST = 0x1E; - UERST = 0; - return; - } - if (bRequest == GET_CONFIGURATION && bmRequestType == 0x80) { - usb_wait_in_ready(); - UEDATX = usb_configuration; - usb_send_in(); - return; - } - - if (bRequest == GET_STATUS) { - usb_wait_in_ready(); - i = 0; - if (bmRequestType == 0x82) { - UENUM = wIndex; - if (UECONX & (1<<STALLRQ)) i = 1; - UENUM = 0; - } - UEDATX = i; - UEDATX = 0; - usb_send_in(); - return; - } - if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE) - && bmRequestType == 0x02 && wValue == 0) { - i = wIndex & 0x7F; - if (i >= 1 && i <= MAX_ENDPOINT) { - usb_send_in(); - UENUM = i; - if (bRequest == SET_FEATURE) { - UECONX = (1<<STALLRQ)|(1<<EPEN); - } else { - UECONX = (1<<STALLRQC)|(1<<RSTDT)|(1<<EPEN); - UERST = (1 << i); - UERST = 0; - } - return; - } - } - if (wIndex == RAWHID_INTERFACE) { - if (bmRequestType == 0xA1 && bRequest == HID_GET_REPORT) { - len = RAWHID_TX_SIZE; - do { - // wait for host ready for IN packet - do { - i = UEINTX; - } while (!(i & ((1<<TXINI)|(1<<RXOUTI)))); - if (i & (1<<RXOUTI)) return; // abort - // send IN packet - n = len < ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE; - for (i = n; i; i--) { - // just send zeros - UEDATX = 0; - } - len -= n; - usb_send_in(); - } while (len || n == ENDPOINT0_SIZE); - return; - } - if (bmRequestType == 0x21 && bRequest == HID_SET_REPORT) { - len = RAWHID_RX_SIZE; - do { - n = len < ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE; - usb_wait_receive_out(); - // ignore incoming bytes - usb_ack_out(); - len -= n; - } while (len); - usb_wait_in_ready(); - usb_send_in(); - return; - } - } - } - UECONX = (1<<STALLRQ) | (1<<EPEN); // stall -} - - diff --git a/software/hhd70dongle/usb_rawhid.h b/software/hhd70dongle/usb_rawhid.h deleted file mode 100644 index 65bc4de..0000000 --- a/software/hhd70dongle/usb_rawhid.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef usb_serial_h__ -#define usb_serial_h__ - -#include <stdint.h> - -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 <avr/io.h> -#include <avr/pgmspace.h> -#include <avr/interrupt.h> - -#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<<PLLE)|(1<<PLLP0))) -#define USB_CONFIG() (USBCON = (1<<USBE)) -#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) -#elif defined(__AVR_ATmega32U4__) -#define HW_CONFIG() (UHWCON = 0x01) -#define PLL_CONFIG() (PLLCSR = 0x12) -#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) -#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) -#elif defined(__AVR_AT90USB646__) -#define HW_CONFIG() (UHWCON = 0x81) -#define PLL_CONFIG() (PLLCSR = 0x1A) -#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) -#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) -#elif defined(__AVR_AT90USB1286__) -#define HW_CONFIG() (UHWCON = 0x81) -#define PLL_CONFIG() (PLLCSR = 0x16) -#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) -#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) -#endif - -// standard control endpoint request types -#define GET_STATUS 0 -#define CLEAR_FEATURE 1 -#define SET_FEATURE 3 -#define SET_ADDRESS 5 -#define GET_DESCRIPTOR 6 -#define GET_CONFIGURATION 8 -#define SET_CONFIGURATION 9 -#define GET_INTERFACE 10 -#define SET_INTERFACE 11 -// HID (human interface device) -#define HID_GET_REPORT 1 -#define HID_GET_IDLE 2 -#define HID_GET_PROTOCOL 3 -#define HID_SET_REPORT 9 -#define HID_SET_IDLE 10 -#define HID_SET_PROTOCOL 11 -#endif -#endif diff --git a/software/hhd70dongle/util.c b/software/hhd70dongle/util.c index 6ad965c..095099f 100644 --- a/software/hhd70dongle/util.c +++ b/software/hhd70dongle/util.c @@ -75,7 +75,7 @@ uint8_t adc_read(uint8_t mux) return ADCH; } -void debug_sprint_int16hex(uint8_t *buffer, int16_t num) +void debug_sprint_int16hex(char *buffer, int16_t num) { int c,n; for (c=0; c<4; c++) diff --git a/software/hhd70dongle/util.h b/software/hhd70dongle/util.h index 4554af9..ec379cc 100644 --- a/software/hhd70dongle/util.h +++ b/software/hhd70dongle/util.h @@ -40,6 +40,6 @@ void reset(void); void adc_on(void); void adc_off(void); uint8_t adc_read(uint8_t mux); -void debug_sprint_int16hex(uint8_t *buffer, int16_t num); +void debug_sprint_int16hex(char *buffer, int16_t num); #endif |