三好先森|LINUX IIO子系统分析之六 IIO设备驱动开发流程说明( 二 )


三、IIO DEVICE的驱动开发流程【三好先森|LINUX IIO子系统分析之六 IIO设备驱动开发流程说明】 以上主要讲的是iio 子系统内部的实现 , 下面我们说下如何实现一个iio device driver , iio device driver的实现相对来说还是比较清晰明了的 。

  • 针对iio device的每一个channel , 定义其支持设备属性参数( struct iio_chan_spec类型的变量) , 以便在iio_device_register时 , 完成各类设备属性的创建 , 下图是我实现的虚拟iio temp device的channel定义 , 若某一channel支持iio buffer , 则设置scan_index、scan_type信息;若支持iio event , 则需要实现event_spec变量( struct iio_event_spec类型的变量 , 定义event类型等 , 以便生成iio event设备属性)

三好先森|LINUX IIO子系统分析之六 IIO设备驱动开发流程说明
  • 定义iio device相关info的读写接口 , 主要是struct iio_info类型的变量 , 如下即为struct iio_info定义的实例 , 其中read_raw、write_raw用于raw data 的读写操作(单次数据采集);而read_event_config、write_event_config、read_event_value、write_event_value接口则主要用于event使能控制、event相关值的读写(如温度告警阈值设置等)

三好先森|LINUX IIO子系统分析之六 IIO设备驱动开发流程说明
  • 调用devm_iio_device_alloc接口 , 申请一个iio device的内存空间;
  • 根据上述步骤1、2定义的变量 , 初始化该iio device;
  • 若该设备支持iio trigger-buffer , 则调用iio_triggered_buffer_setup , 完成iio trigger-buffer的初始化操作;
  • 若该iio device提供iio trigger , 则调用iio_trigger_register完成iio trigger的注册 , 并与iio device进行绑定;
  • 若该iio device提供中断用于iio buffer的采集 , 则完成该中断的中断申请 , 并在中断处理函数中调用iio_trigger_poll , 由iio trigger模块调用iio buffer的处理接口 , 实现iio device 使能channel的采集操作 , 并存储在iio buffer中
  • 调用devm_iio_device_register完成iio device的注册 。
完成以上几步 , 基本上也就可以实现一个iio device driver , 下一章我们将通过一个虚拟的iio devicedriver实例进行动手实践 , 该虚拟iio device driver涉及虚拟i2c adapter driver、虚拟irq controller , 可以实现温度数据的中断触发采集与温度告警中断触发操作 。