-
-
Notifications
You must be signed in to change notification settings - Fork 8.2k
ports/wch: Add support for WCH CH32V307. #8637
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
base: master
Are you sure you want to change the base?
Conversation
Signed-off-by: r4d10n <rakesh.peter@gmail.com>
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: |
Note that there's now TinyUSB support for this chipset 🎉 |
There was a problem hiding this 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 } |
There was a problem hiding this comment.
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- |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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]; |
There was a problem hiding this comment.
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?
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. |
EVT picture link broken, available via archive Also good overview on development board and they are currently available for $10-20. |
This is an automated heads-up that we've just merged a Pull Request See #13763 A search suggests this PR might apply the STATIC macro to some C code. If it Although this is an automated message, feel free to @-reply to me directly if |
This PR adds support for the CH32V307EVT board, which uses the WCH CH32V307 RISC-V microcontroller.
Supported features include:
machine
Pin
moduletime
moduleTODO:
ADC
/DAC
/SPI
/I2C
/I2S
/RTC
support.Ethernet
/USBFS
/USBHS