mirror of
https://github.com/openhwgroup/cvw
synced 2025-01-23 13:04:28 +00:00
88 lines
3.3 KiB
C
88 lines
3.3 KiB
C
///////////////////////////////////////////////////////////////////////
|
|
// uart.h
|
|
//
|
|
// Written: Jaocb Pease jacob.pease@okstate.edu 7/22/2024
|
|
//
|
|
// Purpose: Header for the UART functions.
|
|
//
|
|
//
|
|
//
|
|
// A component of the Wally configurable RISC-V project.
|
|
//
|
|
// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
|
//
|
|
// Licensed under the Solderpad Hardware License v 2.1 (the
|
|
// “License”); you may not use this file except in compliance with the
|
|
// License, or, at your option, the Apache License version 2.0. You
|
|
// may obtain a copy of the License at
|
|
//
|
|
// https://solderpad.org/licenses/SHL-2.1/
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, any work
|
|
// distributed under the License is distributed on an “AS IS” BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
// implied. See the License for the specific language governing
|
|
// permissions and limitations under the License.
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
#include <stdint.h>
|
|
#include "riscv.h"
|
|
#include "time.h"
|
|
|
|
// UART register addresses
|
|
#define UART_BASE 0x10000000
|
|
|
|
#define UART_RBR UART_BASE + 0x00
|
|
#define UART_THR UART_BASE + 0x00
|
|
#define UART_IER UART_BASE + 0x01
|
|
#define UART_IIR UART_BASE + 0x02
|
|
#define UART_FCR UART_BASE + 0x02
|
|
#define UART_LCR UART_BASE + 0x03
|
|
#define UART_MCR UART_BASE + 0x04
|
|
#define UART_LSR UART_BASE + 0x05
|
|
#define UART_MSR UART_BASE + 0x06
|
|
#define UART_SCR UART_BASE + 0x07
|
|
#define UART_DLL UART_BASE + 0x00
|
|
#define UART_DLM UART_BASE + 0x01
|
|
|
|
// Primary function prototypes
|
|
void init_uart(uint32_t freq, uint32_t baud);
|
|
void write_reg_u8(uintptr_t addr, uint8_t value);
|
|
uint8_t read_reg_u8(uintptr_t addr);
|
|
int read_serial(uint8_t *res);
|
|
void print_uart(const char* str);
|
|
void print_uart_int(uint32_t addr);
|
|
void print_uart_dec(uint64_t addr);
|
|
void print_uart_addr(uint64_t addr);
|
|
void print_uart_hex(uint64_t addr, int n);
|
|
void print_uart_byte(uint8_t byte);
|
|
void print_uart_float(float num, int precision);
|
|
// void print_time();
|
|
|
|
// Print numbers in hex with specified widths
|
|
#define print_uart_int(addr) print_uart_hex(addr, 4)
|
|
#define print_uart_addr(addr) print_uart_hex(addr, 8)
|
|
#define print_uart_byte(addr) print_uart_hex(addr, 1)
|
|
#define print_r7(addr) print_uart_hex(addr, 5)
|
|
#define print_r1(addr) print_uart_byte(addr)
|
|
|
|
// Print line with numbers utility macros
|
|
#define println(msg) print_uart(msg "\r\n");
|
|
#define println_with_dec(msg, num) print_uart(msg); print_uart_dec(num); print_uart("\r\n")
|
|
#define println_with_byte(msg, num) print_uart(msg); print_uart_byte(num); print_uart("\r\n")
|
|
#define println_with_int(msg, num) print_uart(msg); print_uart_int(num); print_uart("\r\n")
|
|
#define println_with_addr(msg, num) print_uart(msg); print_uart_addr(num); print_uart("\r\n")
|
|
#define println_with_r1(msg, num) print_uart(msg); print_r1(num); print_uart("\r\n")
|
|
#define println_with_r7(msg, num) print_uart(msg); print_r7(num); print_uart("\r\n")
|
|
#define println_with_float(msg, num) print_uart(msg); set_status_fs(); print_uart_float(num,5); clear_status_fs(); print_uart("\r\n")
|
|
|
|
/* #define print_time() print_uart("["); \ */
|
|
/* set_status_fs(); \ */
|
|
/* print_uart_float(getTime(),5); \ */
|
|
/* clear_status_fs(); \ */
|
|
/* print_uart("] ") */
|
|
|