blob: 8f7f0b1af5e1a7ff91fa49dafa3ac3d4352cb1b9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#include <serial.h>
#include <io.h>
#include <stdint.h>
#include <asm/arch/secure_apb.h>
void serial_set_pin_port(unsigned port_base)
{
setbits_le32(P_AO_RTI_PIN_MUX_REG,3<<11);
}
#define UART_STP_BIT UART_CNTL_MASK_STP_1BIT
#define UART_PRTY_BIT 0
#define UART_CHAR_LEN UART_CNTL_MASK_CHAR_8BIT
void serial_init(unsigned set)
{
/* baud rate */
writel(set| UART_STP_BIT
| UART_PRTY_BIT
| UART_CHAR_LEN
//please do not remove these setting , jerry.yu
| UART_CNTL_MASK_TX_EN
| UART_CNTL_MASK_RX_EN
| UART_CNTL_MASK_RST_TX
| UART_CNTL_MASK_RST_RX
| UART_CNTL_MASK_CLR_ERR
,P_UART_CONTROL(UART_PORT_CONS));
serial_set_pin_port(UART_PORT_CONS);
clrbits_le32(P_UART_CONTROL(UART_PORT_CONS),
UART_CNTL_MASK_RST_TX | UART_CNTL_MASK_RST_RX | UART_CNTL_MASK_CLR_ERR);
}
int serial_putc(int c)
{
if (c == '\n') {
while ((readl(P_UART_STATUS(UART_PORT_CONS)) & UART_STAT_MASK_TFIFO_FULL));
writel('\r', P_UART_WFIFO(UART_PORT_CONS));
}
/* Wait till dataTx register is not full */
while ((readl(P_UART_STATUS(UART_PORT_CONS)) & UART_STAT_MASK_TFIFO_FULL));
writel(c, P_UART_WFIFO(UART_PORT_CONS));
/* Wait till dataTx register is empty */
return c;
}
int serial_getc(void)
{
unsigned char ch;
/* Wait till character is placed in fifo */
while ((readl(P_UART_STATUS(UART_PORT_CONS)) & UART_STAT_MASK_RFIFO_CNT) == 0) ;
/* Also check for overflow errors */
if (readl(P_UART_STATUS(UART_PORT_CONS)) & (UART_STAT_MASK_PRTY_ERR | UART_STAT_MASK_FRAM_ERR))
{
setbits_le32(P_UART_CONTROL(UART_PORT_CONS),UART_CNTL_MASK_CLR_ERR);
clrbits_le32(P_UART_CONTROL(UART_PORT_CONS),UART_CNTL_MASK_CLR_ERR);
}
ch = readl(P_UART_RFIFO(UART_PORT_CONS)) & 0x00ff;
return ((int)ch);
}
int serial_puts(const char *s){
while (*s) {
serial_putc(*s++);
}
return 0;
}
//support 64bit number, serial_put_hex(data, 64);
void serial_put_hex(unsigned long data,unsigned int bitlen)
{
int i;
for (i=bitlen-4;i>=0;i-=4) {
if ((data>>i) == 0)
{
serial_putc(0x30);
continue;
}
unsigned char s = (data>>i)&0xf;
if (s<10)
serial_putc(0x30+s);
else
serial_putc(0x61+s-10);
}
}
void serial_put_dec(unsigned long data)
{
char szTxt[10];
szTxt[0] = 0x30;
int i = 0;
do {
szTxt[i++] = (data % 10) + 0x30;
data = data / 10;
} while(data);
for (--i;i >=0;--i)
serial_putc(szTxt[i]);
}
|