53 #include "dev/uart1.h"
54 #include "dev/watchdog.h"
58 static int (*uart1_input_handler) (
unsigned char c);
60 void uart1_rx_interrupt(
void);
62 void uart1_tx_interrupt(
void);
64 static volatile uint8_t transmitting;
66 #ifdef UART1_CONF_TX_WITH_INTERRUPT
67 #define TX_WITH_INTERRUPT UART1_CONF_TX_WITH_INTERRUPT
69 #define TX_WITH_INTERRUPT 1
74 #ifdef UART1_CONF_TX_BUFSIZE
75 #define UART1_TX_BUFSIZE UART1_CONF_TX_BUFSIZE
77 #define UART1_TX_BUFSIZE 64
80 static uint8_t txbuf_data[UART1_TX_BUFSIZE];
84 uart1_set_input(
int (*input) (
unsigned char c))
86 uart1_input_handler = input;
90 uart1_writeb(
unsigned char c)
105 if(transmitting == 0) {
108 INT_SC1FLAG = INT_SCTXFREE;
109 INT_SC1CFG |= INT_SCTXFREE;
114 while((INT_SC1FLAG & INT_SCTXFREE) == 0);
119 INT_SC1FLAG = INT_SCTXFREE;
137 GPIO_PBCFGL &= 0xF00F;
138 GPIO_PBCFGL |= 0x0490;
140 uartper = (uint32_t) 24e6 / (2 * ubr);
141 rest = (uint32_t) 24e6 % (2 * ubr);
144 if(rest > (2 * ubr) / 4 && rest < (3 * 2 * ubr) / 4) {
146 }
else if(rest >= (3 * 2 * ubr) / 4) {
150 SC1_UARTPER = uartper;
151 SC1_UARTCFG = SC_UART8BIT;
152 SC1_MODE = SC1_MODE_UART;
157 SC1_INTMODE = SC_RXVALLEVEL | SC_TXFREELEVEL;
158 INT_SC1CFG = INT_SCRXVAL;
161 #if TX_WITH_INTERRUPT
165 INT_SC1FLAG = 0xFFFF;
166 INT_CFGSET = INT_SC1;
172 ENERGEST_ON(ENERGEST_TYPE_IRQ);
174 if(INT_SC1FLAG & INT_SCRXVAL) {
175 uart1_rx_interrupt();
176 INT_SC1FLAG = INT_SCRXVAL;
178 #if TX_WITH_INTERRUPT
179 else if(INT_SC1FLAG & INT_SCTXFREE) {
180 uart1_tx_interrupt();
181 INT_SC1FLAG = INT_SCTXFREE;
185 ENERGEST_OFF(ENERGEST_TYPE_IRQ);
189 uart1_rx_interrupt(
void)
194 if(uart1_input_handler !=
NULL) {
195 uart1_input_handler(c);
199 #if TX_WITH_INTERRUPT
201 uart1_tx_interrupt(
void)
205 INT_SC1CFG &= ~INT_SCTXFREE;
void uart1_init(unsigned long ubr)
Initalize the RS232 port.
Header file for the ring buffer library
Structure that holds the state of a ring buffer.
#define NULL
The null pointer.
int ringbuf_get(struct ringbuf *r)
Get a byte from the ring buffer.
void ringbuf_init(struct ringbuf *r, uint8_t *dataptr, uint8_t size)
Initialize a ring buffer.
Header file for the energy estimation mechanism
int ringbuf_elements(struct ringbuf *r)
Get the number of elements currently in the ring buffer.
void watchdog_periodic(void)
Writes the WDT clear sequence.
int ringbuf_put(struct ringbuf *r, uint8_t c)
Insert a byte into the ring buffer.