123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461 |
- extern "C" {
- GPIO_OUTPUT_INIT_LOW | \
- GPIO_OUTPUT_INIT_LOGICAL)
- GPIO_OUTPUT_INIT_HIGH | \
- GPIO_OUTPUT_INIT_LOGICAL)
- GPIO_INT_ENABLE | \
- GPIO_INT_LEVELS_LOGICAL | \
- GPIO_INT_EDGE | \
- GPIO_INT_LOW_0 | \
- GPIO_INT_HIGH_1)
- GPIO_INT_EDGE | \
- GPIO_INT_HIGH_1)
- GPIO_INT_EDGE | \
- GPIO_INT_LOW_0)
- GPIO_INT_EDGE | \
- GPIO_INT_LOW_0 | \
- GPIO_INT_HIGH_1)
- GPIO_INT_LOW_0)
- GPIO_INT_HIGH_1)
- GPIO_INT_LEVELS_LOGICAL | \
- GPIO_INT_EDGE | \
- GPIO_INT_LOW_0)
- GPIO_INT_LEVELS_LOGICAL | \
- GPIO_INT_EDGE | \
- GPIO_INT_HIGH_1)
- GPIO_INT_LEVELS_LOGICAL | \
- GPIO_INT_LOW_0)
- GPIO_INT_LEVELS_LOGICAL | \
- GPIO_INT_HIGH_1)
- typedef uint32_t gpio_port_pins_t;
- typedef uint32_t gpio_port_value_t;
- typedef uint8_t gpio_pin_t;
- typedef uint8_t gpio_dt_flags_t;
- typedef uint32_t gpio_flags_t;
- struct gpio_dt_spec {
- const struct device *port;
- gpio_pin_t pin;
- gpio_dt_flags_t dt_flags;
- };
- { \
- .port = DEVICE_DT_GET(DT_GPIO_CTLR_BY_IDX(node_id, prop, idx)),\
- .pin = DT_GPIO_PIN_BY_IDX(node_id, prop, idx), \
- .dt_flags = DT_GPIO_FLAGS_BY_IDX(node_id, prop, idx), \
- }
- COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
- (GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, idx)), \
- (default_value))
- GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, 0)
- GPIO_DT_SPEC_GET_BY_IDX_OR(node_id, prop, 0, default_value)
- GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), prop, idx)
- GPIO_DT_SPEC_GET_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
- GPIO_DT_SPEC_INST_GET_BY_IDX(inst, prop, 0)
- GPIO_DT_SPEC_INST_GET_BY_IDX_OR(inst, prop, 0, default_value)
- struct gpio_driver_config {
-
- gpio_port_pins_t port_pin_mask;
- };
- struct gpio_driver_data {
-
- gpio_port_pins_t invert;
- };
- struct gpio_callback;
- typedef void (*gpio_callback_handler_t)(const struct device *port,
- struct gpio_callback *cb,
- gpio_port_pins_t pins);
- struct gpio_callback {
-
- sys_snode_t node;
-
- gpio_callback_handler_t handler;
-
- gpio_port_pins_t pin_mask;
- };
- enum gpio_int_mode {
- GPIO_INT_MODE_DISABLED = GPIO_INT_DISABLE,
- GPIO_INT_MODE_LEVEL = GPIO_INT_ENABLE,
- GPIO_INT_MODE_EDGE = GPIO_INT_ENABLE | GPIO_INT_EDGE,
- };
- enum gpio_int_trig {
-
- GPIO_INT_TRIG_LOW = GPIO_INT_LOW_0,
-
- GPIO_INT_TRIG_HIGH = GPIO_INT_HIGH_1,
-
- GPIO_INT_TRIG_BOTH = GPIO_INT_LOW_0 | GPIO_INT_HIGH_1,
- };
- __subsystem struct gpio_driver_api {
- int (*pin_configure)(const struct device *port, gpio_pin_t pin,
- gpio_flags_t flags);
- int (*port_get_raw)(const struct device *port,
- gpio_port_value_t *value);
- int (*port_set_masked_raw)(const struct device *port,
- gpio_port_pins_t mask,
- gpio_port_value_t value);
- int (*port_set_bits_raw)(const struct device *port,
- gpio_port_pins_t pins);
- int (*port_clear_bits_raw)(const struct device *port,
- gpio_port_pins_t pins);
- int (*port_toggle_bits)(const struct device *port,
- gpio_port_pins_t pins);
- int (*pin_interrupt_configure)(const struct device *port,
- gpio_pin_t pin,
- enum gpio_int_mode, enum gpio_int_trig);
- int (*manage_callback)(const struct device *port,
- struct gpio_callback *cb,
- bool set);
- uint32_t (*get_pending_int)(const struct device *dev);
- };
- __syscall int gpio_pin_interrupt_configure(const struct device *port,
- gpio_pin_t pin,
- gpio_flags_t flags);
- static inline int z_impl_gpio_pin_interrupt_configure(const struct device *port,
- gpio_pin_t pin,
- gpio_flags_t flags)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- const struct gpio_driver_data *const data =
- (const struct gpio_driver_data *)port->data;
- enum gpio_int_trig trig;
- enum gpio_int_mode mode;
- __ASSERT_NO_MSG((flags & GPIO_INT_DEBOUNCE) == 0);
- __ASSERT((flags & (GPIO_INT_DISABLE | GPIO_INT_ENABLE))
- != (GPIO_INT_DISABLE | GPIO_INT_ENABLE),
- "Cannot both enable and disable interrupts");
- __ASSERT((flags & (GPIO_INT_DISABLE | GPIO_INT_ENABLE)) != 0U,
- "Must either enable or disable interrupts");
- __ASSERT(((flags & GPIO_INT_ENABLE) == 0) ||
- ((flags & GPIO_INT_EDGE) != 0) ||
- ((flags & (GPIO_INT_LOW_0 | GPIO_INT_HIGH_1)) !=
- (GPIO_INT_LOW_0 | GPIO_INT_HIGH_1)),
- "Only one of GPIO_INT_LOW_0, GPIO_INT_HIGH_1 can be "
- "enabled for a level interrupt.");
- __ASSERT(((flags & GPIO_INT_ENABLE) == 0) ||
- ((flags & (GPIO_INT_LOW_0 | GPIO_INT_HIGH_1)) != 0),
- "At least one of GPIO_INT_LOW_0, GPIO_INT_HIGH_1 has to be "
- "enabled.");
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- if (((flags & GPIO_INT_LEVELS_LOGICAL) != 0) &&
- ((data->invert & (gpio_port_pins_t)BIT(pin)) != 0)) {
-
- flags ^= (GPIO_INT_LOW_0 | GPIO_INT_HIGH_1);
- }
- trig = (enum gpio_int_trig)(flags & (GPIO_INT_LOW_0 | GPIO_INT_HIGH_1));
- mode = (enum gpio_int_mode)(flags & (GPIO_INT_EDGE | GPIO_INT_DISABLE | GPIO_INT_ENABLE));
- return api->pin_interrupt_configure(port, pin, mode, trig);
- }
- static inline int gpio_pin_interrupt_configure_dt(const struct gpio_dt_spec *spec,
- gpio_flags_t flags)
- {
- return gpio_pin_interrupt_configure(spec->port, spec->pin, flags);
- }
- __syscall int gpio_pin_configure(const struct device *port,
- gpio_pin_t pin,
- gpio_flags_t flags);
- static inline int z_impl_gpio_pin_configure(const struct device *port,
- gpio_pin_t pin,
- gpio_flags_t flags)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- struct gpio_driver_data *data =
- (struct gpio_driver_data *)port->data;
- __ASSERT((flags & GPIO_INT_MASK) == 0,
- "Interrupt flags are not supported");
- __ASSERT((flags & (GPIO_PULL_UP | GPIO_PULL_DOWN)) !=
- (GPIO_PULL_UP | GPIO_PULL_DOWN),
- "Pull Up and Pull Down should not be enabled simultaneously");
- __ASSERT((flags & GPIO_OUTPUT) != 0 || (flags & GPIO_SINGLE_ENDED) == 0,
- "Output needs to be enabled for 'Open Drain', 'Open Source' "
- "mode to be supported");
- __ASSERT_NO_MSG((flags & GPIO_SINGLE_ENDED) != 0 ||
- (flags & GPIO_LINE_OPEN_DRAIN) == 0);
- __ASSERT((flags & (GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH)) == 0
- || (flags & GPIO_OUTPUT) != 0,
- "Output needs to be enabled to be initialized low or high");
- __ASSERT((flags & (GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH))
- != (GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH),
- "Output cannot be initialized low and high");
- if (((flags & GPIO_OUTPUT_INIT_LOGICAL) != 0)
- && ((flags & (GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH)) != 0)
- && ((flags & GPIO_ACTIVE_LOW) != 0)) {
- flags ^= GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH;
- }
- flags &= ~GPIO_OUTPUT_INIT_LOGICAL;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- if ((flags & GPIO_ACTIVE_LOW) != 0) {
- data->invert |= (gpio_port_pins_t)BIT(pin);
- } else {
- data->invert &= ~(gpio_port_pins_t)BIT(pin);
- }
- return api->pin_configure(port, pin, flags);
- }
- static inline int gpio_pin_configure_dt(const struct gpio_dt_spec *spec,
- gpio_flags_t extra_flags)
- {
- return gpio_pin_configure(spec->port,
- spec->pin,
- spec->dt_flags | extra_flags);
- }
- __syscall int gpio_port_get_raw(const struct device *port,
- gpio_port_value_t *value);
- static inline int z_impl_gpio_port_get_raw(const struct device *port,
- gpio_port_value_t *value)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- return api->port_get_raw(port, value);
- }
- static inline int gpio_port_get(const struct device *port,
- gpio_port_value_t *value)
- {
- const struct gpio_driver_data *const data =
- (const struct gpio_driver_data *)port->data;
- int ret;
- ret = gpio_port_get_raw(port, value);
- if (ret == 0) {
- *value ^= data->invert;
- }
- return ret;
- }
- __syscall int gpio_port_set_masked_raw(const struct device *port,
- gpio_port_pins_t mask,
- gpio_port_value_t value);
- static inline int z_impl_gpio_port_set_masked_raw(const struct device *port,
- gpio_port_pins_t mask,
- gpio_port_value_t value)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- return api->port_set_masked_raw(port, mask, value);
- }
- static inline int gpio_port_set_masked(const struct device *port,
- gpio_port_pins_t mask,
- gpio_port_value_t value)
- {
- const struct gpio_driver_data *const data =
- (const struct gpio_driver_data *)port->data;
- value ^= data->invert;
- return gpio_port_set_masked_raw(port, mask, value);
- }
- __syscall int gpio_port_set_bits_raw(const struct device *port,
- gpio_port_pins_t pins);
- static inline int z_impl_gpio_port_set_bits_raw(const struct device *port,
- gpio_port_pins_t pins)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- return api->port_set_bits_raw(port, pins);
- }
- static inline int gpio_port_set_bits(const struct device *port,
- gpio_port_pins_t pins)
- {
- return gpio_port_set_masked(port, pins, pins);
- }
- __syscall int gpio_port_clear_bits_raw(const struct device *port,
- gpio_port_pins_t pins);
- static inline int z_impl_gpio_port_clear_bits_raw(const struct device *port,
- gpio_port_pins_t pins)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- return api->port_clear_bits_raw(port, pins);
- }
- static inline int gpio_port_clear_bits(const struct device *port,
- gpio_port_pins_t pins)
- {
- return gpio_port_set_masked(port, pins, 0);
- }
- __syscall int gpio_port_toggle_bits(const struct device *port,
- gpio_port_pins_t pins);
- static inline int z_impl_gpio_port_toggle_bits(const struct device *port,
- gpio_port_pins_t pins)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- return api->port_toggle_bits(port, pins);
- }
- static inline int gpio_port_set_clr_bits_raw(const struct device *port,
- gpio_port_pins_t set_pins,
- gpio_port_pins_t clear_pins)
- {
- __ASSERT((set_pins & clear_pins) == 0, "Set and Clear pins overlap");
- return gpio_port_set_masked_raw(port, set_pins | clear_pins, set_pins);
- }
- static inline int gpio_port_set_clr_bits(const struct device *port,
- gpio_port_pins_t set_pins,
- gpio_port_pins_t clear_pins)
- {
- __ASSERT((set_pins & clear_pins) == 0, "Set and Clear pins overlap");
- return gpio_port_set_masked(port, set_pins | clear_pins, set_pins);
- }
- static inline int gpio_pin_get_raw(const struct device *port, gpio_pin_t pin)
- {
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- gpio_port_value_t value;
- int ret;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- ret = gpio_port_get_raw(port, &value);
- if (ret == 0) {
- ret = (value & (gpio_port_pins_t)BIT(pin)) != 0 ? 1 : 0;
- }
- return ret;
- }
- static inline int gpio_pin_get(const struct device *port, gpio_pin_t pin)
- {
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- gpio_port_value_t value;
- int ret;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- ret = gpio_port_get(port, &value);
- if (ret == 0) {
- ret = (value & (gpio_port_pins_t)BIT(pin)) != 0 ? 1 : 0;
- }
- return ret;
- }
- static inline int gpio_pin_get_dt(const struct gpio_dt_spec *spec)
- {
- return gpio_pin_get(spec->port, spec->pin);
- }
- static inline int gpio_pin_set_raw(const struct device *port, gpio_pin_t pin,
- int value)
- {
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- int ret;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- if (value != 0) {
- ret = gpio_port_set_bits_raw(port, (gpio_port_pins_t)BIT(pin));
- } else {
- ret = gpio_port_clear_bits_raw(port, (gpio_port_pins_t)BIT(pin));
- }
- return ret;
- }
- static inline int gpio_pin_set(const struct device *port, gpio_pin_t pin,
- int value)
- {
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- const struct gpio_driver_data *const data =
- (const struct gpio_driver_data *)port->data;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- if (data->invert & (gpio_port_pins_t)BIT(pin)) {
- value = (value != 0) ? 0 : 1;
- }
- return gpio_pin_set_raw(port, pin, value);
- }
- static inline int gpio_pin_set_dt(const struct gpio_dt_spec *spec, int value)
- {
- return gpio_pin_set(spec->port, spec->pin, value);
- }
- static inline int gpio_pin_toggle(const struct device *port, gpio_pin_t pin)
- {
- const struct gpio_driver_config *const cfg =
- (const struct gpio_driver_config *)port->config;
- (void)cfg;
- __ASSERT((cfg->port_pin_mask & (gpio_port_pins_t)BIT(pin)) != 0U,
- "Unsupported pin");
- return gpio_port_toggle_bits(port, (gpio_port_pins_t)BIT(pin));
- }
- static inline int gpio_pin_toggle_dt(const struct gpio_dt_spec *spec)
- {
- return gpio_pin_toggle(spec->port, spec->pin);
- }
- static inline void gpio_init_callback(struct gpio_callback *callback,
- gpio_callback_handler_t handler,
- gpio_port_pins_t pin_mask)
- {
- __ASSERT(callback, "Callback pointer should not be NULL");
- __ASSERT(handler, "Callback handler pointer should not be NULL");
- callback->handler = handler;
- callback->pin_mask = pin_mask;
- }
- static inline int gpio_add_callback(const struct device *port,
- struct gpio_callback *callback)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- if (api->manage_callback == NULL) {
- return -ENOTSUP;
- }
- return api->manage_callback(port, callback, true);
- }
- static inline int gpio_remove_callback(const struct device *port,
- struct gpio_callback *callback)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)port->api;
- if (api->manage_callback == NULL) {
- return -ENOTSUP;
- }
- return api->manage_callback(port, callback, false);
- }
- __syscall int gpio_get_pending_int(const struct device *dev);
- static inline int z_impl_gpio_get_pending_int(const struct device *dev)
- {
- const struct gpio_driver_api *api =
- (const struct gpio_driver_api *)dev->api;
- if (api->get_pending_int == NULL) {
- return -ENOTSUP;
- }
- return api->get_pending_int(dev);
- }
- }
|