From 923a458d7d3887dbf46895b936bfc6b346332aa8 Mon Sep 17 00:00:00 2001 From: Old-Ding <35417409+Old-Ding@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:48:12 +0800 Subject: [PATCH] bsp: fm33lc026: Fix GPIO IRQ map lookup Keep pin2irqindex within the pin_irq_map bounds and handle the first map entry without reading index -1. Pass encoded pin values to the IRQ map lookup path, and validate the lookup result before indexing the map. Generated-by: OpenAI Codex Signed-off-by: Old-Ding <35417409+Old-Ding@users.noreply.github.com> --- bsp/fm33lc026/libraries/HAL_Drivers/drv_gpio.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bsp/fm33lc026/libraries/HAL_Drivers/drv_gpio.c b/bsp/fm33lc026/libraries/HAL_Drivers/drv_gpio.c index c605cc587cc..c9bb0929726 100644 --- a/bsp/fm33lc026/libraries/HAL_Drivers/drv_gpio.c +++ b/bsp/fm33lc026/libraries/HAL_Drivers/drv_gpio.c @@ -220,9 +220,10 @@ static void fm33_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) rt_inline rt_int32_t pin2irqindex(rt_uint32_t pin) { rt_uint8_t irqindex; - for (irqindex = 4 * PIN_PORT(pin); irqindex <= ITEM_NUM(pin_irq_map); irqindex++) + for (irqindex = 4 * PIN_PORT(pin); irqindex < ITEM_NUM(pin_irq_map); irqindex++) { - if (pin_irq_map[irqindex].pin >= pin && pin_irq_map[irqindex - 1].pin < pin) + if (pin_irq_map[irqindex].pin >= pin && + (irqindex == 0 || pin_irq_map[irqindex - 1].pin < pin)) { return irqindex; } @@ -291,7 +292,7 @@ static rt_err_t fm33_pin_dettach_irq(struct rt_device *device, rt_base_t pin) return -RT_ENOSYS; } - irqindex = pin2irqindex(PIN_STPIN(pin)); + irqindex = pin2irqindex(pin); if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map)) { return -RT_ENOSYS; @@ -334,12 +335,12 @@ static rt_err_t fm33_pin_irq_enable(struct rt_device *device, rt_base_t pin, if (enabled == PIN_IRQ_ENABLE) { + irqindex = pin2irqindex(pin); if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map)) { return -RT_ENOSYS; } - irqindex = pin2irqindex(pin); irqmap = &pin_irq_map[irqindex]; level = rt_hw_interrupt_disable(); @@ -384,7 +385,7 @@ static rt_err_t fm33_pin_irq_enable(struct rt_device *device, rt_base_t pin, } else if (enabled == PIN_IRQ_DISABLE) { - irqmap = get_pin_irq_map(PIN_STPIN(pin)); + irqmap = get_pin_irq_map(pin); if (irqmap == RT_NULL) { return -RT_ENOSYS;