Edit online

关键流程设计

初始化流程

Rt-Thread 系统初始化时会自动调用 GPIO 驱动初始化函数:

Reset_Handler
    → entry()
        → rtthread_startup()
            → rt_hw_board_init()
                → rt_components_board_init()
                    → drv_pin_init()
drv_pin_init() 注册了 RTT Pin 驱动:
const static struct rt_pin_ops _drv_pin_ops =
{
    drv_pin_mode,
    drv_pin_write,
    drv_pin_read,
#ifdef AIC_GPIO_IRQ_DRV_EN
    drv_pin_attach_irq,
    drv_pin_detach_irq,
    drv_pin_irq_enable,
#else
    RT_NULL,
    RT_NULL,
    RT_NULL,
#endif
    drv_pin_get,
};

int drv_pin_init(void)
{
    int ret = RT_EOK;

    ret = rt_device_pin_register("pin", &_drv_pin_ops, RT_NULL);

    return ret;
}
INIT_BOARD_EXPORT(drv_pin_init);

GPIO Irq 流程

../images/gpio_irq.png

Luban-Lite 对 GPIO Irq 做了一个二级中断的封装:

  1. 一级中断。每个 GPIO Group 共享一个物理中断号,每个 GPIO Group 最多包含 32 个 GPIO Pin 脚。

  2. 二级中断。每个 GPIO Pin 脚中断也虚拟成标准的 Luban-Lite 中断,但是实际上是 GPIO Group ISR 做了一次中转。