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*10465441SEvalZerort_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*10465441SEvalZerort_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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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*10465441SEvalZerochar 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*10465441SEvalZerovoid 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