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

📄 main.c

📁 针对华清远见的FS9200(其内核为at91rm9200)的一个usb测试程序
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : ODi   06/26/2002
//*
//*----------------------------------------------------------------------------
#include <stdio.h>
#include "main.h"
#include "lib_arm920t.h"

AT91S_SVC_USBCTL   usbEp0;
AT91S_SVC_USBIN    usbEpIn;
AT91S_SVC_USBOUT   usbEpOut;
AT91S_SVC_USBIN    usbEpInt;

extern volatile unsigned char currentConfiguration;
extern volatile unsigned char currentConnection;

//*----------------------------------------------------------------------------
//* \fn    AT91F_EnableICache
//* \brief Enable I Cache
//*----------------------------------------------------------------------------
void AT91F_EnableICache()
{
	unsigned int ctl;

	ctl = AT91F_ARM_ReadControl();
	ctl |= (1 << 12);
	AT91F_ARM_WriteControl(ctl);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_InitDrivers
//* \brief This function initialize USART 1, the AIC and AT91S_SVC_USDRIVER driver
//*----------------------------------------------------------------------------
void AT91F_InitDrivers()
{
	// ============================= Init USB driver =============================
	// Configure PMC
	AT91F_UDP_CfgPMC();                        // Enable UDP peripheral
	AT91C_BASE_PMC->PMC_SCER |= AT91C_PMC_UDP; // Enable 48 MHz
	// Open DMA service for each endpoint
	AT91F_SVC_USBCTL_Open(&usbEp0, AT91C_BASE_UDP);
	usbEp0.DisptachSetup = AT91F_USB_DispatchRequest;
	AT91F_SVC_USBIN_Open(&usbEpIn, AT91C_BASE_UDP, 2, 0x40, 2);
	AT91F_SVC_USBOUT_Open(&usbEpOut, AT91C_BASE_UDP, 1, 0x40, 2);
	AT91F_SVC_USBIN_Open(&usbEpInt, AT91C_BASE_UDP, 3, 8, 1);

	// Configure AIC controller to handle USB interrupts
	AT91F_AIC_ConfigureIt (
		AT91C_BASE_AIC,                        // AIC base address
		AT91C_ID_UDP,                          // System peripheral ID
		AT91C_AIC_PRIOR_HIGHEST,               // Max priority
		AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
		AT91F_ASM_UDP_Handler );

	// Enable Udp interrupt in AIC
	AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP);
	
	// Enable UDP pullUp (PIOA10 on AT91RM3400DK)
//	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA10);
//	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA10);
	// Enable UDP pullUp (PIOA5 on FS9200BOARD)
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA5);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA5);
/*	{
		unsigned long tick;
		
		tick = 0;
		while(tick<1000000) tick++;
	}*/
	printf("USBD reconnected\n");
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA5);	
	
}

#define BUFFER_SIZE 1024
char pBuffer[BUFFER_SIZE];
volatile char flgUsbOpAchieved;

void usbReceiveCallBack(AT91PS_SVC_USBOUT pUsbOut)
{
	flgUsbOpAchieved = 1;
}

void usbSentCallBack(AT91PS_SVC_USBIN pUsbIn)
{
	flgUsbOpAchieved = 1;
}

void __irq irq_handler(void)	//added by hzh
{	
	void (*svr)(void);
	AT91PS_AIC ptr = AT91C_BASE_AIC;
	unsigned long i;
//	U8 irq_idx;

//取得中断入口地址可用AIC_IVR或用AIC_ISR作索引得到AIC_SVR数组中的地址
	i = ptr->AIC_IVR;		//read AIC_IVR
//	irq_idx = ptr->AIC_ISR&0x1f;
//边沿触发中断必须以此清中断
//	AT91F_AIC_ClearIt(AT91C_BASE_AIC, irq_idx);	

// Write in the IVR to support Protect Mode
// No effect in Normal Mode
// De-assert the NIRQ and clear the source in Protect Mode	
	ptr->AIC_IVR = (AT91_REG)ptr;
	
//	putch("I");
//	printf("%x,%x,%x\n", irq_idx, ptr->AIC_IPR, ptr->AIC_CISR);

	svr = (void (*)(void))i;//ptr->AIC_SVR[irq_idx];
	(*svr)();
	AT91F_AIC_AcknowledgeIt(ptr);	//退出中断前必须应答
}


int main()
{
	unsigned int messageSize, messageId = 0;
	
	//将IRQ入口地址(0x18)的指令改为 ldr, pc, [pc, #-&F20](本程序所用的中断处理方式)
	AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, AT91C_AIC_BRANCH_OPCODE);

	// Init USART 1 console driver
	AT91F_InitDrivers();

	AT91F_EnableICache();

	AT91F_PIO_CfgOutput(AT91C_BASE_PIOC, (1 << 15) | (1 << 14));

	printf("\n\n\r-I- ======================================\n\r-I- AT91RM9200 basic USB example\n\r-I- --------------------------------------\n\r-I- Please connect the board...\n\r-I- ======================================\n\r");

	// Wait for a SET_CONFIGURATION
	while (currentConfiguration != 1);
	
	// Wait for an acknowledged connection
	while (currentConnection != 3);
	
	// Send a welcome message...
	flgUsbOpAchieved = 0;
	usbEpIn.Write(&usbEpIn, 
		"\n\n\r-I- USB serial emulation is active, all characters sent will be echo-ed\n\r", 
		77, usbSentCallBack);
	while(!flgUsbOpAchieved);
	
	
	// Main loop
	while (1) {

		flgUsbOpAchieved = 0;
		usbEpOut.Read(&usbEpOut, pBuffer, BUFFER_SIZE, usbReceiveCallBack);
		while(!flgUsbOpAchieved);
		messageSize = BUFFER_SIZE - usbEpOut.bufferSize;
		printf("-I- (%d) Message received: %d\n\r", messageId, messageSize);
		
		flgUsbOpAchieved = 0;
		usbEpIn.Write(&usbEpIn, pBuffer, messageSize, usbSentCallBack);
		while(!flgUsbOpAchieved);
		printf("-I- (%d) Message sent: %d\n\r", messageId, messageSize);
		++messageId;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -