关键流程设计
初始化流程
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 流程
Luban-Lite 对 GPIO Irq 做了一个二级中断的封装:
-
一级中断。每个 GPIO Group 共享一个物理中断号,每个 GPIO Group 最多包含 32 个 GPIO Pin 脚。
-
二级中断。每个 GPIO Pin 脚中断也虚拟成标准的 Luban-Lite 中断,但是实际上是 GPIO Group ISR 做了一次中转。