Skip to content

ch32 USBHD/USBHS driver implementation#893

Draft
Copper280z wants to merge 88 commits intoZigEmbeddedGroup:mainfrom
Copper280z:ch32_usb
Draft

ch32 USBHD/USBHS driver implementation#893
Copper280z wants to merge 88 commits intoZigEmbeddedGroup:mainfrom
Copper280z:ch32_usb

Conversation

@Copper280z
Copy link
Contributor

@Copper280z Copper280z commented Jan 31, 2026

This adds a new driver for the ch32 USBHD/USBHS peripheral, USB_OTG_FS peripheral, and examples for the ch32v307, and ch32v203 boards.

@github-actions
Copy link

github-actions bot commented Jan 31, 2026

Lint Results

Found 12 issues on changed lines in 4 files:

  • examples/wch/ch32v/src/usb_cdc.zig: 1 issue
  • port/wch/ch32v/src/hals/clocks.zig: 1 issue
  • port/wch/ch32v/src/hals/usbfs.zig: 5 issues
  • port/wch/ch32v/src/hals/usbhs.zig: 5 issues

},
};

const USBController = usb.DeviceController(.{
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename USBController to USB_Controller, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.

///
/// Note: The SVD names bit31 as `USBFSSRC`, but the reference manual
/// describes it as `USBHSSRC` ("USBHS 48MHz clock source selection").
pub const UsbHsClockConfig = struct {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename UsbHsClockConfig to USB_HsClockConfig, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.


const Regs = peripherals.USB_OTG_FS;

const EpState = struct {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename EpState to EP_State, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.

}

// We use offset-based access for per-EP regs to keep helpers compact.
const RegU32 = microzig.mmio.Mmio(packed struct(u32) { v: u32 = 0 });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename RegU32 to Reg_U32, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.


// We use offset-based access for per-EP regs to keep helpers compact.
const RegU32 = microzig.mmio.Mmio(packed struct(u32) { v: u32 = 0 });
const RegU16 = microzig.mmio.Mmio(packed struct(u16) { v: u16 = 0 });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename RegU16 to Reg_U16, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.


const Regs = peripherals.USBHS;

const EpState = struct {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename EpState to EP_State, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.

}

// We use offset-based access for per-EP regs to keep helpers compact.
const RegU32 = microzig.mmio.Mmio(packed struct(u32) { v: u32 = 0 });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename RegU32 to Reg_U32, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.


// We use offset-based access for per-EP regs to keep helpers compact.
const RegU32 = microzig.mmio.Mmio(packed struct(u32) { v: u32 = 0 });
const RegU16 = microzig.mmio.Mmio(packed struct(u16) { v: u16 = 0 });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename RegU16 to Reg_U16, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.

// We use offset-based access for per-EP regs to keep helpers compact.
const RegU32 = microzig.mmio.Mmio(packed struct(u32) { v: u32 = 0 });
const RegU16 = microzig.mmio.Mmio(packed struct(u16) { v: u16 = 0 });
const RegU8 = microzig.mmio.Mmio(packed struct(u8) { v: u8 = 0 });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Rename RegU8 to Reg_U8, it should be more in line with our style guidelines. This automation is not perfect so take it with a grain of salt.

_reserved1: u2 = 0,
});

fn baseAddr() usize {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change to base_addr, in MicroZig we use snake case for function names.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants