关键流程设计
添加 QSPI 总线
在 RT-Thread 板级初始化过程中,会调用 rt_hw_qspi_bus_init() 函数,将板子支持的 QSPI 控制器(总线)
添加到系统中。
INIT_BOARD_EXPORT(rt_hw_qspi_bus_init); // bsp/artinchip/drv/qspi/drv_qspi.c |-> rt_qspi_bus_register(); // kernel/rt-thread/components/drivers/spi/qspi_core.c |-> rt_spi_bus_register(); kernel/rt-thread/components/drivers/spi/spi_core.c |-> rt_spi_bus_device_init(); // kernel/rt-thread/components/drivers/spi/spi_dev.c |-> rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
添加 QSPI 设备
将 QSPI
设备挂载到总线上。
aic_qspi_bus_attach_device("qspi0", "GD25B127D", 0, 4, RT_NULL, RT_NULL); // bsp/artinchip/drv/qspi/drv_qspi.c |-> rt_spi_bus_attach_device(); // kernel/rt-thread/components/drivers/spi/spi_core.c |-> rt_spidev_device_init(device, name); // kernel/rt-thread/components/drivers/spi/spi_dev.c |-> rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
初始化流程
当 QSPI
设备需要使用之前,必须进行初始化配置。
rt_sfud_flash_probe_ex(); |-> rt_qspi_configure(qspi_dev, qspi_cfg); // kernel/rt-thread/components/drivers/spi/qspi_core.c |-> rt_spi_configure(&device->parent, &cfg->parent); // kernel/rt-thread/components/drivers/spi/spi_core.c |-> device->bus->ops->configure(device, &device->config); qspi_configure(device, &device->config); // bsp/artinchip/drv/qspi/drv_qspi.c |-> hal_qspi_master_init(&qspi->handle, &cfg);
中断流程
QSPI HAL 层提供了中断处理函数,但是是否使用中断模式由 DRV 层决定。 Luban-Lite SDK 中对接 RT-Thread 时,使能了中断处理模式。
首先在初始化时,注册了对应的中断处理函数。
qspi_configure(); // bsp/artinchip/drv/qspi/drv_qspi.c
|-> aicos_request_irq(qspi->irq_num, qspi_irq_handler, 0, NULL, (void *)&qspi->handle);
中断发生时,QSPI DRV 层的中断处理函数,调用 HAL
层的中断处理函数进行处理。
qspi_irq_handler(); p/artinchip/drv/qspi/drv_qspi.c |-> hal_qspi_master_irq_handler(h);