77 lines
1.6 KiB
C++
77 lines
1.6 KiB
C++
#include <cstdint>
|
|
|
|
#include "gpio.h"
|
|
#include "xuartlite.h"
|
|
|
|
namespace {
|
|
constexpr uintptr_t kUart0BaseAddress = 0x40001000;
|
|
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); }
|
|
|
|
uint32_t UartRead32() {
|
|
uint32_t val = 0;
|
|
|
|
// little endian
|
|
val |= (UartRead() << 0);
|
|
val |= (UartRead() << 8);
|
|
val |= (UartRead() << 16);
|
|
val |= (UartRead() << 24);
|
|
|
|
return val;
|
|
}
|
|
} // namespace
|
|
|
|
int main() {
|
|
gpio0->data = 1;
|
|
|
|
InitUarts();
|
|
|
|
while (1) {
|
|
uint8_t c = UartRead();
|
|
if (c == 'c') {
|
|
uint32_t addr = UartRead32();
|
|
uint32_t bytes = UartRead32();
|
|
|
|
uint8_t* start = reinterpret_cast<uint8_t*>(addr);
|
|
uint8_t* end = reinterpret_cast<uint8_t*>(addr + bytes);
|
|
for (uint8_t* ptr = start; ptr < end; ptr++) {
|
|
*ptr = UartRead();
|
|
}
|
|
|
|
UartWrite('a');
|
|
UartWrite(bytes);
|
|
gpio0->data = 0xf0;
|
|
} else if (c == 'j') {
|
|
uint32_t addr = UartRead32();
|
|
|
|
gpio0->data = 0x55;
|
|
|
|
addr |= 0x0001;
|
|
|
|
auto jump = reinterpret_cast<void (*)()>(addr);
|
|
jump();
|
|
}
|
|
}
|
|
}
|