Edit online

关键流程设计

添加 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);