Merge remote-tracking branch 'to-be-merged/merge-3d-game'
						commit
						9303ae2c89
					
				| @ -1,11 +1,24 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <stdbool.h> | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  |  | ||||||
| void console_init(void); | void console_init(void); | ||||||
| void console_set_irq_en(bool rx_irq, bool tx_irq); | void console_set_irq_en(bool rx_irq, bool tx_irq); | ||||||
| int getchar(void); | int getchar(void); | ||||||
|  | bool console_havechar(void); | ||||||
| int putchar(int c); | int putchar(int c); | ||||||
| int puts(const char *str); | int puts(const char *str); | ||||||
|  |  | ||||||
| #ifndef __USE_LIBC | #ifndef __USE_LIBC | ||||||
| size_t strlen(const char *s); | size_t strlen(const char *s); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -0,0 +1,18 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | int usb_getchar(void); | ||||||
|  | bool usb_havechar(void); | ||||||
|  | int usb_putchar(int c); | ||||||
|  | int usb_puts(const char *str); | ||||||
|  | void usb_console_init(void); | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @ -0,0 +1,239 @@ | |||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | #include "console.h" | ||||||
|  | #include "liteuart_console.h" | ||||||
|  | #include "microwatt_soc.h" | ||||||
|  | #include "io.h" | ||||||
|  |  | ||||||
|  | #define UART_BAUDS 115200 | ||||||
|  |  | ||||||
|  | static uint64_t uart_base; | ||||||
|  |  | ||||||
|  | /* From Linux liteuart.c */ | ||||||
|  | #define OFF_RXTX	0x00 | ||||||
|  | #define OFF_TXFULL	0x04 | ||||||
|  | #define OFF_RXEMPTY	0x08 | ||||||
|  | #define OFF_EV_STATUS	0x0c | ||||||
|  | #define OFF_EV_PENDING	0x10 | ||||||
|  | #define OFF_EV_ENABLE	0x14 | ||||||
|  |  | ||||||
|  | /* From litex uart.h */ | ||||||
|  | #define UART_EV_TX	0x1 | ||||||
|  | #define UART_EV_RX	0x2 | ||||||
|  |  | ||||||
|  | /* Modified version of csr.h */ | ||||||
|  | /* uart */ | ||||||
|  | static inline uint32_t uart_rxtx_read(void) { | ||||||
|  | 	return readl(uart_base + OFF_RXTX); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void uart_rxtx_write(uint32_t v) { | ||||||
|  | 	writel(v, uart_base + OFF_RXTX); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline uint32_t uart_txfull_read(void) { | ||||||
|  | 	return readl(uart_base + OFF_TXFULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline uint32_t uart_rxempty_read(void) { | ||||||
|  | 	return readl(uart_base + OFF_RXEMPTY); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline uint32_t uart_ev_status_read(void) { | ||||||
|  | 	return readl(uart_base + OFF_EV_STATUS); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // static inline uint32_t uart_ev_status_tx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 0) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_status_tx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_status_read(); | ||||||
|  | // 	return uart_ev_status_tx_extract(word); | ||||||
|  | // } | ||||||
|  |  | ||||||
|  | // static inline uint32_t uart_ev_status_rx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 1) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_status_rx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_status_read(); | ||||||
|  | // 	return uart_ev_status_rx_extract(word); | ||||||
|  | // } | ||||||
|  |  | ||||||
|  | static inline uint32_t uart_ev_pending_read(void) { | ||||||
|  | 	return readl(uart_base + OFF_EV_PENDING); | ||||||
|  | } | ||||||
|  | static inline void uart_ev_pending_write(uint32_t v) { | ||||||
|  | 	writel(v, uart_base + OFF_EV_PENDING); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // static inline uint32_t uart_ev_pending_tx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 0) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_pending_tx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_pending_read(); | ||||||
|  | // 	return uart_ev_pending_tx_extract(word); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_pending_tx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return (oldword & (~(mask << 0))) | (mask & plain_value)<< 0 ; | ||||||
|  | // } | ||||||
|  | // static inline void uart_ev_pending_tx_write(uint32_t plain_value) { | ||||||
|  | // 	uint32_t oldword = uart_ev_pending_read(); | ||||||
|  | // 	uint32_t newword = uart_ev_pending_tx_replace(oldword, plain_value); | ||||||
|  | // 	uart_ev_pending_write(newword); | ||||||
|  | // } | ||||||
|  | // #define CSR_UART_EV_PENDING_RX_OFFSET 1 | ||||||
|  | // #define CSR_UART_EV_PENDING_RX_SIZE 1 | ||||||
|  | // static inline uint32_t uart_ev_pending_rx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 1) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_pending_rx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_pending_read(); | ||||||
|  | // 	return uart_ev_pending_rx_extract(word); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_pending_rx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return (oldword & (~(mask << 1))) | (mask & plain_value)<< 1 ; | ||||||
|  | // } | ||||||
|  | // static inline void uart_ev_pending_rx_write(uint32_t plain_value) { | ||||||
|  | // 	uint32_t oldword = uart_ev_pending_read(); | ||||||
|  | // 	uint32_t newword = uart_ev_pending_rx_replace(oldword, plain_value); | ||||||
|  | // 	uart_ev_pending_write(newword); | ||||||
|  | // } | ||||||
|  | // #define CSR_UART_EV_ENABLE_ADDR (CSR_BASE + 0x814L) | ||||||
|  | // #define CSR_UART_EV_ENABLE_SIZE 1 | ||||||
|  | // static inline uint32_t uart_ev_enable_read(void) { | ||||||
|  | // 	return csr_read_simple(CSR_BASE + 0x814L); | ||||||
|  | // } | ||||||
|  | static inline void uart_ev_enable_write(uint32_t v) { | ||||||
|  | 	writel(v, uart_base + OFF_EV_ENABLE); | ||||||
|  | } | ||||||
|  | // #define CSR_UART_EV_ENABLE_TX_OFFSET 0 | ||||||
|  | // #define CSR_UART_EV_ENABLE_TX_SIZE 1 | ||||||
|  | // static inline uint32_t uart_ev_enable_tx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 0) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_enable_tx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_enable_read(); | ||||||
|  | // 	return uart_ev_enable_tx_extract(word); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_enable_tx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return (oldword & (~(mask << 0))) | (mask & plain_value)<< 0 ; | ||||||
|  | // } | ||||||
|  | // static inline void uart_ev_enable_tx_write(uint32_t plain_value) { | ||||||
|  | // 	uint32_t oldword = uart_ev_enable_read(); | ||||||
|  | // 	uint32_t newword = uart_ev_enable_tx_replace(oldword, plain_value); | ||||||
|  | // 	uart_ev_enable_write(newword); | ||||||
|  | // } | ||||||
|  | // #define CSR_UART_EV_ENABLE_RX_OFFSET 1 | ||||||
|  | // #define CSR_UART_EV_ENABLE_RX_SIZE 1 | ||||||
|  | // static inline uint32_t uart_ev_enable_rx_extract(uint32_t oldword) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return ( (oldword >> 1) & mask ); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_enable_rx_read(void) { | ||||||
|  | // 	uint32_t word = uart_ev_enable_read(); | ||||||
|  | // 	return uart_ev_enable_rx_extract(word); | ||||||
|  | // } | ||||||
|  | // static inline uint32_t uart_ev_enable_rx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | // 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | // 	return (oldword & (~(mask << 1))) | (mask & plain_value)<< 1 ; | ||||||
|  | // } | ||||||
|  | // static inline void uart_ev_enable_rx_write(uint32_t plain_value) { | ||||||
|  | // 	uint32_t oldword = uart_ev_enable_read(); | ||||||
|  | // 	uint32_t newword = uart_ev_enable_rx_replace(oldword, plain_value); | ||||||
|  | // 	uart_ev_enable_write(newword); | ||||||
|  | // } | ||||||
|  | // #define CSR_UART_TUNING_WORD_ADDR (CSR_BASE + 0x818L) | ||||||
|  | // #define CSR_UART_TUNING_WORD_SIZE 1 | ||||||
|  | // static inline uint32_t uart_tuning_word_read(void) { | ||||||
|  | // 	return csr_read_simple(CSR_BASE + 0x818L); | ||||||
|  | // } | ||||||
|  | // static inline void uart_tuning_word_write(uint32_t v) { | ||||||
|  | // 	csr_write_simple(v, CSR_BASE + 0x818L); | ||||||
|  | // } | ||||||
|  | // #define CSR_UART_CONFIGURED_ADDR (CSR_BASE + 0x81cL) | ||||||
|  | // #define CSR_UART_CONFIGURED_SIZE 1 | ||||||
|  | // static inline uint32_t uart_configured_read(void) { | ||||||
|  | // 	return csr_read_simple(CSR_BASE + 0x81cL); | ||||||
|  | // } | ||||||
|  | // static inline void uart_configured_write(uint32_t v) { | ||||||
|  | // 	csr_write_simple(v, CSR_BASE + 0x81cL); | ||||||
|  | // } | ||||||
|  |  | ||||||
|  | // end of csr code | ||||||
|  |  | ||||||
|  | static char uart_read(void) | ||||||
|  | { | ||||||
|  | 	char c; | ||||||
|  | 	while (uart_rxempty_read()); | ||||||
|  | 	c = uart_rxtx_read(); | ||||||
|  | 	uart_ev_pending_write(UART_EV_RX); | ||||||
|  | 	return c; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int uart_read_nonblock(void) | ||||||
|  | { | ||||||
|  | 	return (uart_rxempty_read() == 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void uart_write(char c) | ||||||
|  | { | ||||||
|  | 	while (uart_txfull_read()); | ||||||
|  | 	uart_rxtx_write(c); | ||||||
|  | 	uart_ev_pending_write(UART_EV_TX); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void uart_init(void) | ||||||
|  | { | ||||||
|  | 	uart_ev_pending_write(uart_ev_pending_read()); | ||||||
|  | 	uart_ev_enable_write(UART_EV_TX | UART_EV_RX); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // static void uart_sync(void) | ||||||
|  | // { | ||||||
|  | // 	while (uart_txfull_read()); | ||||||
|  | // } | ||||||
|  |  | ||||||
|  | int usb_getchar(void) | ||||||
|  | { | ||||||
|  | 	return uart_read(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool usb_havechar(void) | ||||||
|  | { | ||||||
|  | 	return uart_read_nonblock(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int usb_putchar(int c) | ||||||
|  | { | ||||||
|  | 	uart_write(c); | ||||||
|  | 	return c; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int usb_puts(const char *str) | ||||||
|  | { | ||||||
|  | 	unsigned int i; | ||||||
|  |  | ||||||
|  | 	for (i = 0; *str; i++) { | ||||||
|  | 		char c = *(str++); | ||||||
|  | 		if (c == 10) | ||||||
|  | 			usb_putchar(13); | ||||||
|  | 		usb_putchar(c); | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void usb_console_init(void) | ||||||
|  | { | ||||||
|  | 	uart_base = UARTUSB_BASE; | ||||||
|  | 	uart_init(); | ||||||
|  | } | ||||||
|  |  | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | usb_3d_game_emu | ||||||
|  | *.o | ||||||
|  | *.elf | ||||||
|  | *.hex | ||||||
|  | *.bin | ||||||
|  |  | ||||||
| @ -0,0 +1,44 @@ | |||||||
|  | ARCH = $(shell uname -m) | ||||||
|  | ifneq ("$(ARCH)", "ppc64") | ||||||
|  | ifneq ("$(ARCH)", "ppc64le") | ||||||
|  | 	CROSS_COMPILE ?= powerpc64le-linux-gnu- | ||||||
|  | endif | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | CC = $(CROSS_COMPILE)gcc | ||||||
|  | CXX = $(CROSS_COMPILE)g++ | ||||||
|  | LD = $(CROSS_COMPILE)ld | ||||||
|  | OBJCOPY = $(CROSS_COMPILE)objcopy | ||||||
|  |  | ||||||
|  | COMMON_FLAGS = -Os -g -Wall -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections -I../include | ||||||
|  | COMMON_FLAGS += -Werror -Wextra | ||||||
|  | CXXFLAGS = $(COMMON_FLAGS) -std=c++14 -fno-exceptions | ||||||
|  | CFLAGS = $(COMMON_FLAGS) -std=c99 | ||||||
|  | ASFLAGS = $(CFLAGS) | ||||||
|  | LDFLAGS = -T powerpc.lds | ||||||
|  |  | ||||||
|  | all: usb_3d_game.hex | ||||||
|  |  | ||||||
|  | console.o: ../lib/console.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||||
|  |  | ||||||
|  | liteuart_console.o: ../lib/liteuart_console.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||||
|  |  | ||||||
|  | usb_3d_game.elf: usb_3d_game.o head.o console.o liteuart_console.o | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $^ | ||||||
|  |  | ||||||
|  | usb_3d_game.bin: usb_3d_game.elf | ||||||
|  | 	$(OBJCOPY) -O binary $^ $@ | ||||||
|  |  | ||||||
|  | usb_3d_game.hex: usb_3d_game.bin | ||||||
|  | 	../scripts/bin2hex.py $^ > $@ | ||||||
|  |  | ||||||
|  | usb_3d_game_emu: usb_3d_game.cpp | ||||||
|  | 	c++ -g -Wall -std=c++14 -Werror -Wextra -o usb_3d_game_emu usb_3d_game.cpp -DEMULATE_TARGET | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	@rm -f *.o usb_3d_game.elf usb_3d_game.bin usb_3d_game.hex usb_3d_game_emu | ||||||
|  | distclean: clean | ||||||
|  | 	rm -f *~ | ||||||
|  |  | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | # 3D Maze Game | ||||||
|  |  | ||||||
|  | Based on: <https://github.com/programmerjake/rv32/tree/v0.1.0.1-alpha/software> | ||||||
|  |  | ||||||
|  | # Run without FPGA/hardware-simulation | ||||||
|  |  | ||||||
|  | Resize your terminal to be at least 100x76. | ||||||
|  |  | ||||||
|  | Building: | ||||||
|  | ```bash | ||||||
|  | cd usb_3d_game | ||||||
|  | make usb_3d_game_emu | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Running: | ||||||
|  | ```bash | ||||||
|  | ./usb_3d_game_emu | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | # Run on OrangeCrab v0.2.1 | ||||||
|  |  | ||||||
|  | Set the OrangeCrab into firmware upload mode by plugging it in to USB while the button is pressed, then run the following commands: | ||||||
|  |  | ||||||
|  | Building/Flashing: | ||||||
|  | ```bash | ||||||
|  | (cd usb_3d_game; make) | ||||||
|  | sudo make FPGA_TARGET=ORANGE-CRAB-0.21 dfuprog DOCKER=1 LITEDRAM_GHDL_ARG=-gUSE_LITEDRAM=false RAM_INIT_FILE=usb_3d_game/usb_3d_game.hex MEMORY_SIZE=$((1<<18)) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Then, in a separate terminal that you've resized to be at least 100x76, run (replacing ttyACM0 with whatever serial device the OrangeCrab is): | ||||||
|  | ```bash | ||||||
|  | sudo tio /dev/ttyACM0 | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | # Controls | ||||||
|  |  | ||||||
|  | Use WASD or the Arrow keys to move around. Press Ctrl+C to quit or restart. | ||||||
|  |  | ||||||
|  | The goal is a set of flashing blocks, nothing special yet happens when you reach them though. | ||||||
| @ -0,0 +1,107 @@ | |||||||
|  | /* Copyright 2013-2014 IBM Corp. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * 	http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define STACK_TOP 0x20000 | ||||||
|  |  | ||||||
|  | #define FIXUP_ENDIAN						   \ | ||||||
|  | 	tdi   0,0,0x48;	  /* Reverse endian of b . + 8		*/ \ | ||||||
|  | 	b     191f;	  /* Skip trampoline if endian is good	*/ \ | ||||||
|  | 	.long 0xa600607d; /* mfmsr r11				*/ \ | ||||||
|  | 	.long 0x01006b69; /* xori r11,r11,1			*/ \ | ||||||
|  | 	.long 0x05009f42; /* bcl 20,31,$+4			*/ \ | ||||||
|  | 	.long 0xa602487d; /* mflr r10				*/ \ | ||||||
|  | 	.long 0x14004a39; /* addi r10,r10,20			*/ \ | ||||||
|  | 	.long 0xa64b5a7d; /* mthsrr0 r10			*/ \ | ||||||
|  | 	.long 0xa64b7b7d; /* mthsrr1 r11			*/ \ | ||||||
|  | 	.long 0x2402004c; /* hrfid				*/ \ | ||||||
|  | 191: | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Load an immediate 64-bit value into a register */ | ||||||
|  | #define LOAD_IMM64(r, e)			\ | ||||||
|  | 	lis     r,(e)@highest;			\ | ||||||
|  | 	ori     r,r,(e)@higher;			\ | ||||||
|  | 	rldicr  r,r, 32, 31;			\ | ||||||
|  | 	oris    r,r, (e)@h;			\ | ||||||
|  | 	ori     r,r, (e)@l; | ||||||
|  |  | ||||||
|  | 	.section ".head","ax" | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Microwatt currently enters in LE mode at 0x0, so we don't need to | ||||||
|  | 	 * do any endian fix ups> | ||||||
|  | 	 */ | ||||||
|  | 	. = 0 | ||||||
|  | .global _start | ||||||
|  | _start: | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | 	/* QEMU enters at 0x10 */ | ||||||
|  | 	. = 0x10 | ||||||
|  | 	FIXUP_ENDIAN | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | 	. = 0x100 | ||||||
|  | 	FIXUP_ENDIAN | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | .global boot_entry | ||||||
|  | boot_entry: | ||||||
|  | 	/* setup stack */ | ||||||
|  | 	LOAD_IMM64(%r1, STACK_TOP - 0x100) | ||||||
|  | 	LOAD_IMM64(%r12, main) | ||||||
|  | 	mtctr	%r12, | ||||||
|  | 	bctrl | ||||||
|  | 	b . | ||||||
|  |  | ||||||
|  | #define EXCEPTION(nr)		\ | ||||||
|  | 	.= nr			;\ | ||||||
|  | 	b	. | ||||||
|  |  | ||||||
|  | 	/* More exception stubs */ | ||||||
|  | 	EXCEPTION(0x300) | ||||||
|  | 	EXCEPTION(0x380) | ||||||
|  | 	EXCEPTION(0x400) | ||||||
|  | 	EXCEPTION(0x480) | ||||||
|  | 	EXCEPTION(0x500) | ||||||
|  | 	EXCEPTION(0x600) | ||||||
|  | 	EXCEPTION(0x700) | ||||||
|  | 	EXCEPTION(0x800) | ||||||
|  | 	EXCEPTION(0x900) | ||||||
|  | 	EXCEPTION(0x980) | ||||||
|  | 	EXCEPTION(0xa00) | ||||||
|  | 	EXCEPTION(0xb00) | ||||||
|  | 	EXCEPTION(0xc00) | ||||||
|  | 	EXCEPTION(0xd00) | ||||||
|  | 	EXCEPTION(0xe00) | ||||||
|  | 	EXCEPTION(0xe20) | ||||||
|  | 	EXCEPTION(0xe40) | ||||||
|  | 	EXCEPTION(0xe60) | ||||||
|  | 	EXCEPTION(0xe80) | ||||||
|  | 	EXCEPTION(0xf00) | ||||||
|  | 	EXCEPTION(0xf20) | ||||||
|  | 	EXCEPTION(0xf40) | ||||||
|  | 	EXCEPTION(0xf60) | ||||||
|  | 	EXCEPTION(0xf80) | ||||||
|  | #if 0 | ||||||
|  | 	EXCEPTION(0x1000) | ||||||
|  | 	EXCEPTION(0x1100) | ||||||
|  | 	EXCEPTION(0x1200) | ||||||
|  | 	EXCEPTION(0x1300) | ||||||
|  | 	EXCEPTION(0x1400) | ||||||
|  | 	EXCEPTION(0x1500) | ||||||
|  | 	EXCEPTION(0x1600) | ||||||
|  | #endif | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  | 	. = 0; | ||||||
|  | 	.head : { | ||||||
|  | 		KEEP(*(.head)) | ||||||
|  |  	} | ||||||
|  | 	. = 0x1000; | ||||||
|  | 	.text : { *(.text) } | ||||||
|  | 	. = 0x2a000; | ||||||
|  | 	.data : { *(.data) } | ||||||
|  | 	.rodata : { *(.rodata) } | ||||||
|  | 	.bss : { *(.bss) } | ||||||
|  | } | ||||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,38 @@ | |||||||
|  | ARCH = $(shell uname -m) | ||||||
|  | ifneq ("$(ARCH)", "ppc64") | ||||||
|  | ifneq ("$(ARCH)", "ppc64le") | ||||||
|  | 	CROSS_COMPILE ?= powerpc64le-linux-gnu- | ||||||
|  | endif | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | CC = $(CROSS_COMPILE)gcc | ||||||
|  | LD = $(CROSS_COMPILE)ld | ||||||
|  | OBJCOPY = $(CROSS_COMPILE)objcopy | ||||||
|  |  | ||||||
|  | CFLAGS = -Os -g -Wall -std=c99 -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections -I../include | ||||||
|  | CFLAGS += -Werror -Wextra | ||||||
|  | ASFLAGS = $(CFLAGS) | ||||||
|  | LDFLAGS = -T powerpc.lds | ||||||
|  |  | ||||||
|  | all: usb_hello.hex | ||||||
|  |  | ||||||
|  | console.o: ../lib/console.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||||
|  |  | ||||||
|  | liteuart_console.o: ../lib/liteuart_console.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||||
|  |  | ||||||
|  | usb_hello.elf: usb_hello.o head.o console.o liteuart_console.o | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $^ | ||||||
|  |  | ||||||
|  | usb_hello.bin: usb_hello.elf | ||||||
|  | 	$(OBJCOPY) -O binary $^ $@ | ||||||
|  |  | ||||||
|  | usb_hello.hex: usb_hello.bin | ||||||
|  | 	../scripts/bin2hex.py $^ > $@ | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	@rm -f *.o usb_hello.elf usb_hello.bin usb_hello.hex | ||||||
|  | distclean: clean | ||||||
|  | 	rm -f *~ | ||||||
|  |  | ||||||
| @ -0,0 +1,107 @@ | |||||||
|  | /* Copyright 2013-2014 IBM Corp. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * 	http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define STACK_TOP 0x2000 | ||||||
|  |  | ||||||
|  | #define FIXUP_ENDIAN						   \ | ||||||
|  | 	tdi   0,0,0x48;	  /* Reverse endian of b . + 8		*/ \ | ||||||
|  | 	b     191f;	  /* Skip trampoline if endian is good	*/ \ | ||||||
|  | 	.long 0xa600607d; /* mfmsr r11				*/ \ | ||||||
|  | 	.long 0x01006b69; /* xori r11,r11,1			*/ \ | ||||||
|  | 	.long 0x05009f42; /* bcl 20,31,$+4			*/ \ | ||||||
|  | 	.long 0xa602487d; /* mflr r10				*/ \ | ||||||
|  | 	.long 0x14004a39; /* addi r10,r10,20			*/ \ | ||||||
|  | 	.long 0xa64b5a7d; /* mthsrr0 r10			*/ \ | ||||||
|  | 	.long 0xa64b7b7d; /* mthsrr1 r11			*/ \ | ||||||
|  | 	.long 0x2402004c; /* hrfid				*/ \ | ||||||
|  | 191: | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Load an immediate 64-bit value into a register */ | ||||||
|  | #define LOAD_IMM64(r, e)			\ | ||||||
|  | 	lis     r,(e)@highest;			\ | ||||||
|  | 	ori     r,r,(e)@higher;			\ | ||||||
|  | 	rldicr  r,r, 32, 31;			\ | ||||||
|  | 	oris    r,r, (e)@h;			\ | ||||||
|  | 	ori     r,r, (e)@l; | ||||||
|  |  | ||||||
|  | 	.section ".head","ax" | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Microwatt currently enters in LE mode at 0x0, so we don't need to | ||||||
|  | 	 * do any endian fix ups> | ||||||
|  | 	 */ | ||||||
|  | 	. = 0 | ||||||
|  | .global _start | ||||||
|  | _start: | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | 	/* QEMU enters at 0x10 */ | ||||||
|  | 	. = 0x10 | ||||||
|  | 	FIXUP_ENDIAN | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | 	. = 0x100 | ||||||
|  | 	FIXUP_ENDIAN | ||||||
|  | 	b	boot_entry | ||||||
|  |  | ||||||
|  | .global boot_entry | ||||||
|  | boot_entry: | ||||||
|  | 	/* setup stack */ | ||||||
|  | 	LOAD_IMM64(%r1, STACK_TOP - 0x100) | ||||||
|  | 	LOAD_IMM64(%r12, main) | ||||||
|  | 	mtctr	%r12, | ||||||
|  | 	bctrl | ||||||
|  | 	b . | ||||||
|  |  | ||||||
|  | #define EXCEPTION(nr)		\ | ||||||
|  | 	.= nr			;\ | ||||||
|  | 	b	. | ||||||
|  |  | ||||||
|  | 	/* More exception stubs */ | ||||||
|  | 	EXCEPTION(0x300) | ||||||
|  | 	EXCEPTION(0x380) | ||||||
|  | 	EXCEPTION(0x400) | ||||||
|  | 	EXCEPTION(0x480) | ||||||
|  | 	EXCEPTION(0x500) | ||||||
|  | 	EXCEPTION(0x600) | ||||||
|  | 	EXCEPTION(0x700) | ||||||
|  | 	EXCEPTION(0x800) | ||||||
|  | 	EXCEPTION(0x900) | ||||||
|  | 	EXCEPTION(0x980) | ||||||
|  | 	EXCEPTION(0xa00) | ||||||
|  | 	EXCEPTION(0xb00) | ||||||
|  | 	EXCEPTION(0xc00) | ||||||
|  | 	EXCEPTION(0xd00) | ||||||
|  | 	EXCEPTION(0xe00) | ||||||
|  | 	EXCEPTION(0xe20) | ||||||
|  | 	EXCEPTION(0xe40) | ||||||
|  | 	EXCEPTION(0xe60) | ||||||
|  | 	EXCEPTION(0xe80) | ||||||
|  | 	EXCEPTION(0xf00) | ||||||
|  | 	EXCEPTION(0xf20) | ||||||
|  | 	EXCEPTION(0xf40) | ||||||
|  | 	EXCEPTION(0xf60) | ||||||
|  | 	EXCEPTION(0xf80) | ||||||
|  | #if 0 | ||||||
|  | 	EXCEPTION(0x1000) | ||||||
|  | 	EXCEPTION(0x1100) | ||||||
|  | 	EXCEPTION(0x1200) | ||||||
|  | 	EXCEPTION(0x1300) | ||||||
|  | 	EXCEPTION(0x1400) | ||||||
|  | 	EXCEPTION(0x1500) | ||||||
|  | 	EXCEPTION(0x1600) | ||||||
|  | #endif | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  | 	. = 0; | ||||||
|  | 	.head : { | ||||||
|  | 		KEEP(*(.head)) | ||||||
|  |  	} | ||||||
|  | 	. = 0x1000; | ||||||
|  | 	.text : { *(.text) } | ||||||
|  | 	. = 0x2a00; | ||||||
|  | 	.data : { *(.data) } | ||||||
|  | 	.bss : { *(.bss) } | ||||||
|  | } | ||||||
| @ -0,0 +1,72 @@ | |||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | #include "console.h" | ||||||
|  | #include "liteuart_console.h" | ||||||
|  |  | ||||||
|  | #include "microwatt_soc.h" | ||||||
|  | #include "io.h" | ||||||
|  |  | ||||||
|  | static char mw_logo[] = | ||||||
|  |  | ||||||
|  | "\n" | ||||||
|  | "   .oOOo.     \n" | ||||||
|  | " .\"      \". \n" | ||||||
|  | " ;  .mw.  ;   Microwatt, it works.\n" | ||||||
|  | "  . '  ' .    \n" | ||||||
|  | "   \\ || /    \n" | ||||||
|  | "    ;..;      \n" | ||||||
|  | "    ;..;      \n" | ||||||
|  | "    `ww'   \n"; | ||||||
|  |  | ||||||
|  | static void print_hex(unsigned long val, int ndigits) | ||||||
|  | { | ||||||
|  | 	int i, x; | ||||||
|  |  | ||||||
|  | 	for (i = (ndigits - 1) * 4; i >= 0; i -= 4) { | ||||||
|  | 		x = (val >> i) & 0xf; | ||||||
|  | 		if (x >= 10) | ||||||
|  | 			putchar(x + 'a' - 10); | ||||||
|  | 		else | ||||||
|  | 			putchar(x + '0'); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  | 	console_init(); | ||||||
|  | 	usb_console_init(); | ||||||
|  |  | ||||||
|  | 	puts(mw_logo); | ||||||
|  |  | ||||||
|  | 	for (int i = 0; i <= 0x14; i+=4) { | ||||||
|  | 		unsigned long val = readl(UART0_BASE + i); | ||||||
|  | 		puts("reg 0x"); | ||||||
|  | 		print_hex(i, 2); | ||||||
|  | 		puts(" = 0x"); | ||||||
|  | 		print_hex(val, 8); | ||||||
|  | 		puts("\n"); | ||||||
|  | 	} | ||||||
|  | 	puts("printed\n"); | ||||||
|  | 	for (int i = 0; i <= 0x14; i+=4) { | ||||||
|  | 		unsigned long val = readl(UART0_BASE + i); | ||||||
|  | 		puts("reg 0x"); | ||||||
|  | 		print_hex(i, 2); | ||||||
|  | 		puts(" = 0x"); | ||||||
|  | 		print_hex(val, 8); | ||||||
|  | 		puts("\n"); | ||||||
|  | 	} | ||||||
|  | 	puts("printed\n"); | ||||||
|  |  | ||||||
|  | 	usb_puts(mw_logo); | ||||||
|  |  | ||||||
|  | 	while (1) { | ||||||
|  | 		// puts(mw_logo); | ||||||
|  | 		// usb_puts(mw_logo); | ||||||
|  | 		unsigned char c = usb_getchar(); | ||||||
|  | 		putchar(c); | ||||||
|  | 		usb_putchar(c); | ||||||
|  | 		if (c == 13) // if CR send LF | ||||||
|  | 			putchar(10); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,263 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | # Based on valentyusb/sim/generate_verilog.py , modified | ||||||
|  | # for Microwatt | ||||||
|  |  | ||||||
|  | # This variable defines all the external programs that this module | ||||||
|  | # relies on.  lxbuildenv reads this variable in order to ensure | ||||||
|  | # the build will finish without exiting due to missing third-party | ||||||
|  | # programs. | ||||||
|  | LX_DEPENDENCIES = [] | ||||||
|  |  | ||||||
|  | # Import lxbuildenv to integrate the deps/ directory | ||||||
|  | #import lxbuildenv | ||||||
|  |  | ||||||
|  | # Disable pylint's E1101, which breaks completely on migen | ||||||
|  | #pylint:disable=E1101 | ||||||
|  |  | ||||||
|  | import argparse | ||||||
|  | import os | ||||||
|  | import yaml | ||||||
|  |  | ||||||
|  | #from migen import * | ||||||
|  | from migen import Module, Signal, Instance, ClockDomain, If | ||||||
|  | from migen.genlib.resetsync import AsyncResetSynchronizer | ||||||
|  | from migen.fhdl.specials import TSTriple | ||||||
|  | from migen.fhdl.bitcontainer import bits_for | ||||||
|  | from migen.fhdl.structure import ClockSignal, ResetSignal, Replicate, Cat | ||||||
|  |  | ||||||
|  | # from litex.build.sim.platform import SimPlatform | ||||||
|  | from litex.build.lattice import LatticePlatform | ||||||
|  | from litex.build.generic_platform import Pins, IOStandard, Misc, Subsignal | ||||||
|  | from litex.soc.integration.soc_core import SoCCore | ||||||
|  | from litex.soc.integration.builder import Builder | ||||||
|  | from litex.soc.interconnect import wishbone | ||||||
|  | from litex.soc.interconnect.csr import AutoCSR, CSRStatus, CSRStorage | ||||||
|  |  | ||||||
|  | from valentyusb import usbcore | ||||||
|  | from valentyusb.usbcore import io as usbio | ||||||
|  | from valentyusb.usbcore.cpu import dummyusb, cdc_eptri, eptri, epfifo | ||||||
|  | from valentyusb.usbcore.endpoint import EndpointType | ||||||
|  |  | ||||||
|  | _connectors = [] | ||||||
|  |  | ||||||
|  | class _CRG(Module): | ||||||
|  |     def __init__(self, platform): | ||||||
|  |         clk = platform.request("clk") | ||||||
|  |         rst = platform.request("reset") | ||||||
|  |  | ||||||
|  |         clk12 = Signal() | ||||||
|  |  | ||||||
|  |         self.clock_domains.cd_sys = ClockDomain() | ||||||
|  |         self.clock_domains.cd_usb_12 = ClockDomain() | ||||||
|  |         self.clock_domains.cd_usb_48 = ClockDomain() | ||||||
|  |         self.clock_domains.cd_usb_48_to_12 = ClockDomain() | ||||||
|  |  | ||||||
|  |         clk48 = clk.clk48 | ||||||
|  |  | ||||||
|  |         self.comb += self.cd_usb_48.clk.eq(clk48) | ||||||
|  |         self.comb += self.cd_usb_48_to_12.clk.eq(clk48) | ||||||
|  |  | ||||||
|  |         clk12_counter = Signal(2) | ||||||
|  |         self.sync.usb_48_to_12 += clk12_counter.eq(clk12_counter + 1) | ||||||
|  |  | ||||||
|  |         self.comb += clk12.eq(clk12_counter[1]) | ||||||
|  |  | ||||||
|  |         self.comb += self.cd_sys.clk.eq(clk.clksys) | ||||||
|  |         self.comb += self.cd_usb_12.clk.eq(clk12) | ||||||
|  |  | ||||||
|  |         self.comb += [ | ||||||
|  |             ResetSignal("sys").eq(rst), | ||||||
|  |             ResetSignal("usb_12").eq(rst), | ||||||
|  |             ResetSignal("usb_48").eq(rst), | ||||||
|  |         ] | ||||||
|  |  | ||||||
|  | class BaseSoC(SoCCore): | ||||||
|  |  | ||||||
|  |     def __init__(self, platform, io, sys_freq, output_dir="build", usb_variant='dummy', **kwargs): | ||||||
|  |         # Disable integrated RAM as we'll add it later | ||||||
|  |         self.integrated_sram_size = 0 | ||||||
|  |  | ||||||
|  |         self.output_dir = output_dir | ||||||
|  |  | ||||||
|  |         platform.add_extension(io) | ||||||
|  |  | ||||||
|  |         self.submodules.crg = _CRG(platform) | ||||||
|  |  | ||||||
|  |         # prior to SocCore.__init__ | ||||||
|  |         self.csr_map = { | ||||||
|  |             "uart":     0, # microwatt soc will remap addresses to 0 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         SoCCore.__init__(self, platform, sys_freq, | ||||||
|  |             cpu_type=None, | ||||||
|  |             integrated_rom_size=0x0, | ||||||
|  |             integrated_sram_size=0x0, | ||||||
|  |             integrated_main_ram_size=0x0, | ||||||
|  |             csr_address_width=14, csr_data_width=32, | ||||||
|  |             with_uart=False, with_timer=False) | ||||||
|  |  | ||||||
|  |         # Add USB pads | ||||||
|  |         usb_pads = platform.request("usb") | ||||||
|  |         usb_iobuf = usbio.IoBuf(usb_pads.d_p, usb_pads.d_n, usb_pads.pullup) | ||||||
|  |         self.comb += usb_pads.tx_en.eq(usb_iobuf.usb_tx_en) | ||||||
|  |         if usb_variant == 'eptri': | ||||||
|  |             self.submodules.usb = eptri.TriEndpointInterface(usb_iobuf, debug=True) | ||||||
|  |         elif usb_variant == 'epfifo': | ||||||
|  |             self.submodules.usb = epfifo.PerEndpointFifoInterface(usb_iobuf, debug=True) | ||||||
|  |         elif usb_variant == 'cdc_eptri': | ||||||
|  |             extra_args = {} | ||||||
|  |             passthrough = ['product', 'manufacturer'] | ||||||
|  |             for p in passthrough: | ||||||
|  |                 try: | ||||||
|  |                     extra_args[p] = kwargs[p] | ||||||
|  |                 except KeyError: | ||||||
|  |                     pass | ||||||
|  |             self.submodules.uart = cdc_eptri.CDCUsb(usb_iobuf, debug=True, **extra_args) | ||||||
|  |         elif usb_variant == 'dummy': | ||||||
|  |             self.submodules.usb = dummyusb.DummyUsb(usb_iobuf, debug=True) | ||||||
|  |         else: | ||||||
|  |             raise ValueError('Invalid endpoints value. It is currently \'eptri\' and \'dummy\'') | ||||||
|  |         try: | ||||||
|  |             self.add_wb_master(self.usb.debug_bridge.wishbone) | ||||||
|  |         except AttributeError: | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         if self.uart: | ||||||
|  |             self.comb += self.platform.request("interrupt").eq(self.uart.ev.irq) | ||||||
|  |  | ||||||
|  |         wb_ctrl = wishbone.Interface() | ||||||
|  |         self.add_wb_master(wb_ctrl) | ||||||
|  |         platform.add_extension(wb_ctrl.get_ios("wb_ctrl")) | ||||||
|  |         self.comb += wb_ctrl.connect_to_pads(self.platform.request("wishbone"), mode="slave") | ||||||
|  |  | ||||||
|  | def add_fsm_state_names(): | ||||||
|  |     """Hack the FSM module to add state names to the output""" | ||||||
|  |     from migen.fhdl.visit import NodeTransformer | ||||||
|  |     from migen.genlib.fsm import NextState, NextValue, _target_eq | ||||||
|  |     from migen.fhdl.bitcontainer import value_bits_sign | ||||||
|  |  | ||||||
|  |     class My_LowerNext(NodeTransformer): | ||||||
|  |         def __init__(self, next_state_signal, next_state_name_signal, encoding, aliases): | ||||||
|  |             self.next_state_signal = next_state_signal | ||||||
|  |             self.next_state_name_signal = next_state_name_signal | ||||||
|  |             self.encoding = encoding | ||||||
|  |             self.aliases = aliases | ||||||
|  |             # (target, next_value_ce, next_value) | ||||||
|  |             self.registers = [] | ||||||
|  |  | ||||||
|  |         def _get_register_control(self, target): | ||||||
|  |             for x in self.registers: | ||||||
|  |                 if _target_eq(target, x[0]): | ||||||
|  |                     return x[1], x[2] | ||||||
|  |             raise KeyError | ||||||
|  |  | ||||||
|  |         def visit_unknown(self, node): | ||||||
|  |             if isinstance(node, NextState): | ||||||
|  |                 try: | ||||||
|  |                     actual_state = self.aliases[node.state] | ||||||
|  |                 except KeyError: | ||||||
|  |                     actual_state = node.state | ||||||
|  |                 return [ | ||||||
|  |                     self.next_state_signal.eq(self.encoding[actual_state]), | ||||||
|  |                     self.next_state_name_signal.eq(int.from_bytes(actual_state.encode(), byteorder="big")) | ||||||
|  |                 ] | ||||||
|  |             elif isinstance(node, NextValue): | ||||||
|  |                 try: | ||||||
|  |                     next_value_ce, next_value = self._get_register_control(node.target) | ||||||
|  |                 except KeyError: | ||||||
|  |                     related = node.target if isinstance(node.target, Signal) else None | ||||||
|  |                     next_value = Signal(bits_sign=value_bits_sign(node.target), related=related) | ||||||
|  |                     next_value_ce = Signal(related=related) | ||||||
|  |                     self.registers.append((node.target, next_value_ce, next_value)) | ||||||
|  |                 return next_value.eq(node.value), next_value_ce.eq(1) | ||||||
|  |             else: | ||||||
|  |                 return node | ||||||
|  |     import migen.genlib.fsm as fsm | ||||||
|  |     def my_lower_controls(self): | ||||||
|  |         self.state_name = Signal(len(max(self.encoding,key=len))*8, reset=int.from_bytes(self.reset_state.encode(), byteorder="big")) | ||||||
|  |         self.next_state_name = Signal(len(max(self.encoding,key=len))*8, reset=int.from_bytes(self.reset_state.encode(), byteorder="big")) | ||||||
|  |         self.comb += self.next_state_name.eq(self.state_name) | ||||||
|  |         self.sync += self.state_name.eq(self.next_state_name) | ||||||
|  |         return My_LowerNext(self.next_state, self.next_state_name, self.encoding, self.state_aliases) | ||||||
|  |     fsm.FSM._lower_controls = my_lower_controls | ||||||
|  |  | ||||||
|  |  | ||||||
|  | _io = [ | ||||||
|  |     # Wishbone | ||||||
|  |     ("wishbone", 0, | ||||||
|  |         Subsignal("adr",   Pins(30)), | ||||||
|  |         Subsignal("dat_r", Pins(32)), | ||||||
|  |         Subsignal("dat_w", Pins(32)), | ||||||
|  |         Subsignal("sel",   Pins(4)), | ||||||
|  |         Subsignal("cyc",   Pins(1)), | ||||||
|  |         Subsignal("stb",   Pins(1)), | ||||||
|  |         Subsignal("ack",   Pins(1)), | ||||||
|  |         Subsignal("we",    Pins(1)), | ||||||
|  |         Subsignal("cti",   Pins(3)), | ||||||
|  |         Subsignal("bte",   Pins(2)), | ||||||
|  |         Subsignal("err",   Pins(1)) | ||||||
|  |     ), | ||||||
|  |     ("usb", 0, | ||||||
|  |         Subsignal("d_p", Pins(1)), | ||||||
|  |         Subsignal("d_n", Pins(1)), | ||||||
|  |         Subsignal("pullup", Pins(1)), | ||||||
|  |         Subsignal("tx_en", Pins(1)), | ||||||
|  |     ), | ||||||
|  |     ("clk", 0, | ||||||
|  |         Subsignal("clk48", Pins(1)), | ||||||
|  |         Subsignal("clksys", Pins(1)), | ||||||
|  |     ), | ||||||
|  |     ("interrupt", 0, Pins(1)), | ||||||
|  |     ("reset", 0, Pins(1)), | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | def generate(core_config, output_dir, csr_csv): | ||||||
|  |  | ||||||
|  |     toolchain = core_config["toolchain"] | ||||||
|  |     if toolchain == "trellis": | ||||||
|  |         platform = LatticePlatform(core_config["device"], [], toolchain=toolchain) | ||||||
|  |     else: | ||||||
|  |         raise ValueError(f"Unknown config toolchain {toolchain}") | ||||||
|  |  | ||||||
|  |     soc = BaseSoC(platform, _io, core_config["sys_freq"], | ||||||
|  |                             usb_variant=core_config["usb_variant"], | ||||||
|  |                             cpu_type=None, cpu_variant=None, | ||||||
|  |                             output_dir=output_dir, | ||||||
|  |                             product=core_config["product"], | ||||||
|  |                             manufacturer="Microwatt") | ||||||
|  |     builder = Builder(soc, output_dir=output_dir, | ||||||
|  |                            csr_csv=csr_csv, | ||||||
|  |                            compile_software=False) | ||||||
|  |     vns = builder.build(run=False, build_name='valentyusb') | ||||||
|  |     soc.do_exit(vns) | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     parser = argparse.ArgumentParser(description="Build standalone ValentyUSB verilog output") | ||||||
|  |     # parser.add_argument('variant', metavar='VARIANT', | ||||||
|  |     #                                choices=['dummy', 'cdc_eptri', 'eptri', 'epfifo'], | ||||||
|  |     #                                default='dummy', | ||||||
|  |     #                                help='USB variant. Choices: [%(choices)s] (default: %(default)s)' ) | ||||||
|  |     parser.add_argument('--dir', metavar='DIRECTORY', | ||||||
|  |                                  default='build', | ||||||
|  |                                  help='Output directory (default: %(default)s)' ) | ||||||
|  |     parser.add_argument('--csr', metavar='CSR', | ||||||
|  |                                  default='csr.csv', | ||||||
|  |                                  help='csr file (default: %(default)s)') | ||||||
|  |     parser.add_argument('config', type=argparse.FileType('r'), | ||||||
|  |                                  help='Input platform config file') | ||||||
|  |     args = parser.parse_args() | ||||||
|  |  | ||||||
|  |     core_config = yaml.load(args.config.read(), Loader=yaml.Loader) | ||||||
|  |     # XXX matt - not sure if this needed, maybe only for sim target? | ||||||
|  |     # add_fsm_state_names() | ||||||
|  |     output_dir = args.dir | ||||||
|  |     generate(core_config, output_dir, args.csr) | ||||||
|  |  | ||||||
|  |     print( | ||||||
|  | """Build complete.  Output files: | ||||||
|  |     {}/gateware/valentyusb.v               Source Verilog file. | ||||||
|  | """.format(output_dir)) | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | # This requires https://github.com/litex-hub/valentyusb  branch hw_cdc_eptri | ||||||
|  | # Tested with | ||||||
|  | # commit 912d8e6dc72d45e092e608ffcaabfeaaa6d4580f | ||||||
|  | # Date:   Wed Jan 6 09:42:42 2021 +0100 | ||||||
|  |  | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | GENSRCDIR=$(dirname $0) | ||||||
|  | cd $GENSRCDIR | ||||||
|  |  | ||||||
|  | for b in orangecrab-85-0.2; do | ||||||
|  |     ./generate.py --dir ../generated/$b $b.yml | ||||||
|  | done | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | { | ||||||
|  |     "device": "LFE5U-85F-8MG285C", | ||||||
|  |     "toolchain": "trellis", | ||||||
|  |     "usb_variant": "cdc_eptri", | ||||||
|  |     "sys_freq": 48000000, | ||||||
|  |     "product": "Microwatt on OrangeCrab", | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | # Autogenerated by LiteX / git: -------- | ||||||
|  | set -e | ||||||
|  | yosys -l valentyusb.rpt valentyusb.ys | ||||||
|  | nextpnr-ecp5 --json valentyusb.json --lpf valentyusb.lpf --textcfg valentyusb.config      --85k --package CSFBGA285 --speed 8 --timing-allow-fail  --seed 1 | ||||||
|  | ecppack valentyusb.config --svf valentyusb.svf --bit valentyusb.bit --bootaddr 0   | ||||||
| @ -0,0 +1,249 @@ | |||||||
|  | 00 | ||||||
|  | 09 | ||||||
|  | 02 | ||||||
|  | 3e | ||||||
|  | 00 | ||||||
|  | 02 | ||||||
|  | 01 | ||||||
|  | 00 | ||||||
|  | 80 | ||||||
|  | 32 | ||||||
|  | 09 | ||||||
|  | 04 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 02 | ||||||
|  | 02 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 05 | ||||||
|  | 24 | ||||||
|  | 00 | ||||||
|  | 10 | ||||||
|  | 01 | ||||||
|  | 04 | ||||||
|  | 24 | ||||||
|  | 02 | ||||||
|  | 02 | ||||||
|  | 05 | ||||||
|  | 24 | ||||||
|  | 06 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 07 | ||||||
|  | 05 | ||||||
|  | 81 | ||||||
|  | 03 | ||||||
|  | 08 | ||||||
|  | 00 | ||||||
|  | 40 | ||||||
|  | 09 | ||||||
|  | 04 | ||||||
|  | 01 | ||||||
|  | 00 | ||||||
|  | 02 | ||||||
|  | 0a | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 07 | ||||||
|  | 05 | ||||||
|  | 02 | ||||||
|  | 02 | ||||||
|  | 40 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 07 | ||||||
|  | 05 | ||||||
|  | 82 | ||||||
|  | 02 | ||||||
|  | 40 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 12 | ||||||
|  | 01 | ||||||
|  | 00 | ||||||
|  | 02 | ||||||
|  | 02 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 40 | ||||||
|  | 09 | ||||||
|  | 12 | ||||||
|  | f2 | ||||||
|  | 5b | ||||||
|  | 01 | ||||||
|  | 01 | ||||||
|  | 01 | ||||||
|  | 02 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 04 | ||||||
|  | 03 | ||||||
|  | 09 | ||||||
|  | 04 | ||||||
|  | 14 | ||||||
|  | 03 | ||||||
|  | 4d | ||||||
|  | 00 | ||||||
|  | 69 | ||||||
|  | 00 | ||||||
|  | 63 | ||||||
|  | 00 | ||||||
|  | 72 | ||||||
|  | 00 | ||||||
|  | 6f | ||||||
|  | 00 | ||||||
|  | 77 | ||||||
|  | 00 | ||||||
|  | 61 | ||||||
|  | 00 | ||||||
|  | 74 | ||||||
|  | 00 | ||||||
|  | 74 | ||||||
|  | 00 | ||||||
|  | 30 | ||||||
|  | 03 | ||||||
|  | 4d | ||||||
|  | 00 | ||||||
|  | 69 | ||||||
|  | 00 | ||||||
|  | 63 | ||||||
|  | 00 | ||||||
|  | 72 | ||||||
|  | 00 | ||||||
|  | 6f | ||||||
|  | 00 | ||||||
|  | 77 | ||||||
|  | 00 | ||||||
|  | 61 | ||||||
|  | 00 | ||||||
|  | 74 | ||||||
|  | 00 | ||||||
|  | 74 | ||||||
|  | 00 | ||||||
|  | 20 | ||||||
|  | 00 | ||||||
|  | 6f | ||||||
|  | 00 | ||||||
|  | 6e | ||||||
|  | 00 | ||||||
|  | 20 | ||||||
|  | 00 | ||||||
|  | 4f | ||||||
|  | 00 | ||||||
|  | 72 | ||||||
|  | 00 | ||||||
|  | 61 | ||||||
|  | 00 | ||||||
|  | 6e | ||||||
|  | 00 | ||||||
|  | 67 | ||||||
|  | 00 | ||||||
|  | 65 | ||||||
|  | 00 | ||||||
|  | 43 | ||||||
|  | 00 | ||||||
|  | 72 | ||||||
|  | 00 | ||||||
|  | 61 | ||||||
|  | 00 | ||||||
|  | 62 | ||||||
|  | 00 | ||||||
|  | 05 | ||||||
|  | 0f | ||||||
|  | 1d | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 18 | ||||||
|  | 10 | ||||||
|  | 05 | ||||||
|  | 00 | ||||||
|  | 38 | ||||||
|  | b6 | ||||||
|  | 08 | ||||||
|  | 34 | ||||||
|  | a9 | ||||||
|  | 09 | ||||||
|  | a0 | ||||||
|  | 47 | ||||||
|  | 8b | ||||||
|  | fd | ||||||
|  | a0 | ||||||
|  | 76 | ||||||
|  | 88 | ||||||
|  | 15 | ||||||
|  | b6 | ||||||
|  | 65 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 02 | ||||||
|  | 01 | ||||||
|  | 12 | ||||||
|  | 03 | ||||||
|  | 4d | ||||||
|  | 53 | ||||||
|  | 46 | ||||||
|  | 54 | ||||||
|  | 31 | ||||||
|  | 30 | ||||||
|  | 30 | ||||||
|  | 7e | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 28 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 04 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 01 | ||||||
|  | 57 | ||||||
|  | 49 | ||||||
|  | 4e | ||||||
|  | 55 | ||||||
|  | 53 | ||||||
|  | 42 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | c2 | ||||||
|  | 01 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 00 | ||||||
|  | 08 | ||||||
| @ -0,0 +1,118 @@ | |||||||
|  | BLOCK RESETPATHS; | ||||||
|  | BLOCK ASYNCPATHS; | ||||||
|  | LOCATE COMP "clk_clk48" SITE "X"; | ||||||
|  | LOCATE COMP "clk_clksys" SITE "X"; | ||||||
|  | LOCATE COMP "reset" SITE "X"; | ||||||
|  | LOCATE COMP "usb_d_p" SITE "X"; | ||||||
|  | LOCATE COMP "usb_d_n" SITE "X"; | ||||||
|  | LOCATE COMP "usb_pullup" SITE "X"; | ||||||
|  | LOCATE COMP "usb_tx_en" SITE "X"; | ||||||
|  | LOCATE COMP "interrupt" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[2]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[3]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[4]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[5]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[6]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[7]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[8]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[9]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[10]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[11]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[12]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[13]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[14]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[15]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[16]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[17]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[18]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[19]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[20]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[21]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[22]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[23]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[24]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[25]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[26]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[27]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[28]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_adr[29]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[2]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[3]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[4]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[5]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[6]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[7]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[8]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[9]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[10]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[11]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[12]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[13]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[14]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[15]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[16]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[17]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[18]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[19]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[20]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[21]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[22]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[23]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[24]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[25]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[26]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[27]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[28]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[29]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[30]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_r[31]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[2]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[3]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[4]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[5]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[6]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[7]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[8]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[9]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[10]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[11]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[12]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[13]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[14]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[15]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[16]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[17]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[18]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[19]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[20]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[21]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[22]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[23]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[24]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[25]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[26]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[27]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[28]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[29]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[30]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_dat_w[31]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_sel[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_sel[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_sel[2]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_sel[3]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_cyc" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_stb" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_ack" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_we" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_cti[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_cti[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_cti[2]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_bte[0]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_bte[1]" SITE "X"; | ||||||
|  | LOCATE COMP "wishbone_err" SITE "X"; | ||||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,6 @@ | |||||||
|  | verilog_defaults -push | ||||||
|  | verilog_defaults -add -defer | ||||||
|  | read_verilog /home/matt/3rd/fpga/microwatt/valentyusb/generated/orangecrab-85-0.2/gateware/valentyusb.v | ||||||
|  | verilog_defaults -pop | ||||||
|  | attrmap -tocase keep -imap keep="true" keep=1 -imap keep="false" keep=0 -remove keep=0 | ||||||
|  | synth_ecp5   -json valentyusb.json -top valentyusb | ||||||
| @ -0,0 +1,232 @@ | |||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | // Auto-generated by Migen (--------) & LiteX (--------) on 2022-02-07 17:23:11 | ||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | #include <generated/soc.h> | ||||||
|  | #ifndef __GENERATED_CSR_H | ||||||
|  | #define __GENERATED_CSR_H | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <system.h> | ||||||
|  | #ifndef CSR_ACCESSORS_DEFINED | ||||||
|  | #include <hw/common.h> | ||||||
|  | #endif /* ! CSR_ACCESSORS_DEFINED */ | ||||||
|  | #ifndef CSR_BASE | ||||||
|  | #define CSR_BASE 0x0L | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* uart */ | ||||||
|  | #define CSR_UART_BASE (CSR_BASE + 0x0L) | ||||||
|  | #define CSR_UART_RXTX_ADDR (CSR_BASE + 0x0L) | ||||||
|  | #define CSR_UART_RXTX_SIZE 1 | ||||||
|  | static inline uint32_t uart_rxtx_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x0L); | ||||||
|  | } | ||||||
|  | static inline void uart_rxtx_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x0L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_TXFULL_ADDR (CSR_BASE + 0x4L) | ||||||
|  | #define CSR_UART_TXFULL_SIZE 1 | ||||||
|  | static inline uint32_t uart_txfull_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x4L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_RXEMPTY_ADDR (CSR_BASE + 0x8L) | ||||||
|  | #define CSR_UART_RXEMPTY_SIZE 1 | ||||||
|  | static inline uint32_t uart_rxempty_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x8L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_STATUS_ADDR (CSR_BASE + 0xcL) | ||||||
|  | #define CSR_UART_EV_STATUS_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_status_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0xcL); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_STATUS_TX_OFFSET 0 | ||||||
|  | #define CSR_UART_EV_STATUS_TX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_status_tx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 0) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_status_tx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_status_read(); | ||||||
|  | 	return uart_ev_status_tx_extract(word); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_STATUS_RX_OFFSET 1 | ||||||
|  | #define CSR_UART_EV_STATUS_RX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_status_rx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 1) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_status_rx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_status_read(); | ||||||
|  | 	return uart_ev_status_rx_extract(word); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_PENDING_ADDR (CSR_BASE + 0x10L) | ||||||
|  | #define CSR_UART_EV_PENDING_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_pending_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x10L); | ||||||
|  | } | ||||||
|  | static inline void uart_ev_pending_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x10L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_PENDING_TX_OFFSET 0 | ||||||
|  | #define CSR_UART_EV_PENDING_TX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_pending_tx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 0) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_pending_tx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_pending_read(); | ||||||
|  | 	return uart_ev_pending_tx_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_pending_tx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 0))) | (mask & plain_value)<< 0 ; | ||||||
|  | } | ||||||
|  | static inline void uart_ev_pending_tx_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = uart_ev_pending_read(); | ||||||
|  | 	uint32_t newword = uart_ev_pending_tx_replace(oldword, plain_value); | ||||||
|  | 	uart_ev_pending_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_PENDING_RX_OFFSET 1 | ||||||
|  | #define CSR_UART_EV_PENDING_RX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_pending_rx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 1) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_pending_rx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_pending_read(); | ||||||
|  | 	return uart_ev_pending_rx_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_pending_rx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 1))) | (mask & plain_value)<< 1 ; | ||||||
|  | } | ||||||
|  | static inline void uart_ev_pending_rx_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = uart_ev_pending_read(); | ||||||
|  | 	uint32_t newword = uart_ev_pending_rx_replace(oldword, plain_value); | ||||||
|  | 	uart_ev_pending_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_ENABLE_ADDR (CSR_BASE + 0x14L) | ||||||
|  | #define CSR_UART_EV_ENABLE_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_enable_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x14L); | ||||||
|  | } | ||||||
|  | static inline void uart_ev_enable_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x14L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_ENABLE_TX_OFFSET 0 | ||||||
|  | #define CSR_UART_EV_ENABLE_TX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_enable_tx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 0) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_enable_tx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_enable_read(); | ||||||
|  | 	return uart_ev_enable_tx_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_enable_tx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 0))) | (mask & plain_value)<< 0 ; | ||||||
|  | } | ||||||
|  | static inline void uart_ev_enable_tx_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = uart_ev_enable_read(); | ||||||
|  | 	uint32_t newword = uart_ev_enable_tx_replace(oldword, plain_value); | ||||||
|  | 	uart_ev_enable_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_UART_EV_ENABLE_RX_OFFSET 1 | ||||||
|  | #define CSR_UART_EV_ENABLE_RX_SIZE 1 | ||||||
|  | static inline uint32_t uart_ev_enable_rx_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 1) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_enable_rx_read(void) { | ||||||
|  | 	uint32_t word = uart_ev_enable_read(); | ||||||
|  | 	return uart_ev_enable_rx_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t uart_ev_enable_rx_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 1))) | (mask & plain_value)<< 1 ; | ||||||
|  | } | ||||||
|  | static inline void uart_ev_enable_rx_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = uart_ev_enable_read(); | ||||||
|  | 	uint32_t newword = uart_ev_enable_rx_replace(oldword, plain_value); | ||||||
|  | 	uart_ev_enable_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_UART_TUNING_WORD_ADDR (CSR_BASE + 0x18L) | ||||||
|  | #define CSR_UART_TUNING_WORD_SIZE 1 | ||||||
|  | static inline uint32_t uart_tuning_word_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x18L); | ||||||
|  | } | ||||||
|  | static inline void uart_tuning_word_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x18L); | ||||||
|  | } | ||||||
|  | #define CSR_UART_CONFIGURED_ADDR (CSR_BASE + 0x1cL) | ||||||
|  | #define CSR_UART_CONFIGURED_SIZE 1 | ||||||
|  | static inline uint32_t uart_configured_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x1cL); | ||||||
|  | } | ||||||
|  | static inline void uart_configured_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x1cL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* ctrl */ | ||||||
|  | #define CSR_CTRL_BASE (CSR_BASE + 0x800L) | ||||||
|  | #define CSR_CTRL_RESET_ADDR (CSR_BASE + 0x800L) | ||||||
|  | #define CSR_CTRL_RESET_SIZE 1 | ||||||
|  | static inline uint32_t ctrl_reset_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x800L); | ||||||
|  | } | ||||||
|  | static inline void ctrl_reset_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x800L); | ||||||
|  | } | ||||||
|  | #define CSR_CTRL_RESET_SOC_RST_OFFSET 0 | ||||||
|  | #define CSR_CTRL_RESET_SOC_RST_SIZE 1 | ||||||
|  | static inline uint32_t ctrl_reset_soc_rst_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 0) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t ctrl_reset_soc_rst_read(void) { | ||||||
|  | 	uint32_t word = ctrl_reset_read(); | ||||||
|  | 	return ctrl_reset_soc_rst_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t ctrl_reset_soc_rst_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 0))) | (mask & plain_value)<< 0 ; | ||||||
|  | } | ||||||
|  | static inline void ctrl_reset_soc_rst_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = ctrl_reset_read(); | ||||||
|  | 	uint32_t newword = ctrl_reset_soc_rst_replace(oldword, plain_value); | ||||||
|  | 	ctrl_reset_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_CTRL_RESET_CPU_RST_OFFSET 1 | ||||||
|  | #define CSR_CTRL_RESET_CPU_RST_SIZE 1 | ||||||
|  | static inline uint32_t ctrl_reset_cpu_rst_extract(uint32_t oldword) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return ( (oldword >> 1) & mask ); | ||||||
|  | } | ||||||
|  | static inline uint32_t ctrl_reset_cpu_rst_read(void) { | ||||||
|  | 	uint32_t word = ctrl_reset_read(); | ||||||
|  | 	return ctrl_reset_cpu_rst_extract(word); | ||||||
|  | } | ||||||
|  | static inline uint32_t ctrl_reset_cpu_rst_replace(uint32_t oldword, uint32_t plain_value) { | ||||||
|  | 	uint32_t mask = ((1 << 1)-1); | ||||||
|  | 	return (oldword & (~(mask << 1))) | (mask & plain_value)<< 1 ; | ||||||
|  | } | ||||||
|  | static inline void ctrl_reset_cpu_rst_write(uint32_t plain_value) { | ||||||
|  | 	uint32_t oldword = ctrl_reset_read(); | ||||||
|  | 	uint32_t newword = ctrl_reset_cpu_rst_replace(oldword, plain_value); | ||||||
|  | 	ctrl_reset_write(newword); | ||||||
|  | } | ||||||
|  | #define CSR_CTRL_SCRATCH_ADDR (CSR_BASE + 0x804L) | ||||||
|  | #define CSR_CTRL_SCRATCH_SIZE 1 | ||||||
|  | static inline uint32_t ctrl_scratch_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x804L); | ||||||
|  | } | ||||||
|  | static inline void ctrl_scratch_write(uint32_t v) { | ||||||
|  | 	csr_write_simple(v, CSR_BASE + 0x804L); | ||||||
|  | } | ||||||
|  | #define CSR_CTRL_BUS_ERRORS_ADDR (CSR_BASE + 0x808L) | ||||||
|  | #define CSR_CTRL_BUS_ERRORS_SIZE 1 | ||||||
|  | static inline uint32_t ctrl_bus_errors_read(void) { | ||||||
|  | 	return csr_read_simple(CSR_BASE + 0x808L); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | // Auto-generated by Migen (--------) & LiteX (--------) on 2022-02-07 17:23:11 | ||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | #ifndef __GENERATED_GIT_H | ||||||
|  | #define __GENERATED_GIT_H | ||||||
|  |  | ||||||
|  | #define MIGEN_GIT_SHA1 "--------" | ||||||
|  | #define LITEX_GIT_SHA1 "--------" | ||||||
|  | #endif | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | // Auto-generated by Migen (--------) & LiteX (--------) on 2022-02-07 17:23:11 | ||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | #ifndef __GENERATED_MEM_H | ||||||
|  | #define __GENERATED_MEM_H | ||||||
|  |  | ||||||
|  | #ifndef CSR_BASE | ||||||
|  | #define CSR_BASE 0x00000000L | ||||||
|  | #define CSR_SIZE 0x00010000 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MEM_REGIONS | ||||||
|  | #define MEM_REGIONS "CSR       0x00000000 0x10000 " | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | // Auto-generated by Migen (--------) & LiteX (--------) on 2022-02-07 17:23:11 | ||||||
|  | //-------------------------------------------------------------------------------- | ||||||
|  | #ifndef __GENERATED_SOC_H | ||||||
|  | #define __GENERATED_SOC_H | ||||||
|  | #define CONFIG_CLOCK_FREQUENCY 48000000 | ||||||
|  | #define CONFIG_CPU_TYPE_NONE | ||||||
|  | #define CONFIG_CPU_VARIANT_STANDARD | ||||||
|  | #define CONFIG_CPU_HUMAN_NAME "Unknown" | ||||||
|  | #define CONFIG_CSR_DATA_WIDTH 32 | ||||||
|  | #define CONFIG_CSR_ALIGNMENT 32 | ||||||
|  | #define CONFIG_BUS_STANDARD "WISHBONE" | ||||||
|  | #define CONFIG_BUS_DATA_WIDTH 32 | ||||||
|  | #define CONFIG_BUS_ADDRESS_WIDTH 32 | ||||||
|  |  | ||||||
|  | #ifndef __ASSEMBLER__ | ||||||
|  | static inline int config_clock_frequency_read(void) { | ||||||
|  | 	return 48000000; | ||||||
|  | } | ||||||
|  | static inline const char * config_cpu_human_name_read(void) { | ||||||
|  | 	return "Unknown"; | ||||||
|  | } | ||||||
|  | static inline int config_csr_data_width_read(void) { | ||||||
|  | 	return 32; | ||||||
|  | } | ||||||
|  | static inline int config_csr_alignment_read(void) { | ||||||
|  | 	return 32; | ||||||
|  | } | ||||||
|  | static inline const char * config_bus_standard_read(void) { | ||||||
|  | 	return "WISHBONE"; | ||||||
|  | } | ||||||
|  | static inline int config_bus_data_width_read(void) { | ||||||
|  | 	return 32; | ||||||
|  | } | ||||||
|  | static inline int config_bus_address_width_read(void) { | ||||||
|  | 	return 32; | ||||||
|  | } | ||||||
|  | #endif // !__ASSEMBLER__ | ||||||
|  |  | ||||||
|  | #endif | ||||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Tobias Platen
						Tobias Platen