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

📄 esr.c

📁 有关于USB的一些主机端驱动
💻 C
字号:
/****************************************************************************
	 OMAP1510DC EVM Building project										
     Oct 23, 2001	China Digipro Copy Right Reserved.

	 File: esr.c	     
     Content: ARM925T exception handler definitions.
     	Exception vectors jump to these functions.
     Author: Zhu, Yaozong
*****************************************************************************/     
 #include "..\header\armperipherals.h"
	 extern unsigned short *fpga_intclear;

 //typedef unsigned int *f(void) fp;	
 
 extern  unsigned int SetIRQHandler( unsigned int a0 );
 extern int SetupTimerHandler( unsigned int timerNO, 
		 		unsigned int LoadTime, 
		 		 unsigned int OneShot_CLKSRC,
				  unsigned int Prescaler );
/* extern int SetupINTSourceHandler( unsigned int SourceNO,
			    unsigned int TriggerType,
			     unsigned int Priority,
			      unsigned int IRQorFIQ );
*/
 extern int SetupUART1(unsigned int BaudRate);
 extern int ReadUART1(unsigned char* Buffer, unsigned int Length);
 extern int WriteUART1(unsigned char* Buffer, unsigned int Length);

void swi_idle()
{
     printf("esr.c  swi_idle\n");
     return;
}


 unsigned int syscalls[16] = { (unsigned int)SetIRQHandler,
				(unsigned int)SetupTimerHandler,
				 (unsigned int)swi_idle,
				  (unsigned int)SetupUART1,
				   (unsigned int)ReadUART1,
				    (unsigned int)WriteUART1, };

 __asm("	.global _syscalls");
 __asm("SYSCALLS .word _syscalls");
 

 #pragma INTERRUPT( soft_interrupt, SWI )
 /* soft_interrupt is a relay function. */
 void soft_interrupt( void ) {
	asm("\tstmdb sp!, {r4, r5, lr}");
	asm("\tmrs r4, spsr");
	asm("\tstr r4, [sp, #-4]!"); /* Save spsr to enable re-entry of SWI. */

	//asm("\tmrs r4, cpsr");
	//asm("\tbic r4, r4, #0x80");
	//asm("\tmsr cpsr, r4"); /* Enable IRQ. */

	asm("\tldr r4, [lr, #-4]"); /* Get out the SWI instruction. */
	asm("\tmov r5, #0xff000000");
	asm("\tmvn r5, r5");  /* r5 = 0x00ffffff */
	asm("\tand r4, r4, r5"); /* Now the system call number in r4. */
	asm("\tldr r5, SYSCALLS");
	asm("\tldr r5, [r5, r4, LSL#2]"); /* r4 contains the call entry now. */
	asm("\tmov lr, pc");
	asm("\tbx r5");       /* Call the syscall with r0-r3 intact. */

	asm("\tldr r5, [sp], #4");
	asm("\tcmp r4, #0"); // If SetupIRQ, then don't restore spsr
	asm("\tmsrne spsr, r5"); /* Restore spsr. */
	asm("\tldmia sp!, {r4, r5, lr}"); /* Restore the registers. */	
}
 
 #pragma INTERRUPT( undefined_instruction, UDEF )
 void undefined_instruction() {
       printf("undefined\n");
       asm("undefined_instructionloop:  b undefined_instructionloop");  
       return; 
 	
 }

#pragma INTERRUPT( prefetch_abort, PABT )
void prefetch_abort() {
       printf("prefetch_abort\n");
       asm("prefetch_abortloop:  b prefetch_abortloop");  
       return;
 }
 
#pragma INTERRUPT( data_abort, DABT )
void data_abort() {
       printf("data_abort\n");
       asm("data_abortloop:  b data_abortloop");
       return;
 }

 #pragma INTERRUPT( FIQ_handler, FIQ )
 void FIQ_handler() {
       printf("Firq\n");
       asm("FIQ_handlerloop:  b FIQ_handlerloop");
       return;
 }           
 


