📄 hardware.c
字号:
/*******************************************************************
*******************************************************************/
#include "system.h"
#ifdef INTEL_X86_CPU
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#endif
#include "utility.h"
#include "hardware.h"
#ifdef ARM_XSCALE_CPU
#include "timer.h"
#endif
/***************************** 局部变量定义 ********************************/
static INT8U LEDSTATE = 0; /* LED输出值,228端口读出值永为0 */
static INT8U LED229 = 0; /* 229端口输出值,229端口读出值永为0 */
/**************************** 全局函数定义 *********************************/
/*
Function Name : getDPRBaseAddr
Parameter : None
Return Type : pointer to INT8U (调用时需要强制转换为需要的类型)
Description : get Dual-Port Ram Base Address, 0x2000表示双口RAM大小(8K),
双口RAM占用窗口地址的后8K
*/
LPBYTE getDPRBaseAddr(void)
{
#ifdef ARM_XSCALE_CPU
// return((LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0x2000));
return((LPBYTE)0x3c0ca000);
#else
return(LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0x2000);
#endif
}
/*
Function Name : getSRAMCPBAddr
Parameter : None
Return Type : pointer to INT8U (调用时需要强制转换为需要的类型)
Description : get SRAM Current Page's Base Address, SRAM当前页占用窗口
地址的前8K,需要访问的SRAM页通过selectPage()设定
*/
LPBYTE getSRAMCPBAddr(void)
{
#ifdef ARM_XSCALE_CPU
return((LPBYTE)0x3c0c8000);
#else
return(LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0);
#endif
}
/*
Function Name : selectPage
Parameter : npage (INT8U) ,页号, 取值范围 0 -128
Return Type : void
Description : select SRAM page to operate
SRAM为1024K,每页为8K,共128页
*/
void selectPage(INT8U npage)
{
WritePort(PAGEPORT, npage);
}
/*
Function Name : getICUslotID
Parameter : None
Return Type : INT8U (unsigned char)
Return Value : 0表示A系ICU1, 1表示A系ICU2, 2表示COMM1
3表示B系ICU1, 4表示B系ICU2, 5表示COMM2
Description : 得到本板ICU所在的槽号
*/
INT8U getICUslotID(void)
{
return((INT8U)((ReadPort(ICUPORT) & 0x38) >> 3));
}
/*
Function Name : getICU_ID
Parameter : None
Return Type : INT8U (unsigned char)
Return Value : 1表示ICU1, 2表示ICU2, 0表示故障(COMM槽)
Description : 得到本板的ICU的编号
*/
INT8U getICU_ID(void)
{
#ifdef ARM_XSCALE_CPU
switch (getICUslotID())
{
case 0:
case 3:
return(1);
case 1:
case 4:
return(2);
default:
return(0);
}
#else
return(INT8U)((((ReadPort(ICUPORT) & 0x38) >> 3) + 1 ) % 3);
#endif
}
/* 判断系内另一个ICU是否存在 */
BOOL isICUInExist(void)
{
return(0x00 == (INT8U)((ReadPort(ICUPORT) & 0x40) >> 6));
}
/* 判断另一个系的ICU1是否存在,对于ICU2永远返回false */
BOOL isICUOutExist(void)
{
if (1 == getICU_ID())
{
return(0x00 == (INT8U)((ReadPort(ICUPORT) & 0x80) >> 7));
}
else
{
return(0 == 1);
}
}
/* 闪烁LEDPORT端口bitN位LED */
void flashLed(INT8U bitN)
{
LEDSTATE ^= (INT8U)bitN;
WritePort(LEDPORT, LEDSTATE);
}
/* 点亮LEDPORT端口bitN位LED */
void lightenLed(INT8U bitN)
{
if (bitN == POWER_LED)
{
LEDSTATE = (INT8U)(LEDSTATE & (~bitN));
}
else
{
LEDSTATE = (INT8U)(LEDSTATE | bitN);
}
WritePort(LEDPORT, LEDSTATE);
}
/* 熄灭LEDPORT端口bitN位LED */
void darkenLed(INT8U bitN)
{
if (bitN == POWER_LED)
{
LEDSTATE = (INT8U)(LEDSTATE | bitN);
}
else
{
LEDSTATE = (INT8U)(LEDSTATE & (~bitN));
}
WritePort(LEDPORT, LEDSTATE);
}
/*
设置看门狗时间
看门狗时间 = (nTime - 1) * 26.214ms
其中, 1 < nTime < 255
*/
void setWDG(INT8U nTime)
{
WritePort(WDSETPORT, nTime);
}
/* 打开看门狗 */
void enableWDG(void)
{
WritePort(WDENPORT, 0x01);
}
/* 清看门狗 */
void clearWDG(void)
{
ReadPort(WDENPORT);
}
/* 故障条件下系统退出 */
void failureExit(void)
{
TIMER delay;
settimer(&delay, 200);
while (1)
{
flashLed(POWER_LED);
starttimer(&delay);
while (isTimeout(&delay) != 1);
}
}
/*
Function Name : getSysID
Parameter : None
Return Type : INT8U (unsigned char)
Return Value : TSYSA表示A系, TSYSB表示B系, TSYSUNKNOWN表示故障
Description : 得到当前系统的系编号
*/
INT8U getSysID(void)
{
INT8U rtn = TSYSUNKNOWN;
switch ((ReadPort(ICUPORT) & 0x38) >> 3)
{
case 0:
case 1:
case 2: setABLED(ASYSTEM);
rtn = TSYSA;
break;
case 3:
case 4:
case 5: setABLED(BSYSTEM);
rtn = TSYSB;
break;
default: break;
}
return(rtn);
}
/*
Function Name : setABLED
Parameter : state (INT8U) ,LED状态, 取值范围 { ASYSTEM, BSYSTEM }
Return Type : void
Description : 设置A,B系指示灯
*/
void setABLED(INT8U state)
{
LED229 = (INT8U)((LED229 & 0xFE) | state);
WritePort(LEDABSYN, LED229);
}
/*
Function Name : setSYNLED
Parameter : state (INT8U) ,LED状态, 取值范围 { INSYN, NOSYN }
Return Type : void
Description : 设置SYNCH指示灯的状态
*/
void setSYNLED(INT8U state)
{
LED229 = (INT8U)((LED229 & 0xFB) | state);
WritePort(LEDABSYN, LED229);
}
/* Without OS, we must implement the following functions ourselves. */
#ifdef ARM_XSCALE_CPU
unsigned char inp(unsigned short ioOffset)
{
return(*(volatile unsigned char*)(ARM_IO_BASE + ioOffset));
}
unsigned char outp(unsigned short ioOffset, unsigned char value)
{
*(volatile unsigned char*)(ARM_IO_BASE + ioOffset) = value;
return(value);
}
void* memcpy(void* pdest, const void* psrc, unsigned short ulen)
{
unsigned short i = 0;
for (i = 0; i < ulen; i++)
{
*(LPBYTE)(pdest + i) = *(LPBYTE)(psrc + i);
}
return(pdest);
}
void ClearLed(void)
{
LEDSTATE = 0x00;
LED229 = 0x00;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -