📄 main.c
字号:
}///////////////////////////////////////////////////////////////////////////////////////////// Interrupt handlers/////////////////////////////////////////////////////////////////////////////////////////////*--------------------------------------------------------------------------------------//* Function Name : usb_c_handler()//* Object : C Interrupt handler for USB//* Input Parameters : none//* Output Parameters : none//*--------------------------------------------------------------------------------------void usb_c_handler(void){ register u_int uir = AT91F_UdpUisr(UDP_BASE) & AT91F_UdpUimr(UDP_BASE); register u_int uisr; if (uir & UDP_ENDBUSRES) { AT91F_UdpReset(UDP_BASE); AT91F_UdpUier(UDP_BASE, (UDP_EP0INT)); AT91F_UdpUicr(UDP_BASE, UDP_ENDBUSRES); } else if (uir & UDP_EP0INT) { // Default endpoint // Capture the interrupt origin uisr = AT91F_UdpEpUisr(usbDesc.pUdp, usbDesc.epId); // A setup packet has been received and automatically acknowledged by the macro if (uisr & UDP_RXSETUP) { // Read the setup packet AT91F_UdpEpRead(UDP_BASE, 0, (char *) &dfuSetup, sizeof(AT91S_UsbSetup)); // Enable the READ on control endpoint if (dfuSetup.bmRequestType & (1 << 7)) AT91F_UdpEpCtrlRead(usbDesc.pUdp, usbDesc.epId); // Clear the interrupt AT91F_UdpEpUicr(UDP_BASE, 0, UDP_RXSETUP); // Dispatch the request usbDesc.DispatchRequest(&usbDesc, &dfuSetup); } // A Data OUT packet has been received... else if (uisr & UDP_RCV_DATA_BANK0) { svcUdp.HandleRx(&svcUdp); } // A Data IN packet has been sent ... else if (uisr & UDP_TXCOMPLETE) { AT91F_UdpEpUicr(UDP_BASE, 0, UDP_TXCOMPLETE); svcUdp.HandleTx(&svcUdp); } // The STALL has been acknowledged, Clear the USB_FORCESTALL to accept the next setup packet else if (uisr & UDP_STALLSENT) AT91F_UdpEpUicr(UDP_BASE, 0, (UDP_FORCESTALL | UDP_STALLSENT)); // Default behavior: Should not happen */ else if (uisr) AT91F_UdpEpUicr(UDP_BASE, 0, uisr); } // Default behaviour... else { AT91F_UdpUicr(UDP_BASE, uir); AT91F_UdpUidr(UDP_BASE, uir); }}//*--------------------------------------------------------------------------------------//* Function Name : irq1_c_handler()//* Object : C Interrupt handler for Interrutp source 1//* Input Parameters : none//* Output Parameters : none//*--------------------------------------------------------------------------------------void irq1_c_handler(void){ volatile unsigned int csr = AT91F_US_CSR(DBGU_BASE); /* ========== Systimer interrupt ============== */ if (ST_BASE->ST_SR & 0x01) { StTick++; ctlTempo.CtlTempoTick(&ctlTempo); return; } if (csr & US_MASK_IRQ_ERROR) { // Stop previous Xmodem transmition at91_usart2_uscr(DBGU_BASE, US_RSTSTA); at91_usart2_usidr(DBGU_BASE, US_ENDRX); at91_usart2_usier(DBGU_BASE, US_RXRDY | US_COMMRX); } else if (csr & (US_MASK_IRQ_TX | US_MASK_IRQ_RX | US_RXBUFF)) { if ( !(svcXmodem.eot) ) svcXmodem.Handler(&svcXmodem, csr); else { dfuDesc.pPipe->Read(dfuDesc.pPipe, (char *) &dfuSetup, 8, XmodemHandleRequest, &dfuSetup); svcXmodem.Handler(&svcXmodem, csr); } }}//*--------------------------------------------------------------------------------------//* Function Name : spi_c_handler()//* Object : C Interrupt handler for SPI//* Input Parameters : none//* Output Parameters : none//*--------------------------------------------------------------------------------------void spi_c_handler(void){ int status; status = ( SPI_BASE->SP_SR & SPI_BASE->SP_IMR ); svcDataFlash.Handler(&svcDataFlash, status);}//*-----------------------------------------------------------------------------//* Function Name : AT91F_DataFlashWaitReady//* Object : wait for dataflash ready (bit7 of the status register == 1)//* Input Parameters : DataFlash Service and timeout//* Return value : DataFlash status "ready or not"//*-----------------------------------------------------------------------------AT91S_SvcDataFlashStatus AT91F_DataFlashWaitReady(AT91PS_SvcDataFlash pSvcDataFlash, u_int timeout){ unsigned int tick; tick = GetTickCount(); pSvcDataFlash->DataFlashDesc.DataFlash_state = 0; do pSvcDataFlash->Status(&(pSvcDataFlash->DataFlashDesc)); while( ((pSvcDataFlash->DataFlashDesc.DataFlash_state & 0x80) != 0x80) && (GetTickCount() < (tick + timeout)) ); if((pSvcDataFlash->DataFlashDesc.DataFlash_state & 0x80) != 0x80) return DATAFLASH_ERROR; return DATAFLASH_OK;}//*-----------------------------------------------------------------------------//* Function Name : AT91F_EEPROMWaitReady//* Object : wait for EEPROM ready//* Input Parameters : timeout//* Return value : none//*-----------------------------------------------------------------------------void AT91F_EEPROMWaitReady(u_int timeout){ volatile unsigned int tick; tick = GetTickCount(); while(GetTickCount() < (tick + timeout));}//*--------------------------------------------------------------------------------------//* Function Name : main//* Object : //* Input Parameters ://* Output Parameters ://*--------------------------------------------------------------------------------------int main ( void ){ // Call Open methods: AT91PS_Buffer pUdpBuffer, pXmBuffer; AT91PS_SvcComm pSvcUdp; AT91PS_SvcComm pSvcXmodem; // Call Open methods: pAT91 = AT91C_ROM_BOOT_ADDRESS;//*--------------------------------------------------------------------------------------//* Tempo//*-------------------------------------------------------------------------------------- pAT91->OpenCtlTempo(&ctlTempo, (void *) &(pAT91->SYSTIMER_DESC)); ctlTempo.CtlTempoStart((void *) &(pAT91->SYSTIMER_DESC));//*--------------------------------------------------------------------------------------//* Xmodem & UDP //*-------------------------------------------------------------------------------------- pUdpBuffer = pAT91->OpenSBuffer(&sUdpBuffer); pXmBuffer = pAT91->OpenSBuffer(&sXmBuffer); pSvcUdp = pAT91->OpenSvcUdp(&svcUdp, UDP_BASE, 0, 8); pSvcXmodem = pAT91->OpenSvcXmodem(&svcXmodem, DBGU_BASE, &ctlTempo); pAT91->OpenPipe(&udpPipe, pSvcUdp, pUdpBuffer); pAT91->OpenPipe(&xmodemPipe, pSvcXmodem, pXmBuffer); pAT91->OpenUsbDesc(&usbDesc, UDP_BASE, 0); usbDesc.GetConfiguration = GetConfiguration; usbDesc.GetDescriptor = GetDescriptor; usbDesc.GetStatus = GetStatus; usbDesc.SetAddress = SetAddress; usbDesc.SetConfiguration = SetConfiguration; usbDesc.pPrivateStandardData = &udpPipe; pAT91->OpenDfuDesc( &dfuDesc, &udpPipe, &ctlTempo, AT91C_DFU_dfuIDLE, &(USB_DFU_DESC.dfuModeFctDesc), DfuDownload, (AT91PF_DfuDescUpload) 0); usbDesc.DispatchClassRequest = dfuDesc.DispatchClassRequest; usbDesc.pPrivateClassData = (void *) &dfuDesc;//*--------------------------------------------------------------------------------------//* SPI DataFlash Init//*-------------------------------------------------------------------------------------- AT91F_SPI_CfgPIO(); AT91F_SPI_CfgPMC(); AT91F_SPI_CfgSPI(); pAT91->OpenSvcDataFlash (APMC_BASE, &svcDataFlash); svcDataFlash.pDevice = &DataFlashDevice; //* Initialize the SPI Interrupt at91_irq_open ( AIC_BASE, SPI_ID , 3, AIC_SRCTYPE_INT_LEVEL_SENSITIVE , AT91F_spi_asm_handler);//*--------------------------------------------------------------------------------------//* Init the UPLOADER//*-------------------------------------------------------------------------------------- //* Init the USB peripheral AT91F_UdpOpen(UDP_BASE); //* Init the USART peripheral AT91F_US_Open(APMC_BASE, (const AT91PS_USART2Desc) &(pAT91->DBGU_DESC), US_ASYNC_MODE, at91_usart2_get_CD(MASTER_CLOCK, BAUD_RATE), 0); //* Initialize the Interrupt handlers at91_irq_open ( AIC_BASE, UDP_ID, 7, AIC_SRCTYPE_INT_LEVEL_SENSITIVE , usb_asm_handler ) ; //* Initialize the Interrupt for sysTimer and DBGU at91_irq_open ( AIC_BASE, SYS_ID, 7, AIC_SRCTYPE_INT_LEVEL_SENSITIVE , irq1_asm_handler ) ;//*--------------------------------------------------------------------------------------//* DOWNLOAD//*--------------------------------------------------------------------------------------// Try to download from a TWI Eeprom or SPI Dataflash or 8 bits external memory switch(DownloadEntry()) { case AT91C_DATAFLASH_OK: if (DataflashBoot()) BranchAppli(); break; case AT91C_EEPROM_OK: if (EepromBoot()) BranchAppli(); break;#ifndef BOOSTER_LIGHT //* No external memory for boosterlight case AT91C_EXTERNMEM_OK: if (ExternMemBoot()) BranchAppli(); break;#endif default: break; }///////////////////////////////////////////////////////////////////////////////////////////// Download failed, wait for upload.../////////////////////////////////////////////////////////////////////////////////////////// xmodemPipe.Read(&xmodemPipe, (char *) BASE_LOAD_ADDRESS, MEMORY_SIZE, XmodemProtocol, (void *) BASE_LOAD_ADDRESS); while (dfuDesc.dfuStatus.bState != AT91C_DFU_dfuMANIFEST_WAIT_RESET); BranchAppli();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -