diff options
-rw-r--r-- | armclock.h | 22 | ||||
-rw-r--r-- | bcmclock.h | 10 | ||||
-rw-r--r-- | global.h | 12 | ||||
-rw-r--r-- | uart.c | 52 | ||||
-rw-r--r-- | uart.h | 22 |
5 files changed, 57 insertions, 61 deletions
@@ -41,38 +41,36 @@ static inline void armclk_init(void) ctrl.fields.timer_enable = 1; ctrl.fields.interrupt_enable = 1; ctrl.fields.counter_23bit = 1; - *(uint32_t volatile*) ARMCLK_CONTROL = ctrl.raw; + wr32(ARMCLK_CONTROL, ctrl.raw); } static inline void armclk_enable_timer_irq(void) { - armclk_control_t ctrl = - (armclk_control_t) *(uint32_t volatile*) ARMCLK_CONTROL; + armclk_control_t ctrl = (armclk_control_t) rd32(ARMCLK_CONTROL); ctrl.fields.interrupt_enable = 1; - *(uint32_t volatile*) ARMCLK_CONTROL = ctrl.raw; + wr32(ARMCLK_CONTROL, ctrl.raw); - *(uint32_t volatile*) ARM_ENABLE_BASIC_IRQS = 1; + wr32(ARM_ENABLE_BASIC_IRQS, 1); } static inline void armclk_disable_timer_irq(void) { - armclk_control_t ctrl = - (armclk_control_t) *(uint32_t volatile*) ARMCLK_CONTROL; + armclk_control_t ctrl = (armclk_control_t) rd32(ARMCLK_CONTROL); ctrl.fields.interrupt_enable = 0; - *(uint32_t volatile*) ARMCLK_CONTROL = ctrl.raw; + wr32(ARMCLK_CONTROL, ctrl.raw); - *(uint32_t volatile*) ARM_DISABLE_BASIC_IRQS = 1; + wr32(ARM_DISABLE_BASIC_IRQS, 1); } static inline void armclk_irq_settimeout(uint32_t timeout) { - *(uint32_t volatile*) ARMCLK_IRQ_CLR_ACK = 0; - *(uint32_t volatile*) ARMCLK_LOAD = timeout; + wr32(ARMCLK_IRQ_CLR_ACK, 0); + wr32(ARMCLK_LOAD, timeout); } static inline _Bool armclk_irq_pending(void) { - return *(uint32_t volatile*) ARM_IRQ_BASIC_PENDING & 1; + return rd32(ARM_IRQ_BASIC_PENDING) & 1; } #endif // ARMCLOCK_H @@ -17,19 +17,19 @@ static inline void bcmclk_enable_timer_irq(void) { - *(uint32_t volatile*) ARM_ENABLE_IRQS_1 = 1 << 3; + wr32(ARM_ENABLE_IRQS_1, 1 << 3); } static inline void bcmclk_disable_timer_irq(void) { - *(uint32_t volatile*) ARM_DISABLE_IRQS_1 = 1 << 3; + wr32(ARM_DISABLE_IRQS_1, 1 << 3); } static inline void bcmclk_irq_settimeout(uint32_t timeout) { - uint32_t clock_now = *(uint32_t volatile*) ST_CLO; - *(uint32_t volatile*) ST_C3 = clock_now + timeout; - *(uint32_t volatile*) ST_CS = 1 << 3; + uint32_t clock_now = rd32(ST_CLO); + wr32(ST_C3, clock_now + timeout); + wr32(ST_CS, 1 << 3); } #endif // BCMCLOCK_H @@ -1,6 +1,8 @@ #ifndef GLOBAL_H #define GLOBAL_H +#include <stdint.h> + // board type, raspi2 #define RASPI 2 @@ -38,4 +40,14 @@ #define ARM_DISABLE_IRQS_2 (ARM_BASE + 0x220) #define ARM_DISABLE_BASIC_IRQS (ARM_BASE + 0x224) +inline static uint32_t rd32(uint32_t addr) +{ + return *(uint32_t volatile*) addr; +} + +inline static void wr32(uint32_t addr, uint32_t value) +{ + *(uint32_t volatile*) addr = value; +} + #endif // GLOBAL_H @@ -3,18 +3,6 @@ #include <uart.h> #include <global.h> -// Memory-Mapped I/O output -static inline void mmio_write(uint32_t reg, uint32_t data) -{ - *(volatile uint32_t*)reg = data; -} - -// Memory-Mapped I/O input -static inline uint32_t mmio_read(uint32_t reg) -{ - return *(volatile uint32_t*)reg; -} - // Loop <delay> times in a way that the compiler won't optimize away static inline void delay(int32_t count) { @@ -25,22 +13,20 @@ static inline void delay(int32_t count) void uart_init() { // Disable PL011_UART. - mmio_write(PL011_UART_CR, 0x00000000); + wr32(PL011_UART_CR, 0); + // Setup the GPIO pin 14 && 15. // Disable pull up/down for all GPIO pins & delay for 150 cycles. - mmio_write(GPPUD, 0x00000000); + wr32(GPPUD, 0); delay(150); // Disable pull up/down for pin 14,15 & delay for 150 cycles. - mmio_write(GPPUDCLK0, (1 << 14) | (1 << 15)); + wr32(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(PL011_UART_ICR, 0x7FF); + wr32(GPPUDCLK0, 0); // Set integer & fractional part of baud rate. // Divider = UART_CLOCK/(16 * Baud) @@ -48,60 +34,60 @@ void uart_init() // UART_CLOCK = 3000000; Baud = 115200. // Divider = 3000000 / (16 * 115200) = 1.627 = ~1. - mmio_write(PL011_UART_IBRD, 1); + wr32(PL011_UART_IBRD, 1); // Fractional part register = (.627 * 64) + 0.5 = 40.6 = ~40. - mmio_write(PL011_UART_FBRD, 40); + wr32(PL011_UART_FBRD, 40); // Set 8 bit data transmission (1 stop bit, no parity) // and disable FIFO to be able to receive interrupt every received // char, not every 2 chars - mmio_write(PL011_UART_LCRH, (1 << 5) | (1 << 6)); + wr32(PL011_UART_LCRH, (1 << 5) | (1 << 6)); // set interrupt to come when transmit FIFO becomes ≤ 1/8 full // or receive FIFO becomes ≥ 1/8 full // (not really matters, since we disabled FIFOs) - mmio_write(PL011_UART_IFLS, 0); + wr32(PL011_UART_IFLS, 0); // Enable PL011_UART, receive & transfer part of UART.2 - mmio_write(PL011_UART_CR, (1 << 0) | (1 << 8) | (1 << 9)); + wr32(PL011_UART_CR, (1 << 0) | (1 << 8) | (1 << 9)); // At first, it's probably safer to disable interrupts :) uart_irq_disable(); - // That disables the entire uart irq; also disable single sources - // within it - *(uint32_t volatile*) PL011_UART_IMSC = 0; + // The above disables the entire uart irq; + // Also disable single sources within it + wr32(PL011_UART_IMSC, 0); } inline static _Bool can_transmit(void) { - return !(mmio_read(PL011_UART_FR) & (1 << 5)); + return !(rd32(PL011_UART_FR) & (1 << 5)); } inline static _Bool can_receive(void) { - return !(mmio_read(PL011_UART_FR) & (1 << 4)); + return !(rd32(PL011_UART_FR) & (1 << 4)); } void putchar(char c) { while (!can_transmit()); - mmio_write(PL011_UART_DR, c); + wr32(PL011_UART_DR, c); } char getchar(void) { while (!can_receive()); - return mmio_read(PL011_UART_DR); + return rd32(PL011_UART_DR); } _Bool putchar_non_blocking(char c) { if (can_transmit()) { - mmio_write(PL011_UART_DR, c); + wr32(PL011_UART_DR, c); return 0; } @@ -111,7 +97,7 @@ _Bool putchar_non_blocking(char c) int getchar_non_blocking(void) { if (can_receive()) - return mmio_read(PL011_UART_DR); + return rd32(PL011_UART_DR); return -1; } @@ -47,59 +47,59 @@ int getchar_non_blocking(void); static inline _Bool uart_irq_pending(void) { return - ((uint32_t) 1 << 25) & *(uint32_t volatile*) ARM_IRQ_PENDING_2; + ((uint32_t) 1 << 25) & rd32(ARM_IRQ_PENDING_2); } static inline void uart_irq_disable(void) { // Mask uart in arm peripheral interrupts - *(uint32_t volatile*) ARM_DISABLE_IRQS_2 = ((uint32_t) 1 << 25); + wr32(ARM_DISABLE_IRQS_2, ((uint32_t) 1) << 25); } static inline void uart_irq_enable(void) { // Unmask uart in arm peripheral interrupts - *(uint32_t volatile*) ARM_ENABLE_IRQS_2 = ((uint32_t) 1 << 25); + wr32(ARM_ENABLE_IRQS_2, ((uint32_t) 1) << 25); } static inline _Bool uart_recv_irq_pending(void) { - return ((uint32_t) 1 << 4) & *(uint32_t volatile*) PL011_UART_MIS; + return (1 << 4) & rd32(PL011_UART_MIS); } static inline void uart_recv_irq_disable(void) { - *(uint32_t volatile*) PL011_UART_IMSC &= ~(1 << 4); + wr32(PL011_UART_IMSC, rd32(PL011_UART_IMSC) & ~(1 << 4)); } static inline void uart_recv_irq_enable(void) { - *(uint32_t volatile*) PL011_UART_IMSC |= (1 << 4); + wr32(PL011_UART_IMSC, rd32(PL011_UART_IMSC) | (1 << 4)); } static inline void uart_clear_recv_irq(void) { - *(uint32_t volatile*) PL011_UART_ICR = (1 << 4); + wr32(PL011_UART_ICR, (1 << 4)); } static inline _Bool uart_send_irq_pending(void) { - return ((uint32_t) 1 << 5) & *(uint32_t volatile*) PL011_UART_MIS; + return (1 << 5) & rd32(PL011_UART_MIS); } static inline void uart_send_irq_disable(void) { - *(uint32_t volatile*) PL011_UART_IMSC &= ~(1 << 5); + wr32(PL011_UART_IMSC, rd32(PL011_UART_IMSC) & ~(1 << 5)); } static inline void uart_send_irq_enable(void) { - *(uint32_t volatile*) PL011_UART_IMSC |= (1 << 5); + wr32(PL011_UART_IMSC, rd32(PL011_UART_IMSC) | (1 << 5)); } static inline void uart_clear_send_irq(void) { - *(uint32_t volatile*) PL011_UART_ICR = (1 << 5); + wr32(PL011_UART_ICR, (1 << 5)); } #endif // UART_H |