| // Copyright 2025 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| #include "pw_digital_io_zephyr/digital_io.h" |
| |
| #include <zephyr/sys/util.h> |
| |
| #include "lib/stdcompat/bit.h" |
| |
| extern "C" void pw_digital_io_ZephyrCallbackHandler(const struct device* dev, |
| struct gpio_callback* cb, |
| uint32_t pin_mask) { |
| PW_ASSERT(cpp20::has_single_bit(pin_mask)); |
| auto owner = |
| CONTAINER_OF(cb, pw::digital_io::gpio_callback_and_handler, data); |
| |
| if (owner->handler == nullptr) { |
| return; |
| } |
| owner->handler(gpio_pin_get(dev, cpp20::countr_zero(pin_mask)) == 0 |
| ? pw::digital_io::State::kInactive |
| : pw::digital_io::State::kActive); |
| } |