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

cpu/atmega_common: some additional periph drivers fixed for atmega8 cpu

- periph/eeprom.c
- periph/wdt.c
- periph/gpio_ll_irq.c

removed unsupported cpuid and dpgpin feature for atmega8 cpu familly

pkg/qdsa: bump the commit hash bump the commit hash after RIOT-OS/qDSA#4
was merged
This commit is contained in:
Hugues Larrive 2023-07-06 01:40:40 +02:00
parent 1b8ad7cffc
commit 064c799e57
8 changed files with 66 additions and 8 deletions

View File

@ -19,7 +19,7 @@ config CPU_MODEL_ATMEGA8
config HAS_CPU_ATMEGA8 config HAS_CPU_ATMEGA8
bool bool
help help
Indicates that a 'atmega8' cpu is being used. Indicates that an 'atmega8' cpu is being used.
## Common CPU symbols ## Common CPU symbols
config CPU_FAM config CPU_FAM

View File

@ -1 +1,3 @@
CPU_FAM = atmega8
include $(RIOTCPU)/atmega_common/Makefile.features include $(RIOTCPU)/atmega_common/Makefile.features

View File

@ -14,8 +14,8 @@ config CPU_COMMON_ATMEGA
bool bool
select HAS_CPU_CORE_ATMEGA select HAS_CPU_CORE_ATMEGA
select HAS_ATMEGA_PCINT0 select HAS_ATMEGA_PCINT0
select HAS_DBGPIN select HAS_DBGPIN if !CPU_FAM_ATMEGA8
select HAS_PERIPH_CPUID select HAS_PERIPH_CPUID if !CPU_FAM_ATMEGA8
select HAS_PERIPH_EEPROM select HAS_PERIPH_EEPROM
select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO
select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_GPIO_IRQ

View File

@ -5,8 +5,6 @@ include $(RIOTCPU)/avr8_common/Makefile.features
FEATURES_PROVIDED += cpu_core_atmega FEATURES_PROVIDED += cpu_core_atmega
FEATURES_PROVIDED += atmega_pcint0 FEATURES_PROVIDED += atmega_pcint0
FEATURES_PROVIDED += dbgpin
FEATURES_PROVIDED += periph_cpuid
FEATURES_PROVIDED += periph_eeprom FEATURES_PROVIDED += periph_eeprom
FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_gpio periph_gpio_irq
FEATURES_PROVIDED += periph_gpio_ll FEATURES_PROVIDED += periph_gpio_ll
@ -20,6 +18,10 @@ FEATURES_PROVIDED += periph_timer_periodic
FEATURES_PROVIDED += periph_rtt_overflow FEATURES_PROVIDED += periph_rtt_overflow
FEATURES_PROVIDED += periph_wdt FEATURES_PROVIDED += periph_wdt
FEATURES_PROVIDED += puf_sram FEATURES_PROVIDED += puf_sram
ifneq (atmega8, $(CPU_FAM))
FEATURES_PROVIDED += dbgpin
FEATURES_PROVIDED += periph_cpuid
endif
FEATURES_CONFLICT += periph_rtc:periph_rtt FEATURES_CONFLICT += periph_rtc:periph_rtt
FEATURES_CONFLICT_MSG += "On ATmega, the RTC and RTT use to the same hardware timer." FEATURES_CONFLICT_MSG += "On ATmega, the RTC and RTT use to the same hardware timer."

View File

@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2018 Inria * Copyright (C) 2018 Inria
* 2023 Hugues Larrive
* *
* This file is subject to the terms and conditions of the GNU Lesser * This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level * General Public License v2.1. See the file LICENSE in the top level
@ -15,6 +16,7 @@
* @brief Low-level EEPROM driver implementation for ATmega family * @brief Low-level EEPROM driver implementation for ATmega family
* *
* @author Alexandre Abadie <alexandre.abadie@inria.fr> * @author Alexandre Abadie <alexandre.abadie@inria.fr>
* @author Hugues Larrive <hugues.larrive@pm.me>
* @} * @}
*/ */
@ -35,7 +37,11 @@ size_t eeprom_read(uint32_t pos, void *data, size_t len)
DEBUG("Reading data from EEPROM at pos %" PRIu32 ": ", pos); DEBUG("Reading data from EEPROM at pos %" PRIu32 ": ", pos);
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
#ifdef EEPE
while (EECR & (1 << EEPE)) {} while (EECR & (1 << EEPE)) {}
#elif defined(EEWE)
while (EECR & (1 << EEWE)) {}
#endif
/* Set up address register */ /* Set up address register */
EEAR = pos++; EEAR = pos++;
@ -58,17 +64,30 @@ size_t eeprom_write(uint32_t pos, const void *data, size_t len)
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
/* Wait for completion of previous operation */ /* Wait for completion of previous operation */
#ifdef EEPE
while (EECR & (1 << EEPE)) {} while (EECR & (1 << EEPE)) {}
#elif defined(EEWE)
while (EECR & (1 << EEWE)) {}
#endif
/* Set up address and Data Registers */ /* Set up address and Data Registers */
EEAR = pos++; EEAR = pos++;
EEDR = *p++; EEDR = *p++;
#ifdef EEMPE
/* Write logical one to EEMPE */ /* Write logical one to EEMPE */
EECR |= (1 << EEMPE); EECR |= (1 << EEMPE);
#elif defined(EEMWE)
/* Write logical one to EEMWE */
EECR |= (1 << EEMWE);
#endif
#ifdef EEPE
/* Start eeprom write by setting EEPE */ /* Start eeprom write by setting EEPE */
EECR |= (1 << EEPE); EECR |= (1 << EEPE);
#elif defined(EEWE)
/* Start eeprom write by setting EEWE */
EECR |= (1 << EEWE);
#endif
} }
return len; return len;

View File

