You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
1.8 KiB

/** @file ir_uart.c
@author Michael Hayes
@date 10 December 2004
*/
#include "system.h"
#include "ir_uart.h"
#include "usart1.h"
#include "timer0.h"
#include "pio.h"
/* Return non-zero if there is a character ready to be read. */
bool
ir_uart_read_ready_p (void)
{
return usart1_read_ready_p ();
}
/* Read character from IR_UART. This blocks if nothing
is available to read. */
int8_t
ir_uart_getc (void)
{
return usart1_getc ();
}
/* Return non-zero if a character can be written without blocking. */
bool
ir_uart_write_ready_p (void)
{
return usart1_write_ready_p ();
}
/* Return non-zero if transmitter finished. */
bool
ir_uart_write_finished_p (void)
{
return usart1_write_finished_p ();
}
/* Write character to IR_UART. This returns zero if
the character could not be written. */
int8_t
ir_uart_putc (char ch)
{
usart1_putc (ch);
/* Gobble echoed character. The echoing is due to an electrical
common-path interference problem caused by a poor PCB layout of the
track powering the IR receiver. */
ir_uart_getc ();
return 1;
}
/* Write string to IR_UART. */
void
ir_uart_puts (const char *str)
{
usart1_puts (str);
}
/* Initialise ir_uart and set baud rate. */
uint8_t
ir_uart_init (void)
{
usart1_cfg_t usart1_cfg =
{
.baud_divisor = USART1_BAUD_DIVISOR (IR_UART_BAUD_RATE),
.bits = 8
};
/* Need to configure DDR so pin is an output.
The state is controlled by the timer. */
pio_config_set (IR_TX_HIGH_PIO, PIO_OUTPUT_HIGH);
timer0_init ();
timer0_period_set (F_CPU / (IR_MODULATION_FREQ * 2));
timer0_mode_set (TIMER0_MODE_CTC);
timer0_output_set (TIMER0_OUTPUT_B, TIMER0_OUTPUT_MODE_TOGGLE);
timer0_start ();
return usart1_init (&usart1_cfg);
}