11
#include <embox/unit.h>
12
#include <lib/libds/bit.h>
14
#include <drivers/gpio/gpio_driver.h>
19
#include <framework/mod/options.h>
21
#include <module/platform/efm32/efm32_conf.h>
23
#include <embox/unit.h>
25
EMBOX_UNIT_INIT(efm32_gpio_init);
27
#define BSP_LED_POLARITY 1
29
#define EFM32_GPIO_CHIP_ID OPTION_GET(NUMBER,gpio_chip_id)
30
#define EFM32_GPIO_PORTS_COUNT (OPTION_GET(NUMBER,gpio_ports_number) + 1)
32
static const struct gpio_chip efm32_gpio_chip;
34
static int efm32_gpio_setup_mode(unsigned char port, gpio_mask_t pins, int mode) {
39
bit_foreach(bit, pins) {
40
if (pins & (1 << bit)) {
41
GPIO_PinModeSet(port, bit, gpioModePushPull, BSP_LED_POLARITY ? 0 : 1);
51
static void efm32_gpio_set(unsigned char port, gpio_mask_t pins, char level) {
53
GPIO_PortOutSet(port, pins);
55
GPIO_PortOutClear(port, pins);
59
static gpio_mask_t efm32_gpio_get(unsigned char port, gpio_mask_t pins) {
61
return GPIO_PortOutGet(port) & pins;
64
static const struct gpio_chip efm32_gpio_chip = {
65
.setup_mode = efm32_gpio_setup_mode,
66
.get = efm32_gpio_get,
67
.set = efm32_gpio_set,
68
.nports = EFM32_GPIO_PORTS_COUNT
71
static int efm32_gpio_init(void) {
72
#if (_SILICON_LABS_32B_SERIES < 2)
73
CMU_ClockEnable(cmuClock_HFPER, true);
76
#if (_SILICON_LABS_32B_SERIES < 2) \
77
|| defined(_SILICON_LABS_32B_SERIES_2_CONFIG_2)
78
CMU_ClockEnable(cmuClock_GPIO, true);
80
return gpio_register_chip((struct gpio_chip *)&efm32_gpio_chip, EFM32_GPIO_CHIP_ID);