blob: 28b56a3c7840a2e5d259a711d5574675c2968997 [file] [log] [blame]
// gpio.c
//
// Copyright (C) 2020 Dan Rodrigues <danrr.gh.oss@gmail.com>
//
// SPDX-License-Identifier: Apache-2.0
#include <stddef.h>
// From Caravel:
#include "../../caravel/defs.h"
// New additions:
#include "gpio.h"
#define GPIO_LED_0 reg_mprj_io_34
#define GPIO_LED_1 reg_mprj_io_35
#define GPIO_LED_2 reg_mprj_io_36
#define GPIO_LED_3 reg_mprj_io_37
#define GPIO_LED (*(volatile uint32_t*)0x30300000)
// Could walk the address space instead but not taking chances incase these regs move around
void gpio_init() {
// Video IO
// RGB out
reg_mprj_io_12 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_13 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_14 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_16 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_17 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_18 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_19 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_20 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_21 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_22 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_23 = GPIO_MODE_USER_STD_OUTPUT;
// VDP flags
reg_mprj_io_24 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_25 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_26 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_27 = GPIO_MODE_USER_STD_OUTPUT;
// Pixel clock (optional)
reg_mprj_io_28 = GPIO_MODE_USER_STD_OUTPUT;
// VDP raster hold flag
reg_mprj_io_29 = GPIO_MODE_USER_STD_OUTPUT;
// Gamepad IO
// CLK
reg_mprj_io_30 = GPIO_MODE_USER_STD_OUTPUT;
// Latch
reg_mprj_io_31 = GPIO_MODE_USER_STD_OUTPUT;
// P1 serial data in
reg_mprj_io_32 = GPIO_MODE_USER_STD_INPUT_NOPULL;
// P2 serial data in
reg_mprj_io_33 = GPIO_MODE_USER_STD_INPUT_NOPULL;
// LEDs (or whatever substitute)
reg_mprj_io_34 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_35 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_36 = GPIO_MODE_USER_STD_OUTPUT;
reg_mprj_io_37 = GPIO_MODE_USER_STD_OUTPUT;
// UART (VERY low in simulator)
reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
// Set UART clock to 64 kbaud (enable before I/O configuration)
reg_uart_clkdiv = 625;
reg_uart_enable = 1;
// Apply config
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
}
void led_set(uint8_t state) {
GPIO_LED = state;
}