From 341fb86b22ffa1902480db52a221589a6bd4526a Mon Sep 17 00:00:00 2001 From: Wayne Venables Date: Sat, 25 Feb 2023 20:18:58 -0800 Subject: [PATCH] Refactoring library files to remove dependency on include.h. --- examples/vga_hello/Makefile | 65 ------- examples/vga_hello/src/include.h | 15 -- examples/vga_hello/src/main.cpp | 3 +- examples/vga_hello/src/main.h | 11 -- global.h | 281 ------------------------------- picovga.cmake | 2 +- src/font/RaspPicoImg.exe | Bin 77824 -> 0 bytes src/font/font_boldB_8x14.cpp | 2 +- src/font/font_boldB_8x16.cpp | 2 +- src/font/font_bold_8x14.cpp | 2 +- src/font/font_bold_8x16.cpp | 2 +- src/font/font_bold_8x8.cpp | 2 +- src/font/font_game_8x8.cpp | 2 +- src/font/font_ibm_8x14.cpp | 2 +- src/font/font_ibm_8x16.cpp | 2 +- src/font/font_ibm_8x8.cpp | 2 +- src/font/font_ibmtiny_8x8.cpp | 2 +- src/font/font_italic_8x8.cpp | 2 +- src/font/font_thin_8x8.cpp | 2 +- src/picovga.h | 136 +++++++++++++++ src/util/canvas.cpp | 6 +- src/util/mat2d.cpp | 2 +- src/util/mat2d.h | 3 + src/util/overclock.cpp | 5 +- src/util/overclock.h | 2 + src/util/print.cpp | 2 +- src/util/pwmsnd.cpp | 5 +- src/util/rand.cpp | 3 +- src/vga.cpp | 10 +- src/vga_layer.cpp | 5 +- src/vga_pal.cpp | 3 +- src/vga_screen.cpp | 4 +- src/vga_util.cpp | 5 +- src/vga_vmode.cpp | 6 +- 34 files changed, 200 insertions(+), 398 deletions(-) delete mode 100644 examples/vga_hello/Makefile delete mode 100644 examples/vga_hello/src/include.h delete mode 100644 examples/vga_hello/src/main.h delete mode 100644 global.h delete mode 100644 src/font/RaspPicoImg.exe create mode 100644 src/picovga.h diff --git a/examples/vga_hello/Makefile b/examples/vga_hello/Makefile deleted file mode 100644 index 87b6ac1..0000000 --- a/examples/vga_hello/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# make clean ... clean -# make all ... compile - -############################################################################## -# Input files - -# ASM source files -ASRC += - -# C source files -CSRC += - -# C++ source files -SRC += src/main.cpp - -############################################################################## -# Configuration - -# defines -DEFINE += -DCFG_TUSB_DEBUG=0 -DEFINE += -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DEFINE += -DCFG_TUSB_OS=OPT_OS_PICO -DEFINE += -DPICO_BIT_OPS_PICO=1 -DEFINE += -DPICO_BOARD=\"pico\" -DEFINE += -DPICO_BUILD=1 -DEFINE += -DPICO_CMAKE_BUILD_TYPE=\"Release\" -DEFINE += -DPICO_COPY_TO_RAM=0 -DEFINE += -DPICO_CXX_ENABLE_EXCEPTIONS=0 -DEFINE += -DPICO_DIVIDER_HARDWARE=1 -DEFINE += -DPICO_DOUBLE_PICO=1 -DEFINE += -DPICO_FLOAT_PICO=1 -DEFINE += -DPICO_INT64_OPS_PICO=1 -DEFINE += -DPICO_MEM_OPS_PICO=1 -DEFINE += -DPICO_NO_FLASH=0 -DEFINE += -DPICO_NO_HARDWARE=0 -DEFINE += -DPICO_ON_DEVICE=1 -DEFINE += -DPICO_PRINTF_PICO=1 -DEFINE += -DPICO_PROGRAM_URL=\"https://github.com/raspberrypi/pico-examples\" -DEFINE += -DPICO_TARGET_NAME=\"pico\" -DEFINE += -DPICO_USE_BLOCKED_RAM=0 -DEFINE += -DNDEBUG - -# stdio output (select one option) -#DEFINE += -DPICO_STDIO_UART=1 -#DEFINE += -DPICO_STDIO_SEMIHOSTING=1 -#DEFINE += -DPICO_STDIO_USB=1 - -# How to connect UART to Pico: -# +---USB---+ -# <-- UART0_TX GP0 |.1 40.|VBUS --- +5V power output to USB device -# --> UART0_RX GP1 |.2 39.|VSYS ---|<|--- +5V power input -# --- GND |.3 38.| GND K diode A -# GP2 |.4 37.| 3V3_EN -# GP3 |.5 36.| 3V3_OUT -# ...... -# -# USB/UART adaptor PL2303TA: -# red ......... +5V VSYS (39) -# black ....... GND (3) -# white RxD ... UART0_TX GP0 (1) -# green TxD ... UART0_RX GP1 (2) - -# Setup: 115200 Baud - -include ../Makefile.inc diff --git a/examples/vga_hello/src/include.h b/examples/vga_hello/src/include.h deleted file mode 100644 index 32642b8..0000000 --- a/examples/vga_hello/src/include.h +++ /dev/null @@ -1,15 +0,0 @@ - -// **************************************************************************** -// -// Common definitions -// -// **************************************************************************** - -// ---------------------------------------------------------------------------- -// Includes -// ---------------------------------------------------------------------------- - -#include "../../../global.h" // global common definitions - -// main -#include "main.h" // main code diff --git a/examples/vga_hello/src/main.cpp b/examples/vga_hello/src/main.cpp index 995cf56..a155163 100644 --- a/examples/vga_hello/src/main.cpp +++ b/examples/vga_hello/src/main.cpp @@ -5,7 +5,8 @@ // // **************************************************************************** -#include "include.h" + +#include "picovga.h" // Draw box ALIGNED u8 Box[512*400]; diff --git a/examples/vga_hello/src/main.h b/examples/vga_hello/src/main.h deleted file mode 100644 index 557c014..0000000 --- a/examples/vga_hello/src/main.h +++ /dev/null @@ -1,11 +0,0 @@ - -// **************************************************************************** -// -// Main code -// -// **************************************************************************** - -#ifndef _MAIN_H -#define _MAIN_H - -#endif // _MAIN_H diff --git a/global.h b/global.h deleted file mode 100644 index 15517a1..0000000 --- a/global.h +++ /dev/null @@ -1,281 +0,0 @@ - -// **************************************************************************** -// -// Global common definitions -// -// **************************************************************************** - -// ---------------------------------------------------------------------------- -// Base data types -// ---------------------------------------------------------------------------- - -typedef signed char s8; -typedef unsigned char u8; -typedef signed short s16; -typedef unsigned short u16; -typedef signed long int s32; -typedef unsigned long int u32; -typedef signed long long int s64; -typedef unsigned long long int u64; - -typedef unsigned int uint; - -typedef unsigned char Bool; -#define True 1 -#define False 0 - -// NULL -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void*)0) -#endif -#endif - -// I/O port prefix -#define __IO volatile - -// request to use inline -#define INLINE __attribute__((always_inline)) inline - -// avoid to use inline -#define NOINLINE __attribute__((noinline)) - -// weak function -#define WEAK __attribute__((weak)) - -// align array to 4-bytes -#define ALIGNED __attribute__((aligned(4))) - -#define LED_PIN 25 - -// ---------------------------------------------------------------------------- -// Constants -// ---------------------------------------------------------------------------- - -#define B0 (1<<0) -#define B1 (1<<1) -#define B2 (1<<2) -#define B3 (1<<3) -#define B4 (1<<4) -#define B5 (1<<5) -#define B6 (1<<6) -#define B7 (1<<7) -#define B8 (1U<<8) -#define B9 (1U<<9) -#define B10 (1U<<10) -#define B11 (1U<<11) -#define B12 (1U<<12) -#define B13 (1U<<13) -#define B14 (1U<<14) -#define B15 (1U<<15) -#define B16 (1UL<<16) -#define B17 (1UL<<17) -#define B18 (1UL<<18) -#define B19 (1UL<<19) -#define B20 (1UL<<20) -#define B21 (1UL<<21) -#define B22 (1UL<<22) -#define B23 (1UL<<23) -#define B24 (1UL<<24) -#define B25 (1UL<<25) -#define B26 (1UL<<26) -#define B27 (1UL<<27) -#define B28 (1UL<<28) -#define B29 (1UL<<29) -#define B30 (1UL<<30) -#define B31 (1UL<<31) - -#define BIT(pos) (1UL<<(pos)) - -#define BIGINT 0x40000000 // big int value - -#define _T(a) a - -#define PI 3.14159265358979324 -#define PI2 (3.14159265358979324*2) - -// ---------------------------------------------------------------------------- -// Includes -// ---------------------------------------------------------------------------- - -// fonts -extern const ALIGNED u8 FontBold8x8[2048]; -extern const ALIGNED u8 FontBold8x14[3584]; -extern const ALIGNED u8 FontBold8x16[4096]; -extern const ALIGNED u8 FontBoldB8x14[3584]; -extern const ALIGNED u8 FontBoldB8x16[4096]; -extern const ALIGNED u8 FontGame8x8[2048]; -extern const ALIGNED u8 FontIbm8x8[2048]; -extern const ALIGNED u8 FontIbm8x14[3584]; -extern const ALIGNED u8 FontIbm8x16[4096]; -extern const ALIGNED u8 FontIbmTiny8x8[2048]; -extern const ALIGNED u8 FontItalic8x8[2048]; -extern const ALIGNED u8 FontThin8x8[2048]; - -// system includes -#include - -// SDK includes -#include "boards/pico.h" - -#include "hardware/regs/addressmap.h" -#include "hardware/regs/adc.h" -#include "hardware/regs/busctrl.h" -#include "hardware/regs/clocks.h" -#include "hardware/regs/dma.h" -#include "hardware/regs/dreq.h" -#include "hardware/regs/i2c.h" -#include "hardware/regs/intctrl.h" -#include "hardware/regs/io_bank0.h" -#include "hardware/regs/io_qspi.h" -#include "hardware/regs/m0plus.h" -#include "hardware/regs/pads_bank0.h" -#include "hardware/regs/pads_qspi.h" -#include "hardware/regs/pio.h" -#include "hardware/regs/pll.h" -#include "hardware/regs/psm.h" -#include "hardware/regs/pwm.h" -#include "hardware/regs/resets.h" -#include "hardware/regs/rosc.h" -#include "hardware/regs/rtc.h" -#include "hardware/regs/sio.h" -#include "hardware/regs/spi.h" -#include "hardware/regs/ssi.h" -#include "hardware/regs/syscfg.h" -#include "hardware/regs/sysinfo.h" -#include "hardware/regs/tbman.h" -#include "hardware/regs/timer.h" -#include "hardware/regs/uart.h" -#include "hardware/regs/usb.h" -#include "hardware/regs/vreg_and_chip_reset.h" -#include "hardware/regs/watchdog.h" -#include "hardware/regs/xip.h" -#include "hardware/regs/xosc.h" - -#include "hardware/structs/adc.h" -#include "hardware/structs/bus_ctrl.h" -#include "hardware/structs/clocks.h" -#include "hardware/structs/dma.h" -#include "hardware/structs/i2c.h" -#include "hardware/structs/interp.h" -#include "hardware/structs/iobank0.h" -#include "hardware/structs/ioqspi.h" -#include "hardware/structs/mpu.h" -#include "hardware/structs/padsbank0.h" -#include "hardware/structs/pads_qspi.h" -#include "hardware/structs/pio.h" -#include "hardware/structs/pll.h" -#include "hardware/structs/psm.h" -#include "hardware/structs/pwm.h" -#include "hardware/structs/resets.h" -#include "hardware/structs/rosc.h" -#include "hardware/structs/rtc.h" -#include "hardware/structs/scb.h" -#include "hardware/structs/sio.h" -#include "hardware/structs/spi.h" -#include "hardware/structs/ssi.h" -#include "hardware/structs/syscfg.h" -#include "hardware/structs/systick.h" -#include "hardware/structs/timer.h" -#include "hardware/structs/uart.h" -#include "hardware/structs/usb.h" -#include "hardware/structs/vreg_and_chip_reset.h" -#include "hardware/structs/watchdog.h" -#include "hardware/structs/xip_ctrl.h" -#include "hardware/structs/xosc.h" - -//#include "hardware/adc.h" -#include "hardware/address_mapped.h" -#include "hardware/claim.h" -#include "hardware/clocks.h" -#include "hardware/divider.h" -#include "hardware/dma.h" -//#include "hardware/flash.h" -#include "hardware/gpio.h" -//#include "hardware/i2c.h" -#include "hardware/interp.h" -#include "hardware/irq.h" -#include "hardware/pio.h" -#include "hardware/pio_instructions.h" -#include "hardware/platform_defs.h" -#include "hardware/pll.h" -#include "hardware/pwm.h" -#include "hardware/resets.h" -//#include "hardware/rtc.h" -//#include "hardware/spi.h" -#include "hardware/sync.h" -#include "hardware/timer.h" -#include "hardware/uart.h" -#include "hardware/vreg.h" -#include "hardware/watchdog.h" -#include "hardware/xosc.h" - -//#include "boot/picoboot.h" -//#include "boot/uf2.h" - -//#include "pico.h" -//#include "tusb_config.h" - -#include "pico/assert.h" -#include "pico/binary_info.h" -#include "pico/bit_ops.h" -#include "pico/bootrom.h" -#include "pico/config.h" -#include "pico/config_autogen.h" -#include "pico/critical_section.h" -#include "pico/divider.h" -#include "pico/double.h" -#include "pico/error.h" -#include "pico/float.h" -#include "pico/int64_ops.h" -#include "pico/lock_core.h" -#include "pico/malloc.h" -//#include "pico/mem_ops.h" -#include "pico/multicore.h" -#include "pico/mutex.h" -#include "pico/platform.h" -#include "pico/printf.h" -#include "pico/runtime.h" -#include "pico/sem.h" -#include "pico/stdio.h" -//#include "pico/stdio_semihosting.h" -//#include "pico/stdio_uart.h" -//#include "pico/stdio_usb.h" -#include "pico/stdlib.h" -#include "pico/sync.h" -#include "pico/time.h" -#include "pico/timeout_helper.h" -#include "pico/types.h" -//#include "pico/unique_id.h" -#include "pico/version.h" - -#include "pico/binary_info/code.h" -#include "pico/binary_info/defs.h" -#include "pico/binary_info/structure.h" - -#include "pico/bootrom/sf_table.h" - -//#include "pico/fix/rp2040_usb_device_enumeration.h" - -#include "pico/stdio/driver.h" - -#include "pico/util/datetime.h" -#include "pico/util/pheap.h" -#include "pico/util/queue.h" - -// PicoVGA includes -#include "src/define.h" // common definitions of C and ASM -#include "src/util/canvas.h" // canvas -#include "src/util/overclock.h" // overclock -#include "src/util/print.h" // print to attribute text buffer -#include "src/util/rand.h" // random number generator -#include "src/util/mat2d.h" // 2D transformation matrix -#include "src/util/pwmsnd.h" // PWM sound output -#include "src/vga_pal.h" // VGA colors and palettes -#include "src/vga_vmode.h" // VGA videomodes -#include "src/vga_layer.h" // VGA layers -#include "src/vga_screen.h" // VGA screen layout -#include "src/vga_util.h" // VGA utilities -#include "src/vga.h" // VGA output diff --git a/picovga.cmake b/picovga.cmake index 1ef24b0..710253e 100644 --- a/picovga.cmake +++ b/picovga.cmake @@ -69,5 +69,5 @@ macro(add_picovga project) target_link_libraries(${project} pico_stdlib hardware_pio hardware_dma pico_multicore hardware_interp hardware_pwm) - include_directories(${project} ${CMAKE_CURRENT_BINARY_DIR}) + include_directories(${project} ${CMAKE_CURRENT_BINARY_DIR} ${PICOVGA_PATH}/src) endmacro() diff --git a/src/font/RaspPicoImg.exe b/src/font/RaspPicoImg.exe deleted file mode 100644 index eed34d73018976a9f5d15001f85468dc12b36680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77824 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 + +#include "hardware/interp.h" // Draw rectangle // col with CANVAS_ATTRIB8 format: bit 0..3 = draw color, bit 4 = draw color is background color diff --git a/src/util/mat2d.cpp b/src/util/mat2d.cpp index 962c810..1d1257c 100644 --- a/src/util/mat2d.cpp +++ b/src/util/mat2d.cpp @@ -5,7 +5,7 @@ // // **************************************************************************** -#include "include.h" +#include "mat2d.h" // prepare transformation matrix (for DrawImgMat function) // ws ... source image width diff --git a/src/util/mat2d.h b/src/util/mat2d.h index 2f922d6..c241743 100644 --- a/src/util/mat2d.h +++ b/src/util/mat2d.h @@ -8,6 +8,9 @@ #ifndef _MAT2D_H #define _MAT2D_H +#include "pico/double.h" +#include "define.h" + // transformation matrix template class cMat2D { diff --git a/src/util/overclock.cpp b/src/util/overclock.cpp index ad3194f..890fbc9 100644 --- a/src/util/overclock.cpp +++ b/src/util/overclock.cpp @@ -5,7 +5,10 @@ // // **************************************************************************** -#include "include.h" +#include "picovga.h" +#include "overclock.h" +#include "hardware/clocks.h" +#include "hardware/structs/ssi.h" // Search PLL setup // reqkhz ... required output frequency in kHz diff --git a/src/util/overclock.h b/src/util/overclock.h index 8779d5b..8e87dbe 100644 --- a/src/util/overclock.h +++ b/src/util/overclock.h @@ -8,6 +8,8 @@ #ifndef _OVERCLOCK_H #define _OVERCLOCK_H +#include "pico/stdlib.h" + // Search PLL setup // reqkhz ... required output frequency in kHz // input ... PLL input frequency in kHz (default 12000, or use clock_get_hz(clk_ref)/1000) diff --git a/src/util/print.cpp b/src/util/print.cpp index 585313e..890debe 100644 --- a/src/util/print.cpp +++ b/src/util/print.cpp @@ -5,7 +5,7 @@ // // **************************************************************************** -#include "include.h" +#include "picovga.h" // current print buffer u8* PrintBuf; diff --git a/src/util/pwmsnd.cpp b/src/util/pwmsnd.cpp index 17a464a..c0f0088 100644 --- a/src/util/pwmsnd.cpp +++ b/src/util/pwmsnd.cpp @@ -6,7 +6,10 @@ // **************************************************************************** // Note: Cannot use DMA, because sample is 8-bit, but CC port requires 16-bit write. -#include "include.h" +#include "picovga.h" +#include "hardware/pwm.h" +#include "hardware/clocks.h" +#include "hardware/sync.h" // current sound const u8* CurSound = NULL; // current playing sound diff --git a/src/util/rand.cpp b/src/util/rand.cpp index 67c5f69..02f8e4c 100644 --- a/src/util/rand.cpp +++ b/src/util/rand.cpp @@ -5,7 +5,8 @@ // // **************************************************************************** -#include "include.h" +#include "picovga.h" +#include "hardware/structs/rosc.h" // global random generator cRandom Rand; diff --git a/src/vga.cpp b/src/vga.cpp index 7f52bd5..4064391 100644 --- a/src/vga.cpp +++ b/src/vga.cpp @@ -5,9 +5,17 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" +#include "pico/printf.h" + +#include "picovga.h" #include "vga.pio.h" +#include +#include "hardware/divider.h" +#include "hardware/dma.h" +#include "hardware/sync.h" + // scanline type u8 ScanlineType[MAXLINE]; diff --git a/src/vga_layer.cpp b/src/vga_layer.cpp index b9c17db..19331ea 100644 --- a/src/vga_layer.cpp +++ b/src/vga_layer.cpp @@ -5,9 +5,12 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" +#include "picovga.h" +#include "hardware/sync.h" #include "vga.pio.h" + // layer program descriptors const sLayerProg LayerProg[LAYERPROG_NUM] = { diff --git a/src/vga_pal.cpp b/src/vga_pal.cpp index 5d71fa1..2a44a46 100644 --- a/src/vga_pal.cpp +++ b/src/vga_pal.cpp @@ -5,7 +5,8 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" +#include "picovga.h" // default 16-color palettes (EGA colors) // - do not set "const", to stay in faster RAM diff --git a/src/vga_screen.cpp b/src/vga_screen.cpp index 0cd92e8..c350e15 100644 --- a/src/vga_screen.cpp +++ b/src/vga_screen.cpp @@ -5,7 +5,9 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" +#include "picovga.h" +#include "hardware/sync.h" // current video screen sScreen Screen = { .num = 0 }; // default video screen diff --git a/src/vga_util.cpp b/src/vga_util.cpp index 600db69..499a8b6 100644 --- a/src/vga_util.cpp +++ b/src/vga_util.cpp @@ -5,7 +5,10 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" + +#include "picovga.h" +#include // convert image from 16-color to 8x8 attribute format void Attr8Conv(u8* dst, u8* attr, const u8* src, int w, int h, const u8* pal) diff --git a/src/vga_vmode.cpp b/src/vga_vmode.cpp index 28ed4e8..efe3e4b 100644 --- a/src/vga_vmode.cpp +++ b/src/vga_vmode.cpp @@ -5,7 +5,11 @@ // // **************************************************************************** -#include "include.h" +#include "pico/stdlib.h" +#include "pico/printf.h" +#include "pico/multicore.h" +#include "picovga.h" + sVmode Vmode; // videomode setup sVgaCfg Cfg; // required configuration