@ -3,6 +3,7 @@
* 2016 INRIA * 2016 INRIA
* 2022 Otto-von-Guericke-Universität Magdeburg * 2022 Otto-von-Guericke-Universität Magdeburg
* 2023 Gerson Fernando Budke * 2023 Gerson Fernando Budke
* 2023 Hugues Larrive
* *
* This file is subject to the terms and conditions of the GNU Lesser General * This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more * Public License v2.1. See the file LICENSE in the top level directory for more
@ -24,6 +25,7 @@
* @author Torben Petersen <petersen@ibr.cs.tu-bs.de> * @author Torben Petersen <petersen@ibr.cs.tu-bs.de>
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de> * @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
* @author Gerson Fernando Budke <nandojve@gmail.com> * @author Gerson Fernando Budke <nandojve@gmail.com>
* @author Hugues Larrive <hugues.larrive@pm.me>
* *
* @} * @}
*/ */
@ -49,32 +51,54 @@ static struct isr_ctx isr_ctx[GPIO_EXT_INT_NUMOF];
static void clear_pending_irqs(uint8_t exti) static void clear_pending_irqs(uint8_t exti)
{ {
#if defined(EIFR)
EIFR |= 1 << exti; EIFR |= 1 << exti;
#elif defined(GIFR)
GIFR |= 1 << (INTF0 + exti);
#else
# error "No support for AVR with neither EIFR nor GIFR"
#endif
} }
void gpio_ll_irq_mask(gpio_port_t port, uint8_t pin) void gpio_ll_irq_mask(gpio_port_t port, uint8_t pin)
{ {
uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin); uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin);
#if defined(EIMSK)
EIMSK &= ~(1 << exti); EIMSK &= ~(1 << exti);
#elif defined(GICR)
GICR &= ~(1 << (INT0 + exti));
#endif
} }
void gpio_ll_irq_unmask(gpio_port_t port, uint8_t pin) void gpio_ll_irq_unmask(gpio_port_t port, uint8_t pin)
{ {
uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin); uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin);
#if defined(EIMSK)
EIMSK |= 1 << exti; EIMSK |= 1 << exti;
#elif defined(GICR)
GICR |= 1 << (INT0 + exti);
#endif
} }
void gpio_ll_irq_unmask_and_clear(gpio_port_t port, uint8_t pin) void gpio_ll_irq_unmask_and_clear(gpio_port_t port, uint8_t pin)
{ {
uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin); uint8_t exti = atmega_pin2exti(GPIO_PORT_NUM(port), pin);
clear_pending_irqs(exti); clear_pending_irqs(exti);
#if defined(EIMSK)
EIMSK |= 1 << exti; EIMSK |= 1 << exti;
#elif defined(GICR)
GICR |= 1 << (INT0 + exti);
#endif
} }
static void set_trigger(uint8_t exti, gpio_irq_trig_t trig) static void set_trigger(uint8_t exti, gpio_irq_trig_t trig)
{ {
exti <<= 1; exti <<= 1;
#if defined(EICRA)
volatile uint8_t *eicr = &EICRA; volatile uint8_t *eicr = &EICRA;
#elif defined(MCUCR)
volatile uint8_t *eicr = &MCUCR;
#endif
#ifdef EICRB #ifdef EICRB
if (exti >= 8) { if (exti >= 8) {
@ -110,7 +134,11 @@ int gpio_ll_irq(gpio_port_t port, uint8_t pin, gpio_irq_trig_t trig,
/* setup IRQ */ /* setup IRQ */
set_trigger(exti, trig); set_trigger(exti, trig);
clear_pending_irqs(exti); clear_pending_irqs(exti);
#if defined(EIMSK)
EIMSK |= 1 << exti; EIMSK |= 1 << exti;
#elif defined(GICR)
GICR |= 1 << (INT0 + exti);
#endif
irq_restore(irq_state); irq_restore(irq_state);

View File

@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2019 Inria * Copyright (C) 2019 Inria
* 2023 Hugues Larrive
* *
* This file is subject to the terms and conditions of the GNU Lesser * This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level * General Public License v2.1. See the file LICENSE in the top level
@ -15,6 +16,7 @@
* @brief Implementation of the watchdog peripheral interface * @brief Implementation of the watchdog peripheral interface
* *
* @author Alexandre Abadie <alexandre.abadie@inria.fr> * @author Alexandre Abadie <alexandre.abadie@inria.fr>
* @author Hugues Larrive <hugues.larrive@pm.me>
* *
* @} * @}
*/ */
@ -66,13 +68,18 @@ void wdt_setup_reboot(uint32_t min_time, uint32_t max_time)
/* disable watchdog */ /* disable watchdog */
wdt_disable(); wdt_disable();
/* WDTO_8S and WDTO_4S are only available on some devices, we will
* test on WDP3 as in avr/wdt.h */
#ifdef WDP3
if (max_time >= 8000) { if (max_time >= 8000) {
wdt_prescaler = WDTO_8S; wdt_prescaler = WDTO_8S;
} }
else if (max_time >= 4000) { else if (max_time >= 4000) {
wdt_prescaler = WDTO_4S; wdt_prescaler = WDTO_4S;
} }
else if (max_time >= 2000) { else
#endif
if (max_time >= 2000) {
wdt_prescaler = WDTO_2S; wdt_prescaler = WDTO_2S;
} }
else if (max_time >= 1000) { else if (max_time >= 1000) {

View File

@ -1,6 +1,6 @@
PKG_NAME=qdsa PKG_NAME=qdsa
PKG_URL=https://github.com/RIOT-OS/qdsa.git PKG_URL=https://github.com/RIOT-OS/qdsa.git
PKG_VERSION=4cb3f1a140f25e18ed288fd484defe3d45bdf166 PKG_VERSION=3fa25ffa3971000fe4a3e3b42340c40c8d79f2a2
PKG_LICENSE=PD PKG_LICENSE=PD
include $(RIOTBASE)/pkg/pkg.mk include $(RIOTBASE)/pkg/pkg.mk