summaryrefslogtreecommitdiff
path: root/vusb-led/vusb-led.c
diff options
context:
space:
mode:
Diffstat (limited to 'vusb-led/vusb-led.c')
-rw-r--r--vusb-led/vusb-led.c288
1 files changed, 37 insertions, 251 deletions
diff --git a/vusb-led/vusb-led.c b/vusb-led/vusb-led.c
index d47d415..31e7c13 100644
--- a/vusb-led/vusb-led.c
+++ b/vusb-led/vusb-led.c
@@ -35,278 +35,64 @@
#include "led.h"
-enum {
- SEND_ENCAPSULATED_COMMAND = 0,
- GET_ENCAPSULATED_RESPONSE,
- SET_COMM_FEATURE,
- GET_COMM_FEATURE,
- CLEAR_COMM_FEATURE,
- SET_LINE_CODING = 0x20,
- GET_LINE_CODING,
- SET_CONTROL_LINE_STATE,
- SEND_BREAK
-};
-
-#define VUSBIO_BULK_OUT_SIZE 8
-#define VUSBIO_BULK_IN_SIZE 8
-
-static PROGMEM const char configDescrCDC[] = { /* USB configuration descriptor */
- 9, /* sizeof(usbDescrConfig): length of descriptor in bytes */
- USBDESCR_CONFIG, /* descriptor type */
- 67,
- 0, /* total length of data returned (including inlined descriptors) */
- 2, /* number of interfaces in this configuration */
- 1, /* index of this configuration */
- 0, /* configuration name string index */
-#if USB_CFG_IS_SELF_POWERED
- (1 << 7) | USBATTR_SELFPOWER, /* attributes */
-#else
- (1 << 7), /* attributes */
-#endif
- USB_CFG_MAX_BUS_POWER/2, /* max USB current in 2mA units */
-
- /* interface descriptor follows inline: */
- 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
- USBDESCR_INTERFACE, /* descriptor type */
- 0, /* index of this interface */
- 0, /* alternate setting for this interface */
- USB_CFG_HAVE_INTRIN_ENDPOINT, /* endpoints excl 0: number of endpoint descriptors to follow */
- USB_CFG_INTERFACE_CLASS,
- USB_CFG_INTERFACE_SUBCLASS,
- USB_CFG_INTERFACE_PROTOCOL,
- 0, /* string index for interface */
-
- /* CDC Class-Specific descriptor */
- 5, /* sizeof(usbDescrCDC_HeaderFn): length of descriptor in bytes */
- 0x24, /* descriptor type */
- 0, /* header functional descriptor */
- 0x10, 0x01,
-
- 4, /* sizeof(usbDescrCDC_AcmFn): length of descriptor in bytes */
- 0x24, /* descriptor type */
- 2, /* abstract control management functional descriptor */
- 0x02, /* SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE */
-
- 5, /* sizeof(usbDescrCDC_UnionFn): length of descriptor in bytes */
- 0x24, /* descriptor type */
- 6, /* union functional descriptor */
- 0, /* CDC_COMM_INTF_ID */
- 1, /* CDC_DATA_INTF_ID */
-
- 5, /* sizeof(usbDescrCDC_CallMgtFn): length of descriptor in bytes */
- 0x24, /* descriptor type */
- 1, /* call management functional descriptor */
- 3, /* allow management on data interface, handles call management by itself */
- 1, /* CDC_DATA_INTF_ID */
-
- /* Endpoint Descriptor */
- 7, /* sizeof(usbDescrEndpoint) */
- USBDESCR_ENDPOINT, /* descriptor type = endpoint */
- 0x80|USB_CFG_EP3_NUMBER, /* IN endpoint number 3 */
- 0x03, /* attrib: Interrupt endpoint */
- 8, 0, /* maximum packet size */
- USB_CFG_INTR_POLL_INTERVAL, /* in ms */
-
- /* Interface Descriptor */
- 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
- USBDESCR_INTERFACE, /* descriptor type */
- 1, /* index of this interface */
- 0, /* alternate setting for this interface */
- 2, /* endpoints excl 0: number of endpoint descriptors to follow */
- 0x0A, /* Data Interface Class Codes */
- 0,
- 0, /* Data Interface Class Protocol Codes */
- 0, /* string index for interface */
-
- /* Endpoint Descriptor */
- 7, /* sizeof(usbDescrEndpoint) */
- USBDESCR_ENDPOINT, /* descriptor type = endpoint */
- 0x01, /* OUT endpoint number 1 */
- 0x02, /* attrib: Bulk endpoint */
- VUSBIO_BULK_OUT_SIZE, 0, /* maximum packet size */
- 0, /* in ms */
-
- /* Endpoint Descriptor */
- 7, /* sizeof(usbDescrEndpoint) */
- USBDESCR_ENDPOINT, /* descriptor type = endpoint */
- 0x81, /* IN endpoint number 1 */
- 0x02, /* attrib: Bulk endpoint */
- VUSBIO_BULK_IN_SIZE, 0, /* maximum packet size */
- 0, /* in ms */
-};
-
-
-uchar usbFunctionDescriptor(usbRequest_t *rq)
-{
- if(rq->wValue.bytes[1] == USBDESCR_DEVICE) {
- usbMsgPtr = (uchar *)usbDescriptorDevice;
- return usbDescriptorDevice[0];
- } else { /* must be config descriptor */
- usbMsgPtr = (uchar *)configDescrCDC;
- return sizeof(configDescrCDC);
- }
-}
-
-
-uchar sendEmptyFrame;
-static uchar intr3Status; /* used to control interrupt endpoint transmissions */
-static usbWord_t baud;
-
-
-/* ------------------------------------------------------------------------- */
-/* ----------------------------- USB interface ----------------------------- */
-/* ------------------------------------------------------------------------- */
-
-uchar usbFunctionSetup(uchar data[8])
+void vusbio_init(void)
{
- usbRequest_t *rq = (void *)data;
-
- if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */
- if( rq->bRequest==GET_LINE_CODING || rq->bRequest==SET_LINE_CODING ) {
- return 0xff;
- /* GET_LINE_CODING -> usbFunctionRead() */
- /* SET_LINE_CODING -> usbFunctionWrite() */
- }
- if(rq->bRequest == SET_CONTROL_LINE_STATE) {
- /* Report serial state (carrier detect). On several Unix platforms,
- * tty devices can only be opened when carrier detect is set.
- */
- if(intr3Status==0)
- intr3Status = 2;
- }
+ odDebugInit();
+ USBOUT &= ~USBMASK;
+ USBDDR &= ~USBMASK;
+ usbInit();
- /* Prepare bulk-in endpoint to respond to early termination */
- if((rq->bmRequestType & USBRQ_DIR_MASK) == USBRQ_DIR_HOST_TO_DEVICE)
- sendEmptyFrame = 1;
+ usbDeviceDisconnect();
+ uchar i = 0;
+ while(--i){
+ wdt_reset();
+ _delay_ms(1);
}
-
- return 0;
-}
-
-
-/*---------------------------------------------------------------------------*/
-/* usbFunctionRead */
-/*---------------------------------------------------------------------------*/
-
-uchar usbFunctionRead(uchar *data, uchar len)
-{
- data[0] = baud.bytes[0];
- data[1] = baud.bytes[1];
- data[2] = 0;
- data[3] = 0;
- data[4] = 0;
- data[5] = 0;
- data[6] = 8;
-
- return 7;
+ usbDeviceConnect();
}
-
-/*---------------------------------------------------------------------------*/
-/* usbFunctionWrite */
-/*---------------------------------------------------------------------------*/
-
-uchar usbFunctionWrite(uchar *data, uchar len)
+void vusbio_task(void)
{
- /* SET_LINE_CODING */
- baud.bytes[0] = data[0];
- baud.bytes[1] = data[1];
-
- //uartInit(baud.word);
- return 1;
+ usbPoll();
}
-void usbFunctionWriteOut(uchar *data, uchar len)
+usbMsgLen_t usbFunctionSetup(uchar data[8])
{
- for(;len;len--) {
-// tx_buf[uwptr++] = *data++;
+ usbRequest_t *req = (void *)data;
+ static uchar buf[4]; /* buffer must stay valid when usbFunctionSetup returns */
+
+ switch(req->bRequest) {
+ case 0: { /* echo */
+ buf[0] = req->wValue.bytes[0];
+ buf[1] = req->wValue.bytes[1];
+ buf[2] = req->wIndex.bytes[0];
+ buf[3] = req->wIndex.bytes[1];
+ usbMsgPtr = (usbMsgPtr_t)buf;
+ return 4;
+ }
+ case 1: {
+ if(req->wValue.bytes[0] & 1) {
+ led_on();
+ } else {
+ led_off();
+ }
+ break;
}
-}
-
-static void vusbio_init(void)
-{
- /* activate pull-ups except on USB lines */
- USB_CFG_IOPORT = (uchar)~((1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT));
- /* all pins input except USB (-> USB reset) */
-#ifdef USB_CFG_PULLUP_IOPORT /* use usbDeviceConnect()/usbDeviceDisconnect() if available */
- USBDDR = 0; /* we do RESET by deactivating pullup */
- usbDeviceDisconnect();
-#else
- USBDDR = (1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT);
-#endif
-
- /* 250 ms disconnect */
- wdt_reset();
- _delay_ms(250);
-
-#ifdef USB_CFG_PULLUP_IOPORT
- usbDeviceConnect();
-#else
- USBDDR = 0; /* remove USB reset condition */
-#endif
-}
-
-
-
-void handle_cmd(uint8_t cmd)
-{
- switch(cmd) {
- case '0': led_off(); break;
- case '1': led_on(); break;
- case 't': led_toggle(); break;
- case 'o': led2_off(); break;
- case 'i': led2_on(); break;
- case 'T': led2_toggle(); break;
- case 'r': reset2bootloader(); break;
- default: printf("error\r\n"); return;
}
- printf("ok\r\n");
+ return 0;
}
int main(void)
{
- MCUSR &= ~(1 << WDRF);
- wdt_disable();
+ wdt_enable(WDTO_1S);
cpu_init();
- led_init();
- odDebugInit();
- usbInit();
vusbio_init();
+ led_init();
sei();
for(;;) {
- }
-
- intr3Status = 0;
- sendEmptyFrame = 0;
-
- sei();
- for(;;) { /* main event loop */
wdt_reset();
- usbPoll();
-
- /* int16_t BytesReceived = vusbio_bytes_received(); */
- /* while(BytesReceived > 0) { */
- /* int ReceivedByte = fgetc(stdin); */
- /* if(ReceivedByte != EOF) { */
- /* handle_cmd(ReceivedByte); */
- /* } */
- /* BytesReceived--; */
- /* } */
-
-// vusbio_task();
-
- /* We need to report rx and tx carrier after open attempt */
- if(intr3Status != 0 && usbInterruptIsReady3()){
- static uchar serialStateNotification[10] = {0xa1, 0x20, 0, 0, 0, 0, 2, 0, 3, 0};
-
- if(intr3Status == 2){
- usbSetInterrupt3(serialStateNotification, 8);
- }else{
- usbSetInterrupt3(serialStateNotification+8, 2);
- }
- intr3Status--;
- }
+ vusbio_task();
}
}