diff options
Diffstat (limited to 'boards/base/RaspberryPi/example-FreeRTOS/Drivers/uart.c')
-rw-r--r-- | boards/base/RaspberryPi/example-FreeRTOS/Drivers/uart.c | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/boards/base/RaspberryPi/example-FreeRTOS/Drivers/uart.c b/boards/base/RaspberryPi/example-FreeRTOS/Drivers/uart.c deleted file mode 100644 index 92f837e7..00000000 --- a/boards/base/RaspberryPi/example-FreeRTOS/Drivers/uart.c +++ /dev/null @@ -1,125 +0,0 @@ -/* uart.c - UART initialization & communication */ -/* Reference material: - * http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf - * Chapter 13: UART - */ - -#include <stdint.h> -#include <mmio.h> -#include <uart.h> - -enum { - // The GPIO registers base address. - GPIO_BASE = 0x20200000, - - // The offsets for reach register. - - // Controls actuation of pull up/down to ALL GPIO pins. - GPPUD = (GPIO_BASE + 0x94), - - // Controls actuation of pull up/down for specific GPIO pin. - GPPUDCLK0 = (GPIO_BASE + 0x98), - - // The base address for UART. - UART0_BASE = 0x20201000, - - // The offsets for reach register for the UART. - UART0_DR = (UART0_BASE + 0x00), - UART0_RSRECR = (UART0_BASE + 0x04), - UART0_FR = (UART0_BASE + 0x18), - UART0_ILPR = (UART0_BASE + 0x20), - UART0_IBRD = (UART0_BASE + 0x24), - UART0_FBRD = (UART0_BASE + 0x28), - UART0_LCRH = (UART0_BASE + 0x2C), - UART0_CR = (UART0_BASE + 0x30), - UART0_IFLS = (UART0_BASE + 0x34), - UART0_IMSC = (UART0_BASE + 0x38), - UART0_RIS = (UART0_BASE + 0x3C), - UART0_MIS = (UART0_BASE + 0x40), - UART0_ICR = (UART0_BASE + 0x44), - UART0_DMACR = (UART0_BASE + 0x48), - UART0_ITCR = (UART0_BASE + 0x80), - UART0_ITIP = (UART0_BASE + 0x84), - UART0_ITOP = (UART0_BASE + 0x88), - UART0_TDR = (UART0_BASE + 0x8C), -}; - -/* - * delay function - * int32_t delay: number of cycles to delay - * - * This just loops <delay> times in a way that the compiler - * wont optimize away. - */ -static void delay(int32_t count) { - asm volatile("__delay_%=: subs %[count], %[count], #1; bne __delay_%=\n" - : : [count]"r"(count) : "cc"); -} - -/* - * Initialize UART0. - */ -void uart_init() { - // Disable UART0. - mmio_write(UART0_CR, 0x00000000); - // Setup the GPIO pin 14 && 15. - - // Disable pull up/down for all GPIO pins & delay for 150 cycles. - mmio_write(GPPUD, 0x00000000); - delay(150); - - // Disable pull up/down for pin 14,15 & delay for 150 cycles. - mmio_write(GPPUDCLK0, (1 << 14) | (1 << 15)); - delay(150); - - // Write 0 to GPPUDCLK0 to make it take effect. - mmio_write(GPPUDCLK0, 0x00000000); - - // Clear pending interrupts. - mmio_write(UART0_ICR, 0x7FF); - - // Set integer & fractional part of baud rate. - // Divider = UART_CLOCK/(16 * Baud) - // Fraction part register = (Fractional part * 64) + 0.5 - // UART_CLOCK = 3000000; Baud = 115200. - - // Divider = 3000000/(16 * 115200) = 1.627 = ~1. - // Fractional part register = (.627 * 64) + 0.5 = 40.6 = ~40. - mmio_write(UART0_IBRD, 1); - mmio_write(UART0_FBRD, 40); - - // Enable FIFO & 8 bit data transmissio (1 stop bit, no parity). - mmio_write(UART0_LCRH, (1 << 4) | (1 << 5) | (1 << 6)); - - // Mask all interrupts. - mmio_write(UART0_IMSC, (1 << 1) | (1 << 4) | (1 << 5) | - (1 << 6) | (1 << 7) | (1 << 8) | - (1 << 9) | (1 << 10)); - - // Enable UART0, receive & transfer part of UART. - mmio_write(UART0_CR, (1 << 0) | (1 << 8) | (1 << 9)); -} - -/* - * Transmit a byte via UART0. - * uint8_t Byte: byte to send. - */ -void uart_putc(uint8_t byte) { - // wait for UART to become ready to transmit - while (1) { - if (!(mmio_read(UART0_FR) & (1 << 5))) { - break; - } - } - mmio_write(UART0_DR, byte); -} - -/* - * print a string to the UART one character at a time - * const char *str: 0-terminated string - */ -void uart_puts(const char *str) { - while (*str) { - uart_putc(*str++); - } -} |