📄 hw_serial.c
字号:
/*********************************************************************
INCLUDE FILES
$Log: hw_serial.c,v $
Revision 1.2 2008/06/19 04:43:36 Administrator
代码整理!
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:08 Lingzhaojun
no message
Revision 1.7 2007/11/10 04:30:23 Huangxinyu
调试修改
Revision 1.6 2007/11/01 01:46:54 Huangxinyu
增加RK2706的兼容性
Revision 1.5 2007/10/30 08:03:17 Huangshilin
修改 概率性 DATA ABORT 的 BUG.
Revision 1.4 2007/10/23 08:27:49 Huangxinyu
调试后修改bug
Revision 1.3 2007/10/17 01:55:03 Huangxinyu
完善串口poweroninit
Revision 1.2 2007/10/08 02:38:49 Lingzhaojun
添加版本自动注释脚本
*********************************************************************/
#if 1
#include "hw_include.h"
//#include "include.h"
#include "hw_uart.h"
#include "hw_serial.h"
#include "hwapi_iomux.h"
#define MODE_X_DIV 16
#define ISSPACE " \t\n\r\f\v"
#define ZEROPAD 1 /* pad with zero */
#define SIGN 2 /* unsigned/signed long */
#define PLUS 4 /* show plus */
#define SPACE 8 /* space if plus */
#define LEFT 16 /* left justified */
#define SPECIAL 32 /* 0x */
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
#define MAXLN 512
#define DebugPortIndex 1
static puartRegister_t serial_ports[2] =
{
(puartRegister_t)APB0_UART0_BASE,
(puartRegister_t)APB0_UART1_BASE
};
int calc_divisor(void)
{
return (CFG_NS16550_CLK / MODE_X_DIV / CONFIG_BAUDRATE);
}
/**************************************************************************
* 函数描述: 初始化serial port
* 入口参数: 无
* 出口参数: 无
* 返回值: 0 -- 初始化成功
* 非0 -- 初始化失败
***************************************************************************/
int serial_PowerOnInit(void)
{
int clock_divisor;
clock_divisor = calc_divisor();
#if ( (CHIPTYPE == RK2700) || (CHIPTYPE == RK2706))
IOMUX_SetUart1Port(UART1_UART_TYPE);
Uart_PowerOnInit(serial_ports[1], clock_divisor);
#else
IOMUX_SetUart0Port(UART0_UART_TYPE);
Uart_PowerOnInit(serial_ports[0], clock_divisor);
#endif
return (0);
}
int fputc(int ch, void *stream)
{
#if ((CHIPTYPE == RK2700) || (CHIPTYPE == RK2706))
if (ch == '\n')
Uart_WriteChar(serial_ports[1], '\r');
Uart_WriteChar(serial_ports[1], ch);
#else
if (ch == '\n')
Uart_WriteChar(serial_ports[0], '\r');
Uart_WriteChar(serial_ports[0], ch);
#endif
return 0;
}
#else
#define __stdio_h
#ifndef ARMULATE
#include "hw_include.h"
#include "hw_uart.h"
#include "hw_serial.h"
#include "hwapi_iomux.h"
typedef char * va_list;
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
#define va_end(ap) ( ap = (va_list)0 )
#define MODE_X_DIV 16
#define ISSPACE " \t\n\r\f\v"
#define ZEROPAD 1 /* pad with zero */
#define SIGN 2 /* unsigned/signed long */
#define PLUS 4 /* show plus */
#define SPACE 8 /* space if plus */
#define LEFT 16 /* left justified */
#define SPECIAL 32 /* 0x */
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
#define MAXLN 512
#define DebugPortIndex 1
static puartRegister_t serial_ports[2] =
{
(puartRegister_t)APB0_UART0_BASE,
(puartRegister_t)APB0_UART1_BASE
};
#define DebugPort ((puartRegister_t)APB0_UART1_BASE)
unsigned char chartypetbl[] =
{
0, _C, _C, _C, _C, _C, _C, _C,
_C, _S | _C, _S | _C, _S | _C, _S | _C, _S | _C, _C, _C,
_C, _C, _C, _C, _C, _C, _C, _C,
_C, _C, _C, _C, _C, _C, _C, _C,
_S | _B, _P, _P, _P, _P, _P, _P, _P,
_P, _P, _P, _P, _P, _P, _P, _P,
_N | _X, _N | _X, _N | _X, _N | _X, _N | _X, _N | _X, _N | _X, _N | _X,
_N | _X, _N | _X, _P, _P, _P, _P, _P, _P,
_P, _U | _X, _U | _X, _U | _X, _U | _X, _U | _X, _U | _X, _U,
_U, _U, _U, _U, _U, _U, _U, _U,
_U, _U, _U, _U, _U, _U, _U, _U,
_U, _U, _U, _P, _P, _P, _P, _P,
_P, _L | _X, _L | _X, _L | _X, _L | _X, _L | _X, _L | _X, _L,
_L, _L, _L, _L, _L, _L, _L, _L,
_L, _L, _L, _L, _L, _L, _L, _L,
_L, _L, _L, _P, _P, _P, _P, _C,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
///////////////////////////////////////////////////////////////////////
//内部函数声明
int vsprintf(char *buf, const char *fmt, va_list args);
int vfscanf(int fp, char* fmt, va_list ap);
int vsscanf(char* buf, char* s, va_list ap);
///////////////////////////////////////////////////////////////////////
int calc_divisor(void)
{
return (CFG_NS16550_CLK / MODE_X_DIV / CONFIG_BAUDRATE);
}
UINT32 do_div(UINT32* n, int base)
{
UINT32 __res;
__res = (*n) % (UINT32)base;
(*n) = (*n) / (UINT32)base;
return __res;
}
size_t strnlen(const char * s, size_t count)
{
const char *sc;
for (sc = s; count-- && *sc != '\0'; ++sc)
/* nothing */;
return sc - s;
}
int isdigit(int c)
{
if (c >= '0' && c <= '9') return (1);
return (0);
}
static int skip_atoi(const char **s)
{
int i = 0;
while (isdigit(**s))
i = i * 10 + *((*s)++) - '0';
return i;
}
char *
serial_strncpy(register char *s1, register char *s2, register int n)
{
register char *os1 = s1;
while (--n >= 0)
if ((*s1++ = *s2++) == '\0')
while (--n >= 0)
* s1++ = '\0';
return (os1);
}
int serial_strcspn(char *p, char *s)
{
int i, j;
for (i = 0; p[i]; i++)
{
for (j = 0; s[j]; j++)
{
if (s[j] == p[i])
break;
}
if (s[j])
break;
}
return (i);
}
static char *
_getbase(char* p, int* basep)
{
if (p[0] == '0')
{
switch (p[1])
{
case 'x':
*basep = 16;
break;
case 't':
case 'n':
*basep = 10;
break;
case 'o':
*basep = 8;
break;
default:
*basep = 10;
return (p);
}
return (p + 2);
}
*basep = 10;
return (p);
}
/* strchr():
* Return the ptr in sp at which the character c appears;
* NULL if not found
*/
char *
serial_strchr(register char *sp, register char c)
{
do
{
if (*sp == c)
return(sp);
}
while (*sp++);
return((char *)0);
}
/*************************************************************
* _atob(vp,p,base)
*/
static int
_atob(unsigned long* vp, char* p, int base)
{
unsigned long value, v1, v2;
char *q, tmp[20];
int digit;
if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))
{
base = 16;
p += 2;
}
if (base == 16 && (q = serial_strchr(p, '.')) != 0)
{
if (q - p > sizeof(tmp) - 1)
return (0);
serial_strncpy(tmp, p, q - p);
tmp[q - p] = '\0';
if (!_atob(&v1, tmp, 16))
return (0);
q++;
if (serial_strchr(q, '.'))
return (0);
if (!_atob(&v2, q, 16))
return (0);
*vp = (v1 << 16) + v2;
return (1);
}
value = *vp = 0;
for (; *p; p++)
{
value *= base;
if (*p >= '0' && *p <= '9')
digit = *p - '0';
else if (*p >= 'a' && *p <= 'f')
digit = *p - 'a' + 10;
else if (*p >= 'A' && *p <= 'F')
digit = *p - 'A' + 10;
else
return (0);
if (digit >= base)
return (0);
value += digit;
}
*vp = value;
return (1);
}
/*************************************************************
* atob(vp,p,base)
* converts p to binary result in vp, rtn 1 on success
*/
int atob(unsigned int* vp, char* p, int base)
{
unsigned long v;
if (base == 0)
p = _getbase(p, &base);
if (_atob(&v, p, base))
{
*vp = v;
return (1);
}
return (0);
}
static char * number(char * str, UINT32 num, int base, int size, int precision , int type)
{
char c, sign, tmp[66];
const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
int i;
if (type & LARGE)
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (type & LEFT)
type &= ~ZEROPAD;
if (base < 2 || base > 36)
return 0;
c = (type & ZEROPAD) ? '0' : ' ';
sign = 0;
if (type & SIGN)
{
if ((int)num < 0)
{
sign = '-';
num = -num;
size--;
}
else if (type & PLUS)
{
sign = '+';
size--;
}
else if (type & SPACE)
{
sign = ' ';
size--;
}
}
if (type & SPECIAL)
{
if (base == 16)
size -= 2;
else if (base == 8)
size--;
}
i = 0;
if (num == 0)
tmp[i++] = '0';
else while (num != 0)
tmp[i++] = digits[do_div(&num,base)];
if (i > precision)
precision = i;
size -= precision;
if (!(type&(ZEROPAD + LEFT)))
while (size-- > 0)
*str++ = ' ';
if (sign)
*str++ = sign;
if (type & SPECIAL)
{
if (base == 8)
*str++ = '0';
else if (base == 16)
{
*str++ = '0';
*str++ = digits[33];
}
}
if (!(type & LEFT))
while (size-- > 0)
*str++ = c;
while (i < precision--)
*str++ = '0';
while (i-- > 0)
*str++ = tmp[i];
while (size-- > 0)
*str++ = ' ';
return str;
}
/**************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -