📄 utils.c
字号:
/***************************************优龙科技责任有限公司*********************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: utils.c
**创 建 人: hzh
**最后修改日期: 2005-11-28
**描 述: PXA270的主程序
**
********************************************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include "systypes.h"
#include "xsuart.h"
#include "xsffuart.h"
#include "xsbtuart.h"
#include "utils.h"
static UartContextT * pSerialConsole;
/*****************************************************************************
** 函数名称: SerialConsoleInit
** 功能描述: 串口初始化程序,这里采用的是全功能串口FFUART
** 输 入: rate:波特率
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
void SerialConsoleInit(UINT rate)
{
UartContextT * ctxP;
XsFFUartSWInit(); //FFUART串口初始化
//XsBTUartSWInit();
ctxP = &FFUart;
ctxP->uartCfgP->rate = rate;
ctxP->setupUartFnP(ctxP);
}
/*****************************************************************************
** 函数名称: SerialConsleSel
** 功能描述: 串口选择函数,FFUART,BTUART,SSUART
** 输 入: ch:串口通道,选择是FFUART,BTUART
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
int SerialConsleSel(int ch)
{
if(ch==0||ch==1) {
int old;
//old = (pSerialConsole==&BTUart)?1:0;
//pSerialConsole = ch?&BTUart:&FFUart;
pSerialConsole=&FFUart; //选择FFUART
return old;
}
return -1;
}
/*****************************************************************************
** 函数名称: fputc
** 功能描述: 串口输出函数,向串口输出字符,由库函数的printf来调用
***extract from stdinout.c
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
extern int lcd_text_en;
int fputc(int ch, FILE *f)
{
char chs[2]; //use dynamic variable not static, hzh
UartContextT * ctxP;
int i = 1;
ctxP = pSerialConsole;
chs[0] = ch;
if(ch=='\n') { //'\n','\r', hzh
chs[1] = '\r';
i++;
}
ctxP->writeUartFnP(ctxP, chs, i);
// A virtual switch can set this. No physical switch available
//if ((POSTRunState() & VS_LCD_TEXT_ON) == VS_LCD_TEXT_ON)
if(lcd_text_en==0)
{
//XsLcdChar(chs[0]);
}
return ch;
}
/*****************************************************************************
** 函数名称: ferror
** 功能描述:
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
int ferror(FILE *f)
{
return 0;
}
/*****************************************************************************
** 函数名称: getc
** 功能描述: 从串口获得一个字符
** 输 入 :
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
//add by hzh
int getc(FILE * f)
{
char chs;
UartContextT * ctxP;
ctxP = pSerialConsole;
while(!ctxP->readUartFnP(ctxP, &chs, 1));
return chs;
}
/*****************************************************************************
** 函数名称: kbhit
** 功能描述: 判断是否由字符输入
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
int kbhit(void)
{
UartContextT * ctxP;
ctxP = pSerialConsole;
return ctxP->RxRdyUartFnP(ctxP);
}
/*****************************************************************************
** 函数名称: waitkey
** 功能描述: 等待一个字符输入
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
void waitkey(void)
{
while(!kbhit());
}
/*****************************************************************************
** 函数名称: getkey
** 功能描述: 获得一个字符输入
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
int getkey(void)
{
if(kbhit())
return getc(stdin);
else
return 0;
//return PostGetKeypad();
}
/*
int getyorn(void)
{
char c;
puts(" [y/n] ");
while(1) {
c = getchar();
if((c=='y')||(c=='Y')||(c=='n')||(c=='N'))
break;
}
putchar(c);
putchar('\n');
return c&1; //y&Y are odd, n&N are even
}
*/
/**************************延迟函数************/
#define OSCR0 *(volatile UINT *)0x40A00010
#define OSSR *(volatile UINT *)0x40A00014
#define OWER *(volatile UINT *)0x40A00018
#define OIER *(volatile UINT *)0x40A0001C
#define OSCR4 *(volatile UINT *)0x40A00040
#define OSMR4 *(volatile UINT *)0x40A00080
#define OMCR4 *(volatile UINT *)0x40A000C0
void DM_WaitUs(int usVal)
{
OMCR4 = (1<<7)|0; //stop but don't reset counter after match
OSMR4 = usVal; //set match value
OSCR4 = 0; //reset counter
OIER = 1<<4; //enable channel 4 int only
OSSR = 1<<4; //clear status
OMCR4 |= 4; //start
while(!(OSSR&(1<<4))); //wait...
}
void DM_WaitMs(int msVal)
{
OMCR4 = (1<<7)|0; //stop but don't reset counter after match
OSMR4 = msVal; //set match value
OSCR4 = 0; //reset counter
OIER = 1<<4; //enable channel 4 int only
OSSR = 1<<4; //clear status
OMCR4 |= 2; //start
while(!(OSSR&(1<<4))); //wait...
}
void DM_WaitS(int sVal)
{
OMCR4 = (1<<7)|0; //stop but don't reset counter after match
OSMR4 = sVal; //set match value
OSCR4 = 0; //reset counter
OIER = 1<<4; //enable channel 4 int only
OSSR = 1<<4; //clear status
OMCR4 |= 3; //start
while(!(OSSR&(1<<4))); //wait...
}
int WaitKeyTimeoutS(int sec, int *ch)
{
OMCR4 = (1<<7)|0; //stop but don't reset counter after match
OSMR4 = sec; //set match value
OSCR4 = 0; //reset counter
OIER = 1<<4; //enable channel 4 int only
OSSR = 1<<4; //clear status
OMCR4 |= 3; //start
while(!(OSSR&(1<<4))&&!kbhit()); //wait...
if(kbhit()) {
*ch = getc(stdin);
return 1;
}
return -1;
}
/*************************************************************/
/*#include "DM_Debug.h"
void DM_CwDbgPrintf (DM_ControlWordsBitsT bitId, char * fmt, ...)
{
}
INT DM_ControlWordsDebugPrintGetBit (DM_ControlWordsBitsT bitId)
{
return 0;
}
#include "dm_errors.h"
void XllpUtilityErrorRecord (XLLP_UINT32_T code, XLLP_UINT32_T param1,
XLLP_UINT32_T param2, XLLP_UINT32_T param3)
{
}
*/
/*************************************************************/
/*
#include "boardControl.h"
UINT SelectIrOperationMode (IrOperationT operation, IrPowerT param)
{
return 1;
}
*/
void udelay(UINT us)
{
DM_WaitUs(us);
}
void mdelay(UINT ms)
{
DM_WaitMs(ms);
}
/*****************************************************************************
** 函数名称: show_led
** 功能描述: 点灯函数
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
#define GPSR0 *(volatile UINT *)0x40E00018
#define GPCR0 *(volatile UINT *)0x40E00024
void show_led(UINT msk, UINT lt)
{
lt = lt?(3<<3):~(3<<3);
msk = msk<<3;
GPSR0 = (msk&(3<<3))&~lt;
GPCR0 = (msk&(3<<3))<
}
/*************************************************************/
/*****************************************************************************
** 函数名称: arch_reset
** 功能描述: Watchdog复位
** 输 入:
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
#define OSMR0 *(volatile UINT *)0x40A00000
#define OSMR1 *(volatile UINT *)0x40A00004
#define OSMR2 *(volatile UINT *)0x40A00008
#define OSMR3 *(volatile UINT *)0x40A0000C
#define OSCR0 *(volatile UINT *)0x40A00010
#define OSSR *(volatile UINT *)0x40A00014
#define OWER *(volatile UINT *)0x40A00018
void arch_reset(char mode)
{
OSCR0 = 0;
OSMR3 = OSCR0 + 325000; //100ms
OSSR |= 1<<3;
OWER = 1; //enable watchdog
puts("reboot...\n");
while(1);
//printf("%d\n", OSCR0);
}
/******************字节顺序处理函数**************************/
unsigned short ntohs(unsigned short s)
{
return (s >> 8) | (s << 8);
}
unsigned short htons(unsigned short s)
{
return (s >> 8) | (s << 8);
}
unsigned long ntohl(unsigned long l)
{
return ((l >> 24) & 0x000000ff) |
((l >> 8) & 0x0000ff00) |
((l << 8) & 0x00ff0000) |
((l << 24) & 0xff000000);
}
unsigned long htonl(unsigned long l)
{
return ntohl(l);
/* return ((l >> 24) & 0x000000ff) |
((l >> 8) & 0x0000ff00) |
((l << 8) & 0x00ff0000) |
((l << 24) & 0xff000000);*/
}
char WaitUserKey(void)
{
char c;
do {
c = getkey();
} while(c==0);
return c;
}
/************************End of File*********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -