IIO驅(qū)動(dòng)框架創(chuàng)建
分析 IIO 子系統(tǒng)的時(shí)候大家應(yīng)該看出了,IIO框架主要用于 ADC 類的傳感器,比如陀螺儀、加速度計(jì)、磁力計(jì)、光強(qiáng)度計(jì)等,這些傳感器基本都是IIC 或者 SPI 接口的。因此 IIO驅(qū)動(dòng)的基礎(chǔ)框架就是 IIC 或者 SPI ,我們可以在 IIC 或 SPI 驅(qū)動(dòng)里面在加上 regmap。當(dāng)然了,有些 SOC內(nèi)部的 ADC 也會(huì)使用 IIO 框架,那么這個(gè)時(shí)候驅(qū)動(dòng)的基礎(chǔ)框架就是 platfrom。
IIO 設(shè)備的申請(qǐng)、初始化以及注冊(cè)在 probe 函數(shù)中完成,在注銷驅(qū)動(dòng)的時(shí)候還需要在 remove 函數(shù)中注銷掉
IIO 設(shè)備、釋放掉申請(qǐng)的一些內(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í)候最終此函數(shù)會(huì)執(zhí)行,
* :此函數(shù)里面會(huì)從傳感器里面讀取各種數(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,成功;其他值,錯(cuò)誤
*/
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í)候最終此函數(shù)
* :會(huì)執(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,成功;其他值,錯(cuò)誤
*/
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ù)格式,比如我們?cè)谟脩艨臻g操作 sysfs 來(lái)設(shè)
* :置傳感器的分辨率,如果分辨率帶小數(shù),那么這個(gè)小數(shù)傳遞到
* : 內(nèi)核空間應(yīng)該擴(kuò)大多少倍,此函數(shù)就是用來(lái)設(shè)置這個(gè)的。
* @param - indio_dev : iio_dev
* @param - chan : 通道
* @param - mask : 掩碼
* @return : 0,成功;其他值,錯(cuò)誤
*/
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ū)動(dòng)的 probe 函數(shù),當(dāng)驅(qū)動(dòng)與
* 設(shè)備匹配以后此函數(shù)就會(huì)執(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、申請(qǐng) 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ū)動(dòng)的 remove 函數(shù),移除 spi 驅(qū)動(dòng)的時(shí)候此函數(shù)會(huì)執(zhí)行
* @param - spi : spi 設(shè)備
* @return : 0,成功;其他負(fù)值,失敗
*/
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)核默認(rèn)使能了 IIO 子系統(tǒng),但是有一些 IIO 模塊沒(méi)有選擇上,這樣會(huì)導(dǎo)致我們編譯
驅(qū)動(dòng)的時(shí)候會(huì)提示某些 API 函數(shù)不存在,需要使能的項(xiàng)目如下:
- > Device Drivers
- > Industrial I/O support (IIO [=y])
- > [*]Enable buffer support within IIO //選中
- > * >Industrial I/O buffering based on kfifo //選中
IIO 驅(qū)動(dòng)框架提供了 sysfs 接口,因此加載成功以后我們可以在用戶空間訪問(wèn)對(duì)應(yīng)的 sysfs
目錄項(xiàng),進(jìn)入目錄“/sys/bus/iio/devices/”目錄里面,此目錄下都是 IIO 框架設(shè)備。
-
傳感器
+關(guān)注
關(guān)注
2553文章
51448瀏覽量
756889 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1852瀏覽量
85684
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
創(chuàng)建和配置數(shù)據(jù)源
如何創(chuàng)建和使用Xilinx的UltraScale PCI Express解決方案
![如何<b class='flag-5'>創(chuàng)建和</b>使用Xilinx的UltraScale PCI Express解決方案](https://file.elecfans.com/web1/M00/70/F8/o4YBAFv1NuCAB4v1AAAlYuVY89c936.jpg)
如何使用Vivado Device Programmer創(chuàng)建和配置存儲(chǔ)設(shè)備
FreeRTOS任務(wù)如何創(chuàng)建和刪除?
AD9832 IIO直接數(shù)字合成Linux驅(qū)動(dòng)程序
![AD9832 <b class='flag-5'>IIO</b>直接數(shù)字合成Linux<b class='flag-5'>驅(qū)動(dòng)</b>程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
AD9834 IIO直接數(shù)字合成Linux驅(qū)動(dòng)程序
![AD9834 <b class='flag-5'>IIO</b>直接數(shù)字合成Linux<b class='flag-5'>驅(qū)動(dòng)</b>程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux,IIO驅(qū)動(dòng)完結(jié)有感
![Linux,<b class='flag-5'>IIO</b><b class='flag-5'>驅(qū)動(dòng)</b>完結(jié)有感](https://file1.elecfans.com/web3/M00/01/49/wKgZO2dSV-mADNqBAAA_py8r-mA623.png)
評(píng)論