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

Merge pull request #20431 from cogip/native_fixes

cpu/native: add gpio-mock
This commit is contained in:
Karl Fessel 2024-03-28 22:07:10 +00:00 committed by GitHub
commit 3e2ab59f4d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 95 additions and 27 deletions

View File

@ -96,6 +96,52 @@ typedef enum {
} gpio_flank_t;
/** @} */
#elif defined(MODULE_PERIPH_GPIO_MOCK)
/**
* @brief Mocked GPIO
*
* Mocked GPIO representation for simulation.
* @{
*/
typedef struct {
int value; /**< current value */
int mode; /**< current mode */
int flank; /**< flank to trigger interrupts */
void (*cb)(void *arg); /**< ISR */
void *arg; /**< ISR arg */
} gpio_mock_t;
/** @} */
#define GPIO_UNDEF 0
#ifndef GPIO_PORT_MAX
#define GPIO_PORT_MAX (16)
#endif
#ifndef GPIO_PIN_MAX
#define GPIO_PIN_MAX (32)
#endif
/**
* @brief Mocked GPIO array
*/
extern gpio_mock_t gpio_mock[GPIO_PORT_MAX][GPIO_PIN_MAX];
#define HAVE_GPIO_T
/**
* @brief Pointer on a mocked GPIO
*/
typedef gpio_mock_t* gpio_t;
/**
* @brief Define a custom GPIO_PIN macro for native mocked GPIO framework.
* Get the mocked GPIO object from mocked GPIO array.
*/
#define GPIO_PIN(port, pin) \
(((port >= 0) && (pin >= 0) && (port < GPIO_PORT_MAX) && (pin < GPIO_PIN_MAX)) \
? &gpio_mock[port][pin] \
: GPIO_UNDEF)
#endif /* MODULE_PERIPH_GPIO_LINUX | DOXYGEN */

View File

@ -19,59 +19,83 @@
#include "periph/gpio.h"
int gpio_init(gpio_t pin, gpio_mode_t mode) {
(void) pin;
(void) mode;
/**
* @brief Mocked GPIO array
*/
gpio_mock_t gpio_mock[GPIO_PORT_MAX][GPIO_PIN_MAX];
__attribute__((weak)) int gpio_init(gpio_t pin, gpio_mode_t mode) {
(void) pin;
(void) mode;
if (pin) {
pin->mode = mode;
pin->value = 0;
return 0;
}
if (mode >= GPIO_OUT)
return 0;
else
return -1;
}
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
__attribute__((weak)) int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
gpio_cb_t cb, void *arg)
{
(void) pin;
(void) mode;
(void) flank;
(void) cb;
(void) arg;
if (pin) {
pin->mode = mode;
pin->flank = flank;
pin->value = 0;
pin->cb = cb;
pin->arg = arg;
return 0;
}
return -1;
}
void gpio_irq_enable(gpio_t pin)
__attribute__((weak)) void gpio_irq_enable(gpio_t pin)
{
(void) pin;
}
void gpio_irq_disable(gpio_t pin)
__attribute__((weak)) void gpio_irq_disable(gpio_t pin)
{
(void) pin;
}
int gpio_read(gpio_t pin) {
(void) pin;
__attribute__((weak)) int gpio_read(gpio_t pin) {
if (pin) {
return pin->value;
}
return 0;
return -1;
}
void gpio_set(gpio_t pin) {
(void) pin;
__attribute__((weak)) void gpio_set(gpio_t pin) {
if (pin) {
pin->value = 1;
}
}
void gpio_clear(gpio_t pin) {
(void) pin;
__attribute__((weak)) void gpio_clear(gpio_t pin) {
if (pin) {
pin->value = 0;
}
}
void gpio_toggle(gpio_t pin) {
(void) pin;
__attribute__((weak)) void gpio_toggle(gpio_t pin) {
if (pin) {
pin->value ^= 1;
}
}
void gpio_write(gpio_t pin, int value) {
(void) pin;
(void) value;
__attribute__((weak)) void gpio_write(gpio_t pin, int value) {
if (pin) {
pin->value = value;
}
}
/** @} */

View File

@ -71,9 +71,7 @@ int32_t qdec_init(qdec_t qdec, qdec_mode_t mode, qdec_cb_t cb, void *arg)
}
/* Initialize qdec channels */
for (uint8_t i = 0; i < QDEC_NUMOF; i++) {
qdecs[qdec] = 0;
}
qdecs[qdec] = 0;
/* Reset counter and start qdec */
qdec_start(qdec);