103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|
|
|
|
extern void PUT32 ( unsigned int, unsigned int );
|
|
extern unsigned int GET32 ( unsigned int );
|
|
extern void dummy ( unsigned int );
|
|
extern void enable_irq ( void );
|
|
extern void enable_fiq ( void );
|
|
|
|
|
|
#define ARM_TIMER_LOD 0x2000B400
|
|
#define ARM_TIMER_VAL 0x2000B404
|
|
#define ARM_TIMER_CTL 0x2000B408
|
|
#define ARM_TIMER_CLI 0x2000B40C
|
|
#define ARM_TIMER_RIS 0x2000B410
|
|
#define ARM_TIMER_MIS 0x2000B414
|
|
#define ARM_TIMER_RLD 0x2000B418
|
|
#define ARM_TIMER_DIV 0x2000B41C
|
|
#define ARM_TIMER_CNT 0x2000B420
|
|
|
|
#define SYSTIMERCLO 0x20003004
|
|
#define GPFSEL1 0x20200004
|
|
#define GPSET0 0x2020001C
|
|
#define GPCLR0 0x20200028
|
|
|
|
#define IRQ_BASIC 0x2000B200
|
|
#define IRQ_PEND1 0x2000B204
|
|
#define IRQ_PEND2 0x2000B208
|
|
#define IRQ_FIQ_CONTROL 0x2000B210
|
|
#define IRQ_ENABLE_BASIC 0x2000B218
|
|
#define IRQ_DISABLE_BASIC 0x2000B224
|
|
|
|
volatile unsigned int icount;
|
|
|
|
//-------------------------------------------------------------------------
|
|
void c_irq_handler ( void )
|
|
{
|
|
icount++;
|
|
if(icount&1)
|
|
{
|
|
PUT32(GPCLR0,1<<16);
|
|
}
|
|
else
|
|
{
|
|
PUT32(GPSET0,1<<16);
|
|
}
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
int notmain ( void )
|
|
{
|
|
unsigned int ra;
|
|
|
|
PUT32(IRQ_DISABLE_BASIC,1);
|
|
|
|
ra=GET32(GPFSEL1);
|
|
ra&=~(7<<18);
|
|
ra|=1<<18;
|
|
PUT32(GPFSEL1,ra);
|
|
PUT32(GPSET0,1<<16);
|
|
|
|
PUT32(ARM_TIMER_CTL,0x003E0000);
|
|
PUT32(ARM_TIMER_LOD,1000000-1);
|
|
PUT32(ARM_TIMER_RLD,1000000-1);
|
|
PUT32(ARM_TIMER_DIV,0x000000F9);
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
PUT32(ARM_TIMER_CTL,0x003E00A2);
|
|
|
|
for(ra=0;ra<5;ra++)
|
|
{
|
|
PUT32(GPCLR0,1<<16);
|
|
while(1) if(GET32(ARM_TIMER_MIS)) break;
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
PUT32(GPSET0,1<<16);
|
|
while(1) if(GET32(ARM_TIMER_MIS)) break;
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
}
|
|
|
|
PUT32(ARM_TIMER_LOD,2000000-1);
|
|
PUT32(ARM_TIMER_RLD,2000000-1);
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
PUT32(IRQ_ENABLE_BASIC,1);
|
|
for(ra=0;ra<5;ra++)
|
|
{
|
|
PUT32(GPCLR0,1<<16);
|
|
while(1) if(GET32(IRQ_BASIC)&1) break;
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
PUT32(GPSET0,1<<16);
|
|
while(1) if(GET32(IRQ_BASIC)&1) break;
|
|
PUT32(ARM_TIMER_CLI,0);
|
|
}
|
|
|
|
PUT32(ARM_TIMER_LOD,4000000-1);
|
|
PUT32(ARM_TIMER_RLD,4000000-1);
|
|
icount=0;
|
|
enable_irq();
|
|
while(1) continue;
|
|
return(0);
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|