久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2515|回復: 0
打印 上一主題 下一主題
收起左側

VS-RK3XXX Android7.1系統調試ADC驅動配置

[復制鏈接]
跳轉到指定樓層
樓主
ID:959225 發表于 2021-8-19 09:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
視壯科技:VS-RK3XXX開發板上的 AD 接口分為:高速 ADC 流接口 (High-speed ADC Stream Interface)、溫度傳感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。本文主要介紹 ADC 的基本配置方法。
內核采用工業 I/O 子系統來控制 ADC,該子系統主要為 AD 轉換或者 DA 轉換的傳感器設計。
其相關數據結構以及配置方法如下:
iio_channel 結構體

struct iio_channel {
        struct iio_dev *indio_dev;//工業 I/O設備
        const struct iio_chan_spec *channel;//I/O通道
        void *data;
};
iio_dev 結構體
該結構體主要用于描述 IO 口所屬的設備,其具體定義如下:
struct iio_dev {
        int             id;
        int             modes;
        int             currentmode;
        struct device           dev;
        struct iio_event_interface  *event_interface;
        struct iio_buffer       *buffer;
        struct list_head        buffer_list;
        int             scan_bytes;
        struct mutex            mlock;
        const unsigned long     *available_scan_masks;
        unsigned            masklength;
        const unsigned long     *active_scan_mask;
        bool                scan_timestamp;
        unsigned            scan_index_timestamp;
        struct iio_trigger      *trig;
        struct iio_poll_func        *pollfunc;
        struct iio_chan_spec const  *channels;
        int             num_channels;
        struct list_head        channel_attr_list;
        struct attribute_group      chan_attr_group;
        const char          *name;
        const struct iio_info       *info;
        struct mutex            info_exist_lock;
        const struct iio_buffer_setup_ops   *setup_ops;
        struct cdev         chrdev;
        #define IIO_MAX_GROUPS 6
        const struct attribute_group    *groups[IIO_MAX_GROUPS + 1];
        int             groupcounter;
        unsigned long           flags;
        #if defined(CONFIG_DEBUG_FS)
        struct dentry           *debugfs_dentry;
        unsigned            cached_reg_addr;
        #endif
};
2.3 iio_chan_spec結構體
該結構體主要用于描述單個通道的屬性,具體定義如下:
struct iio_chan_spec {
        enum iio_chan_type  type; //描述通道類型
        int         channel; //通道號
        int         channel2; //通道號
        unsigned long       address; //通道地址
        int         scan_index;
        struct {
                char    sign;
                u8  realbits;
                u8  storagebits;
                u8  shift;
                enum iio_endian endianness;
            } scan_type;
        long            info_mask;
        long            info_mask_separate;
        long            info_mask_shared_by_type;
        long            event_mask;
        const struct iio_chan_spec_ext_info *ext_info;
        const char      *extend_name;
        const char      *datasheet_name;
        unsigned        modified:1;
        unsigned        indexed:1;
        unsigned        output:1;
        unsigned        differential:1;
};
3 配置步驟
iio_chan_spec結構體
該結構體主要用于描述單個通道的屬性,具體定義如下:
struct iio_chan_spec {
        enum iio_chan_type  type; //描述通道類型
        int         channel; //通道號
        int         channel2; //通道號
        unsigned long       address; //通道地址
        int         scan_index;
        struct {
                char    sign;
                u8  realbits;
                u8  storagebits;
                u8  shift;
                enum iio_endian endianness;
            } scan_type;
        long            info_mask;
        long            info_mask_separate;
        long            info_mask_shared_by_type;
        long            event_mask;
        const struct iio_chan_spec_ext_info *ext_info;
        const char      *extend_name;
        const char      *datasheet_name;
        unsigned        modified:1;
        unsigned        indexed:1;
        unsigned        output:1;
        unsigned        differential:1;
};
配置步驟
3.1 配置DTS節點
ADC的 DTS 節點在 kernel/arch/arm/boot/dts/rk3288.dtsi 文件中定義,如下所示:
adc: adc@ff100000 {
         compatible = "rockchip,saradc";
         reg = <0xff100000 0x100>;
         interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
         #io-channel-cells = <1>;
         io-channel-ranges;rockchip,adc-vref = <1800>;
         clock-frequency = <1000000>;
         clocks = <&clk_saradc>, <&clk_gates7 1>;
         clock-names = "saradc", "pclk_saradc";
         status = "disabled";
};
用戶只需在rk3288.dts 文件中添加通道定義,并將其 status 改為 "okay" 即可:
&adc {
        status = "okay";
        adc_test{
                compatible = "rockchip,adc_test";
                io-channels = <&adc 0>;
        };
};
3.2 在驅動文件中匹配 DTS 節點
在驅動文件中定義 of_device_id 結構體數組:
static const struct of_device_id of_XXX_match[] = {
        { .compatible = "rockchip,adc_test" },
        { /* Sentinel */ }
};
將該結構體數組填充到要使用 ADC 的 platform_driver 中。
static struct platform_driver XXX_driver = {
        .probe      = ...,.remove     = ...,.driver     = {
        .name   = "..",.owner  = THIS_MODULE,#ifdef CONFIG_OF.of_match_table = of_XXX_match,#endif},  
};
3.3 獲取 AD 通道
struct iio_channel *chan; //定義 IIO 通道結構體
chan = iio_channel_get(&pdev->dev, NULL); //獲取 IIO 通道結構體
注:iio_channel_get 通過 probe 函數傳進來的參數 pdev 獲取 IIO 通道結構體,probe 函數如下:
static int XXX_probe(struct platform_device *pdev);
3.4 讀取 AD 采集到的原始數據
int val,ret;
ret = iio_read_channel_raw(chan, &val);
調用 iio_read_channel_raw 函數讀取 AD 采集的原始數據并存入 val 中。
3.5 計算采集到的電壓
使用標準電壓將 AD 轉換的值轉換為用戶所需要的電壓值。其計算公式如下:
Vref / (2^n-1) = Vresult / raw
注:
Vref 為標準電壓
n 為 AD 轉換的位數
Vresult 為用戶所需要的采集電壓
raw 為 AD 采集的原始數據
例如,標準電壓為 1.8V,AD 采集位數為 10 位,AD 采集到的原始數據為 568,則:
Vresult = (1800mv * 568) / 1023;
4 ADC 常用函數接口
struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
功能:獲取 iio 通道描述
參數:
dev: 使用該通道的設備描述指針
consumer_channel: 該設備所使用的 IIO 通道描述指針

void iio_channel_release(struct iio_channel *chan);
功能:釋放 iio_channel_get 函數獲取到的通道
參數:
chan:要被釋放的通道描述指針

int iio_read_channel_raw(struct iio_channel *chan, int *val);
功能:讀取 chan 通道 AD 采集的原始數據。
參數:
chan:要讀取的采集通道指針
val:存放讀取結果的指針
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美韩一区二区三区 | 日韩国产在线 | 国产视频一视频二 | 羞视频在线观看 | 成人在线观看网址 | 欧美不卡 | 国内精品99 | 久久久国产一区 | 国产亚洲一区二区在线观看 | 色婷婷亚洲一区二区三区 | 亚洲a视频 | 视频二区| 精品久久久精品 | 欧美一极视频 | 欧美日韩高清免费 | 91在线最新| 日韩欧美在线视频 | 午夜影院普通用户体验区 | 国产免费播放视频 | 日韩在线资源 | 久久久久久国模大尺度人体 | 99久久国产| av午夜电影| 国产成人精品免费视频大全最热 | 免费视频一区二区三区在线观看 | 久久精品国产久精国产 | 性欧美hd| 国产精品视频www | 天天操夜夜爽 | 91影院在线观看 | 91在线观看视频 | 欧美日韩国产一区二区三区 | 欧洲一区视频 | 久久99视频精品 | 国产区视频在线观看 | 奇米影视在线 | 日本在线你懂的 | 欧美乱做爰xxxⅹ久久久 | 九七午夜剧场福利写真 | 欧美成人激情 | 欧美淫 |