亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 30739 | 回復(fù): 0
打印 上一主題 下一主題

[分享] VS-RK3XXX Android7.1系統(tǒng)調(diào)試ADC驅(qū)動(dòng)配置 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2021-09-10 15:07 |只看該作者 |倒序?yàn)g覽
VS-RK3XXX開(kāi)發(fā)板上的 AD 接口分為:高速 ADC 流接口 (High-speed ADC Stream Interface)、溫度傳感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。本文主要介紹 ADC 的基本配置方法。
內(nèi)核采用工業(yè) I/O 子系統(tǒng)來(lái)控制 ADC,該子系統(tǒng)主要為 AD 轉(zhuǎn)換或者 DA 轉(zhuǎn)換的傳感器設(shè)計(jì)。
其相關(guān)數(shù)據(jù)結(jié)構(gòu)以及配置方法如下:
iio_channel 結(jié)構(gòu)體

struct iio_channel {
        struct iio_dev *indio_dev;//工業(yè) I/O設(shè)備
        const struct iio_chan_spec *channel;//I/O通道
        void *data;
};
iio_dev 結(jié)構(gòu)體
該結(jié)構(gòu)體主要用于描述 IO 口所屬的設(shè)備,其具體定義如下:
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結(jié)構(gòu)體
該結(jié)構(gòu)體主要用于描述單個(gè)通道的屬性,具體定義如下:
struct iio_chan_spec {
        enum iio_chan_type  type; //描述通道類型
        int         channel; //通道號(hào)
        int         channel2; //通道號(hào)
        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結(jié)構(gòu)體
該結(jié)構(gòu)體主要用于描述單個(gè)通道的屬性,具體定義如下:
struct iio_chan_spec {
        enum iio_chan_type  type; //描述通道類型
        int         channel; //通道號(hào)
        int         channel2; //通道號(hào)
        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節(jié)點(diǎn)
ADC的 DTS 節(jié)點(diǎn)在 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 在驅(qū)動(dòng)文件中匹配 DTS 節(jié)點(diǎn)
在驅(qū)動(dòng)文件中定義 of_device_id 結(jié)構(gòu)體數(shù)組:
static const struct of_device_id of_XXX_match[] = {
        { .compatible = "rockchip,adc_test" },
        { /* Sentinel */ }
};
將該結(jié)構(gòu)體數(shù)組填充到要使用 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 通道結(jié)構(gòu)體
chan = iio_channel_get(&pdev->dev, NULL); //獲取 IIO 通道結(jié)構(gòu)體
注:iio_channel_get 通過(guò) probe 函數(shù)傳進(jìn)來(lái)的參數(shù) pdev 獲取 IIO 通道結(jié)構(gòu)體,probe 函數(shù)如下:
static int XXX_probe(struct platform_device *pdev);
3.4 讀取 AD 采集到的原始數(shù)據(jù)
int val,ret;
ret = iio_read_channel_raw(chan, &val);
調(diào)用 iio_read_channel_raw 函數(shù)讀取 AD 采集的原始數(shù)據(jù)并存入 val 中。
3.5 計(jì)算采集到的電壓
使用標(biāo)準(zhǔn)電壓將 AD 轉(zhuǎn)換的值轉(zhuǎn)換為用戶所需要的電壓值。其計(jì)算公式如下:
Vref / (2^n-1) = Vresult / raw
注:
Vref 為標(biāo)準(zhǔn)電壓
n 為 AD 轉(zhuǎn)換的位數(shù)
Vresult 為用戶所需要的采集電壓
raw 為 AD 采集的原始數(shù)據(jù)
例如,標(biāo)準(zhǔn)電壓為 1.8V,AD 采集位數(shù)為 10 位,AD 采集到的原始數(shù)據(jù)為 568,則:
Vresult = (1800mv * 56 / 1023;
4 ADC 常用函數(shù)接口
struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
功能:獲取 iio 通道描述
參數(shù):
dev: 使用該通道的設(shè)備描述指針
consumer_channel: 該設(shè)備所使用的 IIO 通道描述指針

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

int iio_read_channel_raw(struct iio_channel *chan, int *val);
功能:讀取 chan 通道 AD 采集的原始數(shù)據(jù)。
參數(shù):
chan:要讀取的采集通道指針
val:存放讀取結(jié)果的指針
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP