⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_serial.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:

/*********************************************************************
 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 + -