mirror of
https://github.com/isometimes/rpi4-osdev
synced 2024-11-10 04:10:39 +00:00
66 lines
1.5 KiB
C
66 lines
1.5 KiB
C
|
#include "io.h"
|
||
|
#include "fb.h"
|
||
|
|
||
|
// UART0
|
||
|
|
||
|
enum {
|
||
|
ARM_UART0_BASE = PERIPHERAL_BASE + 0x201000,
|
||
|
ARM_UART0_DR = ARM_UART0_BASE + 0x00,
|
||
|
ARM_UART0_FR = ARM_UART0_BASE + 0x18,
|
||
|
ARM_UART0_IBRD = ARM_UART0_BASE + 0x24,
|
||
|
ARM_UART0_FBRD = ARM_UART0_BASE + 0x28,
|
||
|
ARM_UART0_LCRH = ARM_UART0_BASE + 0x2C,
|
||
|
ARM_UART0_CR = ARM_UART0_BASE + 0x30,
|
||
|
ARM_UART0_IFLS = ARM_UART0_BASE + 0x34,
|
||
|
ARM_UART0_IMSC = ARM_UART0_BASE + 0x38,
|
||
|
ARM_UART0_RIS = ARM_UART0_BASE + 0x3C,
|
||
|
ARM_UART0_MIS = ARM_UART0_BASE + 0x40,
|
||
|
ARM_UART0_ICR = ARM_UART0_BASE + 0x44
|
||
|
};
|
||
|
|
||
|
unsigned int bt_isReadByteReady() { return (!(mmio_read(ARM_UART0_FR) & 0x10)); }
|
||
|
|
||
|
unsigned char bt_readByte()
|
||
|
{
|
||
|
unsigned char ch = mmio_read(ARM_UART0_DR) & 0xff;
|
||
|
return ch;
|
||
|
}
|
||
|
|
||
|
unsigned char bt_waitReadByte()
|
||
|
{
|
||
|
while (!bt_isReadByteReady());
|
||
|
return bt_readByte();
|
||
|
}
|
||
|
|
||
|
void bt_writeByte(char byte)
|
||
|
{
|
||
|
while ((mmio_read(ARM_UART0_FR) & 0x20) != 0);
|
||
|
mmio_write(ARM_UART0_DR, (unsigned int)byte);
|
||
|
}
|
||
|
|
||
|
void bt_flushrx()
|
||
|
{
|
||
|
while (bt_isReadByteReady()) bt_readByte();
|
||
|
}
|
||
|
|
||
|
void bt_init()
|
||
|
{
|
||
|
gpio_useAsAlt3(30);
|
||
|
gpio_useAsAlt3(31);
|
||
|
gpio_useAsAlt3(32);
|
||
|
gpio_useAsAlt3(33);
|
||
|
|
||
|
bt_flushrx();
|
||
|
|
||
|
mmio_write(ARM_UART0_IMSC, 0x00);
|
||
|
mmio_write(ARM_UART0_ICR, 0x7ff);
|
||
|
mmio_write(ARM_UART0_IBRD, 0x1a);
|
||
|
mmio_write(ARM_UART0_FBRD, 0x03);
|
||
|
mmio_write(ARM_UART0_IFLS, 0x08);
|
||
|
mmio_write(ARM_UART0_LCRH, 0x70);
|
||
|
mmio_write(ARM_UART0_CR, 0xB01);
|
||
|
mmio_write(ARM_UART0_IMSC, 0x430);
|
||
|
|
||
|
wait_msec(0x100000);
|
||
|
}
|