From 97ce195c495fc090810139fa0df8ae8dc4d03e54 Mon Sep 17 00:00:00 2001 From: Kizarm Date: Sat, 25 Jan 2025 12:21:08 +0100 Subject: [PATCH] reorganize --- .gitignore | 2 ++ V203F6P6/README.md | 4 ++++ {V203R6 => V203F6P6}/blink/Makefile | 0 {V203R6 => V203F6P6}/blink/ch32v203 | 0 {V203R6 => V203F6P6}/blink/main.cpp | 0 {V203R6 => V203F6P6}/ch32v203/CH32V20xxx.h | 0 {V203R6 => V203F6P6}/ch32v203/clang.mk | 0 {V203R6 => V203F6P6}/ch32v203/gcc.mk | 0 .../ch32v203/generated_CH32V203F6P6.ld | 0 {V203R6 => V203F6P6}/ch32v203/gpio.h | 0 {V203R6 => V203F6P6}/ch32v203/startup.cpp | 0 {V203R6 => V203F6P6}/ch32v203/system.cpp | 0 {V203R6 => V203F6P6}/ch32v203/system.h | 0 {V203R6 => V203F6P6}/common/baselayer.h | 0 {V203R6 => V203F6P6}/common/fifo.h | 0 {V203R6 => V203F6P6}/common/oneway.h | 2 +- {V203R6 => V203F6P6}/common/print.cpp | 0 {V203R6 => V203F6P6}/common/print.h | 0 {V203R6 => V203F6P6}/common/usart.h | 0 {V203R6 => V203F6P6}/ws2812b/Makefile | 0 {V203R6 => V203F6P6}/ws2812b/ch32v203 | 0 {V203R6 => V203F6P6}/ws2812b/common | 0 {V203R6 => V203F6P6}/ws2812b/hack.c | 0 {V203R6 => V203F6P6}/ws2812b/linux/Makefile | 0 {V203R6 => V203F6P6}/ws2812b/linux/graph.py | 0 {V203R6 => V203F6P6}/ws2812b/linux/main.cpp | 0 {V203R6 => V203F6P6}/ws2812b/main.cpp | 6 ++--- {V203R6 => V203F6P6}/ws2812b/spiclass.cpp | 17 +++++++------- {V203R6 => V203F6P6}/ws2812b/spiclass.h | 5 ++-- {V203R6 => V203F6P6}/ws2812b/table.c | 0 {V203R6 => V203F6P6}/ws2812b/ws2812b.cpp | 2 +- {V203R6 => V203F6P6}/ws2812b/ws2812b.h | 22 +++++++++--------- V203R6/ws2812b/linux/graph.so | Bin 16648 -> 0 bytes V203R6/ws2812b/linux/main.o | Bin 3536 -> 0 bytes 34 files changed, 33 insertions(+), 27 deletions(-) create mode 100644 V203F6P6/README.md rename {V203R6 => V203F6P6}/blink/Makefile (100%) rename {V203R6 => V203F6P6}/blink/ch32v203 (100%) rename {V203R6 => V203F6P6}/blink/main.cpp (100%) rename {V203R6 => V203F6P6}/ch32v203/CH32V20xxx.h (100%) rename {V203R6 => V203F6P6}/ch32v203/clang.mk (100%) rename {V203R6 => V203F6P6}/ch32v203/gcc.mk (100%) rename {V203R6 => V203F6P6}/ch32v203/generated_CH32V203F6P6.ld (100%) rename {V203R6 => V203F6P6}/ch32v203/gpio.h (100%) rename {V203R6 => V203F6P6}/ch32v203/startup.cpp (100%) rename {V203R6 => V203F6P6}/ch32v203/system.cpp (100%) rename {V203R6 => V203F6P6}/ch32v203/system.h (100%) rename {V203R6 => V203F6P6}/common/baselayer.h (100%) rename {V203R6 => V203F6P6}/common/fifo.h (100%) rename {V203R6 => V203F6P6}/common/oneway.h (64%) rename {V203R6 => V203F6P6}/common/print.cpp (100%) rename {V203R6 => V203F6P6}/common/print.h (100%) rename {V203R6 => V203F6P6}/common/usart.h (100%) rename {V203R6 => V203F6P6}/ws2812b/Makefile (100%) rename {V203R6 => V203F6P6}/ws2812b/ch32v203 (100%) rename {V203R6 => V203F6P6}/ws2812b/common (100%) rename {V203R6 => V203F6P6}/ws2812b/hack.c (100%) rename {V203R6 => V203F6P6}/ws2812b/linux/Makefile (100%) rename {V203R6 => V203F6P6}/ws2812b/linux/graph.py (100%) rename {V203R6 => V203F6P6}/ws2812b/linux/main.cpp (100%) rename {V203R6 => V203F6P6}/ws2812b/main.cpp (79%) rename {V203R6 => V203F6P6}/ws2812b/spiclass.cpp (89%) rename {V203R6 => V203F6P6}/ws2812b/spiclass.h (66%) rename {V203R6 => V203F6P6}/ws2812b/table.c (100%) rename {V203R6 => V203F6P6}/ws2812b/ws2812b.cpp (98%) rename {V203R6 => V203F6P6}/ws2812b/ws2812b.h (67%) delete mode 100755 V203R6/ws2812b/linux/graph.so delete mode 100644 V203R6/ws2812b/linux/main.o diff --git a/.gitignore b/.gitignore index ab98bb0..2c52023 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ *.hex *.map *.elf +*.o +*.so */midi/melody.c */midi/miditone.c */midi/ton/gen diff --git a/V203F6P6/README.md b/V203F6P6/README.md new file mode 100644 index 0000000..6a02cd2 --- /dev/null +++ b/V203F6P6/README.md @@ -0,0 +1,4 @@ +# V203R6 +Koupil jsem na ALI pár levných procesorů CH32V203F6P6, +tak jsem se rozhodl je vyzkoušet. Má to méně paměti (32K flash, 10K ram), +ořezané periferie, ale na pokusy by to mohlo stačit. diff --git a/V203R6/blink/Makefile b/V203F6P6/blink/Makefile similarity index 100% rename from V203R6/blink/Makefile rename to V203F6P6/blink/Makefile diff --git a/V203R6/blink/ch32v203 b/V203F6P6/blink/ch32v203 similarity index 100% rename from V203R6/blink/ch32v203 rename to V203F6P6/blink/ch32v203 diff --git a/V203R6/blink/main.cpp b/V203F6P6/blink/main.cpp similarity index 100% rename from V203R6/blink/main.cpp rename to V203F6P6/blink/main.cpp diff --git a/V203R6/ch32v203/CH32V20xxx.h b/V203F6P6/ch32v203/CH32V20xxx.h similarity index 100% rename from V203R6/ch32v203/CH32V20xxx.h rename to V203F6P6/ch32v203/CH32V20xxx.h diff --git a/V203R6/ch32v203/clang.mk b/V203F6P6/ch32v203/clang.mk similarity index 100% rename from V203R6/ch32v203/clang.mk rename to V203F6P6/ch32v203/clang.mk diff --git a/V203R6/ch32v203/gcc.mk b/V203F6P6/ch32v203/gcc.mk similarity index 100% rename from V203R6/ch32v203/gcc.mk rename to V203F6P6/ch32v203/gcc.mk diff --git a/V203R6/ch32v203/generated_CH32V203F6P6.ld b/V203F6P6/ch32v203/generated_CH32V203F6P6.ld similarity index 100% rename from V203R6/ch32v203/generated_CH32V203F6P6.ld rename to V203F6P6/ch32v203/generated_CH32V203F6P6.ld diff --git a/V203R6/ch32v203/gpio.h b/V203F6P6/ch32v203/gpio.h similarity index 100% rename from V203R6/ch32v203/gpio.h rename to V203F6P6/ch32v203/gpio.h diff --git a/V203R6/ch32v203/startup.cpp b/V203F6P6/ch32v203/startup.cpp similarity index 100% rename from V203R6/ch32v203/startup.cpp rename to V203F6P6/ch32v203/startup.cpp diff --git a/V203R6/ch32v203/system.cpp b/V203F6P6/ch32v203/system.cpp similarity index 100% rename from V203R6/ch32v203/system.cpp rename to V203F6P6/ch32v203/system.cpp diff --git a/V203R6/ch32v203/system.h b/V203F6P6/ch32v203/system.h similarity index 100% rename from V203R6/ch32v203/system.h rename to V203F6P6/ch32v203/system.h diff --git a/V203R6/common/baselayer.h b/V203F6P6/common/baselayer.h similarity index 100% rename from V203R6/common/baselayer.h rename to V203F6P6/common/baselayer.h diff --git a/V203R6/common/fifo.h b/V203F6P6/common/fifo.h similarity index 100% rename from V203R6/common/fifo.h rename to V203F6P6/common/fifo.h diff --git a/V203R6/common/oneway.h b/V203F6P6/common/oneway.h similarity index 64% rename from V203R6/common/oneway.h rename to V203F6P6/common/oneway.h index e4e503d..fe80684 100644 --- a/V203R6/common/oneway.h +++ b/V203F6P6/common/oneway.h @@ -4,7 +4,7 @@ /* C++ interface (jako callback v C) */ template class OneWay { public: - virtual unsigned Send (T * const ptr, const unsigned len, const bool low = false) = 0; + virtual unsigned Send (T * const ptr, const unsigned len) = 0; }; #endif // ONEWAY_H diff --git a/V203R6/common/print.cpp b/V203F6P6/common/print.cpp similarity index 100% rename from V203R6/common/print.cpp rename to V203F6P6/common/print.cpp diff --git a/V203R6/common/print.h b/V203F6P6/common/print.h similarity index 100% rename from V203R6/common/print.h rename to V203F6P6/common/print.h diff --git a/V203R6/common/usart.h b/V203F6P6/common/usart.h similarity index 100% rename from V203R6/common/usart.h rename to V203F6P6/common/usart.h diff --git a/V203R6/ws2812b/Makefile b/V203F6P6/ws2812b/Makefile similarity index 100% rename from V203R6/ws2812b/Makefile rename to V203F6P6/ws2812b/Makefile diff --git a/V203R6/ws2812b/ch32v203 b/V203F6P6/ws2812b/ch32v203 similarity index 100% rename from V203R6/ws2812b/ch32v203 rename to V203F6P6/ws2812b/ch32v203 diff --git a/V203R6/ws2812b/common b/V203F6P6/ws2812b/common similarity index 100% rename from V203R6/ws2812b/common rename to V203F6P6/ws2812b/common diff --git a/V203R6/ws2812b/hack.c b/V203F6P6/ws2812b/hack.c similarity index 100% rename from V203R6/ws2812b/hack.c rename to V203F6P6/ws2812b/hack.c diff --git a/V203R6/ws2812b/linux/Makefile b/V203F6P6/ws2812b/linux/Makefile similarity index 100% rename from V203R6/ws2812b/linux/Makefile rename to V203F6P6/ws2812b/linux/Makefile diff --git a/V203R6/ws2812b/linux/graph.py b/V203F6P6/ws2812b/linux/graph.py similarity index 100% rename from V203R6/ws2812b/linux/graph.py rename to V203F6P6/ws2812b/linux/graph.py diff --git a/V203R6/ws2812b/linux/main.cpp b/V203F6P6/ws2812b/linux/main.cpp similarity index 100% rename from V203R6/ws2812b/linux/main.cpp rename to V203F6P6/ws2812b/linux/main.cpp diff --git a/V203R6/ws2812b/main.cpp b/V203F6P6/ws2812b/main.cpp similarity index 79% rename from V203R6/ws2812b/main.cpp rename to V203F6P6/ws2812b/main.cpp index edf7e15..85a4b17 100644 --- a/V203R6/ws2812b/main.cpp +++ b/V203F6P6/ws2812b/main.cpp @@ -3,14 +3,14 @@ #include "system.h" #include "gpio.h" extern "C" { - extern const unsigned table []; + extern const unsigned table []; // generováno linux/graph.py }; -static FIFO ring; +static FIFO ring; static ws2812b driver(ring); static SpiClass spi (driver); static GpioClass led (GPIOB, 8); -static constexpr unsigned timeout = 5'000u; +static constexpr unsigned timeout = 10'000u; int main () { led << true; diff --git a/V203R6/ws2812b/spiclass.cpp b/V203F6P6/ws2812b/spiclass.cpp similarity index 89% rename from V203R6/ws2812b/spiclass.cpp rename to V203F6P6/ws2812b/spiclass.cpp index 2f0d8dc..291e26e 100644 --- a/V203R6/ws2812b/spiclass.cpp +++ b/V203F6P6/ws2812b/spiclass.cpp @@ -41,20 +41,19 @@ static void InitPins () noexcept { void SpiClass::drq() { if (!driver) return; DMA1_Type::INTFR_DEF state (DMA1.INTFR); - if (state.B.HTIF3) { +/*if (state.B.HTIF3) { DMA1.INTFCR.B.CHTIF3 = SET; // clear half - driver->Send (ptrl, HALF_LEN, true); - } + } */ if (state.B.TCIF3) { DMA1.INTFCR.B.CTCIF3 = SET; // clear complete - //driver->Send (ptrh, HALF_LEN, false); // reset + driver->Send (ptrh, LEDS_LEN); } } -SpiClass::SpiClass(OneWay & base) noexcept : driver (& base), ptrl (buffer), ptrh (buffer + HALF_LEN) { +SpiClass::SpiClass(OneWay & base) noexcept : driver (& base), ptrl (buffer), ptrh (buffer + PADDING) { pSpiInstance = this; for (unsigned n=0u; n(ptrl); + Color * ptr = reinterpret_cast(ptrh); const OneColor oz(0x00); for (unsigned n=0; n 9 x 8 x 0.444 = 32 us DMA celkem (10 + 4) x 32 = 0.448 ms * */ r.B.BR = FPCLK_64; return r.R; diff --git a/V203R6/ws2812b/spiclass.h b/V203F6P6/ws2812b/spiclass.h similarity index 66% rename from V203R6/ws2812b/spiclass.h rename to V203F6P6/ws2812b/spiclass.h index dee1152..52bdcd0 100644 --- a/V203R6/ws2812b/spiclass.h +++ b/V203F6P6/ws2812b/spiclass.h @@ -4,8 +4,9 @@ #include "ws2812b.h" /** */ -static constexpr unsigned HALF_LEN = NUMLEDS * sizeof (Color); -static constexpr unsigned FULL_LEN = 2 * HALF_LEN; +static constexpr unsigned PADDING = 10 * sizeof (Color); +static constexpr unsigned LEDS_LEN = NUMLEDS * sizeof (Color); +static constexpr unsigned FULL_LEN = PADDING + LEDS_LEN; class SpiClass { OneWay * driver; diff --git a/V203R6/ws2812b/table.c b/V203F6P6/ws2812b/table.c similarity index 100% rename from V203R6/ws2812b/table.c rename to V203F6P6/ws2812b/table.c diff --git a/V203R6/ws2812b/ws2812b.cpp b/V203F6P6/ws2812b/ws2812b.cpp similarity index 98% rename from V203R6/ws2812b/ws2812b.cpp rename to V203F6P6/ws2812b/ws2812b.cpp index b94d3a3..840e33c 100644 --- a/V203R6/ws2812b/ws2812b.cpp +++ b/V203F6P6/ws2812b/ws2812b.cpp @@ -37,7 +37,7 @@ unsigned OneColor::to_string(char * ptr, const int m) { ws2812b::ws2812b (FIFO & r) noexcept : OneWay (), ring(r) { } -unsigned int ws2812b::Send (uint8_t * const ptr, const unsigned int len, const bool low) { +unsigned int ws2812b::Send (uint8_t * const ptr, const unsigned int len) { uint32_t cmd; while (ring.Read(cmd)) { const Entry ne (cmd); diff --git a/V203R6/ws2812b/ws2812b.h b/V203F6P6/ws2812b/ws2812b.h similarity index 67% rename from V203R6/ws2812b/ws2812b.h rename to V203F6P6/ws2812b/ws2812b.h index 0783bec..d416838 100644 --- a/V203R6/ws2812b/ws2812b.h +++ b/V203F6P6/ws2812b/ws2812b.h @@ -27,25 +27,25 @@ union Entry { uint32_t number; explicit Entry (const uint32_t e) noexcept { number = e; } }; -/***************************************************************************/ -static constexpr unsigned NUMLEDS = 8u; -/***************************************************************************/ +/*************************************************************************************/ +static constexpr unsigned NUMLEDS = 4u; +static constexpr unsigned FIFOLEN = 8u; // min. depth je 8, jinak mocnina 2 >= NUMLEDS +/*************************************************************************************/ /** @class ws2812b * @brief Driver pro WS2812B * On ten driver je trochu divný. Běží nad SPI s použitím pinu MOSI, 1 bit barvy * jsou 3 bity SPI. Funguje to tak, že SPI běží přes DMA v cirkulárním módu, tedy - * pořád, v 1. polovině si vybere z fronty ring data a uloží je do buferu ve správném - * tvaru, 2. polovina dělá "reset", tedy časování rámce (vysílá nuly). + * pořád, v 1. části dělá "reset", tedy časování rámce (vysílá nuly). + * V 2. části si vybere z fronty ring data a uloží je do buferu ve správném + * tvaru. Využívá se toho, že přerušení přijde až na konci a naplnění daty + * netrvá dlouho, takže se přepisuje jen část, která se nevysílá. * Fronta byla použita (celkem zbytečně) protože zatím netuším jaká data posílat. - * To, že celá 2. polovina je zabrána pro reset je také volovina, ale ničemu to nevadí - * a je to jednoduché. Šlo by dát reset na začátek a v přerušení na konci do buferu - * nasypat data - nebude to trvat tak dlouho aby DMA už začalo posílat data pro LED. * */ class ws2812b : public OneWay { - FIFO & ring; + FIFO & ring; public: - explicit ws2812b (FIFO & r) noexcept; - unsigned int Send (uint8_t * const ptr, const unsigned int len, const bool low = false) override; + explicit ws2812b (FIFO & r) noexcept; + unsigned int Send (uint8_t * const ptr, const unsigned int len) override; protected: }; diff --git a/V203R6/ws2812b/linux/graph.so b/V203R6/ws2812b/linux/graph.so deleted file mode 100755 index daf957263ef53a24a247a569172de223d86f6349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16648 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