mbv: minor cleanup
This commit is contained in:
parent
73edb77577
commit
af768cbb09
@ -6,10 +6,6 @@ bootloader: ## Build the bootloader in docker
|
|||||||
helloworld: ## Build the helloworld app in docker
|
helloworld: ## Build the helloworld app in docker
|
||||||
docker build -o . --target export --build-arg TARGET=helloworld.bin .
|
docker build -o . --target export --build-arg TARGET=helloworld.bin .
|
||||||
|
|
||||||
.PHONY: wozmon
|
|
||||||
wozmon: ## Build the wozmon app in docker
|
|
||||||
docker build -o . --target export --build-arg TARGET=wozmon.bin .
|
|
||||||
|
|
||||||
.PHONY: timer
|
.PHONY: timer
|
||||||
timer: ## Build the timer app in docker
|
timer: ## Build the timer app in docker
|
||||||
docker build -o . --target export --build-arg TARGET=timer.bin .
|
docker build -o . --target export --build-arg TARGET=timer.bin .
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
#include "pol0.h"
|
#include "pol0.h"
|
||||||
|
|
||||||
struct Gpio {
|
namespace {
|
||||||
volatile uint32_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define gpio0 ((Gpio*)GPIO0_BASE)
|
Gpio* gpio0;
|
||||||
|
|
||||||
void sleep(int ms) {
|
void sleep(int ms) {
|
||||||
for (int m = 0; m < ms; m++) {
|
for (int m = 0; m < ms; m++) {
|
||||||
@ -16,7 +15,10 @@ void sleep(int ms) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
gpio0 = Gpio::Instance(GPIO0_BASE);
|
||||||
int out = 0;
|
int out = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -1,25 +1,17 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "bios.h"
|
||||||
|
#include "gpio.h"
|
||||||
#include "intc.h"
|
#include "intc.h"
|
||||||
#include "interrupts.h"
|
#include "interrupts.h"
|
||||||
#include "pol0.h"
|
#include "pol0.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
void BiosWozmon();
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct Gpio {
|
Gpio* leds;
|
||||||
volatile uint32_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
Gpio* leds = reinterpret_cast<Gpio*>(GPIO0_BASE);
|
|
||||||
Timer* timer;
|
Timer* timer;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Timer0Isr() {
|
void Timer0Isr() {
|
||||||
static int counter = 0;
|
static int counter = 0;
|
||||||
leds->data = counter++;
|
leds->data = counter++;
|
||||||
@ -38,7 +30,10 @@ void SetupTimer() {
|
|||||||
EnableInterrupts();
|
EnableInterrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
leds = Gpio::Instance(GPIO0_BASE);
|
||||||
leds->data = 0xa0;
|
leds->data = 0xa0;
|
||||||
|
|
||||||
SetupTimer();
|
SetupTimer();
|
||||||
|
@ -1,21 +1,14 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
#include "intc.h"
|
#include "intc.h"
|
||||||
#include "interrupts.h"
|
#include "interrupts.h"
|
||||||
#include "pol0.h"
|
#include "pol0.h"
|
||||||
#include "xuartlite.h"
|
#include "xuartlite.h"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
void BiosWozmon();
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct Gpio {
|
Gpio* leds;
|
||||||
volatile uint32_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
Gpio* leds = reinterpret_cast<Gpio*>(GPIO0_BASE);
|
|
||||||
|
|
||||||
XUartLite uart0_inst;
|
XUartLite uart0_inst;
|
||||||
XUartLite_Config uart0_config = {
|
XUartLite_Config uart0_config = {
|
||||||
@ -52,9 +45,10 @@ void InitUarts() {
|
|||||||
SetIrqEnabled(UART0_IRQN, true);
|
SetIrqEnabled(UART0_IRQN, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
leds = Gpio::Instance(GPIO0_BASE);
|
||||||
leds->data = 0xa0;
|
leds->data = 0xa0;
|
||||||
|
|
||||||
InitUarts();
|
InitUarts();
|
||||||
|
@ -1,168 +0,0 @@
|
|||||||
#include <cstdint>
|
|
||||||
|
|
||||||
#include "xuartlite.h"
|
|
||||||
|
|
||||||
struct Gpio {
|
|
||||||
volatile uint32_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define gpio0 ((Gpio*)0x40000000)
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
constexpr uintptr_t kUart0BaseAddress = 0x40600000;
|
|
||||||
XUartLite uart0_inst;
|
|
||||||
XUartLite_Config uart0_config = {
|
|
||||||
.DeviceId = 0,
|
|
||||||
.RegBaseAddr = kUart0BaseAddress,
|
|
||||||
.BaudRate = 115200,
|
|
||||||
.UseParity = false,
|
|
||||||
.DataBits = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
XUartLite* uart0 = &uart0_inst;
|
|
||||||
|
|
||||||
void InitUarts() {
|
|
||||||
XUartLite_CfgInitialize(uart0, &uart0_config, uart0_config.RegBaseAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t UartRead() {
|
|
||||||
uint8_t c;
|
|
||||||
while (XUartLite_Recv(uart0, &c, 1) < 1) {
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UartWrite(uint8_t c) {
|
|
||||||
XUartLite_Send(uart0, &c, 1);
|
|
||||||
while (XUartLite_IsSending(uart0)) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Jump(uint32_t addr) {
|
|
||||||
auto jump = reinterpret_cast<void (*)()>(addr);
|
|
||||||
jump();
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr uint8_t kBackspace = 0x7f;
|
|
||||||
constexpr uint8_t kOtherBackspace = 0x08;
|
|
||||||
|
|
||||||
uint8_t ReadHexNibble(uint8_t c) {
|
|
||||||
// lowercase only
|
|
||||||
if (c <= '9') {
|
|
||||||
return c - '0';
|
|
||||||
}
|
|
||||||
return 10 + (c - 'a');
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ReadHex(const char* buf) {
|
|
||||||
uint32_t out = 0;
|
|
||||||
while (*buf == ' ') {
|
|
||||||
buf++;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
uint8_t c = ReadHexNibble(*buf);
|
|
||||||
if (c > 0xf) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
out = (out << 4) + c;
|
|
||||||
buf++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WriteHexNibble(uint8_t c) {
|
|
||||||
if (c > 9) {
|
|
||||||
UartWrite('a' + c - 10);
|
|
||||||
} else {
|
|
||||||
UartWrite('0' + c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UartWriteUint32(uint32_t a) {
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
WriteHexNibble((a >> 28) & 0xf);
|
|
||||||
a <<= 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UartWriteUint8(uint8_t a) {
|
|
||||||
WriteHexNibble(a >> 4);
|
|
||||||
WriteHexNibble(a & 0xf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UartDump(uint32_t addr, int count) {
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
UartWrite(' ');
|
|
||||||
UartWriteUint8(*reinterpret_cast<uint8_t*>(addr + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpHex(uint32_t addr) {
|
|
||||||
addr &= 0xfffffffc;
|
|
||||||
UartWriteUint32(addr);
|
|
||||||
UartWrite(':');
|
|
||||||
UartDump(addr, 4);
|
|
||||||
UartWrite('\r');
|
|
||||||
UartWrite('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
int FindChar(const char* buf, uint8_t c) {
|
|
||||||
int found = 0;
|
|
||||||
while (*buf) {
|
|
||||||
if (*buf == c) {
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
found++;
|
|
||||||
buf++;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
gpio0->data = 1;
|
|
||||||
uint32_t cur_addr = 0;
|
|
||||||
uint32_t cur_data = 0;
|
|
||||||
|
|
||||||
char inbuf[64] = {};
|
|
||||||
char* inptr = inbuf;
|
|
||||||
|
|
||||||
InitUarts();
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
uint8_t c = UartRead();
|
|
||||||
UartWrite(c); // echo
|
|
||||||
if (c == '\r') {
|
|
||||||
gpio0->data = 0x55;
|
|
||||||
*inptr = 0;
|
|
||||||
if (inptr == inbuf) {
|
|
||||||
cur_addr += 4;
|
|
||||||
} else if (FindChar(inbuf, 'r') >= 0) {
|
|
||||||
Jump(cur_addr);
|
|
||||||
} else {
|
|
||||||
cur_addr = ReadHex(inbuf);
|
|
||||||
UartWrite('\n');
|
|
||||||
}
|
|
||||||
DumpHex(cur_addr);
|
|
||||||
int assigned = FindChar(inbuf, ':');
|
|
||||||
if (assigned >= 0) {
|
|
||||||
cur_data = ReadHex(inbuf + assigned + 1);
|
|
||||||
*(reinterpret_cast<uint32_t*>(cur_addr)) = cur_data;
|
|
||||||
}
|
|
||||||
inptr = inbuf;
|
|
||||||
} else if (c == kBackspace) {
|
|
||||||
inptr--;
|
|
||||||
if (inptr < inbuf) {
|
|
||||||
inptr = inbuf;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
UartWrite(kOtherBackspace);
|
|
||||||
UartWrite(' ');
|
|
||||||
UartWrite(kOtherBackspace);
|
|
||||||
} else {
|
|
||||||
*inptr++ = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
1
mbv/configure
vendored
1
mbv/configure
vendored
@ -275,7 +275,6 @@ all = [
|
|||||||
bootloader_image,
|
bootloader_image,
|
||||||
|
|
||||||
app_image("helloworld"),
|
app_image("helloworld"),
|
||||||
app_image("wozmon"),
|
|
||||||
app_image("timer"),
|
app_image("timer"),
|
||||||
app_image("uart"),
|
app_image("uart"),
|
||||||
]
|
]
|
||||||
|
12
mbv/hal/bios.h
Normal file
12
mbv/hal/bios.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
uint8_t BiosUartRead();
|
||||||
|
void BiosUartWrite(uint8_t);
|
||||||
|
void BiosWozmon();
|
||||||
|
void BiosUartWriteNibble(uint8_t);
|
||||||
|
|
||||||
|
}
|
11
mbv/hal/gpio.h
Normal file
11
mbv/hal/gpio.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct Gpio {
|
||||||
|
volatile uint32_t data;
|
||||||
|
|
||||||
|
static Gpio* Instance(uint32_t base) {
|
||||||
|
return reinterpret_cast<Gpio*>(base);
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user