久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > FS4412開發板(ban)使用Linux IIO驅(qu)動(dong)框架實現(xian)ADC驅(qu)動(dong)

FS4412開發板使用Linux IIO驅動框(kuang)架實現ADC驅動 時(shi)間(jian):2017-11-17      來源(yuan):未知

1. 概述

FS4412開發板有一個4通道(0/1/2)、10/12比特(te)精度的 ADC ,其中:

1) ADCIN0: 在(zai)核心板中引出 

2) ADCIN1: 在核(he)心板中引出

3) ADCIN2: 在核心(xin)板中(zhong)引出 

4) ADCIN3: 連接開發(fa)板的(de)VR1電位器

本文主要介(jie)紹基于IIO驅動框架的ADC的簡單實現方(fang)法。

2. 配置DTS節點

FS4412 ADC 的 DTS 節點在(zai) kernel/arch/arm/boot/dts/exynos4412-fs4412.dts 文(wen)件中添(tian)加如下定(ding)義:

adc: adc@12C60000 {                                 

        compatible = "samsung,exynos-adc-fs4412";   

&nbsp; &nbsp;     reg = <0x126C0000 0x100>, <0x10020718 0x4>; 

        clocks = <&clock 303>;                      

        clock-names = "adc";                        

&nbsp;   &nbsp;   #io-channel-cells = <1>;                    

         io-channel-ranges;  ;                        

        status = "okay"; &nbsp;                        ;  

};                   &nbsp;                              

 

3. 編寫驅動

ADC 的(de)驅動源碼為 fs4412_adc.c

3.1. 定義 ADC 通道

可用(yong)的(de)通道(dao)列表在 fs4412_adc.c 中定義:

#define ADC_CHANNEL(_index, _id) {                     &nbsp;\

&nbsp;   .type = IIO_VOLTAGE,                                \

    .indexed = 1,    ;                            ;       \

    .channel = _index,                ;          \

    .address = _index,       &nbsp;                  \

   ; .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),  ;     \

    .datasheet_name = _id,                             &nbsp;\

}

 

/* 通道信息 */

static const struct iio_chan_spec fs4412_adc_iio_channels[] = {

    ADC_CHANNEL(0, "adc0"),

    ADC_CHANNEL(1, "adc1"),

    ADC_CHANNEL(2, "adc2";),

    ADC_CHANNEL(3, "adc3"),

};

 

3.2. ADC采(cai)集原(yuan)始數據原(yuan)理

根據Exynos4412處理器的(de)官方使用(yong)手冊提(ti)供的(de)資(zi)料,可以(yi)總結ADC的(de)基本使用(yong)方法如下(xia):

3.2.1. 初始化過程

5) 初始化ADC_CFG(0x0x10010118)

[16] = 0 設置ADC為(wei)普通模式

6) 初始化ADCCON(0x126C0000)

[16] = 1 使用12位(wei)ADC

[14] = 1 允許分(fen)頻

[13:6]=0xFF 分頻系數

使ADC的工作頻率(lv)控(kong)制(zhi)在5MHz以內

7) 選擇輸入引腳(jiao)ADCMUX(0x126C001C)

[3:0] = 0x03 選擇AIN3作為輸入引(yin)腳

3.2.2. 執行采集轉換過程

1) 開始轉換(huan)ADCCON(0x126C0000)

[0] = 1 ADC開(kai)始轉換

2) 判斷是(shi)否轉換(huan)完成ADCCON(0x126C0000)

讀取(qu)[15]位狀態=1表示轉(zhuan)換完成

3) 讀(du)取轉換(huan)結果(guo)ADCDAT(0x126C000C)

讀ADC的轉換結果

3.3. 計算采集到的電壓

使用標準(zhun)電(dian)壓將 AD 轉(zhuan)換的值(zhi)(zhi)轉(zhuan)換為用戶所需要的電(dian)壓值(zhi)(zhi)。其計算公式(shi)如下:

Vref / (2^n-1) = Vresult / raw

注:

Vref 為標(biao)準電(dian)壓 

n 為 AD 轉換的位數(shu) 

Vresult 為用戶所需要(yao)的(de)采(cai)集電壓 

