0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

IIO驅(qū)動框架創(chuàng)建和相關(guān)配置

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-30 11:53 ? 次閱讀

IIO驅(qū)動框架創(chuàng)建

分析 IIO 子系統(tǒng)的時候大家應(yīng)該看出了,IIO框架主要用于 ADC 類的傳感器,比如陀螺儀、加速度計、磁力計、光強度計等,這些傳感器基本都是IIC 或者 SPI 接口的。因此 IIO驅(qū)動的基礎(chǔ)框架就是 IIC 或者 SPI ,我們可以在 IIC 或 SPI 驅(qū)動里面在加上 regmap。當(dāng)然了,有些 SOC內(nèi)部的 ADC 也會使用 IIO 框架,那么這個時候驅(qū)動的基礎(chǔ)框架就是 platfrom。

IIO 設(shè)備的申請、初始化以及注冊在 probe 函數(shù)中完成,在注銷驅(qū)動的時候還需要在 remove 函數(shù)中注銷掉
IIO 設(shè)備、釋放掉申請的一些內(nèi)存。

以 SPI 接口為例,demo 如下

/* 自定義設(shè)備結(jié)構(gòu)體 */
struct xxx_dev { 
 struct spi_device *spi; /* spi 設(shè)備 */
 struct regmap *regmap; /* regmap */
 struct regmap_config regmap_config;
 struct mutex lock;
};

/*
* 通道數(shù)組
*/
static const struct iio_chan_spec xxx_channels[] = {

};

/*
* @description : 讀函數(shù),當(dāng)讀取 sysfs 中的文件的時候最終此函數(shù)會執(zhí)行,
* :此函數(shù)里面會從傳感器里面讀取各種數(shù)據(jù),然后上傳給應(yīng)用。
* @param - indio_dev : IIO 設(shè)備
* @param - chan : 通道
* @param - val : 讀取的值,如果是小數(shù)值的話,val 是整數(shù)部分。
* @param - val2 : 讀取的值,如果是小數(shù)值的話,val2 是小數(shù)部分。
* @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 : 寫函數(shù),當(dāng)向 sysfs 中的文件寫數(shù)據(jù)的時候最終此函數(shù)
* :會執(zhí)行,一般在此函數(shù)里面設(shè)置傳感器,比如量程等。
* @param - indio_dev : IIO 設(shè)備
* @param - chan : 通道
* @param - val : 應(yīng)用程序?qū)懭胫担绻切?shù)的話,val 是整數(shù)部分。
* @param - val2 : 應(yīng)用程序?qū)懭胫?,如果是小?shù)的話,val2 是小數(shù)部分。
* @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 : 用戶空間寫數(shù)據(jù)格式,比如我們在用戶空間操作 sysfs 來設(shè)
* :置傳感器的分辨率,如果分辨率帶小數(shù),那么這個小數(shù)傳遞到
* : 內(nèi)核空間應(yīng)該擴大多少倍,此函數(shù)就是用來設(shè)置這個的。
* @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 結(jié)構(gòu)體變量
*/
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 驅(qū)動的 probe 函數(shù),當(dāng)驅(qū)動與
* 設(shè)備匹配以后此函數(shù)就會執(zhí)行
* @param - spi : spi 設(shè)備
* 
*/ 
static int xxx_probe(struct spi_device *spi)
{
  int ret;
  struct xxx_dev *data;
  struct iio_dev *indio_dev;

  /* 1、申請 iio_dev 內(nèi)存 */
  indio_dev = devm_iio_device_alloc(&spi- >dev, sizeof(*data));
  if (!indio_dev)
  return -ENOMEM;

  /* 2、獲取 xxx_dev 結(jié)構(gòu)體地址 */
  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 相關(guān)設(shè)置 */

  /* 5、SPI 相關(guān)設(shè)置*/

  /* 6、芯片初始化 */

  return 0;

}

/*
* @description : spi 驅(qū)動的 remove 函數(shù),移除 spi 驅(qū)動的時候此函數(shù)會執(zhí)行
* @param - spi : spi 設(shè)備
* @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、使能內(nèi)核

IIO 相關(guān)配置

Linux 內(nèi)核默認使能了 IIO 子系統(tǒng),但是有一些 IIO 模塊沒有選擇上,這樣會導(dǎo)致我們編譯
驅(qū)動的時候會提示某些 API 函數(shù)不存在,需要使能的項目如下:

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

IIO 驅(qū)動框架提供了 sysfs 接口,因此加載成功以后我們可以在用戶空間訪問對應(yīng)的 sysfs
目錄項,進入目錄“/sys/bus/iio/devices/”目錄里面,此目錄下都是 IIO 框架設(shè)備。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2541

    文章

    49961

    瀏覽量

    747507
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1790

    瀏覽量

    84909
收藏 人收藏

    評論

    相關(guān)推薦

    創(chuàng)建和配置數(shù)據(jù)源

    JAVA教程之創(chuàng)建和配置數(shù)據(jù)源,很好的JAVA的資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-12 17:41 ?6次下載

    如何創(chuàng)建和使用Xilinx的UltraScale PCI Express解決方案

    了解如何創(chuàng)建和使用Xilinx的UltraScale PCI Express解決方案。 使用Vivado IP目錄GUI創(chuàng)建和使用PCI Express IP內(nèi)核。 打開示例設(shè)計并在Vivado軟件中實現(xiàn)它。
    的頭像 發(fā)表于 11-28 06:36 ?3652次閱讀
    如何<b class='flag-5'>創(chuàng)建和</b>使用Xilinx的UltraScale PCI Express解決方案

    如何使用Vivado Device Programmer創(chuàng)建和配置存儲設(shè)備

    了解如何使用Vivado Device Programmer創(chuàng)建和配置配置存儲設(shè)備。 首先,我們將學(xué)習(xí)如何設(shè)置正確的比特流屬性并生成配置存儲器文件。
    的頭像 發(fā)表于 11-22 07:11 ?7395次閱讀

    FreeRTOS任務(wù)如何創(chuàng)建和刪除?

    在FreeRTOS移植到Cortex-M3硬件平臺的文章中,我們已經(jīng)見過任務(wù)創(chuàng)建API,但那篇文章的重點在于如何移植FreeRTOS,本文將重點放在任務(wù)的創(chuàng)建和刪除API函數(shù)上面。 任務(wù)創(chuàng)建和刪除
    的頭像 發(fā)表于 03-11 18:08 ?2807次閱讀

    AD7887 IIO ADC Linux驅(qū)動程序

    AD7887 IIO ADC Linux驅(qū)動程序
    發(fā)表于 04-20 20:29 ?6次下載
    AD7887 <b class='flag-5'>IIO</b> ADC Linux<b class='flag-5'>驅(qū)動</b>程序

    AD7998 IIO ADC Linux驅(qū)動程序

    AD7998 IIO ADC Linux驅(qū)動程序
    發(fā)表于 04-21 20:33 ?16次下載
    AD7998 <b class='flag-5'>IIO</b> ADC Linux<b class='flag-5'>驅(qū)動</b>程序

    AD9832 IIO直接數(shù)字合成Linux驅(qū)動程序

    AD9832 IIO直接數(shù)字合成Linux驅(qū)動程序
    發(fā)表于 04-21 21:20 ?3次下載
    AD9832 <b class='flag-5'>IIO</b>直接數(shù)字合成Linux<b class='flag-5'>驅(qū)動</b>程序

    AD9834 IIO直接數(shù)字合成Linux驅(qū)動程序

    AD9834 IIO直接數(shù)字合成Linux驅(qū)動程序
    發(fā)表于 04-26 14:16 ?1次下載
    AD9834 <b class='flag-5'>IIO</b>直接數(shù)字合成Linux<b class='flag-5'>驅(qū)動</b>程序

    IIO單通道串行ADC Linux驅(qū)動程序

    IIO單通道串行ADC Linux驅(qū)動程序
    發(fā)表于 05-19 18:26 ?5次下載
    <b class='flag-5'>IIO</b>單通道串行ADC Linux<b class='flag-5'>驅(qū)動</b>程序

    AD5446 IIO DAC Linux驅(qū)動程序

    AD5446 IIO DAC Linux驅(qū)動程序
    發(fā)表于 05-23 09:31 ?8次下載
    AD5446 <b class='flag-5'>IIO</b> DAC Linux<b class='flag-5'>驅(qū)動</b>程序

    AD7303 IIO DAC Linux驅(qū)動程序

    AD7303 IIO DAC Linux驅(qū)動程序
    發(fā)表于 05-23 11:08 ?1次下載
    AD7303 <b class='flag-5'>IIO</b> DAC Linux<b class='flag-5'>驅(qū)動</b>程序

    AD5360 IIO多通道Linux驅(qū)動程序DAC

    AD5360 IIO多通道Linux驅(qū)動程序DAC
    發(fā)表于 05-23 11:18 ?7次下載
    AD5360 <b class='flag-5'>IIO</b>多通道Linux<b class='flag-5'>驅(qū)動</b>程序DAC

    AD5380 IIO多通道Linux驅(qū)動程序DAC

    AD5380 IIO多通道Linux驅(qū)動程序DAC
    發(fā)表于 05-23 17:55 ?8次下載
    AD5380 <b class='flag-5'>IIO</b>多通道Linux<b class='flag-5'>驅(qū)動</b>程序DAC

    AD5449 IIO DAC Linux驅(qū)動程序

    AD5449 IIO DAC Linux驅(qū)動程序
    發(fā)表于 05-24 10:38 ?3次下載
    AD5449 <b class='flag-5'>IIO</b> DAC Linux<b class='flag-5'>驅(qū)動</b>程序

    如何創(chuàng)建和使用LabVIEW中的LLB文件

    如何創(chuàng)建和使用LabVIEW中的LLB文件
    發(fā)表于 11-22 16:12 ?0次下載