diff options
author | Christian Cunningham <cc@localhost> | 2022-03-24 09:38:08 -0700 |
---|---|---|
committer | Christian Cunningham <cc@localhost> | 2022-03-24 09:38:08 -0700 |
commit | 93bf62580a68533dc8252b9a2a055c02f34ecb67 (patch) | |
tree | 1b1ca92ebbe107a998136a1442c0dba5be885e13 /src/drivers | |
parent | 3e64dda5d5c350cc325650133f7e64967f1efe84 (diff) |
Modularized
Diffstat (limited to 'src/drivers')
-rw-r--r-- | src/drivers/uart.S | 53 | ||||
-rw-r--r-- | src/drivers/uart.c | 83 |
2 files changed, 0 insertions, 136 deletions
diff --git a/src/drivers/uart.S b/src/drivers/uart.S deleted file mode 100644 index 38957c2..0000000 --- a/src/drivers/uart.S +++ /dev/null @@ -1,53 +0,0 @@ -.section ".text" - -.globl uart_char -uart_char: - mov r2, #0x1000 - movt r2, #0x3f20 -1: - ldr r3, [r2, #24] - tst r3, #0b100000 - bne 1b - str r0, [r2] - bx lr - -.globl uart_string -uart_string: - push {r4, lr} - mov r4, r0 - ldrb r0, [r0] - cmp r0, #0 - popeq {r4, pc} -1: - bl uart_char - ldrb r0, [r4, #1]! - cmp r0, #0 - bne 1b - pop {r4, pc} - -.globl uart_hex -uart_hex: - push {r4, lr} - mov r2, #0x1000 - movt r2, #0x3f20 -1: - ldr r3, [r2, #24] - tst r3, #0b100000 - bne 1b - mov r3, #7 -2: - mov r1, r0 - asr r1, r3 - asr r1, r3 - asr r1, r3 - asr r1, r3 - and r1, #0xf - add r1, #0x30 - cmp r1, #0x3A - blt 3f - add r1, #7 -3: - str r1, [r2] - subs r3, #1 - bge 2b // Jump back to wait for availablilty - pop {r4, pc} diff --git a/src/drivers/uart.c b/src/drivers/uart.c deleted file mode 100644 index 68c70d6..0000000 --- a/src/drivers/uart.c +++ /dev/null @@ -1,83 +0,0 @@ -#include <drivers/uart.h> -#include <lib/kmem.h> -#include <lib/strings.h> -#include <sys/core.h> -#include <sys/schedule.h> -#include <symbols.h> -#include <util/lock.h> - -#define UART_BUFFER_SIZE 0x400 -struct UartBuffer { - char buffer[UART_BUFFER_SIZE]; - unsigned long roffset; - unsigned long woffset; - struct Lock l; -} ubuffer; - -void uart_init(void) -{ - ubuffer.roffset = 0; - ubuffer.woffset = 0; - ubuffer.l.pid = 0; - - // Disable UART0 - store32(0x0, UART0_CR); - // Setup GPIO on pin 14 and 15 - store32(0x0, (unsigned long)GPPUD); - delay(150); - store32((1 << 14) | (1 << 15), (unsigned long)GPPUDCLK0); - delay(150); - store32(0x0, (unsigned long)GPPUDCLK0); - // Clear pending interrupts - store32(0x7FF, UART0_ICR); - // Set to 3Mhz - store32(1, UART0_IBRD); - store32(40, UART0_FBRD); - // Enable FIFO and 8 bit transmission - store32((1<<4)|(1<<5)|(1<<6), UART0_LCRH); - // Mask all interrupts - store32((1<<1)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10), UART0_IMSC); - // Enable UART0 - store32((1<<0)|(1<<8)|(1<<9), UART0_CR); -} - -// s = zero-terminated string -void* uart_print(char* s) -{ - lock(&ubuffer.l); - char* ptr = s; - while (1) { - if (*ptr == 0) - break; - ubuffer.buffer[ubuffer.woffset] = *ptr; - if ((ubuffer.woffset+1)%UART_BUFFER_SIZE == ubuffer.roffset) - return ptr; - ubuffer.woffset++; - ubuffer.woffset %= UART_BUFFER_SIZE; - ptr += 1; - } - // Low priority flush run whenever - add_thread_without_duplicate(uart_flush, 0, PRIORITIES-1); - unlock(&ubuffer.l); - return 0; -} - -void uart_flush(void) -{ - while (ubuffer.roffset != ubuffer.woffset) { - uart_char(ubuffer.buffer[ubuffer.roffset++]); - ubuffer.roffset %= UART_BUFFER_SIZE; - } -} - -void uart_10(unsigned long val) -{ - char* dptr = u32_to_str(val); - uart_string(dptr); -} - -void uart_hexn(unsigned long c_val) -{ - uart_hex(c_val); - uart_char('\n'); -} |