xref: /nrf52832-nimble/rt-thread/libcpu/arm/s3c44b0/serial.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2006-09-06     XuXinming    first version
9*10465441SEvalZero  * 2006-09-20     Bernard      clean code according code style
10*10465441SEvalZero  */
11*10465441SEvalZero 
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include <rthw.h>
14*10465441SEvalZero 
15*10465441SEvalZero #include "s3c44b0.h"
16*10465441SEvalZero 
17*10465441SEvalZero void rt_serial_init(void);
18*10465441SEvalZero void rt_console_puts(const char* str);
19*10465441SEvalZero void rt_serial_putc(const char c);
20*10465441SEvalZero 
21*10465441SEvalZero #define	USTAT_RCV_READY		0x01	/* receive data ready */
22*10465441SEvalZero #define	USTAT_TXB_EMPTY		0x02	/* tx buffer empty */
23*10465441SEvalZero 
serial_flush_input(void)24*10465441SEvalZero rt_inline void serial_flush_input(void)
25*10465441SEvalZero {
26*10465441SEvalZero 	volatile unsigned int tmp;
27*10465441SEvalZero 
28*10465441SEvalZero 	/* keep on reading as long as the receiver is not empty */
29*10465441SEvalZero 	while(UTRSTAT0 & USTAT_RCV_READY) tmp = URXH0;
30*10465441SEvalZero }
31*10465441SEvalZero 
serial_flush_output(void)32*10465441SEvalZero rt_inline void serial_flush_output(void)
33*10465441SEvalZero {
34*10465441SEvalZero 	/* wait until the transmitter is no longer busy */
35*10465441SEvalZero 	while(!(UTRSTAT0 & USTAT_TXB_EMPTY)) ;
36*10465441SEvalZero }
37*10465441SEvalZero 
38*10465441SEvalZero /**
39*10465441SEvalZero  * @addtogroup S3C44B0
40*10465441SEvalZero  */
41*10465441SEvalZero /*@{*/
42*10465441SEvalZero 
43*10465441SEvalZero /**
44*10465441SEvalZero  * This function is used to display a string on console, normally, it's
45*10465441SEvalZero  * invoked by rt_kprintf
46*10465441SEvalZero  *
47*10465441SEvalZero  * @param str the displayed string
48*10465441SEvalZero  */
rt_console_puts(const char * str)49*10465441SEvalZero void rt_console_puts(const char* str)
50*10465441SEvalZero {
51*10465441SEvalZero 	while (*str)
52*10465441SEvalZero 	{
53*10465441SEvalZero 		rt_serial_putc (*str++);
54*10465441SEvalZero 	}
55*10465441SEvalZero }
56*10465441SEvalZero 
57*10465441SEvalZero /**
58*10465441SEvalZero  * This function initializes serial
59*10465441SEvalZero  */
rt_serial_init()60*10465441SEvalZero void rt_serial_init()
61*10465441SEvalZero {
62*10465441SEvalZero 	rt_uint32_t divisor = 0;
63*10465441SEvalZero 
64*10465441SEvalZero 	divisor = 0x20;
65*10465441SEvalZero 
66*10465441SEvalZero 	serial_flush_output();
67*10465441SEvalZero 	serial_flush_input();
68*10465441SEvalZero 
69*10465441SEvalZero 	/* UART interrupt off */
70*10465441SEvalZero 	UCON0 	= 0;
71*10465441SEvalZero 	/* FIFO disable */
72*10465441SEvalZero 	UFCON0	=0x0;
73*10465441SEvalZero 	UMCON0	=0x0;
74*10465441SEvalZero 	/* set baudrate */
75*10465441SEvalZero  	UBRDIV0 = divisor;
76*10465441SEvalZero 
77*10465441SEvalZero 	/* word length=8bit, stop bit = 1, no parity, use external clock */
78*10465441SEvalZero 	ULCON0 	= 0x03|0x00|0x00;
79*10465441SEvalZero 
80*10465441SEvalZero  	UCON0 	= 0x5;
81*10465441SEvalZero }
82*10465441SEvalZero 
83*10465441SEvalZero /**
84*10465441SEvalZero  * This function read a character from serial without interrupt enable mode
85*10465441SEvalZero  *
86*10465441SEvalZero  * @return the read char
87*10465441SEvalZero  */
rt_serial_getc()88*10465441SEvalZero char rt_serial_getc()
89*10465441SEvalZero {
90*10465441SEvalZero 	while ((UTRSTAT0 & USTAT_RCV_READY) == 0);
91*10465441SEvalZero 
92*10465441SEvalZero 	return URXH0;
93*10465441SEvalZero }
94*10465441SEvalZero 
95*10465441SEvalZero /**
96*10465441SEvalZero  * This function will write a character to serial without interrupt enable mode
97*10465441SEvalZero  *
98*10465441SEvalZero  * @param c the char to write
99*10465441SEvalZero  */
rt_serial_putc(const char c)100*10465441SEvalZero void rt_serial_putc(const char c)
101*10465441SEvalZero {
102*10465441SEvalZero 	/*
103*10465441SEvalZero 		to be polite with serial console add a line feed
104*10465441SEvalZero 		to the carriage return character
105*10465441SEvalZero 	*/
106*10465441SEvalZero 	if (c=='\n')rt_serial_putc('\r');
107*10465441SEvalZero 
108*10465441SEvalZero 	/* wait for room in the transmit FIFO */
109*10465441SEvalZero 	while(!(UTRSTAT0 & USTAT_TXB_EMPTY));
110*10465441SEvalZero 
111*10465441SEvalZero 	UTXH0 = (rt_uint8_t)c;
112*10465441SEvalZero }
113*10465441SEvalZero 
114*10465441SEvalZero /*@}*/
115