/** Event handler for the library USB Control Request reception event. */ bool EVENT_USB_Device_ControlRequest(USB_Request_Header_t* req){ // zero out ep0_buf_in for (uint8_t i = 0; i < 64; i++) ep0_buf_in[i] = 0; usb_cmd = 0; if ((req->bmRequestType & CONTROL_REQTYPE_TYPE) == REQTYPE_VENDOR){ switch(req->bRequest){ case 0x00: // Info if (req->wIndex == 0){ USB_ep0_send_progmem((uint8_t*)hwversion, sizeof(hwversion)); }else if (req->wIndex == 1){ USB_ep0_send_progmem((uint8_t*)fwversion, sizeof(fwversion)); } return true; case 0x70: PORTE_DIRSET = 1 << 0 | 1 << 1 | 1 << 2; TCE0_CTRLA = TC_CLKSEL_DIV1_gc; TCE0_CTRLB = TC0_CCAEN_bm | TC0_CCBEN_bm | TC0_CCCEN_bm | TC_WGMODE_SINGLESLOPE_gc; TCE0_PER = 1 << 12; switch(req->wIndex){ case 0x00: TCE0_CCA = req->wValue; break; case 0x01: TCE0_CCB = req->wValue; break; case 0x02: TCE0_CCC = req->wValue; break; } USB_ep0_send(0); return true; // read EEPROM case 0xE0: eeprom_read_block(ep0_buf_in, (void*)(req->wIndex*64), 64); USB_ep0_send(64); return true; // write EEPROM case 0xE1: usb_cmd = req->bRequest; cmd_data = req->wIndex; USB_ep0_send(0); return true; // Wait for OUT data (expecting an OUT transfer) // disconnect from USB, jump to bootloader case 0xBB: USB_enter_bootloader(); return true; } } return false; }
/** Event handler for the library USB Control Request reception event. */ bool EVENT_USB_Device_ControlRequest(USB_Request_Header_t* req){ // zero out ep0_buf_in for (uint8_t i = 0; i < 64; i++) ep0_buf_in[i] = 0; usb_cmd = 0; if ((req->bmRequestType & CONTROL_REQTYPE_TYPE) == REQTYPE_VENDOR){ switch(req->bRequest){ case 0x00: // Info if (req->wIndex == 0){ USB_ep0_send_progmem((uint8_t*)hwversion, sizeof(hwversion)); }else if (req->wIndex == 1){ USB_ep0_send_progmem((uint8_t*)fwversion, sizeof(fwversion)); } return true; case 0x08: * ((uint8_t *) req->wIndex) = req->wValue; USB_ep0_send(0); return true; case 0x09: ep0_buf_in[0] = * ((uint8_t *) req->wIndex); USB_ep0_send(1); return true; case 0x16: * ((uint16_t *) req->wIndex) = req->wValue; USB_ep0_send(0); return true; case 0x17:{ uint16_t *addr; addr = (uint16_t *) req->wIndex; ep0_buf_in[0] = *addr & 0xFF; ep0_buf_in[1] = *addr >> 8; USB_ep0_send(2);} return true; // read EEPROM case 0xE0: eeprom_read_block(ep0_buf_in, (void*)(req->wIndex*64), 64); USB_ep0_send(64); return true; // write EEPROM case 0xE1: usb_cmd = req->bRequest; cmd_data = req->wIndex; USB_ep0_send(0); return true; // Wait for OUT data (expecting an OUT transfer) // disconnect from USB, jump to bootloader case 0xBB: USB_enter_bootloader(); return true; } } return false; }
/** Event handler for the library USB Control Request reception event. */ bool EVENT_USB_Device_ControlRequest(USB_Request_Header_t* req){ usb_cmd = 0; if ((req->bmRequestType & CONTROL_REQTYPE_TYPE) == REQTYPE_VENDOR){ switch(req->bRequest){ case 0x00: // Info if (req->wIndex == 0){ USB_ep0_send_progmem((uint8_t*)hwversion, sizeof(hwversion)); }else if (req->wIndex == 1){ USB_ep0_send_progmem((uint8_t*)fwversion, sizeof(fwversion)); } return true; case 0xA0: // read ADC readADC((IN_sample *) ep0_buf_in); USB_ep0_send(sizeof(IN_sample)); return true; case 0xAA: // write to channel A writeChannel(0, req->wIndex, req->wValue); USB_ep0_send(0); return true; case 0xAB: // write to channel B writeChannel(1, req->wIndex, req->wValue); USB_ep0_send(0); return true; case 0x65: // set gains switch (req->wIndex){ case 0x00: ADCA.CH0.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | req->wValue; // VS-A break; case 0x01: ADCA.CH1.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | req->wValue; // ADC-A break; case 0x02: ADCA.CH2.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | req->wValue; // ADC-B break; case 0x03: ADCA.CH3.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | req->wValue; // VS-B break; } USB_ep0_send(0); return true; case 0x15: // ISet DACB.CH0DATA = req->wValue; DACB.CH1DATA = req->wIndex; USB_ep0_send(0); return true; case 0x80: // Configure sampling configureSampling(req->wIndex /*mode*/ , req->wValue /*period*/); USB_ep0_send(0); return true; case 0xE0: // Read EEPROM eeprom_read_block(ep0_buf_in, (void*)(req->wIndex*64), 64); USB_ep0_send(64); return true; case 0xE1: // Write EEPROM usb_cmd = req->bRequest; cmd_data = req->wIndex; USB_ep0_send(0); return true; // Wait for OUT data (expecting an OUT transfer) case 0xBB: // disconnect from USB, jump to bootloader cli(); PMIC.CTRL = 0; USB_ep0_send(0); USB_ep0_wait_for_complete(); _delay_us(10000); USB_Detach(); void (*enter_bootloader)(void) = (void *) 0x47fc /*0x8ff8/2*/; enter_bootloader(); return true; } } return false; }
/** Event handler for the library USB Control Request reception event. */ bool EVENT_USB_Device_ControlRequest(USB_Request_Header_t* req){ // zero out ep0_buf_in for (uint8_t i = 0; i < 64; i++) ep0_buf_in[i] = 0; usb_cmd = 0; if ((req->bmRequestType & CONTROL_REQTYPE_TYPE) == REQTYPE_VENDOR){ switch(req->bRequest){ case 0x00: // Info if (req->wIndex == 0){ USB_ep0_send_progmem((uint8_t*)hwversion, sizeof(hwversion)); }else if (req->wIndex == 1){ USB_ep0_send_progmem((uint8_t*)fwversion, sizeof(fwversion)); } return true; // bother a specified I2C address, return '1' if address ACKs, '0' if NACK // mnemonic - 0xBotherAddress case 0xBA: ep0_buf_in[0] = botherAddress(req->wIndex, req->wValue); USB_ep0_send(1); return true; // start sampling // mnemonic - 0xConfigure7imer case 0xC7: usb_pipe_reset(&ep_in); if (req->wIndex != 0) { startConversion(); ep0_buf_in[0] = 1; timeout_or_sampling_no_longer_enabled = 0; TCC0.CCA = req->wValue; TCC0.PER = 1 << 15; } else { TCC0.PER = 0; ep0_buf_in[0] = 0; timeout_or_sampling_no_longer_enabled = 1; } TCC0.CNT = 0; USB_ep0_send(1); return true; // return a bitmap of alive cells // mnemonic - 0x5Can case 0x5C: getAlive(); _delay_ms(5); for (uint8_t i = 0; i < 8; i++) {ep0_buf_in[i] = bitmap[i];} USB_ep0_send(8); return true; // return calibration information // mnemonic - 0x6etCalibration case 0x6C: { getCalibrationData(); _delay_ms(5); uint8_t offset = 40*req->wIndex+8*req->wValue; for (uint8_t i = 0; i < 8; i++) {ep0_buf_in[i] = calibrationData[offset+i];} USB_ep0_send(8); return true; } // disconnect from USB, jump to bootloader case 0xBB: USB_enter_bootloader(); return true; } } return false; }