// Callbacks //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //! \brief Callback invoked during the initialization of the USB driver //! //! Configures and enables USB controller and VBus monitoring interrupts //! \param pUsb Pointer to a S_usb instance //------------------------------------------------------------------------------ static void CBK_Init(const S_usb *pUsb) { // Configure and enable the USB controller interrupt AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, USB_GetDriverID(pUsb), AT91C_AIC_PRIOR_LOWEST, 0, //AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ISR_Driver); AT91F_AIC_EnableIt(AT91C_BASE_AIC, USB_GetDriverID(pUsb)); #ifndef USB_BUS_POWERED // Configure VBus monitoring BRD_ConfigureVBus(USB_GetDriverInterface(pUsb)); // Configure and enable the Vbus detection interrupt AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_VBUS, AT91C_AIC_PRIOR_LOWEST, 0, //AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ISR_VBus); AT91F_PIO_InterruptEnable(AT91C_PIO_VBUS, AT91C_VBUS); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_VBUS); #else // Power up the USB controller USB_Attach(pUsb); #endif }
void ISR_VBus(void) { USB_Attach(&sUsb); // Acknowledge the interrupt AT91F_PIO_GetInterruptStatus(AT91C_PIO_VBUS); }
static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; USB_Device_ConfigurationNumber = 0; #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; #endif #if !defined(FIXED_CONTROL_ENDPOINT_SIZE) USB_Descriptor_Device_t* DeviceDescriptorPtr; #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) uint8_t DescriptorAddressSpace; if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR) { if (DescriptorAddressSpace == MEMSPACE_FLASH) USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); else if (DescriptorAddressSpace == MEMSPACE_EEPROM) USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); else USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; } #else if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) { #if defined(USE_RAM_DESCRIPTORS) USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; #elif defined(USE_EEPROM_DESCRIPTORS) USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #else USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #endif } #endif #endif if (USB_Options & USB_DEVICE_OPT_LOWSPEED) USB_Device_SetLowSpeed(); else USB_Device_SetFullSpeed(); Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize, ENDPOINT_BANK_SINGLE); USB_INT_Enable(USB_INT_BUSEVENTI); USB_Attach(); }
static void USB_Init_Host(void) { USB_HostState = HOST_STATE_Unattached; USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE; USB_Host_HostMode_On(); USB_Host_VBUS_Auto_On(); USB_INT_Enable(USB_INT_DCONNI); USB_INT_Enable(USB_INT_BCERRI); USB_Attach(); }
static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; USB_Device_ConfigurationNumber = 0; #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; #endif #if !defined(FIXED_CONTROL_ENDPOINT_SIZE) USB_Descriptor_Device_t* DeviceDescriptorPtr; if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; #endif if (USB_Options & USB_DEVICE_OPT_LOWSPEED) { USB_Device_SetLowSpeed(); } else { #if defined(USB_DEVICE_OPT_HIGHSPEED) if (USB_Options & USB_DEVICE_OPT_HIGHSPEED) USB_Device_SetHighSpeed(); else USB_Device_SetFullSpeed(); #else USB_Device_SetFullSpeed(); #endif } USB_INT_Enable(USB_INT_VBUSTI); Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize, ENDPOINT_BANK_SINGLE); USB_INT_Clear(USB_INT_SUSPI); USB_INT_Enable(USB_INT_SUSPI); USB_INT_Enable(USB_INT_EORSTI); USB_Attach(); }
static void USB_Init_Host(void) { USB_HostState = HOST_STATE_Unattached; USB_Host_ConfigurationNumber = 0; USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE; USB_Host_HostMode_On(); USB_Host_VBUS_Auto_Off(); USB_Host_VBUS_Manual_Enable(); USB_Host_VBUS_Manual_On(); USB_INT_Enable(USB_INT_SRPI); USB_INT_Enable(USB_INT_BCERRI); USB_Attach(); }
// configure USB clock divider per 48mhz internal oscillator void USB_ResetInterface(){ //if (USB_Options & USB_DEVICE_OPT_LOWSPEED) // CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); //else CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); USB.EPPTR = (unsigned) &endpoints; USB.ADDR = 0; endpoints[0].out.STATUS = 0; endpoints[0].out.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0SIZE); endpoints[0].out.DATAPTR = (unsigned) &ep0_buf_out; endpoints[0].in.STATUS = USB_EP_BUSNACK0_bm; endpoints[0].in.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0SIZE); endpoints[0].in.DATAPTR = (unsigned) &ep0_buf_in; USB.CTRLA = USB_ENABLE_bm | USB_SPEED_bm | USB_MAXEP; USB_Attach(); }
void USB_ResetInterface(void) { USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); #if defined(USB_CAN_BE_HOST) USB_HostState = HOST_STATE_Unattached; #endif #if defined(USB_CAN_BE_DEVICE) USB_DeviceState = DEVICE_STATE_Unattached; USB_ConfigurationNumber = 0; #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_RemoteWakeupEnabled = false; #endif #if !defined(NO_DEVICE_SELF_POWER) USB_CurrentlySelfPowered = false; #endif #endif if (!(USB_Options & USB_OPT_MANUAL_PLL)) { #if defined(USB_SERIES_4_AVR) PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1)); #endif USB_PLL_On(); while (!(USB_PLL_IsReady())); } USB_Controller_Reset(); #if defined(USB_CAN_BE_BOTH) if (UHWCON & (1 << UIDE)) { USB_INT_Clear(USB_INT_IDTI); USB_INT_Enable(USB_INT_IDTI); USB_CurrentMode = USB_GetUSBModeFromUID(); } #endif if (!(USB_Options & USB_OPT_REG_DISABLED)) USB_REG_On(); else USB_REG_Off(); USB_CLK_Unfreeze(); #if (defined(USB_CAN_BE_DEVICE) && (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) if (USB_CurrentMode == USB_MODE_DEVICE) { if (USB_Options & USB_DEVICE_OPT_LOWSPEED) USB_Device_SetLowSpeed(); else USB_Device_SetFullSpeed(); } #endif #if (defined(USB_CAN_BE_DEVICE) && !defined(FIXED_CONTROL_ENDPOINT_SIZE)) if (USB_CurrentMode == USB_MODE_DEVICE) { USB_Descriptor_Device_t* DeviceDescriptorPtr; if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) { #if defined(USE_RAM_DESCRIPTORS) USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; #elif defined(USE_EEPROM_DESCRIPTORS) USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #else USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #endif } } #endif USB_Attach(); #if defined(USB_DEVICE_ONLY) USB_INT_Clear(USB_INT_SUSPEND); USB_INT_Enable(USB_INT_SUSPEND); USB_INT_Clear(USB_INT_EORSTI); USB_INT_Enable(USB_INT_EORSTI); #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) USB_INT_Enable(USB_INT_VBUS); #endif #elif defined(USB_HOST_ONLY) USB_Host_HostMode_On(); USB_Host_VBUS_Auto_Off(); USB_OTGPAD_Off(); USB_Host_VBUS_Manual_Enable(); USB_Host_VBUS_Manual_On(); USB_INT_Enable(USB_INT_SRPI); USB_INT_Enable(USB_INT_BCERRI); #else if (USB_CurrentMode == USB_MODE_DEVICE) { USB_INT_Clear(USB_INT_SUSPEND); USB_INT_Enable(USB_INT_SUSPEND); USB_INT_Clear(USB_INT_EORSTI); USB_INT_Enable(USB_INT_EORSTI); #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) USB_INT_Enable(USB_INT_VBUS); #endif #if defined(CONTROL_ONLY_DEVICE) UENUM = ENDPOINT_CONTROLEP; #endif } else if (USB_CurrentMode == USB_MODE_HOST) { USB_Host_HostMode_On(); USB_Host_VBUS_Auto_Off(); USB_OTGPAD_Off(); USB_Host_VBUS_Manual_Enable(); USB_Host_VBUS_Manual_On(); USB_INT_Enable(USB_INT_SRPI); USB_INT_Enable(USB_INT_BCERRI); } #endif }
void USB_SetupInterface(void) { USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); USB_IsConnected = false; #if defined(USB_CAN_BE_BOTH) USB_IsInitialized = false; #endif #if defined(USB_CAN_BE_HOST) USB_HostState = HOST_STATE_Unattached; #endif #if defined(USB_CAN_BE_DEVICE) USB_ConfigurationNumber = 0; USB_RemoteWakeupEnabled = false; USB_CurrentlySelfPowered = false; #endif #if defined(USB_MODIFIED_FULL_CONTROLLER) && !defined(MANUAL_PLL_CONTROL) PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1)); #endif #if !defined(MANUAL_PLL_CONTROL) USB_PLL_On(); #endif while (!(USB_PLL_IsReady())); USB_Interface_Reset(); #if defined(USB_CAN_BE_BOTH) if (UHWCON & (1 << UIDE)) { USB_INT_Clear(USB_INT_IDTI); USB_INT_Enable(USB_INT_IDTI); USB_CurrentMode = USB_GetUSBModeFromUID(); } #elif defined(USB_DEVICE_ONLY) #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) USB_INT_Enable(USB_INT_VBUS); #endif #endif if (!(USB_Options & USB_OPT_REG_DISABLED)) USB_REG_On(); USB_CLK_Unfreeze(); #if (defined(USB_CAN_BE_DEVICE) && (defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER))) if (USB_CurrentMode == USB_MODE_DEVICE) { #ifdef CUL_V3 USB_Device_SetHighSpeed(); #else if (USB_Options & USB_DEVICE_OPT_LOWSPEED) USB_Device_SetLowSpeed(); else USB_Device_SetHighSpeed(); #endif USB_INT_Enable(USB_INT_VBUS); } #endif #if defined(USB_CAN_BE_HOST) USB_INT_Enable(USB_INT_VBERRI); if (USB_CurrentMode == USB_MODE_HOST) USB_Host_PrepareForDeviceConnect(); #endif #if defined(USB_CAN_BE_DEVICE) USB_Descriptor_Device_t* DeviceDescriptorPtr; uint16_t DeviceDescriptorSize; if (USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DeviceDescriptorSize) == true) { #if defined(USE_RAM_DESCRIPTORS) USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; #elif defined(USE_EEPROM_DESCRIPTORS) USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #else USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); #endif } #endif USB_Attach(); #if defined(USB_DEVICE_ONLY) USB_INT_Enable(USB_INT_SUSPEND); USB_INT_Enable(USB_INT_EORSTI); #elif defined(USB_HOST_ONLY) USB_Host_HostMode_On(); #else if (USB_CurrentMode == USB_MODE_DEVICE) { USB_INT_Enable(USB_INT_SUSPEND); USB_INT_Enable(USB_INT_EORSTI); } else if (USB_CurrentMode == USB_MODE_HOST) { USB_Host_HostMode_On(); } #endif #if defined(USB_CAN_BE_BOTH) USB_InitTaskPointer(); #endif }
int main(void) { //PMIC.CTRL = PMIC_HILVLEN_bm | */PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm; //sei(); LED_Init(); LED_On(Red); //LED_On(Orange); #ifdef DEBUG uart_init(); LED_On(Orange); uart_println("UART ready."); LED_Off(Red); #endif USB_Init(); #ifdef DEBUG uart_println("Attaching USB lines"); #endif USB_Attach(); #ifdef DEBUG uart_println("Init done. BL waiting..."); #endif LED_Off(Red); LED_On(Orange); // wait for USB to come up within 7 secs. If it does not => jump to the application directly // if it does: check reset status. EXT = wait another 7 seconds in BL before jumping to the app itself for any programming stuff // if PO/WD/BOD = wait only 2 seconds before jumping to the app. char Keep = 1; OVFCounter = 0; TCD0.CTRLA = TC_CLKSEL_DIV64_gc; // 125ms or thereabouts TCD0.INTCTRLA = TC_OVFINTLVL_MED_gc; while(Keep) // wait for USB { if(OVFCounter >= 7*8) // 7 seconds Keep = 0; if(USB_State == Configured) Keep = 0; if(OVFCounter & 1) LED_On(Red); else LED_Off(Red); } #ifdef DEBUG u8 DelayTime = 2*8; // 2 seconds just for the lulz. Will be set to 0 for production code. #else u8 DelayTime = 0; #endif Keep = 1; u8 rst = RST.STATUS; RST.STATUS = 0xFF; // clear the flags if(rst & RST_EXTRF_bm) // external reset -- stay in bootloader! { DelayTime = 7*8; // 7 seconds } if(USB_State == Configured) { LED_On(Red); } else if (rst & RST_PORF_bm) // power on -- jump to app { LED_Off(Orange); uart_println("DBG: Jumping to application."); //__asm__ ("jmp 0"); } u8 GoToBL = 0; OVFCounter = 0; while(Keep) { if(OVFCounter >= DelayTime) Keep = 0; if(USB_Serial_Pending() > 0) { Keep = 0; GoToBL = 1; } if(OVFCounter & 1) LED_On(Orange); else LED_Off(Orange); } if(GoToBL && USB_State == Configured) { #ifdef DEBUG uart_println("Going to bootloader..."); #endif LED_On(Orange); LED_On(Red); LaunchBootloader(); while (1) { } } #ifdef DEBUG uart_println("Going to application..."); #endif LED_Off(Orange); while(1) { } }