raw 為 AD 采集的原(yuan)始數據

 

例(li)如,標準電壓為 1.8V,AD 采集(ji)位數為 10 位,AD 采集(ji)到的原始數據為 568,則:

Vresult = (1800mv * 568) / 1023;

3.4. 驅動測試例程

以下為完整(zheng)的讀取 ADC 的驅動(dong)例程:

#include <linux/module.h>

#include <linux/platform_device.h>

#include <linux/io.h>

#include <linux/iio/iio.h>

 

MODULE_AUTHOR("LvXin <lvx_sy@farsight.com.cn>");

MODULE_DESCRIPTION("FS4412 ADC driver");

MODULE_LICENSE("GPL v2");

 

#define CON(x) ((x) + 0x00)

#define DLY(x) ((x) + 0x08)

#define DATX(x) ((x) + 0x0C)

#define INTCLR(x) ((x) + 0x18)

#define MUX(x) ((x) + 0x1c)

 

#define CON_RES (1u << 16)

#define CON_PRSCEN (1u << 14)

#define CON_PRSCLV(x) (((x) & 0xFF) << 6)

#define CON_STANDBY (1u << 2)

 

#define MAX_CHANNELS 4

 

#define ADC_CON_EN_START (1u << 0)

#define ADC_DATX_MASK 0xFFF

 

/* adc類 */

struct fs4412_adc {

    void __iomem *regs;

    u32 value;

};

 

static const struct of_device_id fs4412_adc_match[] = {

    { .compatible = "samsung,exynos-adc-fs4412"},

    {},

};

MODULE_DEVICE_TABLE(of, fs4412_adc_match);

 

/* 讀取數據 */

static int exynos_read_raw(struct iio_dev *indio_dev,

        struct iio_chan_spec const *chan,

        int *val,

        int *val2,

        long mask)

{

    struct fs4412_adc *info = iio_priv(indio_dev);

    u32 con1;

 

    if (mask != IIO_CHAN_INFO_RAW)

        return -EINVAL;

 

    mutex_lock(&indio_dev->mlock);

 

    /* 選擇通(tong)道(dao) */

    writel(chan->address, MUX(info->regs));

 

    /* 啟動轉換(huan) */

    con1 = readl(CON(info->regs));

    writel(con1 | ADC_CON_EN_START,

&nbsp;         &nbsp; CON(info->regs));

 

    /* 等待轉換(huan)完(wan)成(cheng) */

    while((readl(CON(info->regs)) &; (1<<15))==0){};

 

    /* 讀取轉換(huan)數據*/

    info->;value = readl(DATX(info->regs)) & ADC_DATX_MASK;

 

    *val = info->value;

 

    mutex_unlock(&indio_dev->mlock);

 

    return IIO_VAL_INT;

}

 

 

static int fs4412_adc_reg_access(struct iio_dev *indio_dev,

  &nbsp;     unsigned reg, unsigned writeval,

        unsigned *readval)

{

    struct fs4412_adc *info = iio_priv(indio_dev);

 

    if (readval == NULL)

        return -EINVAL;

 

    *readval = readl(info->regs + reg);

 

    return 0;

}

 

/* IIO信息(xi)對象 */

static const struct iio_info fs4412_adc_iio_info = {

    .read_raw = &exynos_read_raw,

    .debugfs_reg_access = &fs4412_adc_reg_access,

    .driver_module = THIS_MODULE,

};

 

#define ADC_CHANNEL(_index, _id) { \

    .type = IIO_VOLTAGE, \

    .indexed = 1, \

    .channel = _index, \

    .address = _index, \

    .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \

    .datasheet_name = _id, \

}

 

/* 通道信息 */

static const struct iio_chan_spec fs4412_adc_iio_channels[] = {

     ADC_CHANNEL(0, "adc0"),

    ADC_CHANNEL(1, "adc1"),

  &nbsp; ADC_CHANNEL(2, "adc2"),

    ADC_CHANNEL(3, "adc3"),

};

 

/* ADC硬件初(chu)始化 */

static void fs4412_adc_hw_init(struct fs4412_adc *info)

{

    u32 con;

 

    /* 設置(zhi)預分頻值 */

    con =  CON_PRSCLV(49) | CON_PRSCEN;

 

    /* 12位AD轉(zhuan)換(huan) */

    con |= CON_RES;

    writel(con, CON(info->regs));

}

 

/* 設備匹配函數 */

static int fs4412_adc_probe(struct platform_device *pdev)

{

    struct fs4412_adc *info = NULL;

    struct device_node *np = pdev->dev.of_node;

    struct iio_dev *indio_dev = NULL;

    struct resource *mem;

    int ret = -ENODEV;

 

    if (!np)

        return ret;

 

    /* 動態(tai)申請iio設備 */

    indio_dev = devm_iio_device_alloc(&pdev->;dev, sizeof(struct fs4412_adc));

    if (!indio_dev) {

        dev_err(&pdev->dev, "failed allocating iio device\n");

        return -ENOMEM;

    }

 

    info = iio_priv(indio_dev);

 

    /* 獲得ADC寄存器(qi)地址 */

  &nbsp; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);

    info->regs = devm_ioremap_resource(&pdev->dev, mem);

    if (IS_ERR(info->regs))

&nbsp;       return PTR_ERR(info->regs);

 

    /* 設置私有數據 */

&nbsp;   platform_set_drvdata(pdev, indio_dev);

    indio_dev->name = dev_name(&pdev->dev);

&nbsp;   indio_dev->dev.parent = &pdev->dev;

    indio_dev->dev.of_node = pdev->dev.of_node;

    indio_dev->info = &fs4412_adc_iio_info;

    indio_dev->;modes = INDIO_DIRECT_MODE;

    indio_dev->channels = fs4412_adc_iio_channels;  ;/* 通道(dao)數(shu)據 */

    indio_dev->num_channels = MAX_CHANNELS;

 

    /* 注冊iio設備 */

    ret = iio_device_register(indio_dev);

    if (ret)

        return ret;

 

    /* ADC硬(ying)件初始化 */

    fs4412_adc_hw_init(info);

 

    return 0;

}

 

/* 設備(bei)移除(chu) */

static int fs4412_adc_remove(struct platform_device *pdev)

{

&nbsp;   struct iio_dev *indio_dev = platform_get_drvdata(pdev);

 

    /* 注(zhu)銷iio設(she)備 */

    iio_device_unregister(indio_dev);

    return 0;

}

 

/* 平臺設備對象 */

static struct platform_driver fs4412_adc_driver = {

    .probe = fs4412_adc_probe,

    .remove = fs4412_adc_remove,

    .driver = {

        .name = "exynos-adc",

        .owner = THIS_MODULE,

 ;       .of_match_table = fs4412_adc_match,

    },

};

 

/* 平臺設備模(mo)塊 */

module_platform_driver(fs4412_adc_driver);

 

將以上(shang)源碼保存為 drivers/iio/adc/fs4412_adc.c ,并(bing)在 drivers/iio/adc/Makefile 后加入:

obj-$(CONFIG_FS4412_ADC) += fs4412_adc.o 

編譯(yi)并(bing)燒寫內核(he),啟動后即可在終端下(xia)運行以下(xia)命令來讀取 ADC3 的(de)值(zhi):

# while true; 

> do cat /sys/devices/126c0000.adc/iio\:device0/in_voltage3_raw;

> sleep 1; 

> done

 

運行結果(guo)如下(xia):

ADC原始數(shu)據讀(du)取示(shi)例

數據(ju)采(cai)集的過(guo)程(cheng)中,旋(xuan)轉(zhuan)電(dian)位器的旋(xuan)鈕,改變電(dian)位器的電(dian)阻分壓(ya),就會(hui)改變轉(zhuan)換(huan)后(hou)的結果。

上一篇:c/c++使用數據庫sqlite3

下一篇:淺談字節對齊

熱(re)點文章推薦
華清學員就業榜(bang)單
高薪學員經驗分(fen)享
熱點新聞推薦
前臺專線:010-82525158 企業(ye)培訓(xun)洽談專線:010-82525379 院校合作洽談(tan)專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部