/** Initialises the USB hardware and sets up the USB stack by installing default callbacks. @return TRUE if initialisation was successful */ BOOL USBInit(void) { // init hardware USBHwInit(); // Manual reset to workaround silicon bug USBHwReset(); // Reset USB address USBHwSetAddress(0); // register device status interrupt handler USBHwRegisterDevIntHandler(HandleUsbDevStatus); // register control transfer handler on EP0 USBHwRegisterEPIntHandler(0x00, USBHandleControlTransfer); USBHwRegisterEPIntHandler(0x80, USBHandleControlTransfer); // setup control endpoints USBHwEPConfig(0x00, MAX_PACKET_SIZE0); USBHwEPConfig(0x80, MAX_PACKET_SIZE0); // register standard request handler USBRegisterRequestHandler(REQTYPE_TYPE_STANDARD, USBHandleStandardRequest, abStdReqData); return TRUE; }
/** Configures the device according to the specified configuration index and alternate setting by parsing the installed USB descriptor list. A configuration index of 0 unconfigures the device. @param [in] bConfigIndex Configuration index @param [in] bAltSetting Alternate setting number @todo function always returns TRUE, add stricter checking? @return TRUE if successfully configured, FALSE otherwise */ static int USBSetConfiguration(U8 bConfigIndex, U8 bAltSetting) { U8 *pab; U8 bCurConfig, bCurAltSetting; U8 bEP; U16 wMaxPktSize; ASSERT(pabDescrip != NULL); if (bConfigIndex == 0) { // unconfigure device usb_enumeration_flag=0; USBHwConfigDevice(FALSE); } else { // configure endpoints for this configuration/altsetting pab = (U8 *)pabDescrip; bCurConfig = 0xFF; bCurAltSetting = 0xFF; while (pab[DESC_bLength] != 0) { switch (pab[DESC_bDescriptorType]) { case DESC_CONFIGURATION: // remember current configuration index bCurConfig = pab[CONF_DESC_bConfigurationValue]; break; case DESC_INTERFACE: // remember current alternate setting bCurAltSetting = pab[INTF_DESC_bAlternateSetting]; break; case DESC_ENDPOINT: if ((bCurConfig == bConfigIndex) && (bCurAltSetting == bAltSetting)) { // endpoint found for desired config and alternate setting bEP = pab[ENDP_DESC_bEndpointAddress]; wMaxPktSize = (pab[ENDP_DESC_wMaxPacketSize]) | (pab[ENDP_DESC_wMaxPacketSize + 1] << 8); // configure endpoint USBHwEPConfig(bEP, wMaxPktSize); } break; default: break; } // skip to next descriptor pab += pab[DESC_bLength]; } // configure device usb_enumeration_flag=1; USBHwConfigDevice(TRUE); } return TRUE; }
/** Initialises the USB hardware and sets up the USB stack by installing default callbacks. @return TRUE if initialisation was successful */ BOOL USBInit(void) { // init hardware USBHwInit(); // register bus reset handler USBHwRegisterDevIntHandler(HandleUsbReset); // register control transfer handler on EP0 USBHwRegisterEPIntHandler(0x00, USBHandleControlTransfer); USBHwRegisterEPIntHandler(0x80, USBHandleControlTransfer); // setup control endpoints USBHwEPConfig(0x00, MAX_PACKET_SIZE0); USBHwEPConfig(0x80, MAX_PACKET_SIZE0); // register standard request handler USBRegisterRequestHandler(REQTYPE_TYPE_STANDARD, USBHandleStandardRequest, abStdReqData); return TRUE; }
int main (void) { OS_ERR os_err; #if (CPU_CFG_NAME_EN == DEF_ENABLED) CPU_ERR cpu_err; #endif BSP_PreInit(); /* initialize basic board support routines */ #if (CPU_CFG_NAME_EN == DEF_ENABLED) CPU_NameSet((CPU_CHAR *)CSP_DEV_NAME, (CPU_ERR *)&cpu_err); #endif Mem_Init(); /* Initialize memory management module */ OSInit(&os_err); /* Init uC/OS-III */ // Debug_printf(Debug_Level_1, "Starting init"); #if 0 /* Enable Timer0 Interrupt.*/ CSP_IntVectReg((CSP_DEV_NBR )CSP_INT_CTRL_NBR_MAIN, (CSP_DEV_NBR )CSP_INT_SRC_NBR_TMR_00, (CPU_FNCT_PTR )App_TMR0_IntHandler, (void *)0); CSP_IntEn(CSP_INT_CTRL_NBR_MAIN, CSP_INT_SRC_NBR_TMR_00); /* Enable Timer1 Interrupt.*/ CSP_IntVectReg((CSP_DEV_NBR )CSP_INT_CTRL_NBR_MAIN, (CSP_DEV_NBR )CSP_INT_SRC_NBR_TMR_01, (CPU_FNCT_PTR )App_TMR1_IntHandler, (void *)0); CSP_IntEn(CSP_INT_CTRL_NBR_MAIN, CSP_INT_SRC_NBR_TMR_01); /* Enable Timer2 Interrupt.*/ CSP_IntVectReg((CSP_DEV_NBR )CSP_INT_CTRL_NBR_MAIN, (CSP_DEV_NBR )CSP_INT_SRC_NBR_TMR_02, (CPU_FNCT_PTR )App_TMR2_IntHandler, (void *)0); CSP_IntEn(CSP_INT_CTRL_NBR_MAIN, CSP_INT_SRC_NBR_TMR_02); CSP_TmrInit(); CSP_TmrCfg (CSP_TMR_NBR_00,TIMER_FREQ); CSP_TmrCfg (CSP_TMR_NBR_01,TIMER_FREQ); CSP_TmrCfg (CSP_TMR_NBR_02,TIMER_FREQ); #endif #if 0 // Init the Ethernet PHY EMAC_PinCfg(); emacConfigStruct.Mode = EMAC_MODE_100M_FULL; emacConfigStruct.pbEMAC_Addr = EthernetLinkLayer_macAddress(); OS_EMAC_Init(EthernetLinkLayer_rxSemaphore()); EMAC_Init(&emacConfigStruct); EMAC_SetFilterMode(EMAC_RFC_UCAST_EN, ENABLE); EMAC_SetFilterMode(EMAC_RFC_BCAST_EN, ENABLE); EMAC_SetFilterMode(EMAC_RFC_MCAST_EN, ENABLE); EMAC_SetFilterMode(EMAC_RFC_PERFECT_EN, ENABLE); EMAC_SetFilterMode(EMAC_RFC_MAGP_WOL_EN, DISABLE); EMAC_SetFilterMode(EMAC_RFC_PFILT_WOL_EN, DISABLE); // Init the Ethernt interrupt vecotrs CSP_IntVectReg((CSP_DEV_NBR )CSP_INT_CTRL_NBR_MAIN, (CSP_DEV_NBR )CSP_INT_SRC_NBR_ETHER_00, (CPU_FNCT_PTR )CSP_IntETH_Handler, (void *)0); CSP_IntEn(CSP_INT_CTRL_NBR_MAIN, CSP_INT_SRC_NBR_ETHER_00); EthernetLinkLayer_setMacAddress(macAddress); Ip_initialize(); Ip_setIPv4Address(ipv4Address); #endif #if 0 USBInit(); /* USB Initialization */ /* register descriptors */ USBRegisterDescriptors(abDescriptors); /* USB Descriptor Initialization */ /* register endpoint handlers */ USBHwRegisterEPIntHandler(BULK_IN_EP, BulkIn); /* register BulkIn Handler for EP */ USBHwRegisterEPIntHandler(BULK_OUT_EP, BulkOut); /* register BulkOut Handler for EP */ USBHwRegisterEPIntHandler(INT_IN_EP, NULL); USBHwEPConfig(BULK_IN_EP, MAX_PACKET_SIZE); /* Configure Packet Size for outgoing Transfer */ USBHwEPConfig(BULK_OUT_EP, MAX_PACKET_SIZE); /* Configure Packet Size for incoming Transfer */ /* enable bulk-in interrupts on NAKs */ USBHwNakIntEnable(INACK_BI); #endif //Cb_initialize(&cncQueueBuffer, CNC_QUEUE_BUFFER_SIZE, sizeof(QueueItem), (void*)&cncQueueBufferData); // Debug_printf(Debug_Level_1, "Init finished"); if(os_err != OS_ERR_NONE) for(;;); OSTaskCreate((OS_TCB *)&App_TaskStartTCB, /* Create the Start Task */ (CPU_CHAR *)"Start", (OS_TASK_PTR )App_TaskStart, (void *)0, (OS_PRIO )4, (CPU_STK *)App_TaskStartStk, (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE_LIMIT, (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE, (OS_MSG_QTY )0u, (OS_TICK )0u, (void *)0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&os_err); OSStart(&os_err); /* Start Multitasking */ if(os_err != OS_ERR_NONE) /* shall never get here */ for(;;); return (0); }