Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ports/wch: Add support for WCH CH32V307. #8637

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

r4d10n
Copy link

@r4d10n r4d10n commented May 6, 2022

This PR adds support for the CH32V307EVT board, which uses the WCH CH32V307 RISC-V microcontroller.

Supported features include:

  • REPL (Python prompt) over UART0(WCH-Link/P9).
  • Builtin modules: gc, array, collections, io, struct, sys.
  • GPIO interface with machine Pin module
  • Sleep functions from time module

TODO:

  • GPIO Alternate Functions / Interrupt Services
  • Peripherals - ADC / DAC / SPI / I2C / I2S / RTC support.
  • Stacks - Ethernet / USBFS / USBHS
  • Filesystem - Flash Memory / SDCard.

Signed-off-by: r4d10n <rakesh.peter@gmail.com>
@andrewleech
Copy link
Sponsor Contributor

This looks like a fantastic start to a port, really clean work!

In case it helps, I recently added initial Filesystem support to the up-and-coming ameba port, It wasn't the cleanest change but perhaps this could help as a reference:

@mattytrentini
Copy link
Sponsor Contributor

Note that there's now TinyUSB support for this chipset 🎉

Copy link

@GPSBabelDeveloper GPSBabelDeveloper left a comment

Choose a reason for hiding this comment

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

Just fly-by comments as I was reading the author's citation in a forum.
I may not fully understand the context of the code, so these are just minor things that caught my eye. They may be wrong and feel free to ignore me. :-)

Looks pretty good! Carry on.

@@ -0,0 +1 @@
ENTRY( _start )__stack_size = 2048;PROVIDE( _stack_size = __stack_size );MEMORY{ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K}SECTIONS{ .init : { _sinit = .; . = ALIGN(4); KEEP(*(SORT_NONE(.init))) . = ALIGN(4); _einit = .; } >FLASH AT>FLASH .vector : { *(.vector); . = ALIGN(64); } >FLASH AT>FLASH .text : { . = ALIGN(4); *(.text) *(.text.*) *(.rodata) *(.rodata*) *(.glue_7) *(.glue_7t) *(.gnu.linkonce.t.*) . = ALIGN(4); } >FLASH AT>FLASH .fini : { KEEP(*(SORT_NONE(.fini))) . = ALIGN(4); } >FLASH AT>FLASH PROVIDE( _etext = . ); PROVIDE( _eitcm = . ); .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH AT>FLASH .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH AT>FLASH .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); } >FLASH AT>FLASH .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) /* We don't want to include the .ctor section from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >FLASH AT>FLASH .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >FLASH AT>FLASH .dalign : { . = ALIGN(4); PROVIDE(_data_vma = .); } >RAM AT>FLASH .dlalign : { . = ALIGN(4); PROVIDE(_data_lma = .); } >FLASH AT>FLASH .data : { *(.gnu.linkonce.r.*) *(.data .data.*) *(.gnu.linkonce.d.*) . = ALIGN(8); PROVIDE( __global_pointer$ = . + 0x800 ); *(.sdata .sdata.*) *(.sdata2.*) *(.gnu.linkonce.s.*) . = ALIGN(8); *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) . = ALIGN(4); PROVIDE( _edata = .); } >RAM AT>FLASH .bss : { . = ALIGN(4); PROVIDE( _sbss = .); *(.sbss*) *(.gnu.linkonce.sb.*) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON*) . = ALIGN(4); PROVIDE( _ebss = .); } >RAM AT>FLASH PROVIDE( _end = _ebss); PROVIDE( end = . ); .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : { PROVIDE( _heap_end = . ); . = ALIGN(4); PROVIDE(_susrstack = . ); . = . + __stack_size; PROVIDE( _eusrstack = .); } >RAM }

Choose a reason for hiding this comment

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

Please consider some vertical whitespace in this file. One line is too few. (Maybe a DOS line ending issue?)

TOOLCHAIN_ROOT = /opt/wch/mounriver-studio-toolchain-riscv/bin/
OPENOCD_ROOT = /opt/wch/mounriver-studio-toolchain-openocd/bin/

CROSS_COMPILE ?= $(TOOLCHAIN_ROOT)riscv-none-embed-

Choose a reason for hiding this comment

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

Please consider an early startup test that looks if ${TOOLCHAIN_ROOT} is a directory and ${CROSS_COMPILE}gcc is a file. Issue a helpful error message so the developer knows where to look in the doc and/or configuration files.

Sometimes hardcoded paths just can't be avoided, but it's worth calling out expectations so another user can meet them.

## Examples

```python
MicroPython v1.18-131-g31ba059e9-dirty on 2022-05-05; ch32v307-evt with wch-ch32v307

Choose a reason for hiding this comment

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

Is the highlighting of the 5's here somehow meaningful and intentional?

Connect jumper wires between pads - PA0 <--> LED1 and PE0 <--> KEY.

```python
MicroPython v1.18-131-g31ba059e9-dirty on 2022-05-05; ch32v307-evt with wch-ch32v307

Choose a reason for hiding this comment

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

Same

#include "shared/runtime/pyexec.h"

// Allocate memory for the MicroPython GC heap.
static char heap[4096];

Choose a reason for hiding this comment

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

If your linker hates you, heap[] may have an address like 0x20000123 - it's only promised to be byte aligned. (It'll probably be at least 4-byte aligned in practice...) Do you need to hedgee your bet and use attribute aligned(16) or something to force it more strict so you can do floating point or other stuff in there that requires "better" alignment?

@nubcore
Copy link

nubcore commented Oct 23, 2023

Curious if anyone has been using the features implemented thus far.

I haven't worked directly on any ports, is there likely to be any more dev on the additional tasks?

@r4d10n inspiring work none the less, I look forward to digging in to it more.

@cnlohr rv003 USB

@nubcore
Copy link

nubcore commented Nov 6, 2023

This PR adds support for the CH32V307EVT board, which uses the WCH CH32V307 RISC-V microcontroller.

EVT picture link broken, available via archive

Also good overview on development board and they are currently available for $10-20.

@projectgus
Copy link
Contributor

This is an automated heads-up that we've just merged a Pull Request
that removes the STATIC macro from MicroPython's C API.

See #13763

A search suggests this PR might apply the STATIC macro to some C code. If it
does, then next time you rebase the PR (or merge from master) then you should
please replace all the STATIC keywords with static.

Although this is an automated message, feel free to @-reply to me directly if
you have any questions about this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

7 participants