Introduce ATxmega CPU and Boards#15758
Conversation
4dd8842 to
a4e7535
Compare
|
Sorry for the long delay. My |
|
Drop all linker files, rebased and adjusted the files. |
benpicco
left a comment
There was a problem hiding this comment.
Looks good!
For GPIOs you can also use the auto_test command from tests/periph_gpio.
It takes two GPIOs that you have to connect with a jumper, then runs several configurations on them and tests if the results are as expected.
|
Sorry for my delay but it was necessary rework some parts. Thanks for remind me about that! I tried to address all comments best I can.
|
@gschorcht has a PR open that provides this (among other improvements): #14602 The internal representation of |
maribu
left a comment
There was a problem hiding this comment.
Some minor nitpicks.
Testing wise: pm does now work like a charm. Even the first char on UART is now showing up correctly and reliably. (I haven't checked with a logic analyzer to be 100% sure of this, but some corruption in the first char is considered a reasonable trade off anyway, as waiting after waking up from low power mode for the UART clock to spin up again be a big pain in the ass for all real time critical low power applications.)
The ATxmega can have up to 8 UARTs. This increase from 2 up to 7 to keep avr8_state flags with 8 bits wide. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Some mega boards enabling global irq at board_init. This moves that responsability to cpu/avr8_common to create a common point to all variants. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add ATxmega common files and cpu definitions. This works was originally developed by @Josar. The 2018 version were port to 2021 mainline. This version changes original port to have only the atxmega CPU definition. With that, all family can be accomodated. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add missing ATxmega reset cause register. This shares same definitions from ATmega CPU. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
The current context switch and thread stack init don't have a generic way to save/restore registers for all AVR-8 variations. This add defines to check flash/data sizes and rework: - thread_stack_init - avr8_context_save - avr8_context_restore The new implementation add missing RAMP D/X/Y registers that are used by XMEGA variations. The rules to add EIND, RAMP(D,X,Y,Z) register are: - EIND must be added if device have more than 128k flash. This means, device can access more than 64k words in flash. - RAMP D/X/Y must be added if device have or can address more than 64k data. - RAMPZ must be added if device can address more than 64k bytes of flash or data. With above rules there is no necessity to check by device because it is mandatory the registers for those MCU variations. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Current there is no way to split code between ATmega and ATxmega in drivers. This differentiate AVR8 cores into MEGAs and XMEGAs. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
The XMEGA CPU have a Programmable Multilevel Interrupt Controller. This enables all three PMIC levels. By default, all interrupts are preconfigured as LOW Level without Round Robin queue. This works as any MCU with interrupt enabled. In order to get benefit from Multilevel Interrupts user need increase the interrupt level by own. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
ATxmega have many clock options. This introduce clk_init into cpu_init to allow user select between a default configuration or perform fine clock tune. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Atmel AVR-8 CPU was reworked to accomodate variants like ATxmega. This rename to atmega.inc.mk to avr8.inc.mk to be compliant with new directory structure. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
The current script doesn't allow change script path and name. Add LDSCRIPT_COMPAT_PATH and LDSCRIPT_COMPAT_NAME default values to allow a unique path inside atxmega folder. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
The current script don't allow change debug protocol and not allows set proper part name for xmega. This make DEBUGPROTO optional with JTAG as default protocol. It add a filter for atxmega to add proper AVRDUDE_PROGRAMMER_FLAGS. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add atxmega common board definitions. This works is a port from @Josar with few modifications. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add initial version. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
The current MODULE_WS281X_ATMEGA only supports ATmega core. This update Kconfig to select MODULE_WS281X_ATMEGA module by CPU_CORE_AVR_MEGA instead HAS_ARCH_AVR8. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Atmel XMEGA CPU don't have a timer prescaler div16 and div32 option. This means that at full speed (32MHz) it is not possible have a 1MHz clock tick. Define default tick to 500kHz and add atxmega-a1u-xpro boards to test list. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add atxmega-a1u-xpro board to BOARD_INSUFFICIENT_MEMORY list to exclude test since boards don't have enough data memory. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Add atxmega-a1u-xpro board to BOARD_INSUFFICIENT_MEMORY list to exclude examples since board don't have enough data memory. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Fix missing entry for avr8_common that was created when moving code from atmega_common at RIOT-OS#15712. As complement add myself as code owner for xmega related things. Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
Thank you @maribu! |
|
Let's get this in 😄 |
Contribution description
Add ATxmega CPU and 4 boards. This is an attempt to implement the #15703 Feature Request.
The code was based on the @Josar 's XMEGA branch. However, it was ported and enhanced on many aspects.
Details:
cpu/atxmega
This concentrate all MCU family. This means, all drivers should be put in here. There is no necessity to create an atxmega_common structure.
Drivers:
Interrupt: The XMEGA have a HW multilevel interrupt controller and current version already enable all levels. However, the implementation selects at board configs all interrupts as LOW LEVEL. This means, the behavior will be same as any other MEGA MCU. User can increase the priority but need understand the implications. The Round Robin queue can be enabled at board start-up to avoid starvation from LOW LEVEL interrupts.
SAUL: Supported
boards/atxmega
Follow same structure to concentrate all board common code.
Testing procedure
Tests were conducted on the following boards:
Applications:
In general, the attempts were to make sure code not only builds but it run on real hardware.
Issues/PRs references
Dependencies: #15712
CC: @benpicco @maribu