extern void Timer3Routine(void);
extern void UART1_interrupt(void);
extern void GPIORoutine(void);
extern void mbx_Service(void);
extern void USBInterrupt(void);
extern void Camera_mbx_Service(void);
extern void CAMERA_Service(void);

/*
extern unsigned long *vecs_end;
void fillvector()
{
     unsigned long * vectoraddr = (unsigned long *)vecs_end;
     int i= 0;
    
     for(;i<3000;i++) {
     	   *vectoraddr = 0xEAFFFFFE;
     	   vectoraddr++;
     	}
     return;
} */

void mbx_Service()
{
//you can do something,here.
 Camera_mbx_Service();
 return ;
}


 //void *IRQRoutines[62](void);
unsigned long isr_table[64] = { 0,0,0,0,0,0,(unsigned long )USBInterrupt,0,\
			 0,0,0,0,0,0,(unsigned long)UART1_interrupt,0,\
			 0,0,0,0,0,0,0,0,\
			 0,0,0,0,0,0,0,0,\
			 0,(unsigned long)CAMERA_Service,0,0,0,0,0,0,\
			 0,0,(unsigned long)mbx_Service,0,0,0,(unsigned long)GPIORoutine,0,\
			 (unsigned long)Timer3Routine,0,0,0,0,0,0,0,\
			 0,0,0,0,0,0,0,0};

  __asm("	.global _isr_table");
 __asm("ISR_TABLE .word _isr_table"); 
/* #pragma INTERRUPT( IRQ_handler, IRQ ) */
 /* IRQ_handler is a relay function. */

void IRQ_handler() {
	unsigned int temp,TriggerType;
	struct interrupt_handler_struct *pINTHandler[2] = {(struct interrupt_handler_struct*)0xFFFECB00,
		(struct interrupt_handler_struct*)0xFFFE0000}; 	

 	temp = (pINTHandler[0]->SIR_IRQ_CODE)&0x0000001f;
	if (temp == 0) { /* Well, from handler 2.  */
		pINTHandler[0]->MIR |= (1<<temp);
		temp = (pINTHandler[1]->SIR_IRQ_CODE)&0x0000001f;
		pINTHandler[1]->MIR |= (1<<temp);
		TriggerType = (pINTHandler[1]->ILR[temp])&(1<<TRIGGER_TYPE);
	} else {
		pINTHandler[0]->MIR |= (1<<temp);
		TriggerType = (pINTHandler[0]->ILR[temp])&(1<<TRIGGER_TYPE);
		temp += 32;
	}                                

	*fpga_intclear = 0;

	/* Handler(); */
	/* Play the trick with TI C compiler. The first local variable is located at [sp]. */
	asm("\tldr r0, [sp]"); /* Now temp address is [sp]. */ 
	asm("\tstr lr, [sp, #-4]!"); /* Save lr. */
       asm("\tldr r1, ISR_TABLE");	
	asm("\tldr r0, [r1, r0, LSL#2]"); /* Well, get out the routine entry address. */
	asm("\tmov lr, pc");
	asm("\tbx r0");
	asm("\tldr lr, [sp], #4"); /* Restore lr. */
	/* Handler(); finished. */
	
	if (temp < 31) {
		//pINTHandler[0]->ITR &= ~(1<<temp);
		pINTHandler[0]->ITR &= ~(1<<temp);
		pINTHandler[1]->CONTROL_REG = 1<<NEW_IRQ_AGR;
		//pINTHandler[0]->ITR &= ~(1<<0); // Clear the status
		pINTHandler[0]->ITR &= ~(1<<0); // Clear the status
		pINTHandler[0]->CONTROL_REG = 1<<NEW_IRQ_AGR;		
		pINTHandler[1]->MIR &= ~(1<<temp);
		pINTHandler[0]->MIR &= ~(1<<0);
	}
	else {
		pINTHandler[0]->ITR &= ~(1<<(temp - 32)); // Clear the status
		pINTHandler[0]->CONTROL_REG = 1<<NEW_IRQ_AGR;		
		pINTHandler[0]->MIR &= ~(1<<(temp - 32));
	}

 	return;
 }
 
 

⌨️ 快捷键说明

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