From e344cac0acaab9a26b6900bd308e5c4752a65684 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Sat, 28 Mar 2026 22:36:27 -0700 Subject: [PATCH 01/21] add vendor bootloader for ch32v103 --- vendor/README.md | 14 +++++++++++--- vendor/ch32v103-system-flash-1.bin | Bin 0 -> 2048 bytes vendor/ch32v103-system-flash-2.bin | Bin 0 -> 1792 bytes 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 vendor/ch32v103-system-flash-1.bin create mode 100644 vendor/ch32v103-system-flash-2.bin diff --git a/vendor/README.md b/vendor/README.md index 2116aa5..1c77fdd 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -5,12 +5,20 @@ overwritten system flash and need to recover. ## Files -| File | Chip | Address | Size | -| --------------------------- | ------------ | ------------ | ---------- | -| `ch32v003-system-flash.bin` | CH32V003F4P6 | `0x1FFFF000` | 1920 bytes | +| File | Chip | Address | Size | +| ----------------------------- | ------------ | ------------ | ---------- | +| `ch32v003-system-flash.bin` | CH32V003 | `0x1FFFF000` | 1920 bytes | +| `ch32v006-system-flash.bin` | CH32V006 | `0x1FFFF000` | 3328 bytes | +| `ch32v103-system-flash-1.bin` | CH32V103 | `0x1FFFF000` | 2048 bytes | +| `ch32v103-system-flash-2.bin` | CH32V103 | `0x1FFFF900` | 1792 bytes | ## Restoring ```sh wlink flash vendor/ch32v003-system-flash.bin --address 0x1FFFF000 +wlink flash vendor/ch32v006-system-flash.bin --address 0x1FFFF000 + +# CH32V103 has split system flash regions, so we need to flash each region separately. +wlink flash vendor/ch32v103-system-flash-1.bin --address 0x1FFFF000 +wlink flash vendor/ch32v103-system-flash-2.bin --address 0x1FFFF900 ``` diff --git a/vendor/ch32v103-system-flash-1.bin b/vendor/ch32v103-system-flash-1.bin new file mode 100644 index 0000000000000000000000000000000000000000..4580d9f84076988b8a8ee804f435c9e3bcc535ec GIT binary patch literal 2048 zcmb7FZ){sv6+iFqb;`Oly=u*%o4r1ofToSAUSs;Dvg;0P2*Qh42f-3tV!TzCQXY3Ns1kNBa1mN zDFX2Ui7Wlyz31HX@1A?keZ%1W{_skr1vrMm`}{D#^UnHz4U}JZ_J>!(59i81hF2~l z!Uzwd@(I$2Fv5eVe2g?AjPM{TO{5WFga=V+AdLt&{@X9^ui<_j_Yq-)2T`dZjR+$= zh|1rQMuZU_MCAd}h%mx~sH`H52(J#qj)VW{BPJ`R4RO_%s)N=`z(?w!6A9*F(PBDI zlxV6r*7;7~E%Enze|PHU=^J^L@Ds9>ST(pF88mqiwfwMGxIqq&a=mWkM1Zr4W8I@4 z5lR}u;Zb_7(SAub6U8xQdFfe`s3Y6R;oP1O<=<}67i#VClqCXmred<0Oh$vf1$`d4 z9<-|qpwQ_9IuS^9%--N`2D6qJ>A5ZE<2Bw)cJH*h*nmH`{O$*{lvuBoXFqtq{Jw_1 z9|WX$f|t}9uh}u<+eh;;o?mrKu^NBm_+S>m-C zEst`({)AR~9nbLs+|K+esf>~*EIh@xUhc$G{_BK3*CJFOq}DcLJC=ma_>Q?SqJr&a z1hM*Pb6uAuebu0Re|vOV*eB_Xv3;g4Q~pkSb;G{*xa=Fe%TDxab6JC8-nNIBqXluE zHQik>mE&&tp^*AB+Vz9)mcU3!CVMp_F?E<4)9h|2h!OT`CXe)}>>~{pxutHn`ijKf zhQi<)+nM8JKRns{bVlM9!I!F`wFv9*p3dZ95j{AT(E?is&JJeHRM9w+%cCqK7m`b$ zl|(#C_p45QRX=NQ{Izf?eQ7IpW9?7ppTdlIX_}}s(UCLLB&PN7a7w@SlzA=<*{Z;| zZ4>zF?&n&u=}pPn8e^u2idB*>zILsbn~NFR9QKOX!w3S6*4rg`8>GbR20fdCLw|EB z*16H@p80j>COdjfUFS}Xo;>8#Bi5AH6iGTuoG!{I7=w~jnkzXrMbJf`@D5hTG;o+% zL6j0jK@sK69 znl$2u@!4`HnkmmZoW{ndyQ7)$&GmX~Yh6ZuY;#?n^^?mmZab1L7(h9zmkn@NM3qJe zBTe2_txmLjghslU@f(g_5%q8{P=4sc;q5`qEpNa$HpWBd?g&)>C~lNPXMXHRqCS*o z<0{kPRFp+_gY&XDFU*OO^S(TH9W!k(@Tt4ra&pgIkzdrmYbNV0dRm6)D@Vj&oC@9` z_9-ZjO}We^j1D{U;6BW&OOsQ))@$*m-Do*oqfD$l@)g-4P53zDCtt@dS$f1TvjMG( zsOFLllDDBQ!+y8rhXCgD(W~F_^UJ@LCYP>Thag}ke)^Wbj|tGv>~Q(-!yU@=E@^TC zw83qv*&u9ocHv8!J(R7EMOxAqF7UT4DnKx(DW9KWsR;ebE*mgDR=3)|XYL{l6~z8x zOxbnC;c{?0=2>Z4;Ti<^I DF&r2W literal 0 HcmV?d00001 diff --git a/vendor/ch32v103-system-flash-2.bin b/vendor/ch32v103-system-flash-2.bin new file mode 100644 index 0000000000000000000000000000000000000000..d482e3dd2032af61c49cbed6fa74492f6e89e43d GIT binary patch literal 1792 zcma)7UrZE77@xiUGk1tRa6xRUiDf9X4QXl%xhG`rI2aEIxfrNtf)BVN`anusQ8Y2x zV>u|LEe8vDwn)@dQIaN&q}epq(zD1}QIj@pLHj^0>OKO^!m5GVnIja9G3h09Gv7Dg z_xt|O>Nz%vJs$^R(*`iT(f$v69x}0g@9x{cAaY8M`D1BU16Lzuy1;>|&d9h<xT z(fA}%7CX4KzLD^n70Qj2iFFu6#_0~Z$oPs>{g*2e%N!T1D;A+^T_o;0Hgi*i`WKOS zLWhZrqm*yJss#}O+a$RwAP7X_kTvx`k!-78JdZ|jmY&9Qr)G|3UlGQJTHb0|l_t^c zrSa0p?JtZx;7#-TrDQ2PR9g@zPb>FtOWr1iIHo>7P?=Wg_b2-aW&5BYP@Puo4ZATQ1e(KPzae%&Tnh=TbePH@~Smueu?SOZDLKg6F*( z{V&_k+#S3qWqOxu)9rOL&58>%lDY#bngwn5r`Rg2h>i2kXZYOxDG%=sqIH8xv%;hb zw=!>JUoX8@G4``dgAKf#K5wrt)Zo`ia>~5DxKM15^$oS4)>C~|t|+(whI%y9bk-Ci z<^ss>)eg)%8K2k^>r-(WkOy-3%Y|}UFE=wgb4TR;e2q)wPbT?Xj4$X_TZ`$JOFwLBe4^LA|8TV?UV>p9-@xB;lHKb-e0^P-$fr^)2wWA4Z|#k zcMSD-9MRw)pk9bO9ZZeR7Mm>Z@Hn;xP3o^mtxJWsJNs|x8N|vU zR+bK478*OzX+xn@Xs^~PbW|m1on(*rl!JN>x2-*TGFiZ3XG|;X#jL$F04+RqP5`U0~XN8uJu4hJ~lNUBA0OftB&2b~OdFURC6V&geQB8J@2%PP*3*f_znp#64d zlrg1tOzS^4jO?7}w-MS0v0>U@M1q^{fOiP?89GlWnRdw;8kZBTH9h+;QHo^CPC3hw z5(zSE)8Pk`E0fiGNwhLRdOXT-v?m?+JU?Ny#`I7GA5~VgM3qpbm505 z^v#<5ak4B#-rmXaL`D=SZNbr2gS-T>0TiLTyASmn($O7sYBpgMG^A({lCBHekYbQM X Date: Sun, 29 Mar 2026 02:09:54 -0700 Subject: [PATCH 02/21] add hardware design for software controlled boot0 pin --- docs/boot-ctl-flip-flop.png | Bin 0 -> 176889 bytes docs/boot-ctl-rc.png | Bin 0 -> 82234 bytes docs/boot-ctl.md | 73 ++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 docs/boot-ctl-flip-flop.png create mode 100644 docs/boot-ctl-rc.png create mode 100644 docs/boot-ctl.md diff --git a/docs/boot-ctl-flip-flop.png b/docs/boot-ctl-flip-flop.png new file mode 100644 index 0000000000000000000000000000000000000000..82846125c56cd8995256bd1ffbde3a84bd3babbc GIT binary patch literal 176889 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�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∈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 literal 0 HcmV?d00001 diff --git a/docs/boot-ctl-rc.png b/docs/boot-ctl-rc.png new file mode 100644 index 0000000000000000000000000000000000000000..00001169ca59da346f1ca7c3749a18ad2c40925a GIT binary patch literal 82234 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 x3N}(%{v2 Date: Sun, 29 Mar 2026 02:14:14 -0700 Subject: [PATCH 03/21] add notes about GPIO controlled boot mode selection --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 769a5cc..a8d2591 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Rust bootloader for resource-constrained microcontrollers. Fits in the CH32V003' ## Chip Compatibility -tinyboot currently supports **UART / RS-485** transport. The table below tracks chip support status. +tinyboot currently supports **UART / RS-485** transport. The table below tracks chip support status. Chips with hardware boot pins (e.g. BOOT0/BOOT1) require a small external circuit to allow firmware-controlled boot mode switching. Please see [GPIO-Controlled Boot Mode Selection](docs/boot-ctl.md) document for more information. ✅ Verified | ❓ Untested (same die, likely works — volunteer needed) | 📋 Planned From 17fcf690d85a0f46eca302748e358b34f34e77bc Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:13:14 -0700 Subject: [PATCH 04/21] Implement GPIO based boot selection. --- ch32/app/src/lib.rs | 24 ++++-- ch32/boot/src/lib.rs | 17 ++-- ch32/boot/src/platform/boot_ctl.rs | 43 ++++------ ch32/boot/src/platform/mod.rs | 1 + ch32/hal/build.rs | 43 ++++++++-- ch32/hal/src/boot_request.rs | 93 +++++++++++++++++++-- ch32/hal/src/flash/v0.rs | 2 +- ch32/hal/src/lib.rs | 1 - ch32/hal/{tb-user-flash.x => tb-boot-req.x} | 5 +- examples/ch32/v003/app/build.rs | 2 +- examples/ch32/v003/app/src/main.rs | 2 +- examples/ch32/v003/boot/build.rs | 5 +- examples/ch32/v003/boot/src/main.rs | 2 +- 13 files changed, 176 insertions(+), 64 deletions(-) rename ch32/hal/{tb-user-flash.x => tb-boot-req.x} (69%) diff --git a/ch32/app/src/lib.rs b/ch32/app/src/lib.rs index d130fd8..d728b67 100644 --- a/ch32/app/src/lib.rs +++ b/ch32/app/src/lib.rs @@ -2,12 +2,14 @@ use tinyboot::traits::BootState; use tinyboot::traits::app::BootClient as TBBootClient; -use tinyboot_ch32_hal::{flash, iwdg, pfic}; +use tinyboot_ch32_hal::{boot_request, flash, iwdg, pfic}; // Re-exports so apps only need this one crate. +pub use boot_request::Config as BootCtlConfig; pub use tinyboot::app::{App, AppConfig}; pub use tinyboot::traits::app as traits; pub use tinyboot::{app_version, pkg_version}; +pub use tinyboot_ch32_hal::Pin; #[doc(hidden)] pub use qingke; @@ -48,9 +50,11 @@ macro_rules! fix_mtvec { } /// CH32 boot client implementation. -pub struct Ch32BootClient; +pub struct BootClient { + config: boot_request::Config, +} -impl TBBootClient for Ch32BootClient { +impl TBBootClient for BootClient { fn confirm(&mut self) { critical_section::with(|_| { let addr = flash::meta_addr(); @@ -72,11 +76,12 @@ impl TBBootClient for Ch32BootClient { fn request_update(&mut self) { critical_section::with(|_| { - #[cfg(feature = "system-flash")] - flash::set_boot_mode(true); - #[cfg(not(feature = "system-flash"))] - tinyboot_ch32_hal::boot_request::set_boot_request(true); + boot_request::set_boot_request(&self.config, true); }); + // Allow time for external boot mode circuit (RC) to settle. + for _ in 0..8000u16 { + core::hint::spin_loop(); + } } fn system_reset(&mut self) -> ! { @@ -88,7 +93,8 @@ impl TBBootClient for Ch32BootClient { /// /// Reads boot version from `__tb_boot_version_addr`, app capacity from /// `__tb_app_capacity`, and erase size from `flash::PAGE_SIZE`. -pub fn new_app() -> App { +pub fn new_app(boot_ctl: boot_request::Config) -> App { + boot_request::init(&boot_ctl); unsafe extern "C" { static __tb_boot_version_addr: u8; static __tb_app_capacity: u8; @@ -102,6 +108,6 @@ pub fn new_app() -> App { boot_version: unsafe { boot_ver_addr.read_volatile() }, app_version: tinyboot::tinyboot_version(), }, - Ch32BootClient, + BootClient { config: boot_ctl }, ) } diff --git a/ch32/boot/src/lib.rs b/ch32/boot/src/lib.rs index e4ab853..e10180d 100644 --- a/ch32/boot/src/lib.rs +++ b/ch32/boot/src/lib.rs @@ -13,7 +13,8 @@ pub mod platform; mod rt; pub use platform::{ - BaudRate, BootCtl, BootMetaStore, Duplex, Storage, TxEnConfig, Usart, UsartConfig, + BaudRate, BootCtl, BootCtlConfig, BootMetaStore, Duplex, Storage, TxEnConfig, Usart, + UsartConfig, }; // Re-exports so boot examples only need this one crate. @@ -24,23 +25,25 @@ pub use tinyboot_ch32_hal::{Pin, UsartMapping}; /// Common imports for bootloader binaries. pub mod prelude { - pub use crate::{BaudRate, Duplex, Pin, Pull, TxEnConfig, Usart, UsartConfig, UsartMapping}; + pub use crate::{ + BaudRate, BootCtlConfig, Duplex, Pin, Pull, TxEnConfig, Usart, UsartConfig, UsartMapping, + }; } /// Protocol write buffer size (2 × page size). -const PROTOCOL_BUF_SIZE: usize = 2 * tinyboot_ch32_hal::flash::PAGE_SIZE; +pub const PAGE_SIZE: usize = tinyboot_ch32_hal::flash::PAGE_SIZE; -/// Run the bootloader with the given transport. +/// Run the bootloader with the given transport and boot control config. /// /// Sets up storage, boot metadata, and boot control from linker symbols, /// then enters the boot state machine. Does not return. #[inline(always)] -pub fn run(transport: impl tinyboot::traits::boot::Transport) -> ! { +pub fn run(transport: impl tinyboot::traits::boot::Transport, config: BootCtlConfig) -> ! { let platform = Platform::new( transport, Storage::default(), BootMetaStore::default(), - BootCtl::default(), + BootCtl::new(config), ); - tinyboot::Core::<_, _, _, _, PROTOCOL_BUF_SIZE>::new(platform).run() + tinyboot::Core::<_, _, _, _, { 2 * PAGE_SIZE }>::new(platform).run() } diff --git a/ch32/boot/src/platform/boot_ctl.rs b/ch32/boot/src/platform/boot_ctl.rs index 336dcc6..4b07c47 100644 --- a/ch32/boot/src/platform/boot_ctl.rs +++ b/ch32/boot/src/platform/boot_ctl.rs @@ -1,21 +1,24 @@ use tinyboot::traits::BootMode; use tinyboot::traits::boot::BootCtl as TBBootCtl; -use tinyboot_ch32_hal::pfic; +use tinyboot_ch32_hal::{boot_request, pfic}; /// CH32 boot control (reset, boot mode selection). /// /// In user-flash mode, caches the app entry point from `__tb_app_entry` linker symbol. pub struct BootCtl { + config: boot_request::Config, #[cfg(not(feature = "system-flash"))] app_entry: u32, } -impl Default for BootCtl { - /// In user-flash mode, reads `__tb_app_entry` linker symbol for the app entry point. +impl BootCtl { + /// Create boot control with the given boot request configuration. #[inline(always)] - fn default() -> Self { + pub fn new(config: boot_request::Config) -> Self { + boot_request::init(&config); Self { + config, #[cfg(not(feature = "system-flash"))] app_entry: { unsafe extern "C" { @@ -29,33 +32,23 @@ impl Default for BootCtl { impl TBBootCtl for BootCtl { fn is_boot_requested(&self) -> bool { - #[cfg(feature = "system-flash")] - { - tinyboot_ch32_hal::flash::is_boot_mode() - } - #[cfg(not(feature = "system-flash"))] - { - tinyboot_ch32_hal::boot_request::is_boot_requested() - } + boot_request::is_boot_requested() } fn system_reset(&mut self, mode: BootMode) -> ! { let bootloader = mode == BootMode::Bootloader; - #[cfg(feature = "system-flash")] - { - tinyboot_ch32_hal::flash::set_boot_mode(bootloader); - pfic::system_reset() + boot_request::set_boot_request(&self.config, bootloader); + // Allow time for external boot mode circuit (RC) to settle + // before triggering reset. ~1ms at 8MHz = 8000 iterations. + for _ in 0..8000u16 { + core::hint::spin_loop(); } #[cfg(not(feature = "system-flash"))] - { - tinyboot_ch32_hal::boot_request::set_boot_request(bootloader); - if bootloader { - pfic::system_reset() - } else { - tinyboot_ch32_hal::flash::lock(); - tinyboot_ch32_hal::rcc::reset_apb2(); - pfic::jump(self.app_entry) - } + if !bootloader { + tinyboot_ch32_hal::flash::lock(); + tinyboot_ch32_hal::rcc::reset_apb2(); + pfic::jump(self.app_entry) } + pfic::system_reset() } } diff --git a/ch32/boot/src/platform/mod.rs b/ch32/boot/src/platform/mod.rs index 75febc0..b75a2b8 100644 --- a/ch32/boot/src/platform/mod.rs +++ b/ch32/boot/src/platform/mod.rs @@ -6,6 +6,7 @@ mod transport; pub use boot_ctl::BootCtl; pub use boot_state::BootMetaStore; pub use storage::Storage; +pub use tinyboot_ch32_hal::boot_request::Config as BootCtlConfig; pub use tinyboot_ch32_hal::gpio::Pull; pub use tinyboot_ch32_hal::{Pin, UsartMapping}; pub use transport::usart::{BaudRate, Duplex, TxEnConfig, Usart, UsartConfig}; diff --git a/ch32/hal/build.rs b/ch32/hal/build.rs index 376f565..95ace50 100644 --- a/ch32/hal/build.rs +++ b/ch32/hal/build.rs @@ -23,15 +23,48 @@ fn main() -> Result<(), Box> { } } cfgs.dedup(); + + // Chips with a hardware BOOT0 pin (e.g. CH32V103) need an external circuit + // (RC or flip-flop) to select boot source. Chips without (e.g. CH32V003) + // have a BOOT_MODE register instead. + let boot_pin = !cfgs.iter().any(|c| c == "flash_v0"); + println!("cargo::rustc-check-cfg=cfg(boot_pin)"); + if boot_pin { + println!("cargo:rustc-cfg=boot_pin"); + cfgs.push("boot_pin".to_string()); + } + + // Boot request scheme cfgs — which mechanisms are active: + // boot_req_reg: BOOT_MODE register (system-flash, no boot_pin) + // boot_req_ram: RAM magic word (user-flash OR boot_pin) + // boot_req_gpio: GPIO pin drive (system-flash + boot_pin) + // Note: ram and gpio are both set for system-flash + boot_pin. + let system_flash = env::var("CARGO_FEATURE_SYSTEM_FLASH").is_ok(); + for name in ["boot_req_reg", "boot_req_ram", "boot_req_gpio"] { + println!("cargo::rustc-check-cfg=cfg({name})"); + } + if system_flash && !boot_pin { + println!("cargo:rustc-cfg=boot_req_reg"); + cfgs.push("boot_req_reg".to_string()); + } + if !system_flash || boot_pin { + println!("cargo:rustc-cfg=boot_req_ram"); + cfgs.push("boot_req_ram".to_string()); + } + if system_flash && boot_pin { + println!("cargo:rustc-cfg=boot_req_gpio"); + cfgs.push("boot_req_gpio".to_string()); + } + println!("cargo:cfgs={}", cfgs.join(",")); generate_pin_and_usart_mapping(out)?; - #[cfg(not(feature = "system-flash"))] - { - fs::copy("tb-user-flash.x", out.join("tb-user-flash.x"))?; - println!("cargo:rerun-if-changed=tb-user-flash.x"); - } + // Boot request RAM magic word linker script. + // Always copied (4 bytes NOLOAD — unused by reg scheme but avoids + // conditional complexity in downstream build scripts). + fs::copy("tb-boot-req.x", out.join("tb-boot-req.x"))?; + println!("cargo:rerun-if-changed=tb-boot-req.x"); println!("cargo:rustc-link-search={}", out.display()); println!("cargo:rerun-if-changed=build.rs"); diff --git a/ch32/hal/src/boot_request.rs b/ch32/hal/src/boot_request.rs index 04cca46..005273d 100644 --- a/ch32/hal/src/boot_request.rs +++ b/ch32/hal/src/boot_request.rs @@ -1,14 +1,93 @@ -const BOOT_REQUEST_MAGIC: u32 = 0xB007_CAFE; +//! Boot request signaling and boot mode selection. +//! +//! Three schemes selected automatically by chip capabilities and flash mode: +//! +//! - **reg**: `BOOT_MODE` register (system-flash, chips without `boot_pin`) +//! - **ram**: RAM magic word (user-flash, all chips) +//! - **gpio**: RAM magic word + GPIO pin (system-flash, chips with `boot_pin`) +//! +//! Scheme cfgs (`boot_req_reg`, `boot_req_ram`, `boot_req_gpio`) are set by +//! the build script. `ram` and `gpio` are both active for system-flash + boot_pin. -unsafe extern "C" { - static mut __tb_boot_request: u32; +// ── Configuration ────────────────────────────────────────────────────── + +/// Boot control hardware configuration. +/// +/// For the gpio scheme (system-flash on chips with `boot_pin`), this +/// configures the GPIO pin connected to the BOOT0 control circuit. +/// For all other schemes, no hardware configuration is needed. +#[cfg(boot_req_gpio)] +#[derive(Copy, Clone)] +pub struct Config { + /// GPIO pin connected to the BOOT0 control circuit. + pub pin: crate::Pin, + /// `true` if driving HIGH selects system flash (default for RC circuit). + pub active_high: bool, +} + +/// Boot control hardware configuration (no-op for reg and ram schemes). +#[cfg(not(boot_req_gpio))] +#[derive(Copy, Clone, Default)] +pub struct Config; + +// ── Public API ───────────────────────────────────────────────────────── + +/// Initialize boot control hardware. Call once at startup. +/// +/// For the gpio scheme, configures the BOOT_CTL pin as push-pull output +/// and defaults it to the system-flash direction. For other schemes this +/// is a no-op. +pub fn init(_config: &Config) { + #[cfg(boot_req_gpio)] + { + use crate::gpio::{self, PinMode}; + crate::rcc::enable_gpio(_config.pin.port_index()); + gpio::configure(_config.pin, PinMode::OUTPUT_PUSH_PULL); + drive_boot_pin(_config.pin, _config.active_high, true); + } } +/// Check whether a boot-to-bootloader request is pending. pub fn is_boot_requested() -> bool { - unsafe { core::ptr::read_volatile(&raw const __tb_boot_request) == BOOT_REQUEST_MAGIC } + #[cfg(boot_req_reg)] + return crate::flash::boot_mode(); + + #[cfg(boot_req_ram)] + return unsafe { core::ptr::read_volatile(&raw const __tb_boot_request) == BOOT_REQUEST_MAGIC }; +} + +/// Signal (or clear) boot intent for the next reset. +pub fn set_boot_request(_config: &Config, request: bool) { + #[cfg(boot_req_reg)] + crate::flash::set_boot_mode(request); + + #[cfg(boot_req_ram)] + { + let val = if request { BOOT_REQUEST_MAGIC } else { 0 }; + unsafe { core::ptr::write_volatile(&raw mut __tb_boot_request, val) }; + } + + #[cfg(boot_req_gpio)] + drive_boot_pin(_config.pin, _config.active_high, request); +} + +// ── Private ──────────────────────────────────────────────────────────── + +#[cfg(boot_req_ram)] +const BOOT_REQUEST_MAGIC: u32 = 0xB007_CAFE; + +#[cfg(boot_req_ram)] +unsafe extern "C" { + static mut __tb_boot_request: u32; } -pub fn set_boot_request(request: bool) { - let val = if request { BOOT_REQUEST_MAGIC } else { 0 }; - unsafe { core::ptr::write_volatile(&raw mut __tb_boot_request, val) }; +#[cfg(boot_req_gpio)] +fn drive_boot_pin(pin: crate::Pin, active_high: bool, system_flash: bool) { + use crate::gpio::{self, Level}; + let level = if active_high == system_flash { + Level::High + } else { + Level::Low + }; + gpio::set_level(pin, level); } diff --git a/ch32/hal/src/flash/v0.rs b/ch32/hal/src/flash/v0.rs index f0b2852..8ee0c58 100644 --- a/ch32/hal/src/flash/v0.rs +++ b/ch32/hal/src/flash/v0.rs @@ -112,7 +112,7 @@ pub fn write(addr: u32, data: &[u8]) { FLASH.ctlr().write(|_| {}); } -pub fn is_boot_mode() -> bool { +pub fn boot_mode() -> bool { FLASH.statr().read().boot_mode() } diff --git a/ch32/hal/src/lib.rs b/ch32/hal/src/lib.rs index 00f813b..de34ad2 100644 --- a/ch32/hal/src/lib.rs +++ b/ch32/hal/src/lib.rs @@ -24,5 +24,4 @@ pub mod pfic; pub mod rcc; pub mod usart; -#[cfg(not(feature = "system-flash"))] pub mod boot_request; diff --git a/ch32/hal/tb-user-flash.x b/ch32/hal/tb-boot-req.x similarity index 69% rename from ch32/hal/tb-user-flash.x rename to ch32/hal/tb-boot-req.x index 306c774..2c43733 100644 --- a/ch32/hal/tb-user-flash.x +++ b/ch32/hal/tb-boot-req.x @@ -1,8 +1,9 @@ -/* User-flash boot request word. +/* Boot request magic word. * * Reserves 4 bytes at the start of RAM (NOLOAD, preserved across * soft resets). Both bootloader and app must link this script. - * Add -Ttb-user-flash.x to linker flags. */ + * Used by the ram and gpio boot control schemes. + * Add -Ttb-boot-req.x to linker flags. */ SECTIONS { .boot_request ORIGIN(RAM) (NOLOAD) : diff --git a/examples/ch32/v003/app/build.rs b/examples/ch32/v003/app/build.rs index f35d966..fd7c6bf 100644 --- a/examples/ch32/v003/app/build.rs +++ b/examples/ch32/v003/app/build.rs @@ -22,10 +22,10 @@ fn main() { println!("cargo:rustc-link-search={out_dir}"); println!("cargo:rerun-if-changed=memory_x"); println!("cargo:rustc-link-arg=-Ttb-app.x"); + println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); println!("cargo:rustc-link-arg=-Tdefmt.x"); if user_flash { - println!("cargo:rustc-link-arg=-Ttb-user-flash.x"); println!("cargo:rustc-link-arg=--wrap=_setup_interrupts"); } } diff --git a/examples/ch32/v003/app/src/main.rs b/examples/ch32/v003/app/src/main.rs index d37f98b..cc955ed 100644 --- a/examples/ch32/v003/app/src/main.rs +++ b/examples/ch32/v003/app/src/main.rs @@ -66,7 +66,7 @@ fn main() -> ! { let mut tx = transport::Tx(tx); // Tinyboot app client - let mut app = tinyboot_ch32_app::new_app(); + let mut app = tinyboot_ch32_app::new_app(tinyboot_ch32_app::BootCtlConfig); app.confirm(); defmt::info!("Boot confirmed, app ready."); diff --git a/examples/ch32/v003/boot/build.rs b/examples/ch32/v003/boot/build.rs index bcc7d1b..0fcd839 100644 --- a/examples/ch32/v003/boot/build.rs +++ b/examples/ch32/v003/boot/build.rs @@ -22,10 +22,7 @@ fn main() { println!("cargo:rustc-link-search={out_dir}"); println!("cargo:rerun-if-changed=memory_x"); println!("cargo:rustc-link-arg=-Ttb-boot.x"); - - if user_flash { - println!("cargo:rustc-link-arg=-Ttb-user-flash.x"); - } + println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); } fn cfg_has(key: &str) -> bool { diff --git a/examples/ch32/v003/boot/src/main.rs b/examples/ch32/v003/boot/src/main.rs index d3fe607..bf8802f 100644 --- a/examples/ch32/v003/boot/src/main.rs +++ b/examples/ch32/v003/boot/src/main.rs @@ -40,5 +40,5 @@ fn main() -> ! { rx_pull: Pull::None, tx_en: None, }); - tinyboot_ch32_boot::run(transport); + tinyboot_ch32_boot::run(transport, BootCtlConfig); } From 2140a8eeb159955fb737d767c3bc887a42eda83f Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:18:05 -0700 Subject: [PATCH 05/21] Implement v103 flash hal. --- ch32/boot/build.rs | 1 - ch32/boot/src/lib.rs | 1 + ch32/hal/build.rs | 1 - ch32/hal/src/flash/mod.rs | 1 + ch32/hal/src/flash/v1.rs | 122 ++++++++++++++++++++++++++++++++++++++ ch32/hal/src/lib.rs | 1 + 6 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 ch32/hal/src/flash/v1.rs diff --git a/ch32/boot/build.rs b/ch32/boot/build.rs index 5082901..38fd57f 100644 --- a/ch32/boot/build.rs +++ b/ch32/boot/build.rs @@ -4,7 +4,6 @@ fn main() { // Re-emit peripheral cfgs from tinyboot-ch32-hal (exposed via its `links` metadata). if let Ok(cfgs) = std::env::var("DEP_TINYBOOT_CH32_HAL_CFGS") { for cfg in cfgs.split(',').filter(|s| !s.is_empty()) { - println!("cargo::rustc-check-cfg=cfg({cfg})"); println!("cargo:rustc-cfg={cfg}"); } } diff --git a/ch32/boot/src/lib.rs b/ch32/boot/src/lib.rs index e10180d..931fe76 100644 --- a/ch32/boot/src/lib.rs +++ b/ch32/boot/src/lib.rs @@ -1,5 +1,6 @@ #![no_std] #![warn(missing_docs)] +#![allow(unexpected_cfgs)] //! CH32 bootloader platform implementation. //! diff --git a/ch32/hal/build.rs b/ch32/hal/build.rs index 95ace50..9939c2f 100644 --- a/ch32/hal/build.rs +++ b/ch32/hal/build.rs @@ -17,7 +17,6 @@ fn main() -> Result<(), Box> { for p in METADATA.peripherals { if let Some(regs) = &p.registers { let cfg = format!("{}_{}", regs.kind, regs.version); - println!("cargo::rustc-check-cfg=cfg({cfg})"); println!("cargo:rustc-cfg={cfg}"); cfgs.push(cfg); } diff --git a/ch32/hal/src/flash/mod.rs b/ch32/hal/src/flash/mod.rs index 9fd72ab..fc0de50 100644 --- a/ch32/hal/src/flash/mod.rs +++ b/ch32/hal/src/flash/mod.rs @@ -1,4 +1,5 @@ #[cfg_attr(flash_v0, path = "v0.rs")] +#[cfg_attr(flash_v1, path = "v1.rs")] mod family; pub use family::*; diff --git a/ch32/hal/src/flash/v1.rs b/ch32/hal/src/flash/v1.rs new file mode 100644 index 0000000..5aa778a --- /dev/null +++ b/ch32/hal/src/flash/v1.rs @@ -0,0 +1,122 @@ +const KEY1: u32 = 0x4567_0123; +const KEY2: u32 = 0xCDEF_89AB; +const FLASH: ch32_metapac::flash::Flash = ch32_metapac::FLASH; + +#[inline(always)] +fn wait_busy() { + while FLASH.statr().read().bsy() {} + debug_assert!( + !FLASH.statr().read().wrprterr(), + "flash write protection error" + ); + // RM: clear EOP flag (W1C) after every BUFRST, BUFLOAD, and STRT. + FLASH.statr().write(|w| w.set_eop(true)); +} + +/// Unlock flash controller (KEYR + MODEKEYR). +pub fn unlock() { + FLASH.keyr().write(|w| w.set_keyr(KEY1)); + FLASH.keyr().write(|w| w.set_keyr(KEY2)); + FLASH.modekeyr().write(|w| w.set_modekeyr(KEY1)); + FLASH.modekeyr().write(|w| w.set_modekeyr(KEY2)); +} + +/// Lock flash controller. +#[inline(always)] +pub fn lock() { + FLASH.ctlr().write(|w| { + w.set_lock(true); + w.set_flock(true); + }); +} + +/// Flash page size in bytes (erase and fast-write granularity). +pub const PAGE_SIZE: usize = 128; + +/// Fast-write buffer load size in bytes. +const BUF_LOAD_SIZE: usize = 16; + +// --- User flash (fast page erase/write) --- + +/// Erase a single 128-byte page at `addr` (RM §24.4.7). +pub fn erase(addr: u32) { + // Step 4: set FTER + FLASH.ctlr().write(|w| { + w.set_fter(true); + }); + // Step 5: write page address + FLASH.addr().write(|w| w.set_far(addr)); + // Step 6: set STRT + FLASH.ctlr().write(|w| { + w.set_fter(true); + w.set_strt(true); + }); + // Step 7: wait BSY, clear EOP + wait_busy(); + // Clear FTER + FLASH.ctlr().write(|_| {}); +} + +/// Write `data` to flash at `addr` (RM §24.4.6). +/// +/// Must not cross a page boundary. `addr` must be 4-byte aligned. +/// Trailing bytes are padded to the next BUF_LOAD_SIZE boundary with 0xFF. +pub fn write(addr: u32, data: &[u8]) { + let page_base = addr & !(PAGE_SIZE as u32 - 1); + debug_assert!((addr as usize & 3) == 0, "write: addr not word-aligned"); + debug_assert!( + addr + data.len() as u32 <= page_base + PAGE_SIZE as u32, + "write: crosses page boundary" + ); + + // Step 4: set FTPG alone + FLASH.ctlr().write(|w| { + w.set_ftpg(true); + }); + // Step 5: set BUFRST (with FTPG still set) + FLASH.ctlr().write(|w| { + w.set_ftpg(true); + w.set_bufrst(true); + }); + // Step 6: wait BSY, clear EOP + wait_busy(); + + // Steps 7-9: load 16-byte groups into buffer (8 groups × 16 bytes = 128 bytes). + // Each group: write 4 words, then BUFLOAD. + let load_len = (data.len() + BUF_LOAD_SIZE - 1) & !(BUF_LOAD_SIZE - 1); + let mut buf_addr = addr; + let mut pos = 0; + while pos < load_len { + // Build word byte-by-byte; 0xFF fills bytes past data end. + let mut buf = [0xFFu8; 4]; + let mut j = 0; + while j < 4 && pos + j < data.len() { + buf[j] = data[pos + j]; + j += 1; + } + unsafe { core::ptr::write_volatile(buf_addr as *mut u32, u32::from_le_bytes(buf)) }; + buf_addr += 4; + pos += 4; + + // Step 8: BUFLOAD after each 16-byte group + if pos % BUF_LOAD_SIZE == 0 { + FLASH.ctlr().write(|w| { + w.set_ftpg(true); + w.set_bufload(true); + }); + wait_busy(); + } + } + + // Step 10: write page address + FLASH.addr().write(|w| w.set_far(page_base)); + // Step 11: set STRT + FLASH.ctlr().write(|w| { + w.set_ftpg(true); + w.set_strt(true); + }); + // Step 12: wait BSY, clear EOP + wait_busy(); + // Step 14: clear FTPG + FLASH.ctlr().write(|_| {}); +} diff --git a/ch32/hal/src/lib.rs b/ch32/hal/src/lib.rs index de34ad2..74067bb 100644 --- a/ch32/hal/src/lib.rs +++ b/ch32/hal/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +#![allow(unexpected_cfgs)] #[cfg(not(any( feature = "ch32v003f4p6", From ed4feb43d5e7ba9f0703454c15a25a8a2e51d36e Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:22:31 -0700 Subject: [PATCH 06/21] generalize UART HAL API --- ch32/boot/src/platform/transport/usart/mod.rs | 46 +++++++++++-------- ch32/hal/build.rs | 13 ++++++ ch32/hal/src/afio/v0.rs | 15 ++++-- ch32/hal/src/rcc/v0.rs | 20 ++++++-- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/ch32/boot/src/platform/transport/usart/mod.rs b/ch32/boot/src/platform/transport/usart/mod.rs index d6d0834..f618f5c 100644 --- a/ch32/boot/src/platform/transport/usart/mod.rs +++ b/ch32/boot/src/platform/transport/usart/mod.rs @@ -74,23 +74,26 @@ impl Usart { pub fn new(config: &UsartConfig) -> Self { let tx_pin = config.mapping.tx_pin(); let rx_pin = config.mapping.rx_pin(); - let remap = config.mapping.remap_value(); let regs = config.mapping.regs(); let half_duplex = matches!(config.duplex, Duplex::Half); - // Batch-enable GPIO port(s), AFIO, and USART1 clocks + let usart_n = config.mapping.peripheral_index(); + + // Batch-enable GPIO port(s), AFIO, and USART clocks rcc::enable_apb2( (1 << (2 + tx_pin.port_index())) | (1 << (2 + rx_pin.port_index())) - | 1 // AFIO (bit 0) - | (1 << 14), // USART1 (bit 14) + | 1 // AFIO + | rcc::usart_apb2_bit(usart_n), ); - - // Set pin remap if non-default - if remap != 0 { - afio::set_usart1_remap(remap); + // Enable USART on APB1 if not on APB2 (e.g. USART2/3) + if rcc::usart_apb2_bit(usart_n) == 0 { + rcc::enable_usart(usart_n); } + // Set pin remap + afio::set_usart_remap(usart_n, config.mapping.remap_value()); + // Configure pins gpio::configure(tx_pin, PinMode::AF_PUSH_PULL); if !half_duplex { @@ -101,11 +104,12 @@ impl Usart { if let Some(ref tx_en) = config.tx_en { rcc::enable_gpio(tx_en.pin.port_index()); gpio::configure(tx_en.pin, PinMode::OUTPUT_PUSH_PULL); - if tx_en.active_high { - gpio::set_low(tx_en.pin); + let rx_level = if tx_en.active_high { + gpio::Level::Low } else { - gpio::set_high(tx_en.pin); - } + gpio::Level::High + }; + gpio::set_level(tx_en.pin, rx_level); } // Initialize USART @@ -120,22 +124,24 @@ impl Usart { #[inline(always)] fn set_tx_mode(&self) { if let Some(ref tx_en) = self.tx_en { - if tx_en.active_high { - gpio::set_high(tx_en.pin); + let level = if tx_en.active_high { + gpio::Level::High } else { - gpio::set_low(tx_en.pin); - } + gpio::Level::Low + }; + gpio::set_level(tx_en.pin, level); } } #[inline(always)] fn set_rx_mode(&self) { if let Some(ref tx_en) = self.tx_en { - if tx_en.active_high { - gpio::set_low(tx_en.pin); + let level = if tx_en.active_high { + gpio::Level::Low } else { - gpio::set_high(tx_en.pin); - } + gpio::Level::High + }; + gpio::set_level(tx_en.pin, level); } } } diff --git a/ch32/hal/build.rs b/ch32/hal/build.rs index 9939c2f..63a6b12 100644 --- a/ch32/hal/build.rs +++ b/ch32/hal/build.rs @@ -237,6 +237,19 @@ fn generate_pin_and_usart_mapping(out: &Path) -> Result<(), Box> { } writeln!(code, " }}")?; writeln!(code, " }}")?; + writeln!(code)?; + + // peripheral_index() — USART peripheral number (1, 2, 3, ...) + writeln!(code, " pub const fn peripheral_index(self) -> u8 {{")?; + writeln!(code, " match self {{")?; + for (peri, remap) in groups.keys() { + let variant = format!("{}Remap{}", capitalize_peripheral(peri), remap); + // Extract trailing digits from e.g. "USART1" → 1 + let index: String = peri.chars().filter(|c| c.is_ascii_digit()).collect(); + writeln!(code, " UsartMapping::{variant} => {index},")?; + } + writeln!(code, " }}")?; + writeln!(code, " }}")?; writeln!(code, "}}")?; diff --git a/ch32/hal/src/afio/v0.rs b/ch32/hal/src/afio/v0.rs index fcc60c8..acbe047 100644 --- a/ch32/hal/src/afio/v0.rs +++ b/ch32/hal/src/afio/v0.rs @@ -1,7 +1,12 @@ #[inline(always)] -pub fn set_usart1_remap(remap: u8) { - ch32_metapac::AFIO.pcfr1().write(|w| { - w.set_usart1_rm(remap & 1 != 0); - w.set_usart1_rm1(remap & 2 != 0); - }); +pub fn set_usart_remap(n: u8, remap: u8) { + if remap == 0 { + return; + } + if n == 1 { + ch32_metapac::AFIO.pcfr1().write(|w| { + w.set_usart1_rm(remap & 1 != 0); + w.set_usart1_rm1(remap & 2 != 0); + }); + } } diff --git a/ch32/hal/src/rcc/v0.rs b/ch32/hal/src/rcc/v0.rs index 3be08fe..bc39617 100644 --- a/ch32/hal/src/rcc/v0.rs +++ b/ch32/hal/src/rcc/v0.rs @@ -9,10 +9,22 @@ pub fn enable_afio() { ch32_metapac::RCC.apb2pcenr().modify(|w| w.set_afioen(true)); } -pub fn enable_usart1() { - ch32_metapac::RCC - .apb2pcenr() - .modify(|w| w.set_usart1en(true)); +const USART1EN: u32 = 1 << 14; + +/// APB2 enable bit for USART `n`, or 0 if not on APB2. +pub const fn usart_apb2_bit(n: u8) -> u32 { + match n { + 1 => USART1EN, + _ => 0, + } +} + +/// Enable USART `n` clock on whichever bus it lives on. +pub fn enable_usart(n: u8) { + let bit = usart_apb2_bit(n); + if bit != 0 { + ch32_metapac::RCC.apb2pcenr().modify(|w| w.0 |= bit); + } } /// Batch-enable APB2 peripherals in a single write. From 95f5cb7e6faae72edfee9d86d4c583bc7d4c4611 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:23:32 -0700 Subject: [PATCH 07/21] add gpio hal --- ch32/hal/src/gpio/mod.rs | 1 + ch32/hal/src/gpio/v0.rs | 26 ++++++----- ch32/hal/src/gpio/v3.rs | 95 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 ch32/hal/src/gpio/v3.rs diff --git a/ch32/hal/src/gpio/mod.rs b/ch32/hal/src/gpio/mod.rs index cd1a8d4..45c9ba8 100644 --- a/ch32/hal/src/gpio/mod.rs +++ b/ch32/hal/src/gpio/mod.rs @@ -1,4 +1,5 @@ #[cfg_attr(gpio_v0, path = "v0.rs")] +#[cfg_attr(gpio_v3, path = "v3.rs")] mod family; pub use family::*; diff --git a/ch32/hal/src/gpio/v0.rs b/ch32/hal/src/gpio/v0.rs index 586d109..dd6b317 100644 --- a/ch32/hal/src/gpio/v0.rs +++ b/ch32/hal/src/gpio/v0.rs @@ -9,6 +9,12 @@ pub enum Pull { Down, } +#[derive(Copy, Clone, PartialEq)] +pub enum Level { + Low, + High, +} + /// GPIO pin configuration. /// /// Encodes the 4-bit CFGLR field `[MODE(2) | CNF(2)]` directly. @@ -55,14 +61,14 @@ pub fn configure(pin: Pin, mode: PinMode) { } } -pub fn set_high(pin: Pin) { - pin.gpio_regs() - .bshr() - .write(|w| w.0 = 1 << pin.pin_number()); -} - -pub fn set_low(pin: Pin) { - pin.gpio_regs().bcr().write(|w| w.0 = 1 << pin.pin_number()); +pub fn set_level(pin: Pin, level: Level) { + if level == Level::High { + pin.gpio_regs() + .bshr() + .write(|w| w.0 = 1 << pin.pin_number()); + } else { + pin.gpio_regs().bcr().write(|w| w.0 = 1 << pin.pin_number()); + } } impl embedded_hal::digital::ErrorType for Pin { @@ -71,12 +77,12 @@ impl embedded_hal::digital::ErrorType for Pin { impl embedded_hal::digital::OutputPin for Pin { fn set_high(&mut self) -> Result<(), Self::Error> { - set_high(*self); + set_level(*self, Level::High); Ok(()) } fn set_low(&mut self) -> Result<(), Self::Error> { - set_low(*self); + set_level(*self, Level::Low); Ok(()) } } diff --git a/ch32/hal/src/gpio/v3.rs b/ch32/hal/src/gpio/v3.rs new file mode 100644 index 0000000..da59ce6 --- /dev/null +++ b/ch32/hal/src/gpio/v3.rs @@ -0,0 +1,95 @@ +use core::convert::Infallible; + +use crate::Pin; + +#[derive(Copy, Clone)] +pub enum Pull { + None, + Up, + Down, +} + +#[derive(Copy, Clone, PartialEq)] +pub enum Level { + Low, + High, +} + +/// GPIO pin configuration. +/// +/// Encodes the 4-bit CFGLR/CFGHR field `[MODE(2) | CNF(2)]` directly. +/// Bit 7 = set ODR high, bit 6 = set ODR low, bits 3:0 = CFG nibble. +#[derive(Copy, Clone)] +pub struct PinMode(u8); + +// MODE bits: INPUT=0b00, OUTPUT_10MHZ=0b01 +// CNF bits (shifted <<2): ANALOG/PP=0b0000, FLOAT/OD=0b0100, PULL/AF_PP=0b1000, AF_OD=0b1100 +impl PinMode { + pub const INPUT_FLOATING: Self = Self(0b0100); // MODE=00 CNF=01 + pub const INPUT_PULL_UP: Self = Self(0b1000 | 0x80); // MODE=00 CNF=10, ODR=1 + pub const INPUT_PULL_DOWN: Self = Self(0b1000 | 0x40); // MODE=00 CNF=10, ODR=0 + pub const OUTPUT_PUSH_PULL: Self = Self(0b0001); // MODE=01 CNF=00 + pub const OUTPUT_OPEN_DRAIN: Self = Self(0b0101); // MODE=01 CNF=01 + pub const AF_PUSH_PULL: Self = Self(0b1001); // MODE=01 CNF=10 + pub const AF_OPEN_DRAIN: Self = Self(0b1101); // MODE=01 CNF=11 + + pub fn input_pull(pull: Pull) -> Self { + match pull { + Pull::Up => Self::INPUT_PULL_UP, + Pull::Down => Self::INPUT_PULL_DOWN, + Pull::None => Self::INPUT_FLOATING, + } + } +} + +#[inline(always)] +pub fn configure(pin: Pin, mode: PinMode) { + let regs = pin.gpio_regs(); + let n = pin.pin_number(); + + let shift = (n % 8) * 4; + let mask = !(0xFu32 << shift); + let bits = ((mode.0 & 0x0F) as u32) << shift; + + if n < 8 { + let prev = regs.cfglr().read().0; + regs.cfglr() + .write_value(ch32_metapac::gpio::regs::Cfglr(prev & mask | bits)); + } else { + let prev = regs.cfghr().read().0; + regs.cfghr() + .write_value(ch32_metapac::gpio::regs::Cfghr(prev & mask | bits)); + } + + if mode.0 & 0xC0 != 0 { + let mut outdr = regs.outdr().read(); + outdr.set_odr(n, mode.0 & 0x80 != 0); + regs.outdr().write_value(outdr); + } +} + +pub fn set_level(pin: Pin, level: Level) { + if level == Level::High { + pin.gpio_regs() + .bshr() + .write(|w| w.0 = 1 << pin.pin_number()); + } else { + pin.gpio_regs().bcr().write(|w| w.0 = 1 << pin.pin_number()); + } +} + +impl embedded_hal::digital::ErrorType for Pin { + type Error = Infallible; +} + +impl embedded_hal::digital::OutputPin for Pin { + fn set_high(&mut self) -> Result<(), Self::Error> { + set_level(*self, Level::High); + Ok(()) + } + + fn set_low(&mut self) -> Result<(), Self::Error> { + set_level(*self, Level::Low); + Ok(()) + } +} From 208eb2b4c1fbdd1f4c27b7f250c548e0b8b92dab Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:23:55 -0700 Subject: [PATCH 08/21] add afio hal --- ch32/hal/src/afio/mod.rs | 1 + ch32/hal/src/afio/v3.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 ch32/hal/src/afio/v3.rs diff --git a/ch32/hal/src/afio/mod.rs b/ch32/hal/src/afio/mod.rs index f834b22..91caad9 100644 --- a/ch32/hal/src/afio/mod.rs +++ b/ch32/hal/src/afio/mod.rs @@ -1,4 +1,5 @@ #[cfg_attr(afio_v0, path = "v0.rs")] +#[cfg_attr(afio_v3, path = "v3.rs")] mod family; pub use family::*; diff --git a/ch32/hal/src/afio/v3.rs b/ch32/hal/src/afio/v3.rs new file mode 100644 index 0000000..27aebd6 --- /dev/null +++ b/ch32/hal/src/afio/v3.rs @@ -0,0 +1,18 @@ +#[inline(always)] +pub fn set_usart_remap(n: u8, remap: u8) { + if remap == 0 { + return; + } + match n { + 1 => ch32_metapac::AFIO + .pcfr1() + .modify(|w| w.set_usart1_rm(remap & 1 != 0)), + 2 => ch32_metapac::AFIO + .pcfr1() + .modify(|w| w.set_usart2_rm(remap & 1 != 0)), + 3 => ch32_metapac::AFIO + .pcfr1() + .modify(|w| w.set_usart3_rm(remap)), + _ => {} + } +} From 1e9b17dfd6b4f4c004bec2f304bab2eb597ca29d Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:24:29 -0700 Subject: [PATCH 09/21] add rcc hal --- ch32/hal/src/rcc/mod.rs | 1 + ch32/hal/src/rcc/v1.rs | 53 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 ch32/hal/src/rcc/v1.rs diff --git a/ch32/hal/src/rcc/mod.rs b/ch32/hal/src/rcc/mod.rs index 8d362cc..4f63518 100644 --- a/ch32/hal/src/rcc/mod.rs +++ b/ch32/hal/src/rcc/mod.rs @@ -1,4 +1,5 @@ #[cfg_attr(rcc_v0, path = "v0.rs")] +#[cfg_attr(rcc_v1, path = "v1.rs")] mod family; pub use family::*; diff --git a/ch32/hal/src/rcc/v1.rs b/ch32/hal/src/rcc/v1.rs new file mode 100644 index 0000000..89fcebe --- /dev/null +++ b/ch32/hal/src/rcc/v1.rs @@ -0,0 +1,53 @@ +pub fn enable_gpio(port_index: usize) { + // IOPxEN bits are consecutive starting at bit 2: IOPA=2, IOPB=3, IOPC=4, IOPD=5. + ch32_metapac::RCC + .apb2pcenr() + .modify(|w| w.0 |= 1 << (2 + port_index)); +} + +pub fn enable_afio() { + ch32_metapac::RCC.apb2pcenr().modify(|w| w.set_afioen(true)); +} + +const USART1EN: u32 = 1 << 14; + +/// APB2 enable bit for USART `n`, or 0 if not on APB2. +pub const fn usart_apb2_bit(n: u8) -> u32 { + match n { + 1 => USART1EN, + _ => 0, + } +} + +/// Enable USART `n` clock on whichever bus it lives on. +pub fn enable_usart(n: u8) { + let bit = usart_apb2_bit(n); + if bit != 0 { + ch32_metapac::RCC.apb2pcenr().modify(|w| w.0 |= bit); + } else { + let rcc = ch32_metapac::RCC; + match n { + 2 => rcc.apb1pcenr().modify(|w| w.set_usart2en(true)), + 3 => rcc.apb1pcenr().modify(|w| w.set_usart3en(true)), + _ => {} + } + } +} + +/// Batch-enable APB2 peripherals in a single write. +/// Only safe at init before other peripherals are enabled. +#[inline(always)] +pub fn enable_apb2(bits: u32) { + ch32_metapac::RCC.apb2pcenr().write(|w| w.0 = bits); +} + +/// Pulse-reset all APB2 peripherals (USART1, GPIO, AFIO, etc.) +/// then disable their clocks — restores power-on default state. +#[inline(always)] +pub fn reset_apb2() { + let rcc = ch32_metapac::RCC; + let enabled = rcc.apb2pcenr().read().0; + rcc.apb2prstr().write(|w| w.0 = enabled); + rcc.apb2prstr().write(|w| w.0 = 0); + rcc.apb2pcenr().write(|w| w.0 = 0); +} From 611792daf7acdfd8e3e430bad54d29cdc6b4bc91 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:24:57 -0700 Subject: [PATCH 10/21] add pfic hal --- ch32/hal/src/pfic/mod.rs | 1 + ch32/hal/src/pfic/rv3.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 ch32/hal/src/pfic/rv3.rs diff --git a/ch32/hal/src/pfic/mod.rs b/ch32/hal/src/pfic/mod.rs index 5067ca9..eb956f8 100644 --- a/ch32/hal/src/pfic/mod.rs +++ b/ch32/hal/src/pfic/mod.rs @@ -1,4 +1,5 @@ #[cfg_attr(pfic_rv2, path = "rv2.rs")] +#[cfg_attr(pfic_rv3, path = "rv3.rs")] mod family; pub use family::*; diff --git a/ch32/hal/src/pfic/rv3.rs b/ch32/hal/src/pfic/rv3.rs new file mode 100644 index 0000000..f70e68a --- /dev/null +++ b/ch32/hal/src/pfic/rv3.rs @@ -0,0 +1,19 @@ +/// Jump to an absolute address. Does not return. +pub fn jump(addr: u32) -> ! { + let f: unsafe extern "C" fn() -> ! = unsafe { core::mem::transmute(addr as usize) }; + unsafe { f() } +} + +pub fn system_reset() -> ! { + use ch32_metapac::pfic::vals::{Keycode, Sysreset}; + + // Clear reset status flags (RMVF) — required for boot mode transition + ch32_metapac::RCC.rstsckr().write(|w| w.0 = 1 << 24); + ch32_metapac::PFIC.cfgr().write(|w| { + w.set_keycode(Keycode(0xBEEF)); + w.set_sysreset(Sysreset::RESET); + }); + loop { + core::hint::spin_loop(); + } +} From fd1eb4c3cb1a1d2c1c09cacfa9c6886e86eb7c38 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:49:10 -0700 Subject: [PATCH 11/21] Implement rt for v103 --- ch32/boot/src/rt/mod.rs | 3 +++ ch32/boot/src/rt/v3.S | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 ch32/boot/src/rt/v3.S diff --git a/ch32/boot/src/rt/mod.rs b/ch32/boot/src/rt/mod.rs index 66ca07b..25ee58a 100644 --- a/ch32/boot/src/rt/mod.rs +++ b/ch32/boot/src/rt/mod.rs @@ -1,2 +1,5 @@ #[cfg(pfic_rv2)] core::arch::global_asm!(include_str!("v2.S")); + +#[cfg(pfic_rv3)] +core::arch::global_asm!(include_str!("v3.S")); diff --git a/ch32/boot/src/rt/v3.S b/ch32/boot/src/rt/v3.S new file mode 100644 index 0000000..8fd4422 --- /dev/null +++ b/ch32/boot/src/rt/v3.S @@ -0,0 +1,28 @@ + # ========================================================================= + # Minimal bootloader runtime for system-flash builds (QingKe V3). + # + # Omits .data copy, .bss zeroing, and interrupt vector table to save + # space — critical when the bootloader must fit in 2048 bytes. + # + # Safe because the system-flash bootloader: + # - Has no initialized statics (no .data) + # - Has no zero-init statics (no .bss) + # - Never enables interrupts (polling only) + # - Only runs from power-on reset (SRAM is undefined anyway) + # + # User-flash builds should use the full qingke-rt runtime which + # includes .data/.bss init for defmt-rtt and system-reset safety. + # ========================================================================= + + .section .init, "ax" + .global _start + .align 2 + +_start: + .option push + .option norelax + la gp, __global_pointer$ + .option pop + + la sp, _stack_top + j main From 43df1a09cd682fa5d4436998caf54b0e637886a0 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:49:56 -0700 Subject: [PATCH 12/21] add ch32v103 variant feature flags. --- ch32/app/Cargo.toml | 4 ++++ ch32/boot/Cargo.toml | 4 ++++ ch32/hal/Cargo.toml | 4 ++++ ch32/hal/src/lib.rs | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/ch32/app/Cargo.toml b/ch32/app/Cargo.toml index 4fbb12b..04ed60a 100644 --- a/ch32/app/Cargo.toml +++ b/ch32/app/Cargo.toml @@ -23,4 +23,8 @@ ch32v003f4p6 = ["tinyboot-ch32-hal/ch32v003f4p6"] ch32v003a4m6 = ["tinyboot-ch32-hal/ch32v003a4m6"] ch32v003f4u6 = ["tinyboot-ch32-hal/ch32v003f4u6"] ch32v003j4m6 = ["tinyboot-ch32-hal/ch32v003j4m6"] +ch32v103c6t6 = ["tinyboot-ch32-hal/ch32v103c6t6"] +ch32v103c8t6 = ["tinyboot-ch32-hal/ch32v103c8t6"] +ch32v103c8u6 = ["tinyboot-ch32-hal/ch32v103c8u6"] +ch32v103r8t6 = ["tinyboot-ch32-hal/ch32v103r8t6"] system-flash = ["tinyboot-ch32-hal/system-flash"] diff --git a/ch32/boot/Cargo.toml b/ch32/boot/Cargo.toml index d12f52a..a84dd61 100644 --- a/ch32/boot/Cargo.toml +++ b/ch32/boot/Cargo.toml @@ -21,5 +21,9 @@ ch32v003f4p6 = ["tinyboot-ch32-hal/ch32v003f4p6"] ch32v003a4m6 = ["tinyboot-ch32-hal/ch32v003a4m6"] ch32v003f4u6 = ["tinyboot-ch32-hal/ch32v003f4u6"] ch32v003j4m6 = ["tinyboot-ch32-hal/ch32v003j4m6"] +ch32v103c6t6 = ["tinyboot-ch32-hal/ch32v103c6t6"] +ch32v103c8t6 = ["tinyboot-ch32-hal/ch32v103c8t6"] +ch32v103c8u6 = ["tinyboot-ch32-hal/ch32v103c8u6"] +ch32v103r8t6 = ["tinyboot-ch32-hal/ch32v103r8t6"] rt = [] system-flash = ["tinyboot-ch32-hal/system-flash"] diff --git a/ch32/hal/Cargo.toml b/ch32/hal/Cargo.toml index 155b956..92a492a 100644 --- a/ch32/hal/Cargo.toml +++ b/ch32/hal/Cargo.toml @@ -28,6 +28,10 @@ ch32v003f4p6 = ["ch32-metapac/ch32v003f4p6"] ch32v003a4m6 = ["ch32-metapac/ch32v003a4m6"] ch32v003f4u6 = ["ch32-metapac/ch32v003f4u6"] ch32v003j4m6 = ["ch32-metapac/ch32v003j4m6"] +ch32v103c6t6 = ["ch32-metapac/ch32v103c6t6"] +ch32v103c8t6 = ["ch32-metapac/ch32v103c8t6"] +ch32v103c8u6 = ["ch32-metapac/ch32v103c8u6"] +ch32v103r8t6 = ["ch32-metapac/ch32v103r8t6"] # Bootloader runs from system flash (uses BOOT_MODE register for boot request). # When disabled, bootloader runs from user flash (uses RAM magic word for boot request). diff --git a/ch32/hal/src/lib.rs b/ch32/hal/src/lib.rs index 74067bb..3dd6fde 100644 --- a/ch32/hal/src/lib.rs +++ b/ch32/hal/src/lib.rs @@ -6,6 +6,10 @@ feature = "ch32v003a4m6", feature = "ch32v003f4u6", feature = "ch32v003j4m6", + feature = "ch32v103c6t6", + feature = "ch32v103c8t6", + feature = "ch32v103c8u6", + feature = "ch32v103r8t6", )))] compile_error!( "No chip variant selected. Enable a chip feature, e.g.: \ From ce43592149a56fd957142642957f5124e65d5aff Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 11:50:12 -0700 Subject: [PATCH 13/21] copy and update examples --- examples/ch32/v103/.cargo/config.toml | 13 + examples/ch32/v103/Cargo.lock | 705 ++++++++++++++++++ examples/ch32/v103/Cargo.toml | 19 + examples/ch32/v103/app/Cargo.toml | 22 + examples/ch32/v103/app/build.rs | 35 + .../ch32/v103/app/memory_x/system-flash.x | 28 + examples/ch32/v103/app/memory_x/user-flash.x | 33 + examples/ch32/v103/app/src/main.rs | 96 +++ examples/ch32/v103/app/src/transport.rs | 40 + examples/ch32/v103/boot/Cargo.toml | 17 + examples/ch32/v103/boot/build.rs | 30 + .../ch32/v103/boot/memory_x/system-flash.x | 23 + examples/ch32/v103/boot/memory_x/user-flash.x | 22 + examples/ch32/v103/boot/src/main.rs | 50 ++ examples/ch32/v103/rust-toolchain.toml | 3 + 15 files changed, 1136 insertions(+) create mode 100644 examples/ch32/v103/.cargo/config.toml create mode 100644 examples/ch32/v103/Cargo.lock create mode 100644 examples/ch32/v103/Cargo.toml create mode 100644 examples/ch32/v103/app/Cargo.toml create mode 100644 examples/ch32/v103/app/build.rs create mode 100644 examples/ch32/v103/app/memory_x/system-flash.x create mode 100644 examples/ch32/v103/app/memory_x/user-flash.x create mode 100644 examples/ch32/v103/app/src/main.rs create mode 100644 examples/ch32/v103/app/src/transport.rs create mode 100644 examples/ch32/v103/boot/Cargo.toml create mode 100644 examples/ch32/v103/boot/build.rs create mode 100644 examples/ch32/v103/boot/memory_x/system-flash.x create mode 100644 examples/ch32/v103/boot/memory_x/user-flash.x create mode 100644 examples/ch32/v103/boot/src/main.rs create mode 100644 examples/ch32/v103/rust-toolchain.toml diff --git a/examples/ch32/v103/.cargo/config.toml b/examples/ch32/v103/.cargo/config.toml new file mode 100644 index 0000000..9569bd5 --- /dev/null +++ b/examples/ch32/v103/.cargo/config.toml @@ -0,0 +1,13 @@ +[build] +target = "riscv32imc-unknown-none-elf" + +[target.riscv32imc-unknown-none-elf] +rustflags = [ + "-C", "link-arg=-Tlink.x", + "-C", "link-arg=--nmagic", +] +runner = "probe-rs run --chip CH32V103" + +[env] +DEFMT_LOG = "trace" +DEFMT_RTT_BUFFER_SIZE = "128" diff --git a/examples/ch32/v103/Cargo.lock b/examples/ch32/v103/Cargo.lock new file mode 100644 index 0000000..87c8dba --- /dev/null +++ b/examples/ch32/v103/Cargo.lock @@ -0,0 +1,705 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "app" +version = "3.2.1" +dependencies = [ + "ch32-hal", + "critical-section", + "defmt", + "defmt-rtt", + "embedded-io 0.7.1", + "qingke-rt", + "tinyboot-ch32-app", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitmaps" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" + +[[package]] +name = "boot" +version = "1.2.3" +dependencies = [ + "panic-halt", + "tinyboot-ch32-boot", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "ch32-hal" +version = "0.1.0" +source = "git+https://github.com/ch32-rs/ch32-hal#2ed4f3cab40f42b81d7355f1632ae4cb9ad4d5f1" +dependencies = [ + "bitmaps", + "ch32-metapac 0.1.0", + "critical-section", + "embassy-futures", + "embassy-hal-internal", + "embassy-sync", + "embassy-usb-driver", + "embedded-can", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-storage", + "futures", + "nb 1.1.0", + "proc-macro2", + "qingke", + "qingke-rt", + "quote", + "rand_core", + "sdio-host", +] + +[[package]] +name = "ch32-metapac" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc8e84ea6d10960c6018df65845a5dfa87dfefbc3bb9f058b6ed2a24fec1db6" +dependencies = [ + "riscv 0.11.1", + "vcell", +] + +[[package]] +name = "ch32-metapac" +version = "0.1.0" +source = "git+https://github.com/ch32-rs/ch32-metapac?rev=7cd6fb70d07de3a987c63d0d8f5547bb8261e403#7cd6fb70d07de3a987c63d0d8f5547bb8261e403" +dependencies = [ + "riscv 0.12.1", + "vcell", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "defmt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" +dependencies = [ + "bitflags", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "defmt-rtt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" +dependencies = [ + "critical-section", + "defmt", +] + +[[package]] +name = "embassy-futures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" + +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + +[[package]] +name = "embassy-sync" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73974a3edbd0bd286759b3d483540f0ebef705919a5f56f4fc7709066f71689b" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async 0.6.1", + "futures-core", + "futures-sink", + "heapless", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" +dependencies = [ + "embedded-io-async 0.6.1", +] + +[[package]] +name = "embedded-can" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" +dependencies = [ + "embedded-hal 1.0.0", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" +dependencies = [ + "embedded-hal 1.0.0", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb1aa714776b75c7e67e1da744b81a129b3ff919c8712b5e1b32252c1f07cc7" + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io 0.6.1", +] + +[[package]] +name = "embedded-io-async" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564b9f813c544241430e147d8bc454815ef9ac998878d30cc3055449f7fd4c0" +dependencies = [ + "embedded-io 0.7.1", +] + +[[package]] +name = "embedded-storage" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "panic-halt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qingke" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10318bf64fc0befbcd09d7a9a62d8b99972ba3dfdd4a94695f63fd892f47e14e" +dependencies = [ + "bit_field", + "cfg-if", + "critical-section", + "riscv 0.15.0", +] + +[[package]] +name = "qingke-rt" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8ba56c91dd9a044bd519778bcf70644d1d936fee4ea20fdc2d0e3bac8f75fb9" +dependencies = [ + "qingke", + "qingke-rt-macros", +] + +[[package]] +name = "qingke-rt-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54edcd0e9b8b5c3c83d313c93869325bfcd969d30d9cef1a1015b0970b21be81" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "riscv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5c1b8bf41ea746266cdee443d1d1e9125c86ce1447e1a2615abd34330d33a9" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", +] + +[[package]] +name = "riscv" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", + "paste", + "riscv-macros 0.1.0", + "riscv-pac", +] + +[[package]] +name = "riscv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05cfa3f7b30c84536a9025150d44d26b8e1cc20ddf436448d74cd9591eefb25" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", + "paste", + "riscv-macros 0.3.0", + "riscv-pac", +] + +[[package]] +name = "riscv-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "riscv-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d323d13972c1b104aa036bc692cd08b822c8bbf23d79a27c526095856499799" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "riscv-pac" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436" + +[[package]] +name = "sdio-host" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93c025f9cfe4c388c328ece47d11a54a823da3b5ad0370b22d95ad47137f85a" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tinyboot-ch32-app" +version = "0.2.1" +dependencies = [ + "critical-section", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", + "qingke", + "tinyboot-ch32-hal", + "tinyboot-core", + "tinyboot-protocol", +] + +[[package]] +name = "tinyboot-ch32-boot" +version = "0.2.1" +dependencies = [ + "embedded-io 0.7.1", + "embedded-storage", + "tinyboot-ch32-hal", + "tinyboot-core", + "tinyboot-protocol", +] + +[[package]] +name = "tinyboot-ch32-hal" +version = "0.2.1" +dependencies = [ + "ch32-metapac 0.0.6", + "critical-section", + "embedded-hal 1.0.0", + "embedded-io 0.7.1", + "embedded-storage", +] + +[[package]] +name = "tinyboot-core" +version = "0.2.1" +dependencies = [ + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", + "embedded-storage", + "tinyboot-protocol", +] + +[[package]] +name = "tinyboot-protocol" +version = "0.2.1" +dependencies = [ + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" diff --git a/examples/ch32/v103/Cargo.toml b/examples/ch32/v103/Cargo.toml new file mode 100644 index 0000000..31184b2 --- /dev/null +++ b/examples/ch32/v103/Cargo.toml @@ -0,0 +1,19 @@ +[workspace] +members = ["boot", "app"] +resolver = "2" + +[workspace.package] +edition = "2024" + +[profile.dev] +opt-level = "z" +lto = true +codegen-units = 1 +debug = 2 +debug-assertions = false + +[profile.release] +opt-level = "z" +lto = true +codegen-units = 1 +panic = "abort" diff --git a/examples/ch32/v103/app/Cargo.toml b/examples/ch32/v103/app/Cargo.toml new file mode 100644 index 0000000..37210e9 --- /dev/null +++ b/examples/ch32/v103/app/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "app" +version = "3.2.1" +edition.workspace = true + +[dependencies] +tinyboot-ch32-app = { path = "../../../../ch32/app", default-features = false } +embedded-io = "0.7" +critical-section = "1" +ch32-hal = { git = "https://github.com/ch32-rs/ch32-hal", default-features = false } +qingke-rt = { version = "0.6", features = ["v3"] } +defmt = "1.0" +defmt-rtt = "1.1" + +[features] +default = ["ch32v103c8t6", "system-flash"] +system-flash = ["tinyboot-ch32-app/system-flash"] +user-flash = [] +ch32v103c6t6 = ["tinyboot-ch32-app/ch32v103c6t6", "ch32-hal/ch32v103c6t6", "ch32-hal/rt"] +ch32v103c8t6 = ["tinyboot-ch32-app/ch32v103c8t6", "ch32-hal/ch32v103c8t6", "ch32-hal/rt"] +ch32v103c8u6 = ["tinyboot-ch32-app/ch32v103c8u6", "ch32-hal/ch32v103c8u6", "ch32-hal/rt"] +ch32v103r8t6 = ["tinyboot-ch32-app/ch32v103r8t6", "ch32-hal/ch32v103r8t6", "ch32-hal/rt"] diff --git a/examples/ch32/v103/app/build.rs b/examples/ch32/v103/app/build.rs new file mode 100644 index 0000000..fd7c6bf --- /dev/null +++ b/examples/ch32/v103/app/build.rs @@ -0,0 +1,35 @@ +fn main() { + let system_flash = cfg_has("CARGO_FEATURE_SYSTEM_FLASH"); + let user_flash = cfg_has("CARGO_FEATURE_USER_FLASH"); + + match (system_flash, user_flash) { + (true, false) | (false, true) => {} + _ => panic!("Enable exactly one flash mode: `system-flash` or `user-flash`"), + } + + let flash_mode = if system_flash { + "system-flash" + } else { + "user-flash" + }; + + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let out_dir = std::env::var("OUT_DIR").unwrap(); + let src = format!("{manifest_dir}/memory_x/{flash_mode}.x"); + let dst = format!("{out_dir}/memory.x"); + std::fs::copy(&src, &dst).unwrap_or_else(|e| panic!("copy {src} -> {dst}: {e}")); + + println!("cargo:rustc-link-search={out_dir}"); + println!("cargo:rerun-if-changed=memory_x"); + println!("cargo:rustc-link-arg=-Ttb-app.x"); + println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); + println!("cargo:rustc-link-arg=-Tdefmt.x"); + + if user_flash { + println!("cargo:rustc-link-arg=--wrap=_setup_interrupts"); + } +} + +fn cfg_has(key: &str) -> bool { + std::env::var_os(key).is_some() +} diff --git a/examples/ch32/v103/app/memory_x/system-flash.x b/examples/ch32/v103/app/memory_x/system-flash.x new file mode 100644 index 0000000..7421240 --- /dev/null +++ b/examples/ch32/v103/app/memory_x/system-flash.x @@ -0,0 +1,28 @@ +/* CH32V103 application memory layout for system-flash bootloader. + * + * The application occupies all user flash minus the last page (boot metadata). + * The bootloader lives in the separate system flash region. + */ +MEMORY +{ + RAM : ORIGIN = 0x20000000, LENGTH = 20K + + /* Execution mirror of APP */ + CODE : ORIGIN = 0x00000000, LENGTH = 64K - 128 + + /* Physical flash addresses */ + BOOT : ORIGIN = 0x1FFFF000, LENGTH = 2048 + APP : ORIGIN = 0x08000000, LENGTH = 64K - 128 + META : ORIGIN = 0x08000000 + 64K - 128, LENGTH = 128 +} + +/* qingke-rt expects a FLASH region */ +REGION_ALIAS("FLASH", CODE); + +/* Region aliases required by qingke-rt */ +REGION_ALIAS("REGION_TEXT", CODE); +REGION_ALIAS("REGION_RODATA", CODE); +REGION_ALIAS("REGION_DATA", RAM); +REGION_ALIAS("REGION_BSS", RAM); +REGION_ALIAS("REGION_HEAP", RAM); +REGION_ALIAS("REGION_STACK", RAM); diff --git a/examples/ch32/v103/app/memory_x/user-flash.x b/examples/ch32/v103/app/memory_x/user-flash.x new file mode 100644 index 0000000..e4f743d --- /dev/null +++ b/examples/ch32/v103/app/memory_x/user-flash.x @@ -0,0 +1,33 @@ +/* CH32V103 application memory layout for user-flash bootloader. + * + * The application occupies user flash between the bootloader and + * boot metadata regions. + * + * Flash map: + * 0x0000_0000 .. 0x0000_1FFF bootloader 8KB + * 0x0000_2000 .. 0x0000_FF7F application 56KB - 128B + * 0x0000_FF80 .. 0x0000_FFFF boot meta 128B + */ +MEMORY +{ + RAM : ORIGIN = 0x20000000, LENGTH = 20K + + /* Execution mirror of APP */ + CODE : ORIGIN = 0x00000000 + 8K, LENGTH = 56K - 128 + + /* Physical flash addresses */ + BOOT : ORIGIN = 0x08000000, LENGTH = 8K + APP : ORIGIN = 0x08000000 + 8K, LENGTH = 56K - 128 + META : ORIGIN = 0x08000000 + 64K - 128, LENGTH = 128 +} + +/* qingke-rt expects a FLASH region */ +REGION_ALIAS("FLASH", CODE); + +/* Region aliases required by qingke-rt */ +REGION_ALIAS("REGION_TEXT", CODE); +REGION_ALIAS("REGION_RODATA", CODE); +REGION_ALIAS("REGION_DATA", RAM); +REGION_ALIAS("REGION_BSS", RAM); +REGION_ALIAS("REGION_HEAP", RAM); +REGION_ALIAS("REGION_STACK", RAM); diff --git a/examples/ch32/v103/app/src/main.rs b/examples/ch32/v103/app/src/main.rs new file mode 100644 index 0000000..12e030c --- /dev/null +++ b/examples/ch32/v103/app/src/main.rs @@ -0,0 +1,96 @@ +//! Example application for the tinyboot bootloader (CH32V103). +//! +//! - Timer interrupt blinks LED on PC13 every second +//! - Main loop listens on USART1 (TX=PA9, RX=PA10) for tinyboot commands, +//! reboots into bootloader on receipt of Reset command + +#![no_std] +#![no_main] + +mod transport; + +use core::cell::RefCell; + +use ch32_hal::gpio::{Level, Output}; +use ch32_hal::interrupt::InterruptExt; +use ch32_hal::pac; +use ch32_hal::time::Hertz; +use ch32_hal::timer::low_level::Timer; +use ch32_hal::usart::{self, Uart}; +use critical_section::Mutex; + +use defmt_rtt as _; + +#[cfg(feature = "user-flash")] +tinyboot_ch32_app::fix_mtvec!(); +tinyboot_ch32_app::app_version!(); + +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo) -> ! { + defmt::error!("panic"); + loop {} +} + +type Shared = Mutex>>; +static LED: Shared> = Mutex::new(RefCell::new(None)); + +#[qingke_rt::entry] +fn main() -> ! { + let p = ch32_hal::init(Default::default()); + + // LED blink via TIM2 interrupt (2 Hz toggle = 1 Hz blink) + critical_section::with(|cs| { + LED.borrow_ref_mut(cs) + .replace(Output::new(p.PC13, Level::Low, Default::default())); + }); + let tim = Timer::new(p.TIM2); + tim.set_frequency(Hertz::hz(2)); + tim.enable_update_interrupt(true); + tim.start(); + unsafe { ch32_hal::interrupt::TIM2.enable() }; + + // USART1 blocking — must match the bootloader's pin mapping. + // + // Remap options (CH32V103, ch32-hal generic param): + // 0 (Remap0): TX=PA9, RX=PA10 (default) + // 1 (Remap1): TX=PB6, RX=PB7 + let mut uart_config = usart::Config::default(); + uart_config.baudrate = 115200; + let uart = Uart::new_blocking::<0>(p.USART1, p.PA10, p.PA9, uart_config).unwrap(); + let (tx, rx) = uart.split(); + let mut rx = transport::Rx(rx); + let mut tx = transport::Tx(tx); + + // Tinyboot app client + #[cfg(feature = "system-flash")] + let mut app = tinyboot_ch32_app::new_app(tinyboot_ch32_app::BootCtlConfig { + pin: tinyboot_ch32_app::Pin::PB1, // adjust to your BOOT0 control pin + active_high: true, + }); + + #[cfg(not(feature = "system-flash"))] + let mut app = tinyboot_ch32_app::new_app(tinyboot_ch32_app::BootCtlConfig); + + app.confirm(); + + defmt::info!("Boot confirmed, app ready."); + + loop { + app.poll(&mut rx, &mut tx); + } +} + +#[qingke_rt::interrupt] +fn TIM2() { + pac::TIM2.intfr().modify(|w| w.set_uif(false)); + critical_section::with(|cs| { + if let Some(ref mut led) = *LED.borrow_ref_mut(cs) { + led.toggle(); + if led.is_set_high() { + defmt::info!("LED on"); + } else { + defmt::info!("LED off"); + } + } + }); +} diff --git a/examples/ch32/v103/app/src/transport.rs b/examples/ch32/v103/app/src/transport.rs new file mode 100644 index 0000000..1b08e54 --- /dev/null +++ b/examples/ch32/v103/app/src/transport.rs @@ -0,0 +1,40 @@ +//! embedded_io adapters for ch32-hal blocking UART. + +use ch32_hal::mode::Blocking; +use ch32_hal::usart::{Instance, UartRx, UartTx}; +use core::convert::Infallible; +use embedded_io::{ErrorType, Read, Write}; + +pub struct Rx<'d, T: Instance>(pub UartRx<'d, T, Blocking>); + +impl ErrorType for Rx<'_, T> { + type Error = Infallible; +} + +impl Read for Rx<'_, T> { + fn read(&mut self, buf: &mut [u8]) -> Result { + if buf.is_empty() { + return Ok(0); + } + let _ = self.0.blocking_read(&mut buf[..1]); + Ok(1) + } +} + +pub struct Tx<'d, T: Instance>(pub UartTx<'d, T, Blocking>); + +impl ErrorType for Tx<'_, T> { + type Error = Infallible; +} + +impl Write for Tx<'_, T> { + fn write(&mut self, buf: &[u8]) -> Result { + let _ = self.0.blocking_write(buf); + Ok(buf.len()) + } + + fn flush(&mut self) -> Result<(), Self::Error> { + let _ = self.0.blocking_flush(); + Ok(()) + } +} diff --git a/examples/ch32/v103/boot/Cargo.toml b/examples/ch32/v103/boot/Cargo.toml new file mode 100644 index 0000000..6ddf961 --- /dev/null +++ b/examples/ch32/v103/boot/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "boot" +version = "1.2.3" +edition.workspace = true + +[dependencies] +tinyboot-ch32-boot = { path = "../../../../ch32/boot", default-features = false } +panic-halt = "1.0" + +[features] +default = ["ch32v103c8t6", "system-flash"] +system-flash = ["tinyboot-ch32-boot/system-flash"] +user-flash = [] +ch32v103c6t6 = ["tinyboot-ch32-boot/ch32v103c6t6", "tinyboot-ch32-boot/rt"] +ch32v103c8t6 = ["tinyboot-ch32-boot/ch32v103c8t6", "tinyboot-ch32-boot/rt"] +ch32v103c8u6 = ["tinyboot-ch32-boot/ch32v103c8u6", "tinyboot-ch32-boot/rt"] +ch32v103r8t6 = ["tinyboot-ch32-boot/ch32v103r8t6", "tinyboot-ch32-boot/rt"] diff --git a/examples/ch32/v103/boot/build.rs b/examples/ch32/v103/boot/build.rs new file mode 100644 index 0000000..0fcd839 --- /dev/null +++ b/examples/ch32/v103/boot/build.rs @@ -0,0 +1,30 @@ +fn main() { + let system_flash = cfg_has("CARGO_FEATURE_SYSTEM_FLASH"); + let user_flash = cfg_has("CARGO_FEATURE_USER_FLASH"); + + match (system_flash, user_flash) { + (true, false) | (false, true) => {} + _ => panic!("Enable exactly one flash mode: `system-flash` or `user-flash`"), + } + + let flash_mode = if system_flash { + "system-flash" + } else { + "user-flash" + }; + + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let out_dir = std::env::var("OUT_DIR").unwrap(); + let src = format!("{manifest_dir}/memory_x/{flash_mode}.x"); + let dst = format!("{out_dir}/memory.x"); + std::fs::copy(&src, &dst).unwrap_or_else(|e| panic!("copy {src} -> {dst}: {e}")); + + println!("cargo:rustc-link-search={out_dir}"); + println!("cargo:rerun-if-changed=memory_x"); + println!("cargo:rustc-link-arg=-Ttb-boot.x"); + println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); +} + +fn cfg_has(key: &str) -> bool { + std::env::var_os(key).is_some() +} diff --git a/examples/ch32/v103/boot/memory_x/system-flash.x b/examples/ch32/v103/boot/memory_x/system-flash.x new file mode 100644 index 0000000..03728e4 --- /dev/null +++ b/examples/ch32/v103/boot/memory_x/system-flash.x @@ -0,0 +1,23 @@ +/* CH32V103 system-flash bootloader memory layout. + * + * The bootloader runs from the first 2048-byte system flash region. + * All 64KB of user flash is available for the application. + * Boot metadata occupies the last page of user flash. + * + * System flash is split by option bytes: + * 0x1FFFF000 .. 0x1FFFF7FF region 1 2048 bytes (used) + * 0x1FFFF800 .. 0x1FFFF8FF option bytes (gap) + * 0x1FFFF900 .. 0x1FFFFFFD region 2 1792 bytes (unused for now) + */ +MEMORY +{ + RAM : ORIGIN = 0x20000000, LENGTH = 20K + + /* Execution mirror of BOOT */ + CODE : ORIGIN = 0x00000000, LENGTH = 2048 + + /* Physical flash addresses */ + BOOT : ORIGIN = 0x1FFFF000, LENGTH = 2048 + APP : ORIGIN = 0x08000000, LENGTH = 64K - 128 + META : ORIGIN = 0x08000000 + 64K - 128, LENGTH = 128 +} diff --git a/examples/ch32/v103/boot/memory_x/user-flash.x b/examples/ch32/v103/boot/memory_x/user-flash.x new file mode 100644 index 0000000..7d52bbe --- /dev/null +++ b/examples/ch32/v103/boot/memory_x/user-flash.x @@ -0,0 +1,22 @@ +/* CH32V103 user-flash bootloader memory layout. + * + * The bootloader occupies the first 8KB of the 64KB user flash. + * Boot metadata occupies the last page of user flash. + * + * Flash map: + * 0x0800_0000 .. 0x0800_1FFF bootloader 8KB + * 0x0800_2000 .. 0x0800_FF7F application 56KB - 128B + * 0x0800_FF80 .. 0x0800_FFFF boot meta 128B + */ +MEMORY +{ + RAM : ORIGIN = 0x20000000, LENGTH = 20K + + /* Execution mirror of BOOT */ + CODE : ORIGIN = 0x00000000, LENGTH = 8K + + /* Physical flash addresses */ + BOOT : ORIGIN = 0x08000000, LENGTH = 8K + APP : ORIGIN = 0x08000000 + 8K, LENGTH = 56K - 128 + META : ORIGIN = 0x08000000 + 64K - 128, LENGTH = 128 +} diff --git a/examples/ch32/v103/boot/src/main.rs b/examples/ch32/v103/boot/src/main.rs new file mode 100644 index 0000000..10ebe13 --- /dev/null +++ b/examples/ch32/v103/boot/src/main.rs @@ -0,0 +1,50 @@ +//! Bootloader example for CH32V103. +//! +//! Two flash modes available via feature flags: +//! +//! **system-flash**: Runs from the 2048-byte system flash region, leaving all +//! 64KB of user flash for the application. Requires external BOOT0 control +//! circuit (RC or flip-flop) on the configured GPIO pin. +//! +//! **user-flash**: Occupies first 8KB of user flash, with the application in +//! the remaining 56KB. + +#![no_std] +#![no_main] + +use panic_halt as _; + +tinyboot_ch32_boot::boot_version!(); + +use tinyboot_ch32_boot::prelude::*; + +#[unsafe(export_name = "main")] +fn main() -> ! { + // USART1 transport for firmware updates. + // + // Remap options (CH32V103): + // Remap0: TX=PA9, RX=PA10 (default) + // Remap1: TX=PB6, RX=PB7 + let transport = Usart::new(&UsartConfig { + duplex: Duplex::Full, + baud: BaudRate::B115200, + pclk: 8_000_000, + mapping: UsartMapping::Usart1Remap0, + rx_pull: Pull::None, + tx_en: None, + }); + + // V103 system-flash: configure GPIO pin driving the external BOOT0 + // control circuit (RC or flip-flop). Adjust pin to your hardware. + #[cfg(feature = "system-flash")] + let config = BootCtlConfig { + pin: Pin::PB1, // adjust to your BOOT0 control pin + active_high: true, // RC circuit: HIGH = system flash + }; + + // V103 user-flash: no GPIO boot control needed, uses RAM magic word. + #[cfg(not(feature = "system-flash"))] + let config = BootCtlConfig; + + tinyboot_ch32_boot::run(transport, config); +} diff --git a/examples/ch32/v103/rust-toolchain.toml b/examples/ch32/v103/rust-toolchain.toml new file mode 100644 index 0000000..db4fae7 --- /dev/null +++ b/examples/ch32/v103/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly" +components = ["rust-src", "rustfmt", "clippy", "rust-analyzer"] From ffe65265065ef93905d75772419f7620eb914209 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 12:06:36 -0700 Subject: [PATCH 14/21] update CI and pre-commit for CH32V103 --- .github/workflows/ci.yml | 40 ++++++++++++++++++++++++++++++++++++++-- scripts/pre-commit | 22 ++++++++++++++++++---- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 549207d..2781a15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,8 +40,8 @@ jobs: - run: cargo build - run: cargo build --release - ch32: - name: CH32 (${{ matrix.chip }}) + ch32-v003: + name: CH32V003 (${{ matrix.chip }}) runs-on: ubuntu-latest strategy: fail-fast: false @@ -75,3 +75,39 @@ jobs: run: cd examples/ch32/v003 && cargo +nightly clippy -p app --no-default-features --features "${{ matrix.chip }},user-flash" -- -D warnings - name: Build app (user-flash) run: cd examples/ch32/v003 && cargo +nightly build -p app --no-default-features --features "${{ matrix.chip }},user-flash" --release + + ch32-v103: + name: CH32V103 (${{ matrix.chip }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + chip: [ch32v103c6t6, ch32v103c8t6, ch32v103c8u6, ch32v103r8t6] + steps: + - uses: actions/checkout@v6 + - name: Install toolchain + run: | + rustup toolchain install nightly --profile minimal --component rust-src,rustfmt,clippy + rustup +nightly target add riscv32imc-unknown-none-elf + - name: Clippy libraries + run: cd ch32 && cargo +nightly clippy -p tinyboot-ch32-hal -p tinyboot-ch32-boot --no-default-features --features ${{ matrix.chip }} --target riscv32imc-unknown-none-elf -- -D warnings + - name: Build libraries + run: cd ch32 && cargo +nightly build -p tinyboot-ch32-hal -p tinyboot-ch32-boot --no-default-features --features ${{ matrix.chip }} --target riscv32imc-unknown-none-elf --release + - name: Fmt examples + run: cd examples/ch32/v103 && cargo +nightly fmt --all -- --check + - name: Clippy boot (system-flash) + run: cd examples/ch32/v103 && cargo +nightly clippy -p boot --no-default-features --features "${{ matrix.chip }},system-flash" -- -D warnings + - name: Build boot (system-flash) + run: cd examples/ch32/v103 && cargo +nightly build -p boot --no-default-features --features "${{ matrix.chip }},system-flash" --release + - name: Clippy boot (user-flash) + run: cd examples/ch32/v103 && cargo +nightly clippy -p boot --no-default-features --features "${{ matrix.chip }},user-flash" -- -D warnings + - name: Build boot (user-flash) + run: cd examples/ch32/v103 && cargo +nightly build -p boot --no-default-features --features "${{ matrix.chip }},user-flash" --release + - name: Clippy app (system-flash) + run: cd examples/ch32/v103 && cargo +nightly clippy -p app --no-default-features --features "${{ matrix.chip }},system-flash" -- -D warnings + - name: Build app (system-flash) + run: cd examples/ch32/v103 && cargo +nightly build -p app --no-default-features --features "${{ matrix.chip }},system-flash" --release + - name: Clippy app (user-flash) + run: cd examples/ch32/v103 && cargo +nightly clippy -p app --no-default-features --features "${{ matrix.chip }},user-flash" -- -D warnings + - name: Build app (user-flash) + run: cd examples/ch32/v103 && cargo +nightly build -p app --no-default-features --features "${{ matrix.chip }},user-flash" --release diff --git a/scripts/pre-commit b/scripts/pre-commit index 5a44835..486bd26 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -7,16 +7,30 @@ set -e (cd lib && cargo test -p tinyboot-core -p tinyboot-protocol) # --- CH32 libraries (embedded target, needs nightly + build-std) --- -TARGET_JSON=../examples/ch32/v003/riscv32ec-unknown-none-elf.json -CHIP=ch32v003f4p6 +V003_JSON=../examples/ch32/v003/riscv32ec-unknown-none-elf.json + +# V003 (cd ch32 && cargo +nightly clippy -p tinyboot-ch32-hal -p tinyboot-ch32-boot -p tinyboot-ch32-app \ - --no-default-features --features $CHIP \ - --target $TARGET_JSON \ + --no-default-features --features ch32v003f4p6 \ + --target $V003_JSON \ -Zbuild-std=core -Zjson-target-spec \ -- -D warnings) +# V103 +(cd ch32 && cargo +nightly clippy -p tinyboot-ch32-hal -p tinyboot-ch32-boot \ + --no-default-features --features ch32v103c8t6 \ + --target riscv32imc-unknown-none-elf \ + -- -D warnings) + # --- Examples --- +# V003 for flash in system-flash user-flash; do (cd examples/ch32/v003 && cargo +nightly clippy -p boot --no-default-features --features "ch32v003f4p6,$flash" -- -D warnings) (cd examples/ch32/v003 && cargo +nightly clippy -p app --no-default-features --features "ch32v003f4p6,$flash" -- -D warnings) done + +# V103 +for flash in system-flash user-flash; do + (cd examples/ch32/v103 && cargo +nightly clippy -p boot --no-default-features --features "ch32v103c8t6,$flash" -- -D warnings) + (cd examples/ch32/v103 && cargo +nightly clippy -p app --no-default-features --features "ch32v103c8t6,$flash" -- -D warnings) +done From 764ffa31dd781da992ba558c1d3fbe046555633a Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 13:18:35 -0700 Subject: [PATCH 15/21] fix app version placement for chips with separate interrupt vector table Capture qingke-rt's orphan .vector_table.interrupts section before .tb_version so the version tag is always the last loadable content. The bootloader reads the version at app_base + app_size - 2. --- lib/core/tb-app.x | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/core/tb-app.x b/lib/core/tb-app.x index ff6a330..dbefc5f 100644 --- a/lib/core/tb-app.x +++ b/lib/core/tb-app.x @@ -9,7 +9,20 @@ __tb_meta_base = ORIGIN(META); __tb_boot_version_addr = ORIGIN(BOOT) + LENGTH(BOOT) - 2; __tb_app_capacity = LENGTH(APP); -/* App version placed immediately after all other flash content. */ +/* App version must be the very last loadable flash content. + * The bootloader reads it at app_base + app_size - 2. + * + * Capture the qingke-rt interrupt vector table (orphan section on V3+) + * before .tb_version so it doesn't end up after the version tag. */ +SECTIONS +{ + .tb_vectors ALIGN(4) : + { + KEEP(*(.vector_table.interrupts)); + KEEP(*(.vector_table.external_interrupts)); + } > CODE +} INSERT AFTER .data; + SECTIONS { .tb_version ALIGN(2) : @@ -17,7 +30,7 @@ SECTIONS __tb_version = .; KEEP(*(.tb_version)); } > CODE -} INSERT AFTER .data; +} INSERT AFTER .tb_vectors; /* qingke-rt's link.x doesn't define a .uninit section. * defmt-rtt places its buffer in .uninit.* and expects NOLOAD. */ From a47ddcef4db94896b466307ba9d01b07eafb0922 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 13:18:41 -0700 Subject: [PATCH 16/21] update docs for CH32V103 support --- README.md | 7 ++++++- ch32/app/README.md | 8 +++++--- ch32/boot/README.md | 16 +++++++++++++--- ch32/hal/README.md | 5 +++-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a8d2591..89d16a3 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ tinyboot currently supports **UART / RS-485** transport. The table below tracks | CH32V003A4M6 | `ch32v003a4m6` | `0x1FFFF000` (1920B) | ❓ | -- | | CH32V003F4U6 | `ch32v003f4u6` | `0x1FFFF000` (1920B) | ❓ | -- | | CH32V003J4M6 | `ch32v003j4m6` | `0x1FFFF000` (1920B) | ❓ | -- | +| CH32V103C6T6 | `ch32v103c6t6` | `0x1FFFF000` (2048B) | ❓ | -- | +| CH32V103C8T6 | `ch32v103c8t6` | `0x1FFFF000` (2048B) | ✅ | -- | +| CH32V103C8U6 | `ch32v103c8u6` | `0x1FFFF000` (2048B) | ❓ | -- | +| CH32V103R8T6 | `ch32v103r8t6` | `0x1FFFF000` (2048B) | ❓ | -- | | CH32V002X4X6 | `ch32v002x4x6` | `0x1FFF0000` (3KB + 256B) | 📋 | `flash_v00x` HAL ([#29][ch32-data-29]) | | CH32V004X6X1 | `ch32v004x6x1` | `0x1FFF0000` (3KB + 256B) | 📋 | `flash_v00x` HAL ([#29][ch32-data-29]) | | CH32V005X6X6 | `ch32v005x6x6` | `0x1FFF0000` (3KB + 256B) | 📋 | `flash_v00x` HAL ([#29][ch32-data-29]) | @@ -75,6 +79,7 @@ ch32/ CH32 implementations cli/ tinyboot — host CLI flasher examples/ch32/v003/ CH32V003 boot + app examples +examples/ch32/v103/ CH32V103 boot + app examples ``` | Crate | Description | @@ -91,7 +96,7 @@ examples/ch32/v003/ CH32V003 boot + app examples The workspaces use **edition 2024**. - **Library crates and CLI** — stable Rust 1.85+ -- **CH32 examples** (bootloader and app binaries) — nightly, for `-Zbuild-std` on `riscv32ec-unknown-none-elf` +- **CH32 examples** (bootloader and app binaries) — nightly, for `-Zbuild-std` on `riscv32ec-unknown-none-elf` (V003) or standard `riscv32imc-unknown-none-elf` (V103) ## Linker Region Contract diff --git a/ch32/app/README.md b/ch32/app/README.md index 2dd3d47..646a633 100644 --- a/ch32/app/README.md +++ b/ch32/app/README.md @@ -16,7 +16,8 @@ tinyboot_ch32_app::app_version!(); tinyboot_ch32_app::fix_mtvec!(); // All parameters come from linker symbols — no hardcoded addresses needed. -let mut app = tinyboot_ch32_app::new_app(); +// Pass BootCtlConfig for your chip (unit struct for V003, GPIO config for V103). +let mut app = tinyboot_ch32_app::new_app(tinyboot_ch32_app::BootCtlConfig); // Confirm boot — transitions Validating -> Idle in boot metadata app.confirm(); @@ -33,7 +34,7 @@ loop { | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | `app_version!()` | Macro that places the crate version (from `Cargo.toml`) in the `.tb_version` linker section | | `fix_mtvec!()` | Macro that fixes `mtvec` for apps behind a user-flash bootloader. Requires `--wrap=_setup_interrupts` linker arg. Not needed for system-flash | -| `new_app()` | Create an `App` configured for CH32 hardware. Reads geometry from linker symbols (`__tb_boot_version_addr`, `__tb_app_capacity`) | +| `new_app(config)` | Create an `App` configured for CH32 hardware. Takes `BootCtlConfig`; reads geometry from linker symbols | | `App::confirm()` | Confirm trial boot (Validating -> Idle), preserving checksum in boot metadata | | `App::poll()` | Poll for and handle one tinyboot command (blocking) | | `App::poll_async()` | Async version of `poll()` | @@ -50,6 +51,7 @@ All other commands receive `Status::Unsupported`. | Feature | Description | | -------------- | --------------------------------------- | | `ch32v003f4p6` | CH32V003F4P6 chip variant (default) | +| `ch32v103c8t6` | CH32V103C8T6 chip variant | | `system-flash` | App paired with system-flash bootloader | -See [`examples/ch32/v003/app`](../../examples/ch32/v003/app/) for a complete example. +See [`examples/ch32/v003/app`](../../examples/ch32/v003/app/) and [`examples/ch32/v103/app`](../../examples/ch32/v103/app/) for complete examples. diff --git a/ch32/boot/README.md b/ch32/boot/README.md index 509f9b7..578d2c1 100644 --- a/ch32/boot/README.md +++ b/ch32/boot/README.md @@ -31,22 +31,32 @@ fn main() -> ! { rx_pull: Pull::None, tx_en: None, }); - tinyboot_ch32_boot::run(transport); + tinyboot_ch32_boot::run(transport, BootCtlConfig); } ``` +For chips with a hardware BOOT0 pin (e.g. CH32V103), pass a `BootCtlConfig` with the GPIO pin driving the boot mode selection circuit: + +```rust +tinyboot_ch32_boot::run(transport, BootCtlConfig { + pin: Pin::PB1, + active_high: true, +}); +``` + `Storage`, `BootMetaStore`, and `BootCtl` are initialized from linker symbols automatically. The boot version is placed by `boot_version!()` in the `.tb_version` section and read at runtime via the `__tb_version` linker symbol. -See [`examples/ch32/v003/boot`](../../examples/ch32/v003/boot/) for a complete bootloader example. +See [`examples/ch32/v003/boot`](../../examples/ch32/v003/boot/) and [`examples/ch32/v103/boot`](../../examples/ch32/v103/boot/) for complete examples. ## Runtime -The bootloader includes a minimal startup assembly (`v2.S`) — GP/SP init and jump to main (~20 bytes). No .data/.bss init since the system-flash bootloader uses no mutable statics. +The bootloader includes minimal startup assembly — GP/SP init and jump to main (~20 bytes). No .data/.bss init since the system-flash bootloader uses no mutable statics. Separate assembly files per QingKe core version (`v2.S` for V003, `v3.S` for V103). ## Features | Feature | Description | | -------------- | -------------------------------------------------------------------- | | `ch32v003f4p6` | CH32V003F4P6 chip variant (default) | +| `ch32v103c8t6` | CH32V103C8T6 chip variant | | `rt` | Minimal runtime startup (GP/SP init, no vector table or static init) | | `system-flash` | Bootloader runs from system flash | diff --git a/ch32/hal/README.md b/ch32/hal/README.md index 4902e53..fc210ae 100644 --- a/ch32/hal/README.md +++ b/ch32/hal/README.md @@ -15,7 +15,7 @@ Minimal hardware abstraction layer for tinyboot on CH32 microcontrollers. This i | `afio` | Alternate function I/O and pin remapping | | `pfic` | Interrupt controller and system reset | | `iwdg` | Independent watchdog timer feed | -| `boot_request` | RAM-based boot request signaling (user-flash only) | +| `boot_request` | Boot request signaling (reg/ram/gpio, auto-selected) | ## Code generation @@ -31,7 +31,8 @@ This keeps the source chip-agnostic while producing zero-overhead accessors. | Feature | Description | | -------------- | ----------------------------------------------------------------------------- | | `ch32v003f4p6` | CH32V003F4P6 chip variant (default, for rust-analyzer; CI uses explicit chip) | -| `system-flash` | Bootloader runs from system flash (uses BOOT_MODE register for boot requests) | +| `ch32v103c8t6` | CH32V103C8T6 chip variant | +| `system-flash` | Bootloader runs from system flash (boot request scheme auto-selected by chip) | ## Notes From da24a3535da737df2f0a2d13c5a0094a0a13a129 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 18:37:39 -0700 Subject: [PATCH 17/21] invalidate read cache after flash write / erase for v103. --- ch32/hal/src/flash/v1.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ch32/hal/src/flash/v1.rs b/ch32/hal/src/flash/v1.rs index 5aa778a..c8813e1 100644 --- a/ch32/hal/src/flash/v1.rs +++ b/ch32/hal/src/flash/v1.rs @@ -30,6 +30,25 @@ pub fn lock() { }); } +/// Undocumented flash controller register at offset 0x34. +/// Not in the RM; used by WCH's HAL for read-cache invalidation. +/// +/// See: https://github.com/openwch/ch32v103/blob/f99a84c4c42b6fb676560a9b8b7c737401efe0ad/EVT/EXAM/SRC/Peripheral/src/ch32v10x_flash.c#L210 +const FLASH_RDCACHE_REG: *mut u32 = 0x4002_2034 as *mut u32; + +/// XOR mask used to read from a 4 KB-distant flash address, forcing eviction +/// of the prefetch/read pipeline entry for the page just written or erased. +const RDCACHE_XOR_MASK: u32 = 0x0000_1000; + +/// Invalidate the flash read cache for `addr`. +/// +/// `addr` must be word-aligned (callers always pass page-aligned addresses). +fn invalidate_read_cache(addr: u32) { + let src = addr ^ RDCACHE_XOR_MASK; + let val = unsafe { core::ptr::read_volatile(src as *const u32) }; + unsafe { core::ptr::write_volatile(FLASH_RDCACHE_REG, val) }; +} + /// Flash page size in bytes (erase and fast-write granularity). pub const PAGE_SIZE: usize = 128; @@ -55,6 +74,7 @@ pub fn erase(addr: u32) { wait_busy(); // Clear FTER FLASH.ctlr().write(|_| {}); + invalidate_read_cache(addr); } /// Write `data` to flash at `addr` (RM §24.4.6). @@ -119,4 +139,5 @@ pub fn write(addr: u32, data: &[u8]) { wait_busy(); // Step 14: clear FTPG FLASH.ctlr().write(|_| {}); + invalidate_read_cache(page_base); } From 92c2056ae07b2ff55920a7fefbd49968c85deadb Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 18:42:47 -0700 Subject: [PATCH 18/21] cli: add retry if crc fails. --- cli/src/client.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cli/src/client.rs b/cli/src/client.rs index 46607b4..c8ebdb6 100644 --- a/cli/src/client.rs +++ b/cli/src/client.rs @@ -158,6 +158,7 @@ impl Client { } // 3. Write — chunk by MAX_PAYLOAD, pad to 4-byte alignment with 0xFF + let page_size = erase_size as usize; let padded_len = firmware.len().next_multiple_of(4); let total_chunks = padded_len.div_ceil(MAX_PAYLOAD) as u32; let mut offset = 0usize; @@ -176,7 +177,19 @@ impl Client { self.frame.cmd = Cmd::Write; self.frame.addr = offset as u32; self.frame.len = len as u16; - self.transact()?; + match self.transact() { + Ok(()) => {} + Err(FlashError::Device(Status::CrcMismatch)) => { + // Response frame corrupted — flush device write buffer + // and restart from the nearest page-aligned offset. + debug!("response CRC mismatch at offset {offset:#X}, flushing and retrying from page boundary"); + let _ = self.flush(); + offset = offset & !(page_size - 1); + chunk_idx = (offset / MAX_PAYLOAD) as u32; + continue; + } + Err(e) => return Err(e), + } offset = end; chunk_idx += 1; on_progress("Writing", chunk_idx, total_chunks); From b996b54852237861f91c88cec04c83d15e4a8e21 Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Tue, 14 Apr 2026 18:43:29 -0700 Subject: [PATCH 19/21] remove EOP clear, openwch doesn't do it. --- ch32/hal/src/flash/v1.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ch32/hal/src/flash/v1.rs b/ch32/hal/src/flash/v1.rs index c8813e1..21050f0 100644 --- a/ch32/hal/src/flash/v1.rs +++ b/ch32/hal/src/flash/v1.rs @@ -9,8 +9,6 @@ fn wait_busy() { !FLASH.statr().read().wrprterr(), "flash write protection error" ); - // RM: clear EOP flag (W1C) after every BUFRST, BUFLOAD, and STRT. - FLASH.statr().write(|w| w.set_eop(true)); } /// Unlock flash controller (KEYR + MODEKEYR). From 40d767b89a7c09cfddca71f9154ad34a7693f07b Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Wed, 15 Apr 2026 00:57:40 -0700 Subject: [PATCH 20/21] move to OpenServoCore's fork of qingke with proper fixes and remove hacks. --- ch32/app/Cargo.toml | 1 - ch32/app/src/lib.rs | 38 ------------------------------ examples/ch32/v003/Cargo.lock | 10 +++----- examples/ch32/v003/Cargo.toml | 4 ++++ examples/ch32/v003/app/build.rs | 3 --- examples/ch32/v003/app/src/main.rs | 2 -- examples/ch32/v103/Cargo.lock | 10 +++----- examples/ch32/v103/Cargo.toml | 4 ++++ examples/ch32/v103/app/Cargo.toml | 2 +- examples/ch32/v103/app/build.rs | 3 --- examples/ch32/v103/app/src/main.rs | 2 -- lib/core/tb-app.x | 9 ------- 12 files changed, 15 insertions(+), 73 deletions(-) diff --git a/ch32/app/Cargo.toml b/ch32/app/Cargo.toml index 04ed60a..c056493 100644 --- a/ch32/app/Cargo.toml +++ b/ch32/app/Cargo.toml @@ -16,7 +16,6 @@ tinyboot-protocol = { workspace = true } embedded-io = { workspace = true } embedded-io-async = { workspace = true } critical-section = "1.2" -qingke = "0.6" [features] ch32v003f4p6 = ["tinyboot-ch32-hal/ch32v003f4p6"] diff --git a/ch32/app/src/lib.rs b/ch32/app/src/lib.rs index d728b67..a62f81f 100644 --- a/ch32/app/src/lib.rs +++ b/ch32/app/src/lib.rs @@ -11,44 +11,6 @@ pub use tinyboot::traits::app as traits; pub use tinyboot::{app_version, pkg_version}; pub use tinyboot_ch32_hal::Pin; -#[doc(hidden)] -pub use qingke; - -/// Fix `mtvec` for apps linked at a non-zero flash address (user-flash bootloader). -/// -/// `qingke-rt` hardcodes `mtvec = 0x0` in its `_setup_interrupts`. This macro -/// generates a linker `--wrap` override that calls the original setup, then -/// rewrites `mtvec` to the actual vector table base. -/// -/// Not needed for system-flash bootloaders (app starts at 0x0). -/// -/// Place at module scope alongside [`app_version!`]. Requires -/// `--wrap=_setup_interrupts` in `build.rs`: -/// -/// ```rust,ignore -/// // build.rs -/// println!("cargo:rustc-link-arg=--wrap=_setup_interrupts"); -/// ``` -#[cfg(not(feature = "system-flash"))] -#[macro_export] -macro_rules! fix_mtvec { - () => { - #[unsafe(export_name = "__wrap__setup_interrupts")] - unsafe extern "C" fn _tinyboot_setup_interrupts() { - use $crate::qingke::register::mtvec::{self, TrapMode}; - - unsafe extern "C" { - fn __real__setup_interrupts(); - fn _start(); - } - unsafe { - __real__setup_interrupts(); - mtvec::write(_start as *const () as usize, TrapMode::VectoredAddress); - } - } - }; -} - /// CH32 boot client implementation. pub struct BootClient { config: boot_request::Config, diff --git a/examples/ch32/v003/Cargo.lock b/examples/ch32/v003/Cargo.lock index 87c8dba..8fdec8a 100644 --- a/examples/ch32/v003/Cargo.lock +++ b/examples/ch32/v003/Cargo.lock @@ -463,8 +463,7 @@ dependencies = [ [[package]] name = "qingke" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10318bf64fc0befbcd09d7a9a62d8b99972ba3dfdd4a94695f63fd892f47e14e" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "bit_field", "cfg-if", @@ -475,8 +474,7 @@ dependencies = [ [[package]] name = "qingke-rt" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8ba56c91dd9a044bd519778bcf70644d1d936fee4ea20fdc2d0e3bac8f75fb9" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "qingke", "qingke-rt-macros", @@ -485,8 +483,7 @@ dependencies = [ [[package]] name = "qingke-rt-macros" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54edcd0e9b8b5c3c83d313c93869325bfcd969d30d9cef1a1015b0970b21be81" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "proc-macro-error", "proc-macro2", @@ -634,7 +631,6 @@ dependencies = [ "critical-section", "embedded-io 0.7.1", "embedded-io-async 0.7.0", - "qingke", "tinyboot-ch32-hal", "tinyboot-core", "tinyboot-protocol", diff --git a/examples/ch32/v003/Cargo.toml b/examples/ch32/v003/Cargo.toml index 31184b2..71cf130 100644 --- a/examples/ch32/v003/Cargo.toml +++ b/examples/ch32/v003/Cargo.toml @@ -17,3 +17,7 @@ opt-level = "z" lto = true codegen-units = 1 panic = "abort" + +[patch.crates-io] +qingke = { git = "https://github.com/OpenServoCore/qingke", branch = "main" } +qingke-rt = { git = "https://github.com/OpenServoCore/qingke", branch = "main" } diff --git a/examples/ch32/v003/app/build.rs b/examples/ch32/v003/app/build.rs index fd7c6bf..e346afd 100644 --- a/examples/ch32/v003/app/build.rs +++ b/examples/ch32/v003/app/build.rs @@ -25,9 +25,6 @@ fn main() { println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); println!("cargo:rustc-link-arg=-Tdefmt.x"); - if user_flash { - println!("cargo:rustc-link-arg=--wrap=_setup_interrupts"); - } } fn cfg_has(key: &str) -> bool { diff --git a/examples/ch32/v003/app/src/main.rs b/examples/ch32/v003/app/src/main.rs index cc955ed..63d227b 100644 --- a/examples/ch32/v003/app/src/main.rs +++ b/examples/ch32/v003/app/src/main.rs @@ -23,8 +23,6 @@ use critical_section::Mutex; use defmt_rtt as _; -#[cfg(feature = "user-flash")] -tinyboot_ch32_app::fix_mtvec!(); tinyboot_ch32_app::app_version!(); #[panic_handler] diff --git a/examples/ch32/v103/Cargo.lock b/examples/ch32/v103/Cargo.lock index 87c8dba..8fdec8a 100644 --- a/examples/ch32/v103/Cargo.lock +++ b/examples/ch32/v103/Cargo.lock @@ -463,8 +463,7 @@ dependencies = [ [[package]] name = "qingke" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10318bf64fc0befbcd09d7a9a62d8b99972ba3dfdd4a94695f63fd892f47e14e" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "bit_field", "cfg-if", @@ -475,8 +474,7 @@ dependencies = [ [[package]] name = "qingke-rt" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8ba56c91dd9a044bd519778bcf70644d1d936fee4ea20fdc2d0e3bac8f75fb9" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "qingke", "qingke-rt-macros", @@ -485,8 +483,7 @@ dependencies = [ [[package]] name = "qingke-rt-macros" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54edcd0e9b8b5c3c83d313c93869325bfcd969d30d9cef1a1015b0970b21be81" +source = "git+https://github.com/OpenServoCore/qingke?branch=main#44d490b2ff429ed4689bd7dd1653146f4fff506a" dependencies = [ "proc-macro-error", "proc-macro2", @@ -634,7 +631,6 @@ dependencies = [ "critical-section", "embedded-io 0.7.1", "embedded-io-async 0.7.0", - "qingke", "tinyboot-ch32-hal", "tinyboot-core", "tinyboot-protocol", diff --git a/examples/ch32/v103/Cargo.toml b/examples/ch32/v103/Cargo.toml index 31184b2..71cf130 100644 --- a/examples/ch32/v103/Cargo.toml +++ b/examples/ch32/v103/Cargo.toml @@ -17,3 +17,7 @@ opt-level = "z" lto = true codegen-units = 1 panic = "abort" + +[patch.crates-io] +qingke = { git = "https://github.com/OpenServoCore/qingke", branch = "main" } +qingke-rt = { git = "https://github.com/OpenServoCore/qingke", branch = "main" } diff --git a/examples/ch32/v103/app/Cargo.toml b/examples/ch32/v103/app/Cargo.toml index 37210e9..e0e7b5d 100644 --- a/examples/ch32/v103/app/Cargo.toml +++ b/examples/ch32/v103/app/Cargo.toml @@ -8,7 +8,7 @@ tinyboot-ch32-app = { path = "../../../../ch32/app", default-features = false } embedded-io = "0.7" critical-section = "1" ch32-hal = { git = "https://github.com/ch32-rs/ch32-hal", default-features = false } -qingke-rt = { version = "0.6", features = ["v3"] } +qingke-rt = { version = "0.6", features = ["v3a"] } defmt = "1.0" defmt-rtt = "1.1" diff --git a/examples/ch32/v103/app/build.rs b/examples/ch32/v103/app/build.rs index fd7c6bf..e346afd 100644 --- a/examples/ch32/v103/app/build.rs +++ b/examples/ch32/v103/app/build.rs @@ -25,9 +25,6 @@ fn main() { println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); println!("cargo:rustc-link-arg=-Tdefmt.x"); - if user_flash { - println!("cargo:rustc-link-arg=--wrap=_setup_interrupts"); - } } fn cfg_has(key: &str) -> bool { diff --git a/examples/ch32/v103/app/src/main.rs b/examples/ch32/v103/app/src/main.rs index 12e030c..07793ed 100644 --- a/examples/ch32/v103/app/src/main.rs +++ b/examples/ch32/v103/app/src/main.rs @@ -21,8 +21,6 @@ use critical_section::Mutex; use defmt_rtt as _; -#[cfg(feature = "user-flash")] -tinyboot_ch32_app::fix_mtvec!(); tinyboot_ch32_app::app_version!(); #[panic_handler] diff --git a/lib/core/tb-app.x b/lib/core/tb-app.x index dbefc5f..1016cc6 100644 --- a/lib/core/tb-app.x +++ b/lib/core/tb-app.x @@ -32,12 +32,3 @@ SECTIONS } > CODE } INSERT AFTER .tb_vectors; -/* qingke-rt's link.x doesn't define a .uninit section. - * defmt-rtt places its buffer in .uninit.* and expects NOLOAD. */ -SECTIONS -{ - .uninit (NOLOAD) : ALIGN(4) - { - *(.uninit .uninit.*); - } > RAM -} INSERT AFTER .bss; From 2056f0270216ba0d06b621d2ccfd2df6923ebc2a Mon Sep 17 00:00:00 2001 From: Aaron Qian Date: Wed, 15 Apr 2026 13:20:25 -0700 Subject: [PATCH 21/21] rust fmt fixes --- cli/src/client.rs | 4 ++-- examples/ch32/v003/app/build.rs | 1 - examples/ch32/v103/app/build.rs | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cli/src/client.rs b/cli/src/client.rs index c8ebdb6..1bb9447 100644 --- a/cli/src/client.rs +++ b/cli/src/client.rs @@ -182,9 +182,9 @@ impl Client { Err(FlashError::Device(Status::CrcMismatch)) => { // Response frame corrupted — flush device write buffer // and restart from the nearest page-aligned offset. - debug!("response CRC mismatch at offset {offset:#X}, flushing and retrying from page boundary"); + debug!("CRC mismatch at {offset:#X}, retrying from page boundary"); let _ = self.flush(); - offset = offset & !(page_size - 1); + offset &= !(page_size - 1); chunk_idx = (offset / MAX_PAYLOAD) as u32; continue; } diff --git a/examples/ch32/v003/app/build.rs b/examples/ch32/v003/app/build.rs index e346afd..f70a4c5 100644 --- a/examples/ch32/v003/app/build.rs +++ b/examples/ch32/v003/app/build.rs @@ -24,7 +24,6 @@ fn main() { println!("cargo:rustc-link-arg=-Ttb-app.x"); println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); println!("cargo:rustc-link-arg=-Tdefmt.x"); - } fn cfg_has(key: &str) -> bool { diff --git a/examples/ch32/v103/app/build.rs b/examples/ch32/v103/app/build.rs index e346afd..f70a4c5 100644 --- a/examples/ch32/v103/app/build.rs +++ b/examples/ch32/v103/app/build.rs @@ -24,7 +24,6 @@ fn main() { println!("cargo:rustc-link-arg=-Ttb-app.x"); println!("cargo:rustc-link-arg=-Ttb-boot-req.x"); println!("cargo:rustc-link-arg=-Tdefmt.x"); - } fn cfg_has(key: &str) -> bool {