Edit online

关键流程设计

4 Dec 2024
Read time: 1 minute(s)

初始化流程

GPAI 模块完全遵循 driver 的通用初始化流程,申请 regs 资源、clk、reset,还需要注册一个 iio 设备,使用 iio 子系统提供的注册接口 iio_device_register():
#define iio_device_register(indio_dev) \
    __iio_device_register((indio_dev), THIS_MODULE)
参数 dev 是一个 struct iio_dev 类型的指针,其中关键信息有:设备名称、通道数目、一组 iio 的操作集(struct iio_info)、通道配置信息等。在 info 中,我们暂时只实现了一个 read 接口:
static const struct iio_info aic_gpai_iio_info = {
    .read_raw = aic_gpai_read_raw,
};

中断处理流程

GPAI 支持使用中断方式来读取数据,这样避免软件去做等待处理。


gpai_irq_flow1

1. GPAI 非周期模式的数据采集流程
  • 对于非周期模式:当用户层触发 read_raw() 接口,就会启动一次硬件去读数据

  • 当硬件准备好数据,会产生一个中断

  • 在中断处理函数中,用 INT Flag 来区分是哪个通道有数据,逐个通道扫描将数据读出,会缓存到一个全局变量中

  • 对于周期模式:GPAI 控制器会自动按给定周期产生一次数据中断

注:

周期模式时,当周期值太小,比如 < 10ms,会增加系统的调度负担。

注:

TODO:目前,当产生高电平、低电平告警的时候,只是驱动中打印警告信息,暂未做其他处理。