summaryrefslogtreecommitdiff
path: root/src/uart.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uart.c')
-rw-r--r--src/uart.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/src/uart.c b/src/uart.c
index bb2a0ea..3b107f4 100644
--- a/src/uart.c
+++ b/src/uart.c
@@ -5,6 +5,7 @@ References:
5#include <uart.h> 5#include <uart.h>
6 6
7#include <gpio.h> 7#include <gpio.h>
8#include <mailbox.h>
8#include <mmio.h> 9#include <mmio.h>
9 10
10enum 11enum
@@ -31,15 +32,10 @@ enum
31 UART0_ITIP = (UART0_BASE + 0x84), 32 UART0_ITIP = (UART0_BASE + 0x84),
32 UART0_ITOP = (UART0_BASE + 0x88), 33 UART0_ITOP = (UART0_BASE + 0x88),
33 UART0_TDR = (UART0_BASE + 0x8C), 34 UART0_TDR = (UART0_BASE + 0x8C),
34 // The offsets for Mailbox registers.
35 MBOX_BASE = 0xB880,
36 MBOX_READ = (MBOX_BASE + 0x00),
37 MBOX_STATUS = (MBOX_BASE + 0x18),
38 MBOX_WRITE = (MBOX_BASE + 0x20)
39}; 35};
40 36
41// A mailbox message with set clock rate of PL011 to 3MHz tag. 37// A mailbox message with set clock rate of PL011 to 3MHz tag.
42static volatile unsigned int __attribute__((aligned(16))) mbox[9] = { 38static const uint32_t __attribute__((aligned(MAIL_ALIGN))) UART_SET_CLK[9] = {
43 9*4, 0, 0x38002, 12, 8, 2, 3000000, 0, 0 39 9*4, 0, 0x38002, 12, 8, 2, 3000000, 0, 0
44}; 40};
45 41
@@ -77,14 +73,9 @@ void uart_init(int raspi) {
77 // For Raspi3 and 4 the UART_CLOCK is system-clock dependent by default. 73 // For Raspi3 and 4 the UART_CLOCK is system-clock dependent by default.
78 // Set it to 3Mhz so that we can consistently set the baud rate 74 // Set it to 3Mhz so that we can consistently set the baud rate
79 if (raspi >= 3) { 75 if (raspi >= 3) {
80 // UART_CLOCK = 30000000; 76 // Send message over property channel to configure UART clock.
81 unsigned int r = (unsigned int) (((uint64_t)(&mbox) & ~0xF) | 8); 77 mbox_write(PROPERTY_CHANNEL, UART_SET_CLK);
82 // Wait until we can talk to the VC. 78 mbox_read(PROPERTY_CHANNEL);
83 while (mmio_read(MBOX_STATUS) & 0x80000000);
84 // Send our message to property channel and wait for the response.
85 mmio_write(MBOX_WRITE, r);
86 while ((mmio_read(MBOX_STATUS) & 0x40000000) ||
87 (mmio_read(MBOX_READ) != r));
88 } 79 }
89 80
90 // Divider = 3000000 / (16 * 115200) = 1.627 = ~1. 81 // Divider = 3000000 / (16 * 115200) = 1.627 = ~1.