0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IIO驱动框架创建和相关配置

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-30 11:53 次阅读

IIO驱动框架创建

分析 IIO 子系统的时候大家应该看出了,IIO框架主要用于 ADC 类的传感器,比如陀螺仪、加速度计、磁力计、光强度计等,这些传感器基本都是IIC 或者 SPI 接口的。因此 IIO驱动的基础框架就是 IIC 或者 SPI ,我们可以在 IIC 或 SPI 驱动里面在加上 regmap。当然了,有些 SOC内部的 ADC 也会使用 IIO 框架,那么这个时候驱动的基础框架就是 platfrom。

IIO 设备的申请、初始化以及注册在 probe 函数中完成,在注销驱动的时候还需要在 remove 函数中注销掉
IIO 设备、释放掉申请的一些内存。

以 SPI 接口为例,demo 如下

/* 自定义设备结构体 */
struct xxx_dev { 
 struct spi_device *spi; /* spi 设备 */
 struct regmap *regmap; /* regmap */
 struct regmap_config regmap_config;
 struct mutex lock;
};

/*
* 通道数组
*/
static const struct iio_chan_spec xxx_channels[] = {

};

/*
* @description : 读函数,当读取 sysfs 中的文件的时候最终此函数会执行,
* :此函数里面会从传感器里面读取各种数据,然后上传给应用。
* @param - indio_dev : IIO 设备
* @param - chan : 通道
* @param - val : 读取的值,如果是小数值的话,val 是整数部分。
* @param - val2 : 读取的值,如果是小数值的话,val2 是小数部分。
* @param - mask : 掩码。
* @return : 0,成功;其他值,错误
*/
static int xxx_read_raw(struct iio_dev *indio_dev,
   struct iio_chan_spec const *chan,
   int *val, int *val2, long mask)
{
 return 0;
} 

/*
* @description : 写函数,当向 sysfs 中的文件写数据的时候最终此函数
* :会执行,一般在此函数里面设置传感器,比如量程等。
* @param - indio_dev : IIO 设备
* @param - chan : 通道
* @param - val : 应用程序写入值,如果是小数的话,val 是整数部分。
* @param - val2 : 应用程序写入值,如果是小数的话,val2 是小数部分。
* @return : 0,成功;其他值,错误
*/
static int xxx_write_raw(struct iio_dev *indio_dev,
   struct iio_chan_spec const *chan,
   int val, int val2, long mask)
{
 return 0;
}

/*
* @description : 用户空间写数据格式,比如我们在用户空间操作 sysfs 来设
* :置传感器的分辨率,如果分辨率带小数,那么这个小数传递到
* : 内核空间应该扩大多少倍,此函数就是用来设置这个的。
* @param - indio_dev : iio_dev
* @param - chan : 通道
* @param - mask : 掩码
* @return : 0,成功;其他值,错误
*/
static int xxx_write_raw_get_fmt(struct iio_dev *indio_dev,
   struct iio_chan_spec const *chan, long mask)
{
 return 0;
}

/*
* iio_info 结构体变量
*/
static const struct iio_info xxx_info = {
  .read_raw = xxx_read_raw,
  .write_raw = xxx_write_raw,
  .write_raw_get_fmt = &xxx_write_raw_get_fmt,
};

/*
* @description : spi 驱动的 probe 函数,当驱动与
* 设备匹配以后此函数就会执行
* @param - spi : spi 设备
* 
*/ 
static int xxx_probe(struct spi_device *spi)
{
  int ret;
  struct xxx_dev *data;
  struct iio_dev *indio_dev;

  /* 1、申请 iio_dev 内存 */
  indio_dev = devm_iio_device_alloc(&spi- >dev, sizeof(*data));
  if (!indio_dev)
  return -ENOMEM;

  /* 2、获取 xxx_dev 结构体地址 */
  data = iio_priv(indio_dev);
  data- >spi = spi;
  spi_set_drvdata(spi, indio_dev);
  mutex_init(&data- >lock);

  /* 3、初始化 iio_dev 成员变量 */
  indio_dev- >dev.parent = &spi- >dev;
  indio_dev- >info = &xxx_info;
  indio_dev- >name = "xxx";
  indio_dev- >modes = INDIO_DIRECT_MODE; /* 直接模式 /
  indio_dev- >channels = xxx_channels;
  indio_dev- >num_channels = ARRAY_SIZE(xxx_channels);

  iio_device_register(indio_dev);

  /* 4、regmap 相关设置 */

  /* 5、SPI 相关设置*/

  /* 6、芯片初始化 */

  return 0;

}

/*
* @description : spi 驱动的 remove 函数,移除 spi 驱动的时候此函数会执行
* @param - spi : spi 设备
* @return : 0,成功;其他负值,失败
*/
static int xxx_remove(struct spi_device *spi)
{
  struct iio_dev *indio_dev = spi_get_drvdata(spi);
  struct xxx_dev *data;

  data = iio_priv(indio_dev); ;

  /* 1、其他资源的注销以及释放 */

  /* 2、注销 IIO */
  iio_device_unregister(indio_dev);

  return 0;
}

3、使能内核

IIO 相关配置

Linux 内核默认使能了 IIO 子系统,但是有一些 IIO 模块没有选择上,这样会导致我们编译
驱动的时候会提示某些 API 函数不存在,需要使能的项目如下:

- > Device Drivers 
   - > Industrial I/O support (IIO [=y])
       - > [*]Enable buffer support within IIO //选中
       - >  * >Industrial I/O buffering based on kfifo //选中

IIO 驱动框架提供了 sysfs 接口,因此加载成功以后我们可以在用户空间访问对应的 sysfs
目录项,进入目录“/sys/bus/iio/devices/”目录里面,此目录下都是 IIO 框架设备。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2550

    文章

    51046

    浏览量

    753142
  • 驱动
    +关注

    关注

    12

    文章

    1839

    浏览量

    85270
收藏 人收藏

    评论

    相关推荐

    创建和配置数据源

    JAVA教程之创建和配置数据源,很好的JAVA的资料,快来学习吧。
    发表于 04-12 17:41 6次下载

    如何创建和使用Xilinx的UltraScale PCI Express解决方案

    了解如何创建和使用Xilinx的UltraScale PCI Express解决方案。 使用Vivado IP目录GUI创建和使用PCI Express IP内核。 打开示例设计并在Vivado软件中实现它。
    的头像 发表于 11-28 06:36 3760次阅读
    如何<b class='flag-5'>创建和</b>使用Xilinx的UltraScale PCI Express解决方案

    如何使用Vivado Device Programmer创建和配置存储设备

    了解如何使用Vivado Device Programmer创建和配置配置存储设备。 首先,我们将学习如何设置正确的比特流属性并生成配置存储器文件。
    的头像 发表于 11-22 07:11 7649次阅读

    FreeRTOS任务如何创建和删除?

    在FreeRTOS移植到Cortex-M3硬件平台的文章中,我们已经见过任务创建API,但那篇文章的重点在于如何移植FreeRTOS,本文将重点放在任务的创建和删除API函数上面。 任务创建和删除
    的头像 发表于 03-11 18:08 2926次阅读

    AD7887 IIO ADC Linux驱动程序

    AD7887 IIO ADC Linux驱动程序
    发表于 04-20 20:29 6次下载
    AD7887 <b class='flag-5'>IIO</b> ADC Linux<b class='flag-5'>驱动</b>程序

    AD7998 IIO ADC Linux驱动程序

    AD7998 IIO ADC Linux驱动程序
    发表于 04-21 20:33 16次下载
    AD7998 <b class='flag-5'>IIO</b> ADC Linux<b class='flag-5'>驱动</b>程序

    AD9832 IIO直接数字合成Linux驱动程序

    AD9832 IIO直接数字合成Linux驱动程序
    发表于 04-21 21:20 3次下载
    AD9832 <b class='flag-5'>IIO</b>直接数字合成Linux<b class='flag-5'>驱动</b>程序

    AD9834 IIO直接数字合成Linux驱动程序

    AD9834 IIO直接数字合成Linux驱动程序
    发表于 04-26 14:16 1次下载
    AD9834 <b class='flag-5'>IIO</b>直接数字合成Linux<b class='flag-5'>驱动</b>程序

    IIO单通道串行ADC Linux驱动程序

    IIO单通道串行ADC Linux驱动程序
    发表于 05-19 18:26 7次下载
    <b class='flag-5'>IIO</b>单通道串行ADC Linux<b class='flag-5'>驱动</b>程序

    AD7303 IIO DAC Linux驱动程序

    AD7303 IIO DAC Linux驱动程序
    发表于 05-23 11:08 1次下载
    AD7303 <b class='flag-5'>IIO</b> DAC Linux<b class='flag-5'>驱动</b>程序

    AD5360 IIO多通道Linux驱动程序DAC

    AD5360 IIO多通道Linux驱动程序DAC
    发表于 05-23 11:18 7次下载
    AD5360 <b class='flag-5'>IIO</b>多通道Linux<b class='flag-5'>驱动</b>程序DAC

    AD5380 IIO多通道Linux驱动程序DAC

    AD5380 IIO多通道Linux驱动程序DAC
    发表于 05-23 17:55 8次下载
    AD5380 <b class='flag-5'>IIO</b>多通道Linux<b class='flag-5'>驱动</b>程序DAC

    AD5449 IIO DAC Linux驱动程序

    AD5449 IIO DAC Linux驱动程序
    发表于 05-24 10:38 3次下载
    AD5449 <b class='flag-5'>IIO</b> DAC Linux<b class='flag-5'>驱动</b>程序

    如何创建和使用LabVIEW中的LLB文件

    如何创建和使用LabVIEW中的LLB文件
    发表于 11-22 16:12 0次下载

    Linux,IIO驱动完结有感

    1. 我录制45天,你学完只需要1天 历时1个半月,驱动大全IIO驱动完结了!20个视频,时长5小时45分钟。大纲如下: 01.1_IIO子系统简化
    的头像 发表于 12-06 09:45 161次阅读
    Linux,<b class='flag-5'>IIO</b><b class='flag-5'>驱动</b>完结有感