📄 uhal.c
字号:
/* ARM board targetting source file.
file name: uhal.c
date: 2000. 2. 14
made by COiNS
*/
#include <stdarg.h>
#include <string.h>
#include "uhal.h"
#include "../arm44box/44b.h"
//#include "ne2kif.h"
#include "err.h"
//#######################
//mclk 66000000
//66000000hz/4= 16500000
///16500000/100= 165000
// 1/165000*SEC==> SEC*165
#define _TICK 1000 // 1/1000 sec
//#define _TICK 100 // 1/100 sec
//#define _TICK 10 // 1/10 sec
#define _CLOCK (165*(1000/_TICK))
#define MAX_TBUF 2048
static char tbuf[MAX_TBUF]= {0, }; //for uHALr_printf
//for debugging
void BreakPoint(void);
void DebugUNDEF(void);
void DebugSWI(void);
void DebugABORT(void);
void DebugFIQ(void);
//utilities
void Uart_SendByte(int data);
//timer interrupt handler routine
extern void TickHandler(void);
extern void UserIRQ(void);
//for interrupt enable or disable
extern void ARMDisableInt(void);
extern void ARMEnableInt(void);
//Output through LCD or serial port to print information.
extern int vsprintf(const char *format, ...);
int uHALr_printf(const char *format, ...)
{
va_list v_list;
char *ptr;
int i= 0;
va_start(v_list, format); // Initialize variable arguments.
vsprintf(tbuf, format, v_list );
va_end(v_list);
ptr= tbuf;
while( (*ptr) && i<MAX_TBUF) {
Uart_SendByte(*ptr);
ptr++; i++;
}//while
return 1;
}//uHALr_printf
/*** Called by ARMTargetInit() ***/
//disable memory management unit.
void uHALr_ResetMMU(void)
{
}//uHALrResetMMU
void (*pre_isr)(void);
void *(*post_isr)(void);
//Define pre & post-process routines for Interrupt.
void uHALir_DefineIRQ(void *is, void *iq, void *n)
{
pre_isr= (void (*)(void))is;
post_isr= (void *(*)(void))iq;
}//uHALir_DefineIRQ
//Initialze interrupts.
void uHALr_InitInterrupts(void)
{
// Non-vectored,IRQ disable,FIQ disable
rINTCON=0x1;
// All=IRQ mode
rINTMOD=0x0;
// All interrupt is masked.
rINTMSK=BIT_GLOBAL;
//set interrupt vector routine
// pISR_RESET //reserved
pISR_UNDEF= (unsigned) DebugUNDEF;
pISR_SWI= (unsigned) DebugSWI;
pISR_PABORT= (unsigned) DebugABORT;
pISR_DABORT= (unsigned) DebugABORT;
pISR_RESERVED= (unsigned) BreakPoint; //not used
// pISR_IRQ= (unsigned) 0; //reserved
pISR_FIQ= (unsigned) DebugFIQ;
pISR_ADC= (unsigned) BreakPoint;
pISR_RTC= (unsigned) BreakPoint;
pISR_UTXD1= (unsigned) BreakPoint;
pISR_UTXD0= (unsigned) BreakPoint;
pISR_SIO= (unsigned) BreakPoint;
pISR_IIC= (unsigned) BreakPoint;
pISR_URXD1= (unsigned) BreakPoint;
pISR_URXD0= (unsigned) BreakPoint;
pISR_TIMER5= (unsigned) BreakPoint;
pISR_TIMER4= (unsigned) BreakPoint;
pISR_TIMER3= (unsigned) BreakPoint;
pISR_TIMER2= (unsigned) BreakPoint;
pISR_TIMER1= (unsigned) BreakPoint;
pISR_TIMER0= (unsigned) BreakPoint;
pISR_UERR01= (unsigned) BreakPoint;
pISR_WDT= (unsigned) BreakPoint;
pISR_BDMA1= (unsigned) BreakPoint;
pISR_BDMA0= (unsigned) BreakPoint;
pISR_ZDMA1= (unsigned) BreakPoint;
pISR_ZDMA0= (unsigned) BreakPoint;
pISR_TICK= (unsigned) BreakPoint;
pISR_EINT4567= (unsigned) BreakPoint;
//pISR_EINT3= (unsigned) BreakPoint;
pISR_EINT3= (unsigned) UserIRQ;
pISR_EINT2= (unsigned) BreakPoint;
pISR_EINT1= (unsigned) BreakPoint;
pISR_EINT0= (unsigned) BreakPoint;
//handler setting
pISR_TIMER0= (unsigned) TickHandler;
}//uHALr_InitInterrupts
//Initialize timer that is used OS.
void uHALr_InitTimers(void)
{
//dead zone=0, pre0= 100
rTCFG0= 0x00000064;
//all interrupt, mux0= 1/4
rTCFG1= 0x00000001;
//set T0 count
rTCNTB0= _CLOCK;
//update T0
rTCON= 0x00000002;
//T0,auto reload and start
rTCON= 0x00000009;
}//uHALr_InitTimers
/*** Called by ARMTargetStart() ***/
//Request the system timer.
//return value 1:success 0:fail
int uHALr_RequestSystemTimer(void *tick, const unsigned char *str)
{
return 1;
}//uHALr_RequestSystemTimer
//Start system timer & enable the interrupt.
void uHALr_InstallSystemTimer(void)
{
//Non-vectored,IRQ enable,FIQ disable
rINTCON=0x1;
//rINTCON=0x5;
//Non maksed TIMER0
//##############################
rINTMSK=~( BIT_TIMER0 | BIT_GLOBAL | BIT_EINT3); //Default value=0x7ffffff
}//uHALr_InstallSystemTimer
//////////////////////////////////////////////////////////////////
//utilities
//////////////////////////////////////////////////////////////////
void Delay(int time)
// time=0: adjust the Delay function by WatchDog timer.
// 100us resolution.
{
int i,adjust=0;
int delayLoopCount= 400;
if(time==0) {
time=200;adjust=1;
delayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
rWTDAT=0xffff;
rWTCNT=0xffff;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1/64/(65+1),nRESET,interrupt disable
}//if
for(;time>0;time--)
for(i=0;i<delayLoopCount;i++);
if(adjust==1) {
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
i=0xffff-rWTCNT; // 1count/16us
delayLoopCount=8000000/(i*64); //400*100/(i*64/200)
}//if
}//Delay
static int whichUart=0;
void Uart_Select(int ch)
{
whichUart=ch;
}
void Uart_SendByte(int data)
{
if(whichUart==0) {
if(data=='\n') {
while(!(rUTRSTAT0 & 0x2));
Delay(10); //because the slow response of hyper_terminal
WrUTXH0('\r');
}//if
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
Delay(10);
WrUTXH0(data);
}//if
else {
if(data=='\n') {
while(!(rUTRSTAT1 & 0x2));
Delay(10); //because the slow response of hyper_terminal
rUTXH1='\r';
}//if
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
Delay(10);
rUTXH1=data;
}//else
}//Uart_SendByte
void Led_Display(int LedStatus)
{
//rPDATE=(rPDATE & 0xf0)|(data&0xf);
rPCONE = 0x556b;
rPUPE = 0x6;
if((LedStatus&0x01)==0x01) //PE7状态设置
rPDATE=rPDATE&0x17f;
else
rPDATE=rPDATE|0x80;
if((LedStatus&0x02)==0x02) //PE6状态设置
rPDATE=rPDATE&0x1bf;
else
rPDATE=rPDATE|0x40;
if((LedStatus&0x04)==0x04) //PE5状态设置
rPDATE=rPDATE&0x1df;
else
rPDATE=rPDATE|0x20;
if((LedStatus&0x08)==0x08) //PE4状态设置
rPDATE=rPDATE&0x1ef;
else
rPDATE=rPDATE|0x10;
}//Led_Display
//------------------------PORTS------------------------------//void Port_Init(void){ //CAUTION:Follow the configuration order for setting the ports. // 1) setting value // 2) setting control register // 3) configure pull-up resistor. //16bit data bus configuration // PORT A GROUP /* BIT 9 8 7 6 5 4 3 2 1 0 */ /* GPA9 GPA8 ADDR22 ADDR21 GPA5 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 */ /* 0, 0, 1, 1, 0, 1, 1, 1, 1, 1 */ /* GPA9->SMCALE*/ /* GPA8->SMCCLE*/ /* GPA5->SMCCE*/ /* GPE0->SMCRB*/ rPCONA = 0x1ff; // PORT B GROUP /* BIT 10 9 8 7 6 5 4 3 2 1 0 */ /* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS /SCAS SCLK SCKE */ /* (Reserve) IDE USB FLASH SRAM No care No Care Sdram Sdram Sdram Sdram */ /* 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 */ rPDATB = 0x7ff; rPCONB = 0x1cf; //PORT C GROUP //BUSWIDTH=16 */ /* PC 15 14 13 12 11 10 9 8 */ /* O O RXD1 TXD1 I O nDREQ1 nDACK1(used as output IO) */ /* LCD_BK LCDDSP Uart1 Uart1 tchPen tchScrCS USB USB */ /* 01 01 11 11 00 01 00 01 */ /* PC 7 6 5 4 3 2 1 0*/ /* O O O I I I I I*/ /* VD4 VD5 VD6 VD7 key key key key*/ /* 11 11 11 11 00 00 00 00*/ rPDATC = 0xff00; //All IO is high rPCONC = 0x0ff0ffff; rPUPC = 0x30ff; //PULL UP RESISTOR should be enabled to I/O //PORT D GROUP for KeyBoard /* PORT D GROUP(I/O OR LCD) */ /* BIT 7 6 5 4 3 2 1 0 */ /* I I I I O O O O */ /* 00 00 00 00 01 01 01 01 */ rPDATD= 0xff; rPCOND= 0xaaaa; rPUPD = 0x0; //PORT E GROUP /* Bit 8 7 6 5 4 3 2 1 0 */ /* CODECLK O O O O Res RXD0 TXD0 SMRB(I) */ /* 10 01 01 01 01 00 10 10 00 */ rPDATE = 0x1ff; rPCONE = 0x25529; rPUPE = 0x6; //PORT F GROUP /* Bit 8 7 6 5 4 3 2 1 0 */ /* SIOCLK SIORxD GPF6input SIOTxD Input Input Input Input IICSDA IICSCL */ /* 011 011 000 000 00 00 00 10 10 */ /*-----------------qhy-------- */ /* 000 000 000 000 00 00 00 10 10 */ rPDATF = 0x1ff; rPCONF = 0xa;//0x24900a; rPUPF = 0x0;//0x1e3; //PORT G GROUP /* BIT 7 6 5 4 3 2 1 0 */ /* INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 */ /* 11 11 11 11 11 11 11 11 */ rPDATG = 0xff; rPCONG = 0xffff; rPUPG = 0x0; //should be enabled rSPUCR=0x7; //D15-D0 pull-up disable /*定义非Cache区*/ rNCACHBE0=((Non_Cache_End>>12)<<16) | (Non_Cache_Start>>12); /*所有的外部硬件中断为低电平触发*/ rEXTINT=0x4000;
}
void SysENInterrupt(unsigned ISPC_BIT)//, void (*handler)(void))
{
rINTMSK &=~( ISPC_BIT | BIT_GLOBAL); //Default value=0x7ffffff
}
void SysDISInterrupt(unsigned ISPC_BIT)//, void (*handler)(void))
{
rINTMSK |= ISPC_BIT; //Default value=0x7ffffff
}
//////////////////////////////////////////////////////////////////
//routines for debugging
//////////////////////////////////////////////////////////////////
void OutDebug(unsigned int num)
{
uHALr_printf("\r\n***STACK***:%d\r\n", num);
}//OutDebug
void BreakPoint(void)
{
uHALr_printf("!!!Enter break point.");
while(1) {
//Led_Display(0xf);
//Delay(1000);
//Led_Display(0x0);
//Delay(1000);
}//while
}//BreakPoint
extern int I_COUNT= 0;
void DebugUNDEF(void)
{
uHALr_printf("!!!Enter UNDEFINED. %d\r\n", I_COUNT);
BreakPoint();
}
void DebugSWI(void)
{
uHALr_printf("!!!Enter SWI. %d\r\n", I_COUNT);
BreakPoint();
}
void DebugABORT(void)
{
uHALr_printf("!!!Enter ABORT %d\r\n", I_COUNT);
BreakPoint();
}
void DebugFIQ(void)
{
uHALr_printf("!!!Enter FIQ. %d\r\n", I_COUNT);
BreakPoint();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -