1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
Commit Graph

296 Commits

Author SHA1 Message Date
Francisco
7e6fee8260
Merge pull request #14615 from maribu/atmega-idle-stack-size
cpu/atmega_common: Increase idle stack size with xtimer
2020-07-30 14:43:20 +02:00
Marian Buschsieweke
040bad0425
cpu/atmega_common: increase stack size with xtimer
If a timer triggers while the idle thread is running, previously a stack
overflow was triggered. This commit increases the idle threads stack size if
xtimer is used.
2020-07-27 16:52:36 +02:00
Marian Buschsieweke
7b49310147
cpu/atmega_common: Enable cpp feature 2020-07-24 15:22:34 +02:00
Benjamin Valentin
96273b4df0 cpu/atmega_common: use TIMER_CHANNEL_NUMOF 2020-06-24 00:45:35 +02:00
Leandro Lanzieri
873badcd76
cpu/atmega_common: Add ATmega128 family Kconfig symbol 2020-06-22 15:19:35 +02:00
Leandro Lanzieri
19bdb11548
cpu/atmega_common: Add Kconfig symbols 2020-06-17 10:52:23 +02:00
benpicco
49aef1b678
Merge pull request #13902 from benpicco/periph_timer_periodic
periph/timer: add timer_set_periodic()
2020-05-28 18:03:32 +02:00
Benjamin Valentin
c000a77658 cpu/atmega_common: implement timer_set_periodic() 2020-05-28 17:37:42 +02:00
benpicco
2183fb9273
Merge pull request #14155 from maribu/atmega_timer_cleanup
cpu/atmega*: Clean up timer configs
2020-05-28 17:33:31 +02:00
Marian Buschsieweke
fb722b1be7
cpu/atmega_common/periph_timer: Fix style 2020-05-28 16:27:08 +02:00
benpicco
8a2b089cd5
Merge pull request #14098 from maribu/atmega-timer
cpu/atmega_common: Fix periph_timer
2020-05-28 13:23:22 +02:00
Marian Buschsieweke
99bd1c318c
cpu/atmega_common/periph_timer: Add timer_set
Added a low level implementation of timer_set() that allows setting relative
timeouts as short as 0. This results in tests/periph_timer_short_relative_set
no passing.
2020-05-28 11:46:02 +02:00
Francisco
3ef40f3321
Merge pull request #14085 from maribu/atmega_irq
cpu/atmega_common: Update to inlineable IRQ API
2020-05-26 16:33:07 +02:00
Marian Buschsieweke
9e566370bf
cpu/atmega_common: Fixed irq_arch implementation
The inline assembly implementation was badly in need of improvement.

- irq_disable() took 2 CPU cycles more than needed
    - The current interrupt state was stored in a temporary register and
      afterwards copied to the target register, rather than storing it in the
      target register right away
    - The lower bits of the state were cleared (as they have no meaning for the
      interrupt status), but the API purposely never required such things from
      implementations.
- irq_restore() took 5 CPU cycles. This was reduced to 3 CPU cycles (or 2 CPU
  cycles in the best case)
2020-05-26 15:19:14 +02:00
Marian Buschsieweke
067a9c38ae
cpu/atmega_common: Fix race in periph_timer
As AVR is an 8 bit platform, special care needs to be taken when accessing 16
bit registers in an atomic fashion. This commit as just this care.
2020-05-18 21:22:31 +02:00
Marian Buschsieweke
ba5844098d
cpu/atmega_common: Make irq_arch inline-able
- Moved irq_arch.c to irq_arch.h and marked all functions as
  `__attribute__((always_inline)) static inline`
2020-05-17 18:41:11 +02:00
benpicco
cc44992abe
Merge pull request #12827 from maribu/atmega_pwm
cpu/atmega_common/periph/pwm: Minor fix & cleanup
2020-05-16 22:26:58 +02:00
Marian Buschsieweke
506288791d
cpu/atmega_common/periph/pwm: Minor fix & cleanup
- On pwm_poweron, the PWM resolution was not restored. (A custom resolution was
  only usable if, PWM channel 0 is not used. That configuration is not common,
  so this bug was likely never triggered)
- Disabled a work around to prevent flickering:
    - Previously, PWM was disconnected on level 0% and 100%
    - This increases the run time of `pwm_set()`
    - It prevents using the PWM for wave form generation via DDS, as the wave
      noticeably jumps when reaching 0% or 100%
- Slightly reduces memory requirements: 2 Bytes of RAM, 112 Bytes of ROM
    - Tested with avr-gcc 9.2.0 and LTO enabled
2020-05-16 20:43:31 +02:00
Marian Buschsieweke
2f3961690e
cpu/atmega_common: Add feature PUF_SRAM
The feature is implemented in `cpu/atmega_common`, so we can just enable it for
all ATmega boards.
2020-05-15 11:31:23 +02:00
Marian Buschsieweke
355b01ce98
cpu/atmega_common: Moved atmega_state to cpu.c
The global state flags should never have bin in irq_arch.c but in cpu.c. This
is not fixed.
2020-05-15 11:24:29 +02:00
Marian Buschsieweke
4d1a5b9256
cpu/atmega_common: Drop legacy include
Drop `#include "irq.h"` in `cpu.h`, which was there for a legacy work around.
A bunch of missing includes of `irq.h` materialized due to this and were
fixed.
2020-05-15 11:24:28 +02:00
84745365fd cpu: atmega_common: make THREAD_STACKSIZE_IDLE configurable 2020-03-12 13:01:13 +01:00
Benjamin Valentin
93d2068a9e cpu/atmega_common: Implement RTC based on TIM2
This implements a basic Real Time Clock based on TIM2.

As the timer is too fast and wraps around after just 8 bits, it is
not used directly. Instead TIM2 is responsible for providing a 1 Hz
tick by generating an alarm every second.

The current time data is kept in the `.noinit` section, so it will survive
a reboot, but the clock will not be updated while the bootloader runs, so
expect inaccuracies.
2020-03-03 16:26:26 +01:00
Gunar Schorcht
da244ffcaa cpu/atmega_common: fix compile problem with NDEBUG 2020-02-25 09:41:24 +01:00
benpicco
de89f3a459
Merge pull request #13319 from maribu/avr-reboot
cpu/atmega_common: Fix reboot issues
2020-02-11 17:18:12 +01:00
Francisco
e2dc125fb3
Merge pull request #13308 from maribu/atmega_state_cleanup
cpu/atmega_common: Cleanup state flags
2020-02-10 17:37:24 +01:00
Marian Buschsieweke
60ee8cd513
cpu/atmega_common: Fix pm_reboot with LTO
The reboot process for ATmegas is to enable the watchdog timer and loop until
the wdt reboots this MCU. However, this reboot will keep the wdt configuration,
so that the wdt needs to be disabled during boot. This is done in get_mcusr,
but without the attribute "used" it will be optimized out in LTO builds. This
commits adds the attribute "used" to get_mcusr.

