mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2025-04-21 12:27:27 +03:00
Adding lm32 demo to SAKC project
This commit is contained in:
46
lm32/logic/sakc/firmware/hw-test/Makefile
Normal file
46
lm32/logic/sakc/firmware/hw-test/Makefile
Normal file
@@ -0,0 +1,46 @@
|
||||
LM32_CC=lm32-elf-gcc
|
||||
LM32_LD=lm32-elf-ld
|
||||
LM32_OBJCOPY=lm32-elf-objcopy
|
||||
LM32_OBJDUMP=lm32-elf-objdump
|
||||
|
||||
SREC2VRAM ?= ../../tools/srec2vram/srec2vram
|
||||
VRAMFILE=image.ram
|
||||
|
||||
CFLAGS=-MMD -O2 -Wall -g -s -fomit-frame-pointer -mbarrel-shift-enabled -mmultiply-enabled -mdivide-enabled -msign-extend-enabled
|
||||
LDFLAGS=-nostdlib -nodefaultlibs -Tlinker.ld
|
||||
SEGMENTS = -j .text -j .rodata -j .data
|
||||
|
||||
all: image.srec $(VRAMFILE)
|
||||
|
||||
crt0ram.o: crt0ram.S
|
||||
$(LM32_CC) $(CFLAGS) -c crt0ram.S
|
||||
|
||||
main.o: main.c
|
||||
$(LM32_CC) $(CFLAGS) -c main.c
|
||||
|
||||
soc-hw.o: soc-hw.c
|
||||
$(LM32_CC) $(CFLAGS) -c soc-hw.c
|
||||
|
||||
image: crt0ram.o main.o soc-hw.o linker.ld Makefile
|
||||
$(LM32_LD) $(LDFLAGS) -Map image.map -N -o image crt0ram.o main.o soc-hw.o
|
||||
|
||||
image.lst: image
|
||||
$(LM32_OBJDUMP) -h -S $< > $@
|
||||
|
||||
image.bin: image
|
||||
$(LM32_OBJCOPY) $(SEGMENTS) -O binary image image.bin
|
||||
|
||||
image.srec: image image.lst
|
||||
$(LM32_OBJCOPY) $(SEGMENTS) -O srec image image.srec
|
||||
|
||||
$(VRAMFILE): image.srec
|
||||
$(SREC2VRAM) image.srec 0x40000000 0x1000 > $(VRAMFILE)
|
||||
|
||||
clean:
|
||||
rm -f image image.lst image.bin image.srec image.map *.o *.d
|
||||
|
||||
DEPS := $(wildcard *.d)
|
||||
ifneq ($(DEPS),)
|
||||
include $(DEPS)
|
||||
endif
|
||||
|
||||
249
lm32/logic/sakc/firmware/hw-test/crt0ram.S
Normal file
249
lm32/logic/sakc/firmware/hw-test/crt0ram.S
Normal file
@@ -0,0 +1,249 @@
|
||||
/*
|
||||
* LatticeMico32 C startup code.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* Exception handlers - Must be 32 bytes long. */
|
||||
.section .text, "ax", @progbits
|
||||
.global _start
|
||||
.global irq_enable, irq_disable, irq_set_mask, irq_get_mask
|
||||
.global jump, halt
|
||||
.global get_sp, get_gp
|
||||
|
||||
_start:
|
||||
_reset_handler:
|
||||
xor r0, r0, r0
|
||||
wcsr IE, r0
|
||||
mvhi r1, hi(_reset_handler)
|
||||
ori r1, r1, lo(_reset_handler)
|
||||
wcsr EBA, r1
|
||||
calli _crt0
|
||||
nop
|
||||
nop
|
||||
|
||||
_breakpoint_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_ibuserror_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_watchpoint_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_dbuserror_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_divzero_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_interrupt_handler:
|
||||
sw (sp+0), ra
|
||||
calli _save_all
|
||||
rcsr r1, IP
|
||||
calli irq_handler
|
||||
mvhi r1, 0xffff
|
||||
ori r1, r1, 0xffff
|
||||
wcsr IP, r1
|
||||
bi _restore_all_and_eret
|
||||
|
||||
_scall_handler:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_crt0:
|
||||
/* Setup stack and global pointer */
|
||||
mvhi sp, hi(_fstack)
|
||||
ori sp, sp, lo(_fstack)
|
||||
mvhi gp, hi(_gp)
|
||||
ori gp, gp, lo(_gp)
|
||||
|
||||
/* Clear BSS */
|
||||
mvhi r1, hi(_fbss)
|
||||
ori r1, r1, lo(_fbss)
|
||||
mvhi r3, hi(_ebss)
|
||||
ori r3, r3, lo(_ebss)
|
||||
.clearBSS:
|
||||
be r1, r3, .callMain
|
||||
sw (r1+0), r0
|
||||
addi r1, r1, 4
|
||||
bi .clearBSS
|
||||
|
||||
.callMain:
|
||||
mvi r1, 0
|
||||
mvi r2, 0
|
||||
mvi r3, 0
|
||||
calli main
|
||||
|
||||
irq_enable:
|
||||
mvi r1, 1
|
||||
wcsr IE, r1
|
||||
ret
|
||||
|
||||
irq_disable:
|
||||
mvi r1, 0
|
||||
wcsr IE, r1
|
||||
ret
|
||||
|
||||
irq_set_mask:
|
||||
wcsr IM, r1
|
||||
ret
|
||||
|
||||
irq_get_mask:
|
||||
rcsr r1, IM
|
||||
ret
|
||||
|
||||
jump:
|
||||
b r1
|
||||
|
||||
halt:
|
||||
bi halt
|
||||
|
||||
/* Save all registers onto the stack */
|
||||
_save_all:
|
||||
addi sp, sp, -128
|
||||
sw (sp+4), r1
|
||||
sw (sp+8), r2
|
||||
sw (sp+12), r3
|
||||
sw (sp+16), r4
|
||||
sw (sp+20), r5
|
||||
sw (sp+24), r6
|
||||
sw (sp+28), r7
|
||||
sw (sp+32), r8
|
||||
sw (sp+36), r9
|
||||
sw (sp+40), r10
|
||||
#ifdef MICO32_FULL_CONTEXT_SAVE_RESTORE
|
||||
sw (sp+44), r11
|
||||
sw (sp+48), r12
|
||||
sw (sp+52), r13
|
||||
sw (sp+56), r14
|
||||
sw (sp+60), r15
|
||||
sw (sp+64), r16
|
||||
sw (sp+68), r17
|
||||
sw (sp+72), r18
|
||||
sw (sp+76), r19
|
||||
sw (sp+80), r20
|
||||
sw (sp+84), r21
|
||||
sw (sp+88), r22
|
||||
sw (sp+92), r23
|
||||
sw (sp+96), r24
|
||||
sw (sp+100), r25
|
||||
sw (sp+104), r26
|
||||
sw (sp+108), r27
|
||||
#endif
|
||||
sw (sp+120), ea
|
||||
sw (sp+124), ba
|
||||
/* ra and sp need special handling, as they have been modified */
|
||||
lw r1, (sp+128)
|
||||
sw (sp+116), r1
|
||||
mv r1, sp
|
||||
addi r1, r1, 128
|
||||
sw (sp+112), r1
|
||||
ret
|
||||
|
||||
/* Restore all registers and return from exception */
|
||||
_restore_all_and_eret:
|
||||
lw r1, (sp+4)
|
||||
lw r2, (sp+8)
|
||||
lw r3, (sp+12)
|
||||
lw r4, (sp+16)
|
||||
lw r5, (sp+20)
|
||||
lw r6, (sp+24)
|
||||
lw r7, (sp+28)
|
||||
lw r8, (sp+32)
|
||||
lw r9, (sp+36)
|
||||
lw r10, (sp+40)
|
||||
#ifdef MICO32_FULL_CONTEXT_SAVE_RESTORE
|
||||
lw r11, (sp+44)
|
||||
lw r12, (sp+48)
|
||||
lw r13, (sp+52)
|
||||
lw r14, (sp+56)
|
||||
lw r15, (sp+60)
|
||||
lw r16, (sp+64)
|
||||
lw r17, (sp+68)
|
||||
lw r18, (sp+72)
|
||||
lw r19, (sp+76)
|
||||
lw r20, (sp+80)
|
||||
lw r21, (sp+84)
|
||||
lw r22, (sp+88)
|
||||
lw r23, (sp+92)
|
||||
lw r24, (sp+96)
|
||||
lw r25, (sp+100)
|
||||
lw r26, (sp+104)
|
||||
lw r27, (sp+108)
|
||||
#endif
|
||||
lw ra, (sp+116)
|
||||
lw ea, (sp+120)
|
||||
lw ba, (sp+124)
|
||||
/* Stack pointer must be restored last, in case it has been updated */
|
||||
lw sp, (sp+112)
|
||||
eret
|
||||
|
||||
get_sp:
|
||||
mv r1, sp
|
||||
ret
|
||||
|
||||
get_gp:
|
||||
mv r1, gp
|
||||
ret
|
||||
|
||||
59
lm32/logic/sakc/firmware/hw-test/linker.ld
Normal file
59
lm32/logic/sakc/firmware/hw-test/linker.ld
Normal file
@@ -0,0 +1,59 @@
|
||||
OUTPUT_FORMAT("elf32-lm32")
|
||||
ENTRY(_start)
|
||||
|
||||
__DYNAMIC = 0;
|
||||
|
||||
|
||||
_RAM_START = 0x40000000;
|
||||
_RAM_SIZE = 0x1000;
|
||||
_RAM_END = _RAM_START + _RAM_SIZE;
|
||||
|
||||
MEMORY {
|
||||
ram : ORIGIN = 0x40000000, LENGTH = 0x1000 /* 4k */
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
_ftext = .;
|
||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||
_etext = .;
|
||||
} > ram
|
||||
|
||||
.rodata :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_frodata = .;
|
||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
_erodata = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_fdata = .;
|
||||
*(.data .data.* .gnu.linkonce.d.*)
|
||||
*(.data1)
|
||||
_gp = ALIGN(16);
|
||||
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
||||
_edata = .;
|
||||
} > ram
|
||||
|
||||
.bss :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_fbss = .;
|
||||
*(.dynsbss)
|
||||
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
||||
*(.scommon)
|
||||
*(.dynbss)
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
_ebss = .;
|
||||
_end = .;
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(_fstack = ORIGIN(ram) + LENGTH(ram) - 4);
|
||||
151
lm32/logic/sakc/firmware/hw-test/main.c
Normal file
151
lm32/logic/sakc/firmware/hw-test/main.c
Normal file
@@ -0,0 +1,151 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
#include "soc-hw.h"
|
||||
|
||||
inline void writeint(uint32_t val)
|
||||
{
|
||||
uint32_t i, digit;
|
||||
|
||||
for (i=0; i<8; i++) {
|
||||
digit = (val & 0xf0000000) >> 28;
|
||||
if (digit >= 0xA)
|
||||
uart_putchar('A'+digit-10);
|
||||
else
|
||||
uart_putchar('0'+digit);
|
||||
val <<= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void test2() {
|
||||
uart_putchar('b');
|
||||
}
|
||||
|
||||
void test() {
|
||||
uart_putchar('a');
|
||||
test2();
|
||||
uart_putchar('c');
|
||||
}
|
||||
|
||||
char glob[] = "Global";
|
||||
|
||||
volatile uint32_t *p;
|
||||
volatile uint8_t *p2;
|
||||
|
||||
extern uint32_t tic_msec;
|
||||
|
||||
int main()
|
||||
{
|
||||
char test2[] = "Lokalerstr";
|
||||
char *str = test2;
|
||||
uint32_t i;
|
||||
|
||||
// for (i = 0; i < 4; i++)
|
||||
// test2[i] = 'l';
|
||||
// glob[0] = 'g';
|
||||
|
||||
// Initialize stuff
|
||||
uart_init();
|
||||
|
||||
// Say Hello!
|
||||
uart_putstr( "** Spike Test Firmware **\n" );
|
||||
|
||||
// Initialize TIC
|
||||
isr_init();
|
||||
tic_init();
|
||||
irq_set_mask( 0x00000002 );
|
||||
irq_enable();
|
||||
|
||||
// Say Hello!
|
||||
uart_putstr( "Timer Interrupt instelled.\n" );
|
||||
|
||||
// Do some trivial tests
|
||||
uart_putstr( "Subroutine-Return Test: " );
|
||||
test();
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Local-Pointer Test:" );
|
||||
for (;*str; str++) {
|
||||
uart_putchar(*str);
|
||||
}
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Global-Pointer Test:" );
|
||||
str = glob;
|
||||
for (;*str; str++) {
|
||||
uart_putchar(*str);
|
||||
}
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Stack Pointer : " );
|
||||
writeint(get_sp());
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Global Pointer: " );
|
||||
writeint(get_gp());
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Timer Test (1s): " );
|
||||
for(i=0; i<4; i++) {
|
||||
uart_putstr("tic...");
|
||||
msleep(1000);
|
||||
}
|
||||
uart_putchar('\n');
|
||||
|
||||
uart_putstr( "Timer Interrupt counter: " );
|
||||
writeint( tic_msec );
|
||||
uart_putchar('\n');
|
||||
|
||||
int val = tic_msec;
|
||||
uart_putstr( "Shift: " );
|
||||
writeint( val );
|
||||
uart_putstr(" <-> ");
|
||||
for(i=0; i<32; i++) {
|
||||
if (val & 0x80000000)
|
||||
uart_putchar( '1' );
|
||||
else
|
||||
uart_putchar( '0' );
|
||||
|
||||
val <<= 1;
|
||||
}
|
||||
uart_putstr("\r\n");
|
||||
|
||||
uart_putstr( "GPIO Test..." );
|
||||
gpio0->oe = 0x000000ff;
|
||||
for(;;) {
|
||||
for(i=0; i<8; i++) {
|
||||
uint32_t out1, out2;
|
||||
|
||||
out1 = 0x01 << i;
|
||||
out2 = 0x80 >> i;
|
||||
gpio0->out = out1 | out2;
|
||||
|
||||
msleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
uart_putstr( "Memory Dump: " );
|
||||
uint32_t *start = (uint32_t *)0x40000000;
|
||||
uint32_t *end = (uint32_t *)0x40000100;
|
||||
uint32_t *p;
|
||||
for (p=start; p<end; p++) {
|
||||
if (((uint32_t)p & 12) == 0) {
|
||||
uart_putstr("\r\n[");
|
||||
writeint((uint32_t) p);
|
||||
uart_putchar(']');
|
||||
}
|
||||
|
||||
uart_putchar(' ');
|
||||
writeint(*p);
|
||||
}
|
||||
*/
|
||||
|
||||
uart_putstr("Entering Echo Test...\n");
|
||||
while (1) {
|
||||
uart_putchar(uart_getchar());
|
||||
}
|
||||
}
|
||||
|
||||
133
lm32/logic/sakc/firmware/hw-test/soc-hw.c
Normal file
133
lm32/logic/sakc/firmware/hw-test/soc-hw.c
Normal file
@@ -0,0 +1,133 @@
|
||||
#include "soc-hw.h"
|
||||
|
||||
uart_t *uart0 = (uart_t *) 0xf0000000;
|
||||
timer_t *timer0 = (timer_t *) 0xf0010000;
|
||||
gpio_t *gpio0 = (gpio_t *) 0xF0020000;
|
||||
|
||||
isr_ptr_t isr_table[32];
|
||||
|
||||
|
||||
void tic_isr();
|
||||
/***************************************************************************
|
||||
* IRQ handling
|
||||
*/
|
||||
void isr_null()
|
||||
{
|
||||
}
|
||||
|
||||
void irq_handler(uint32_t pending)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i=0; i<32; i++) {
|
||||
if (pending & 0x01) (*isr_table[i])();
|
||||
pending >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void isr_init()
|
||||
{
|
||||
int i;
|
||||
for(i=0; i<32; i++)
|
||||
isr_table[i] = &isr_null;
|
||||
}
|
||||
|
||||
void isr_register(int irq, isr_ptr_t isr)
|
||||
{
|
||||
isr_table[irq] = isr;
|
||||
}
|
||||
|
||||
void isr_unregister(int irq)
|
||||
{
|
||||
isr_table[irq] = &isr_null;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* TIMER Functions
|
||||
*/
|
||||
void msleep(uint32_t msec)
|
||||
{
|
||||
uint32_t tcr;
|
||||
|
||||
// Use timer0.1
|
||||
timer0->compare1 = (FCPU/1000)*msec;
|
||||
timer0->counter1 = 0;
|
||||
timer0->tcr1 = TIMER_EN;
|
||||
|
||||
do {
|
||||
//halt();
|
||||
tcr = timer0->tcr1;
|
||||
} while ( ! (tcr & TIMER_TRIG) );
|
||||
}
|
||||
|
||||
void nsleep(uint32_t nsec)
|
||||
{
|
||||
uint32_t tcr;
|
||||
|
||||
// Use timer0.1
|
||||
timer0->compare1 = (FCPU/1000000)*nsec;
|
||||
timer0->counter1 = 0;
|
||||
timer0->tcr1 = TIMER_EN;
|
||||
|
||||
do {
|
||||
//halt();
|
||||
tcr = timer0->tcr1;
|
||||
} while ( ! (tcr & TIMER_TRIG) );
|
||||
}
|
||||
|
||||
|
||||
uint32_t tic_msec;
|
||||
|
||||
void tic_isr()
|
||||
{
|
||||
tic_msec++;
|
||||
timer0->tcr0 = TIMER_EN | TIMER_AR | TIMER_IRQEN;
|
||||
}
|
||||
|
||||
void tic_init()
|
||||
{
|
||||
tic_msec = 0;
|
||||
|
||||
// Setup timer0.0
|
||||
timer0->compare0 = (FCPU/10000);
|
||||
timer0->counter0 = 0;
|
||||
timer0->tcr0 = TIMER_EN | TIMER_AR | TIMER_IRQEN;
|
||||
|
||||
isr_register(1, &tic_isr);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* UART Functions
|
||||
*/
|
||||
void uart_init()
|
||||
{
|
||||
//uart0->ier = 0x00; // Interrupt Enable Register
|
||||
//uart0->lcr = 0x03; // Line Control Register: 8N1
|
||||
//uart0->mcr = 0x00; // Modem Control Register
|
||||
|
||||
// Setup Divisor register (Fclk / Baud)
|
||||
//uart0->div = (FCPU/(57600*16));
|
||||
}
|
||||
|
||||
char uart_getchar()
|
||||
{
|
||||
while (! (uart0->ucr & UART_DR)) ;
|
||||
return uart0->rxtx;
|
||||
}
|
||||
|
||||
void uart_putchar(char c)
|
||||
{
|
||||
while (uart0->ucr & UART_BUSY) ;
|
||||
uart0->rxtx = c;
|
||||
}
|
||||
|
||||
void uart_putstr(char *str)
|
||||
{
|
||||
char *c = str;
|
||||
while(*c) {
|
||||
uart_putchar(*c);
|
||||
c++;
|
||||
}
|
||||
}
|
||||
|
||||
108
lm32/logic/sakc/firmware/hw-test/soc-hw.h
Normal file
108
lm32/logic/sakc/firmware/hw-test/soc-hw.h
Normal file
@@ -0,0 +1,108 @@
|
||||
#ifndef SPIKEHW_H
|
||||
#define SPIKEHW_H
|
||||
|
||||
#define PROMSTART 0x00000000
|
||||
#define RAMSTART 0x00000800
|
||||
#define RAMSIZE 0x400
|
||||
#define RAMEND (RAMSTART + RAMSIZE)
|
||||
|
||||
#define RAM_START 0x40000000
|
||||
#define RAM_SIZE 0x04000000
|
||||
|
||||
#define FCPU 50000000
|
||||
|
||||
#define UART_RXBUFSIZE 32
|
||||
|
||||
/****************************************************************************
|
||||
* Types
|
||||
*/
|
||||
typedef unsigned int uint32_t; // 32 Bit
|
||||
typedef signed int int32_t; // 32 Bit
|
||||
|
||||
typedef unsigned char uint8_t; // 8 Bit
|
||||
typedef signed char int8_t; // 8 Bit
|
||||
|
||||
/****************************************************************************
|
||||
* Interrupt handling
|
||||
*/
|
||||
typedef void(*isr_ptr_t)(void);
|
||||
|
||||
void irq_enable();
|
||||
void irq_disable();
|
||||
void irq_set_mask(uint32_t mask);
|
||||
uint32_t irq_get_mak();
|
||||
|
||||
void isr_init();
|
||||
void isr_register(int irq, isr_ptr_t isr);
|
||||
void isr_unregister(int irq);
|
||||
|
||||
/****************************************************************************
|
||||
* General Stuff
|
||||
*/
|
||||
void halt();
|
||||
void jump(uint32_t addr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Timer
|
||||
*/
|
||||
#define TIMER_EN 0x08 // Enable Timer
|
||||
#define TIMER_AR 0x04 // Auto-Reload
|
||||
#define TIMER_IRQEN 0x02 // IRQ Enable
|
||||
#define TIMER_TRIG 0x01 // Triggered (reset when writing to TCR)
|
||||
|
||||
typedef struct {
|
||||
volatile uint32_t tcr0;
|
||||
volatile uint32_t compare0;
|
||||
volatile uint32_t counter0;
|
||||
volatile uint32_t tcr1;
|
||||
volatile uint32_t compare1;
|
||||
volatile uint32_t counter1;
|
||||
} timer_t;
|
||||
|
||||
void msleep(uint32_t msec);
|
||||
void nsleep(uint32_t nsec);
|
||||
|
||||
void tic_init();
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* GPIO0
|
||||
*/
|
||||
typedef struct {
|
||||
volatile uint32_t ctrl;
|
||||
volatile uint32_t dummy1;
|
||||
volatile uint32_t dummy2;
|
||||
volatile uint32_t dummy3;
|
||||
volatile uint32_t in;
|
||||
volatile uint32_t out;
|
||||
volatile uint32_t oe;
|
||||
} gpio_t;
|
||||
|
||||
/***************************************************************************
|
||||
* UART0
|
||||
*/
|
||||
#define UART_DR 0x01 // RX Data Ready
|
||||
#define UART_ERR 0x02 // RX Error
|
||||
#define UART_BUSY 0x10 // TX Busy
|
||||
|
||||
typedef struct {
|
||||
volatile uint32_t ucr;
|
||||
volatile uint32_t rxtx;
|
||||
} uart_t;
|
||||
|
||||
void uart_init();
|
||||
void uart_putchar(char c);
|
||||
void uart_putstr(char *str);
|
||||
char uart_getchar();
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Pointer to actual components
|
||||
*/
|
||||
extern timer_t *timer0;
|
||||
extern uart_t *uart0;
|
||||
extern gpio_t *gpio0;
|
||||
extern uint32_t *sram0;
|
||||
|
||||
#endif // SPIKEHW_H
|
||||
Reference in New Issue
Block a user