⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 at91rm9200 的rom程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}/////////////////////////////////////////////////////////////////////////////////////////////	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 + -