Also simplified the backward compatibility with older ATmegas (currently not
supported by RIOT) on outdated versions of avrlibc.
2020-02-10 17:08:09 +01:00
benpicco
24fb7a9aae
Merge pull request #12933 from maribu/atmega_pcint_cleanup
cpu/atmega_common/periph/gpio: Clean up PCINT support
2020-02-06 18:29:15 +01:00
Marian Buschsieweke
1879f58512
cpu/atmega_common: Cleanup state flags
- Use one byte of RAM to track both IRQ and UART TX state
- Fix incorrect use of volatile
2020-02-06 15:41:41 +01:00
Gunar Schorcht
668e05ed4f cpu/atmega: fix PWM compilation error with NDEBUG
When NDEBUG macro is defined during compilation, the assert macro produces empty code. The dev parameter is then unused.
2020-02-03 00:14:32 +01:00
Gunar Schorcht
2051167176 cpu/atmega: fix I2C compilation error with NDEBUG
When NDEBUG macro is defined during compilation, the assert macro produces empty code. The dev parameter is then unused.
2020-01-30 11:46:31 +01:00
Gunar Schorcht
ddd7cb0a7d
Merge pull request #12898 from aabadie/pr/cpu/dependencies_cleanup
cpu: move cpu level dependencies in dedicated Makefile.dep files
2020-01-28 17:57:02 +01:00
Sebastian Meiling
91cff05a15 doc: use @name for doxygen groups 2020-01-28 15:46:09 +01:00
Sebastian Meiling
2eae1952f7 doc: fix doxygen groups for atmega cpus 2020-01-28 15:44:29 +01:00
e969b2fcd5
cpu/atmega_common: move common dependencies 2020-01-28 13:20:53 +01:00
90e10d3009
cpu/atmega_common: move avr-libc-extra dependency to Makefile.dep 2020-01-28 13:20:52 +01:00
76b9cfb677
Merge pull request #12973 from fjmolinas/pr_atmega_tx_isr
cpu/atmega_common/periph/uart: use TX_ISR to check TX end
2020-01-15 11:51:22 +01:00
Francisco Molina
70c6df9330 cpu/atmega_common/periph/uart: use TX_ISR to check TX end
For atmega boards a TX has not actually completed until UDRn is empty
as well as the Transmit Shift Register.

To avoid resetting an UART before a TX has completed we use the TXCn
flash and ISR to set a variables that indicates TX is ongoing. This
allows not reseting the UART while there are ongoing TX pending.

This fixes an issue where part of the last byte is not shifted out
of the TX shift register causing rubish on the first TX following an
uart_init.
2020-01-15 10:02:40 +01:00
Marian Buschsieweke
3c7d95de02
cpu/atmega_common/periph: adc_sample() now returns int32_t 2020-01-10 14:13:13 +01:00
Marian Buschsieweke
3ecd303ed0
cpu/atmega_common/periph: Clean up PCINT support
- Using a enum instead of _COUNTER is easier to read
    - _COUNTER is also a reserved name; so better not use it to avoid issues
- Split out the pcint code into a static inline function for increased
  readability
2019-12-12 11:38:43 +01:00
Marian Buschsieweke
a45066551b
cpu/atmega_common/periph: Fixed bug in PCINT
The bank index and the pin number are not necessarily identical. For all
PCINT banks except for bank 3 bank_idx was used therefore. It was likely
just forgotten to update that for bank 3 as well.
2019-12-12 11:33:19 +01:00
chudov
efa9bb88a2 cpu/atmega256rfr2: symbol counter based RTT support 2019-12-05 22:53:05 +01:00
Matthew Blue
fb211c7c0c cpu/atmega_common: initial RTT support 2019-12-01 17:26:24 +01:00
Marian Buschsieweke
97f727349b
cpu/atmega_common: Fixed atmega_exit_isr
A context switch at the end of the ISR should only occur, if requested.
This fixes this.
2019-11-27 01:39:33 +01:00
41e29e3fda
Merge pull request #12790 from maribu/atmega_isr_thread
cpu/atmega_common
2019-11-24 11:10:10 +01:00
cc51f4ff7c cpu/atmega_common: fix typos 2019-11-23 22:39:35 +01:00
Francois Berder
4a31f94cfc many typo fixes
Signed-off-by: Francois Berder <18538310+francois-berder@users.noreply.github.com>
2019-11-23 22:39:07 +01:00
Marian Buschsieweke
606d72f64b
cpu/atmega_common: Clean up & fix IRQ handling
At the end of an ISR, the ATmega code was doing an `thread_yield()` instead of
 a `thread_yield_higher()`. This resulted in tests/isr_yield_higher failing.
 Fixing this saves a few lines of code, some ROM, and solves the issue.
2019-11-23 11:57:11 +01:00
Marian Buschsieweke
2b1bee750a
cpu/atmega_common: Stop using reserved names
Names with two leading underscores are reserved in any context of the c
 standard, and thus must not be used. This ATmega platform used it however for
 defining internal stuff. This commit fixes this.
2019-11-23 11:56:11 +01:00
benpicco
09f647eee2
Merge pull request #12693 from maribu/neopixel-atmega
drivers: Added WS281x RGB LED driver for ATmega platform
2019-11-22 22:36:36 +01:00
Marian Buschsieweke
8d0a9ead7b
cpu/atmega_common/periph: Fixed typo in gpio.c 2019-11-18 22:45:40 +01:00
Yegor Yefremov
cf65070b06 doxygen/GPIO: don't include overridden typedefs
Add missing #ifndefs to overridden GPIO typedefs.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
2019-11-15 10:35:33 +01:00
Yegor Yefremov
fa3b0ff04b doxygen/SPI: don't include overridden typedefs
Add missing #ifndefs to overridden SPI typedefs.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
2019-11-15 10:35:32 +01:00
Marian Buschsieweke
ba26aed107
cpu/atmega_common: Restructured code
Moved macros and static inline helper functions needed to access ATmega GPIOs
to cpu/atmega_common/include/atmega_gpio.h in order to reuse them for the
platform specific low level part of the Neopixel driver.
2019-11-12 20:15:59 +01:00
Benjamin Valentin
3ce6ddcdb2 cpu/atmega_common: cpuid: add a word of warning
The CPU ID only differs in byte 4 (RC calibration) between devices.

Add a word of warning to the documentation that this may not be very unique.
2019-11-11 18:07:09 +01:00
Benjamin Valentin
5b6d56efd5 atmega_common: provide CPU ID for every device
ATmega128RFA1/ATmega256RFR2 do not have a unique CPU ID.

Use the RC oscillator callibration byte as an impromptu CPU ID and rely
on bootlader constants present on all ATmega families for the remaining
bytes.

This way we can provide a faux CPU ID on all ATmega MCUs and typical hobbyists
with no access to JTAG adapters or high voltage programmer capable of writing
the user signature have a good chance that the CPU IDs of their device do not collide.
2019-11-08 16:58:03 +01:00
d22404b8b7
cpu/atmega_common: add implementation for watchdog 2019-11-07 11:35:29 +01:00
Marian Buschsieweke
314184adb5
cpu: Platform specific C11 atomics compat headers
Added headers to define platform specific sizes and types for the C11 atomics
compatibility module for C++.
2019-10-24 23:08:36 +02:00
629003d042
cpu/atmega: cleanup dependencies handling 2019-10-18 12:40:34 +02:00
9c442a3547
cpu/atmega_common: provide gpio feature at cpu level 2019-10-17 21:42:07 +02:00
Benjamin Valentin
b1ef68abf7 cpu/atmega_common: move periph/cpuid.c to common code
Both atmega128rfa1 and atmega256rfr2 implement it.
2019-10-17 19:20:31 +02:00
Benjamin Valentin
7d78e32b15 cpu/atmega128rfa1: ATmega128rfa1 MCU support 2019-10-17 19:20:31 +02:00
ebf43616b7 cpu: add arch_* features 2019-10-13 21:03:41 +02:00
Kevin "Tristate Tom" Weiss
4b7c5915ec
Merge pull request #10953 from gschorcht/sys/shell/heap_cmd/pr
sys/shell: add heap command
2019-10-04 13:49:57 +02:00
Gunar Schorcht
02d81b717e
Merge pull request #12063 from maribu/i2c_release
drivers/periph/i2c: Updated i2c_release() to return void
2019-10-01 19:50:38 +02:00
Sebastian Meiling
1d24709674 cpu/atmega_common: adapt timer to return 0 on success
Adapt periph/timer implementation of atmega based MCUs
to return 0 on success for all functions.
2019-09-11 13:41:44 +02:00
Juan I Carrano
abc25f0715
Merge pull request #11452 from maribu/atmega_irq
cpu/atmega_common: Bugfixes in irq_arch.c
2019-09-10 13:39:53 +02:00
Francisco
6d800ed85a
Merge pull request #11366 from maribu/early_stdio_atmega
cpu/atmega_common: Moved atmega_stdio_init() to cpu_init()
2019-09-09 10:22:53 +03:00
Gunar Schorcht
4b009649c6 cpu/atmega_common: changes for common heap command 2019-09-05 09:20:55 +02:00
Gaëtan Harter
1be5b7b10b
cpu: do not locally export compilation variables
These are already exported by `makefiles/vars.inc.mk`.
It is a prerequisite to allow handling compilation without global exports.
2019-08-29 10:35:53 +02:00
Marian Buschsieweke
454d25ae68
cpu/atmega_common: Updated i2c_release() 2019-08-22 12:03:07 +02:00
Gunar Schorcht
f52162bcb0 cpu/atmega_common: wrappers to avoid preemtion
Memory management function like `malloc`, `calloc`, `realloc` and `free` must not be preempted when they operate on allocator structures. To avoid such a preemption, wrappers around these functions are used which simply disable all interrupts for the time of their execution.
2019-08-12 23:22:23 +02:00
fabian18
2c001f5a6c drivers/include/periph/eeprom: Changed uint8_t* to void* in API 2019-08-09 17:27:32 +02:00
3e519e164b
cpu/atmega_common/gpio: use ARRAY_SIZE macro 2019-08-08 17:52:51 +02:00
Robert Hartung
7bca1cc5d5 cpu/atmega_common: implements pseudomodule-based pin change interrupts 2019-08-01 09:23:04 +02:00
Thomas Perrot
44803ea4fd
cpu/atmega32u4: add support for ATmega32U4 2019-05-24 15:12:47 +02:00
Marian Buschsieweke
20b9ef7c5b
cpu/atmega_common: Fix function attributes
Functions marked with __atribute__((naked)) may only use basic inline assembly
and must not use any c code. The functions __enter_thread_mode() and
cpu_switch_context_exit() are using C code, so they must not be marked as
naked.
2019-04-26 11:02:01 +02:00
Marian Buschsieweke
70cf9b34c7
cpu/atmega_common: Add barriers to irq_*()
To prevent reordering of accesses to the interrupt control register when link
time optimization (LTO) is enabled, memory barriers are needed. Without LTO
calls to the external functions irq_disable(), irq_restore(), irq_enable() and
irq_is_in() have the same affect as compiler barriers, as the compiler is unable
to prove that reordering of memory accesses is safe (from a single-threaded
point of view). With LTO the compiler can easily prove that reordering is safe
from a single-threaded point of view: Thus, the compiler may move memory
accesses wrapped in irq_disable(), irq_restore() across those calls.

The memory barriers will have no effect on non-LTO builds.
2019-04-25 17:42:15 +02:00
Marian Buschsieweke
48fabca38d
cpu/atmega_common: Fix return value of irq_enable
Citing the doc of irq_enable():

    @return Previous value of status register. [...]

On atmega however the new value of the status register is returned, not the one
prior to enabling interrupts.
2019-04-25 17:42:02 +02:00
Sebastian Meiling
d08a6132bf
Merge pull request #10934 from gschorcht/cpu_atmega_common_heap
cpu/atmega_common: make remaining RAM available as heap
2019-04-15 13:17:57 +02:00
Marian Buschsieweke
ca5e196e78
cpu/atmega_common: Move stdio_init() to cpu_init()
Moving atmega_stdio_init() to cpu_init() just before periph_init() guarantees
that stdio is available to allow DEBUG() in periph_init(). This also helps to
unify the boot up process of ATmega boards and de-duplicates the stdio init from
board_init().
2019-04-10 10:18:43 +02:00
Francisco Acosta
2bdcdddd76 cpu/atmega*: make use of common atmega.inc.mk and remove redundancies
Everything is now defined in atmega.inc.mk, following the common
RIOT-like reusability of rules and variables (e.g. cortexm.inc.mk).
2019-02-05 17:12:03 +01:00
Gunar Schorcht
ecb26526df cpu/atmega_common: make RAM available as heap
Fills __malloc_heap_end with the current SP before it enters thread mode to make the remaining RAM available as a heap.
2019-02-05 02:19:58 +01:00
Gaëtan Harter
9cd50a693a
cpu/atmega_common: do not export LINKFLAGS
This prevent evaluating `LINKFLAGS` when not needed and when building
in docker so does not produce errors if `avr-ld` is not installed.

```
BUILD_IN_DOCKER=1 BOARD=arduino-mega2560  make --no-print-directory -C examples/hello-world/ clean
/srv/ilab-builds/workspace/git/riot_master/makefiles/toolchain/gnu.inc.mk:18: objcopy not found. Hex file will not be created.
/bin/sh: 1: avr-ld: not found
```

It removes the `/bin/sh: 1: avr-ld: not found`
2019-01-23 18:32:40 +01:00
Sebastian Meiling
0edf76d362
Merge pull request #9984 from kaspar030/refactor_atmega_libc
cpu/atmega_common: refactor AVR libc code into module
2019-01-22 08:41:37 +01:00
7313525035 atmega_common: refactor avr-libc-extra into avr_libc_extra module 2019-01-21 14:37:08 +01:00
MrKevinWeiss
3ce03df0ff cpu/atmega_common/uart: Comment why brr calc is different from datasheet
The brr calculation on the datasheet is different than what is implmented.
This is intentional since it provides better rounding due to truncation.
There was no comment explaining that so this comment should prevent confusion.
2019-01-07 08:40:21 +01:00
c97bedcd8b cpu/atmega_common: define eeprom clear byte value 2018-12-04 11:24:57 +01:00
Kevin "Bear Puncher" Weiss
153759b926
Merge pull request #10498 from smlng/pr/adapt/7542
atmega: add periph_pwm (taken from #7542)
2018-11-29 15:54:51 +01:00
smlng
262a04c9cf atmega: fix periph timer configuration
- correct number of timers for atmega328p from 2 to 1
- correct number of timer channels for atmega328p from 3 to 2
- adapt atmega periph timer implementation accordingly
2018-11-29 09:30:44 +01:00
Victor Arino
2ebb187ca9 cpu/atmega-common: PWM implementation
Implementation of PWM with 8-bit timers
2018-11-28 16:00:54 +01:00
Victor Arino
01420152de cpu/atmega-common: add maps for 8-bit timers 2018-11-28 15:58:58 +01:00
PeterKietzmann
8d11ca417f cpu/atmega_common: add mega2560 puf_sram feature 2018-11-20 09:45:32 +01:00
Francisco Acosta
b2fc9b197e cpu/atmega*: remove unnecessary code (already factored out)
cpu.c and startup.c were redundant in most platforms, except for
atmega256rfr2. The common code is now in cpu/atmega_common/cpu.c
and cpu/atmega_common/startup.c. cpu_conf.h is also removed as
it's now in cpu/atmega_common/include thus shared by all atmega
based platforms.
2018-11-02 16:23:48 +01:00
Francisco Acosta
4f28407af8 cpu/atmega_common: use the same cpu_conf for all atmega based boards
Removes redundancy of code since all the boards were defining
the same variables. Moreover, the stack sizes are unified per
architecture, as required.
2018-11-02 16:23:48 +01:00
Francisco Acosta
feac98cc97 cpu/atmega_common: add cpu.c and startup.c common code
Removes duplicated code for atmega platforms. They were all
basically the same, only with the exception of atmegarfr2,
for which there is an #if statement to use the code in the
same file.
2018-11-02 16:23:47 +01:00
e9a6ebc409 cpu: drivers/eeprom: refactor periph_eeprom implementation 2018-10-16 10:39:10 +02:00
Martine Lenders
0eebda0958 atmega_common: mark closing #endif for MODULE_PERIPH_GPIO_IRQ 2018-10-09 15:10:59 +02:00
Hauke Petersen
94ff02f3c4 cpu/atmega/gpio: use gpio_irq feature 2018-09-21 08:11:20 +02:00
cladmi
9720d9c51c
cpu/atmega_common: Allow specifying a reserved space in ROM
It is defined using the `ROM_RESERVED` variable.

This should allow supporting arduino bootloader that is stored at the
end of the ROM.
2018-09-05 12:20:36 +02:00