initial revision
[ucgine.git] / examples / spi-flash-client / uart.c
1 /*
2  * Copyright (c) 2015, Olivier MATZ <zer0@droids-corp.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the University of California, Berkeley nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include <avr/io.h>
29 #include <avr/interrupt.h>
30 #include <avr/pgmspace.h>
31 #include <util/delay.h>
32
33 #include <stdio.h>
34 #include <ctype.h>
35
36 #include <ucg_irq.h>
37 #include <ucg_cirbuf.h>
38 #include <ucg_uart.h>
39 #include <ucg_avr_uart.h>
40
41 #include "uart.h"
42
43 /* rx & tx buffers */
44 static char rx_buf[128];
45 static struct ucg_cirbuf rx_cirbuf;
46 static char tx_buf[128];
47 static struct ucg_cirbuf tx_cirbuf;
48 /* generic uart struct */
49 static struct ucg_uart main_uart;
50 /* avr-specific uart struct */
51 static struct ucg_avr_uart avr_uart_data = {
52         .reg_udr = &UDR0,
53         .reg_ucsra = &UCSR0A,
54         .reg_ucsrb = &UCSR0B,
55         .reg_ucsrc = &UCSR0C,
56         .reg_ubrrl = &UBRR0L,
57         .reg_ubrrh = &UBRR0H,
58         .bit_udre = UDRE0,
59         .bit_rxc = RXC0,
60         .bit_udrie = UDRIE0,
61         .bit_rxen = RXEN0,
62         .bit_txen = TXEN0,
63         .bit_rxcie = RXCIE0,
64         .bit_u2x = U2X0,
65 };
66
67 /* send on stdout */
68 static int std_send(char c, FILE *f)
69 {
70         (void)f;
71         ucg_uart_send(&main_uart, c, WAIT);
72         return 0;
73 }
74
75 /* recv on stdin */
76 static int std_recv(FILE *f)
77 {
78         int16_t c;
79
80         (void)f;
81         c = ucg_uart_recv(&main_uart, NOWAIT);
82         if (c < 0)
83                 return _FDEV_EOF;
84
85         return c;
86 }
87
88 SIGNAL(USART_RX_vect)
89 {
90         ucg_uart_rx_intr(&main_uart);
91 }
92
93 SIGNAL(USART_UDRE_vect)
94 {
95         ucg_uart_tx_intr(&main_uart);
96 }
97
98 int uart_init(void)
99 {
100         int ret;
101         struct ucg_uart_config conf;
102
103         ret = ucg_uart_init(&main_uart, &avr_uart_ops, &avr_uart_data,
104                 &rx_cirbuf, rx_buf, sizeof(rx_buf),
105                 &tx_cirbuf, tx_buf, sizeof(tx_buf));
106         if (ret < 0)
107                 return ret;
108         ucg_uart_getconf(&main_uart, &conf);
109         conf.baudrate = 57600;
110         ret = ucg_uart_setconf(&main_uart, &conf);
111         if (ret < 0)
112                 return ret;
113
114         fdevopen(std_send, std_recv);
115         return ret;
116 }