長(zhǎng)文梳理Linux 工業(yè)輸入輸出IIO子系統(tǒng)框架

嵌入式ARM 2020-12-10 00:00

直接來(lái)源:嵌入式客棧

出處:https://www.cnblogs.com/yongleili717/p/10744252.html

作者三石li

由于需要對(duì)ADC進(jìn)行驅(qū)動(dòng)設(shè)計(jì),因此學(xué)習(xí)了一下Linux驅(qū)動(dòng)的IIO子系統(tǒng)。本文翻譯自《Linux Device Drivers Development 》--John Madieu

IIO Framework

工業(yè)I/O(IIO)是專(zhuān)用于模數(shù)轉(zhuǎn)換器(ADC)和數(shù)模轉(zhuǎn)換器(DAC)的內(nèi)核子系統(tǒng)。隨著越來(lái)越多的具有不同代碼實(shí)現(xiàn)的傳感器(具有模擬到數(shù)字或數(shù)字到模擬,功能的測(cè)量設(shè)備)分散在內(nèi)核源上,收集它們變得必要。這就是IIO框架以通用的方式所做的事情。自2009年以來(lái),Jonathan Cameron和Linux-IIO社區(qū)一直在開(kāi)發(fā)它。

加速度計(jì),陀螺儀,電流/電壓測(cè)量芯片,光傳感器,壓力傳感器等都屬于IIO系列器件。

IIO模型基于設(shè)備和通道架構(gòu):

  • 設(shè)備代表芯片本身。它是層次結(jié)構(gòu)的頂級(jí)。
  • 通道代表設(shè)備的單個(gè)采集線(xiàn)。設(shè)備可以具有一個(gè)或多個(gè)通道。例如,加速度計(jì)是具有  三個(gè)通道的裝置,每個(gè)通道對(duì)應(yīng)一個(gè)軸(X,Y和Z)。

IIO芯片是物理和硬件傳感器/轉(zhuǎn)換器。它作為字符設(shè)備(當(dāng)支持觸發(fā)緩沖時(shí))暴露給用戶(hù)空間,以及包含一組文件的sysfs目錄條目,其中一些文件代表通道。單個(gè)通道用單個(gè)sysfs文件條目表示。

下面是從用戶(hù)空間與IIO驅(qū)動(dòng)程序交互的兩種方式:

  • /sys/bus/iio/iio:deviceX/:表示傳感器及其通道
  • /dev/iio:deviceX: 表示導(dǎo)出設(shè)備事件和數(shù)據(jù)緩沖區(qū)的字符設(shè)備

IIO框架架構(gòu)和布局

上圖顯示了如何在內(nèi)核和用戶(hù)空間之間組織IIO框架。驅(qū)動(dòng)程序使用IIO核心公開(kāi)的一組工具和API來(lái)管理硬件并向IIO核心報(bào)告處理。然后,IIO子系統(tǒng)通過(guò)sysfs接口和字符設(shè)備將整個(gè)底層機(jī)制抽象到用戶(hù)空間,用戶(hù)可以在其上執(zhí)行系統(tǒng)調(diào)用。

IIO API分布在多個(gè)頭文件中,如下所示:

#include <linux/iio/iio.h>    /* mandatory */
#include <linux/iio/sysfs.h>  /* mandatory since sysfs is used */
#include <linux/iio/events.h> /* For advanced users, to manage iio events */
#include <linux/iio/buffer.h> /* mandatory to use triggered buffers */
#include <linux/iio/trigger.h>/* Only if you implement trigger in your driver (rarely used)*/

在以下文章中,我們將描述和處理IIO框架的每個(gè)概念,例如

  • 遍歷其數(shù)據(jù)結(jié)構(gòu)(設(shè)備,通道等)
  • 觸發(fā)緩沖支持和連續(xù)捕獲,以及其sysfs接口
  • 探索現(xiàn)有的IIO觸發(fā)器
  • 以單次模式或連續(xù)模式捕獲數(shù)據(jù)
  • 列出可用于幫助開(kāi)發(fā)人員測(cè)試其設(shè)備的可用工具

IIO數(shù)據(jù)結(jié)構(gòu)

IIO設(shè)備在內(nèi)核中表示為struct iio_dev結(jié)構(gòu)體的一個(gè)實(shí)例,并由struct iio_info結(jié)構(gòu)體描述。所有重要的IIO結(jié)構(gòu)都在include/linux/iio/iio.h中定義。

iio_dev結(jié)構(gòu)

該結(jié)構(gòu)代表IIO設(shè)備,描述設(shè)備和驅(qū)動(dòng)程序。它告訴我們:

  • 設(shè)備上有多少個(gè)通道?

  • 設(shè)備可以在哪些模式下運(yùn)行:?jiǎn)未危|發(fā)緩沖?

  • 這個(gè)驅(qū)動(dòng)程序可以使用哪些hooks鉤子?

struct iio_dev {
   [...]
   int modes;
   int currentmode;
   struct device dev;
   struct iio_buffer *buffer;
   int scan_bytes;
   const unsigned long *available_scan_masks;
   const unsigned long *active_scan_mask;
   bool scan_timestamp;
   struct iio_trigger *trig;
   struct iio_poll_func *pollfunc;
   struct iio_chan_spec const *channels;
   int num_channels;
   const char *name;
   const struct iio_info *info;
   const struct iio_buffer_setup_ops *setup_ops;
   struct cdev chrdev;

};

完整的結(jié)構(gòu)在IIO頭文件中定義。我們將不感興趣的字段在此處刪除。

  • modes: 這表示設(shè)備支持的不同模式。支持的模式有:

    • INDIO_DIRECT_MODE表示設(shè)備提供的sysfs接口。
    • INDIO_BUFFER_TRIGGERED表示設(shè)備支持硬件觸發(fā)器。使用iio_triggered_buffer_setup()函數(shù)設(shè)置觸發(fā)緩沖區(qū)時(shí),此模式會(huì)自動(dòng)添加到設(shè)備中.
    • INDIO_BUFFER_HARDWARE表示設(shè)備具有硬件緩沖區(qū)。
    • INDIO_ALL_BUFFER_MODES是上述兩者的聯(lián)合。
  • currentmode: 這表示設(shè)備實(shí)際使用的模式。

  • dev: 這表示IIO設(shè)備所依賴(lài)的struct設(shè)備(根據(jù)Linux設(shè)備型號(hào))。

  • buffer: 這是您的數(shù)據(jù)緩沖區(qū),在使用觸發(fā)緩沖區(qū)模式時(shí)會(huì)推送到用戶(hù)空間。使用iio_triggered_buffer_setup函數(shù)啟用觸發(fā)緩沖區(qū)支持時(shí),它會(huì)自動(dòng)分配并與您的設(shè)備關(guān)聯(lián)。

  • scan_bytes: 這是捕獲并饋送到緩沖區(qū)的字節(jié)數(shù)。當(dāng)從用戶(hù)空間使用觸發(fā)緩沖區(qū)時(shí),緩沖區(qū)應(yīng)至少為indio-> scan_bytes字節(jié)大。

  • available_scan_masks: 這是允許的位掩碼的可選數(shù)組。使用觸發(fā)緩沖器時(shí),可以啟用通道捕獲并將其饋入IIO緩沖區(qū)。如果您不想允許某些通道啟用,則應(yīng)僅使用允許的通道填充此數(shù)組。以下是為加速度計(jì)(帶有X,Y和Z通道)提供掃描掩碼的示例:

/*
 * Bitmasks 0x7 (0b111) and 0 (0b000) are allowed.
 * It means one can enable none or all of them.
 * one can't for example enable only channel X and Y
 */


static const unsigned long my_scan_masks[] = {0x70};
indio_dev->available_scan_masks = my_scan_masks;
  • active_scan_mask: 這是啟用通道的位掩碼。只有來(lái)自這些通道的數(shù)據(jù)能被推入緩沖區(qū)。例如,對(duì)于8通道ADC轉(zhuǎn)換器,如果只啟用第一個(gè)(0),第三個(gè)(2)和最后一個(gè)(7)通道,則位掩碼將為0b10000101(0x85)。active_scan_mask將設(shè)置為0x85。然后,驅(qū)動(dòng)程序可以使用for_each_set_bit宏遍歷每個(gè)設(shè)置位,根據(jù)通道獲取數(shù)據(jù),并填充緩沖區(qū)。

  • scan_timestamp: 這告訴我們是否將捕獲時(shí)間戳推入緩沖區(qū)。如果為true,則將時(shí)間戳作為緩沖區(qū)的最后一個(gè)元素。時(shí)間戳大8字節(jié)(64位)。

  • trig: 這是當(dāng)前設(shè)備觸發(fā)器(支持緩沖模式時(shí))。

  • pollfunc:這是在接收的觸發(fā)器上運(yùn)行的函數(shù)。

  • channels: 這表示通道規(guī)范結(jié)構(gòu),用于描述設(shè)備具有的每個(gè)通道。

  • num_channels: 這表示通道中指定的通道數(shù)。

  • name: 這表示設(shè)備名稱(chēng)。

  • info: 來(lái)自驅(qū)動(dòng)程序的回調(diào)和持續(xù)信息。

  • setup_ops: 啟用/禁用緩沖區(qū)之前和之后調(diào)用的回調(diào)函數(shù)集。這個(gè)結(jié)構(gòu)在include / linux / iio / iio.h中定義,如下所示:

struct iio_buffer_setup_ops {
    int (* preenable) (struct iio_dev *);
    int (* postenable) (struct iio_dev *);
    int (* predisable) (struct iio_dev *);
    int (* postdisable) (struct iio_dev *);
    bool (* validate_scan_mask) (struct iio_dev *indio_dev,
                                 const unsigned long *scan_mask);
};
  • setup_ops: 如果未指定,則IIO內(nèi)核使用drivers / iio / buffer / industrialio-triggered-buffer.c中定義的缺省iio_triggered_buffer_setup_ops。

  • chrdev: 這是由IIO核心創(chuàng)建的關(guān)聯(lián)字符設(shè)備。

用于為IIO設(shè)備分配內(nèi)存的函數(shù)是iio_device_alloc():

struct iio_dev * iio_device_alloc(int sizeof_priv) 
///struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv)
/* Resource-managed iio_device_alloc()*/
/*Managed iio_device_alloc. iio_dev allocated with this function is automatically freed on driver detach.
If an iio_dev allocated with this function needs to be freed separately, devm_iio_device_free() must be used. */

dev是為其分配iio_dev的設(shè)備,sizeof_priv是用于為任何私有結(jié)構(gòu)分配的內(nèi)存空間。這樣,傳遞每個(gè)設(shè)備(私有)數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單。如果分配失敗,該函數(shù)返回NULL:

struct iio_dev *indio_dev;
struct my_private_data *data;
indio_dev = iio_device_alloc(sizeof(*data));
if (!indio_dev)
          return -ENOMEM;
/*data is given the address of reserved momory for private data */
data = iio_priv(indio_dev);

在分配IIO設(shè)備存儲(chǔ)器之后,下一步是填充不同的字段。完成后,必須使用iio_device_register函數(shù)向IIO子系統(tǒng)注冊(cè)設(shè)備:

int iio_device_register(struct iio_dev *indio_dev)
       //devm_iio_device_register(dev, indio_dev)
/* Resource-managed iio_device_register() */

在執(zhí)行此功能后,設(shè)備將準(zhǔn)備好接受來(lái)自用戶(hù)空間的請(qǐng)求。反向操作(通常在釋放函數(shù)中完成)是iio_device_unregister():

void iio_device_unregister(struct iio_dev *indio_dev)
// void devm_iio_device_unregister(struct device * dev, struct iio_dev * indio_dev)

一旦取消注冊(cè),iio_device_alloc分配的內(nèi)存可以用iio_device_free釋放:

void iio_device_free(struct iio_dev *iio_dev)
// void devm_iio_device_free(struct device * dev, struct iio_dev * iio_dev)

給定IIO設(shè)備作為參數(shù),可以通過(guò)以下方式檢索私有數(shù)據(jù):

 struct my_private_data *the_data = iio_priv(indio_dev);

iio_info結(jié)構(gòu)體

struct iio_info結(jié)構(gòu)用于聲明IIO內(nèi)核使用的鉤子,以讀取/寫(xiě)入通道/屬性值:

struct iio_info {
           struct module *driver_module;
            const struct attribute_group *attrs;
            int (*read_raw)(struct iio_dev *indio_dev,
               struct iio_chan_spec const *chan,
               int *val, int *val2, long mask);

            int (*write_raw)(struct iio_dev *indio_dev,

                struct iio_chan_spec const *chan,

                int val, int val2, long mask);
             [...]

};
  • driver_module: 這是用于確保chrdev正確擁有的模塊結(jié)構(gòu),通常設(shè)置為T(mén)HIS_MODULE。

  • attrs: 這表示設(shè)備屬性。

  • read_raw: 這是用戶(hù)讀取設(shè)備sysfs文件屬性時(shí)的回調(diào)運(yùn)行。mask參數(shù)是一個(gè)位掩碼,它允許我們知道請(qǐng)求了哪種類(lèi)型的值。channel參數(shù)讓我們知道相關(guān)的通道。它可以是采樣頻率,用于將原始值轉(zhuǎn)換為可用值的比例,或原始值本身。

  • write_raw: 這是用于將值寫(xiě)入設(shè)備的回調(diào)。例如,可以使用它來(lái)設(shè)置采樣頻率。

以下代碼顯示了如何設(shè)置struct iio_info結(jié)構(gòu):

static const struct iio_info iio_dummy_info = {
    .driver_module = THIS_MODULE,
    .read_raw = &iio_dummy_read_raw,
    .write_raw = &iio_dummy_write_raw,
[...]

/*
 * Provide device type specific interface functions and
 * constant data. 提供設(shè)備類(lèi)型特定的接口功能和常量數(shù)據(jù)。
 */

indio_dev->info = &iio_dummy_info;

IIO channels

通道代表單條采集線(xiàn)。例如加速度計(jì)具有3個(gè)通道(X,Y,Z),因?yàn)槊總€(gè)軸代表單個(gè)采集線(xiàn)。struct iio_chan_spec是表示和描述內(nèi)核中單個(gè)通道的結(jié)構(gòu):

 struct iio_chan_spec {
        enum iio_chan_type type;
        int channel;
        int channel2;
        unsigned long address;
        int scan_index;
        struct {
            charsign;
            u8 realbits;
            u8 storagebits;
            u8 shift;
            u8 repeat;
            enum iio_endian endianness;
        } scan_type;
        long info_mask_separate;
        long info_mask_shared_by_type;
        long info_mask_shared_by_dir;
        long info_mask_shared_by_all;
        const struct iio_event_spec *event_spec;
        unsigned int num_event_specs;
        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;

    };

各個(gè)參數(shù)意義:

  • type: 這指定了通道的測(cè)量類(lèi)型。在電壓測(cè)量的情況下,它應(yīng)該是IIO_VOLTAGE。對(duì)于光傳感器,它是IIO_LIGHT。對(duì)于加速度計(jì),使用IIO_ACCEL。所有可用類(lèi)型都在include / uapi / linux / iio / types.h中定義,如enum iio_chan_type。要為給定轉(zhuǎn)換器編寫(xiě)驅(qū)動(dòng)程序,請(qǐng)查看該文件以查看每個(gè)通道所屬的類(lèi)型。

  • channel: 這指定.indexed設(shè)置為1時(shí)的通道索引。

  • channel2: 這指定.modified設(shè)置為1時(shí)的通道修飾。

  • modified: 這指定是否將修飾符應(yīng)用于此通道屬性名稱(chēng)。在這種情況下,修飾符設(shè)置在.channel2中。(例如,IIO_MOD_X,IIO_MOD_Y,IIO_MOD_Z是關(guān)于xyz軸的軸向傳感器的修改器)。可用修飾符列表在內(nèi)核IIO頭中定義為枚舉iio_modifier。修飾符只會(huì)破壞sysfs中的通道屬性名稱(chēng),而不是值。

  • indexed: 這指定通道屬性名稱(chēng)是否具有索引。如果是,則在.channel字段中指定索引。

  • scan_index and scan_type: 當(dāng)使用緩沖區(qū)觸發(fā)器時(shí),這些字段用于標(biāo)識(shí)緩沖區(qū)中的元素。scan_index設(shè)置緩沖區(qū)內(nèi)捕獲的通道的位置。具有較低scan_index的通道將放置在具有較高索引的通道之前。將.scan_index設(shè)置為-1將阻止通道進(jìn)行緩沖捕獲(scan_elements目錄中沒(méi)有條目)。

暴露給用戶(hù)空間的通道sysfs屬性以位掩碼的形式指定。根據(jù)共享信息,可以將屬性設(shè)置為以下掩碼之一:

  • info_mask_separate 將屬性標(biāo)記為特定于此通

  • info_mask_shared_by_type 將該屬性標(biāo)記為由相同類(lèi)型的所有通道共享。導(dǎo)出的信息由相同類(lèi)型的所有通道共享。

  • info_mask_shared_by_dir 將屬性標(biāo)記為由同一方向的所有通道共享。導(dǎo)出的信息由同一方向的所有通道共享。

  • info_mask_shared_by_all 將屬性標(biāo)記為所有通道共享,無(wú)論其類(lèi)型或方向如何。導(dǎo)出的信息由所有渠道共享。用于枚舉這些屬性的位掩碼都在include / linux / iio / iio.h中定義:

enum iio_chan_info_enum {
    IIO_CHAN_INFO_RAW = 0,
    IIO_CHAN_INFO_PROCESSED,
    IIO_CHAN_INFO_SCALE,
    IIO_CHAN_INFO_OFFSET,
    IIO_CHAN_INFO_CALIBSCALE,
    [...]
    IIO_CHAN_INFO_SAMP_FREQ,
    IIO_CHAN_INFO_FREQUENCY,
    IIO_CHAN_INFO_PHASE,
    IIO_CHAN_INFO_HARDWAREGAIN,
    IIO_CHAN_INFO_HYSTERESIS,
    [...]
};

字節(jié)序字段應(yīng)為以下之一:

enum iio_endian {
      IIO_CPU,
      IIO_BE,
      IIO_LE,
};

通道屬性命名約定

屬性的名稱(chēng)由IIO核心自動(dòng)生成,具有以下模式:{direction} _ {type} _ {index} _ {modifier} _ {info_mask}:

  • direction方向?qū)?yīng)于屬性方向,根據(jù)drivers / iio / industrialio-core.c中的struct iio_direction結(jié)構(gòu):
static const char * const iio_direction[] = {
   [0] = "in",
   [1] = "out"
}; 
  • type對(duì)應(yīng)于通道類(lèi)型,根據(jù)char數(shù)組const iio_chan_type_name_spec:
static const char * const iio_chan_type_name_spec[] = {
   [IIO_VOLTAGE] = "voltage",
   [IIO_CURRENT] = "current",
   [IIO_POWER] = "power",
   [IIO_ACCEL] = "accel",
   [...]
   [IIO_UVINDEX] = "uvindex",
   [IIO_ELECTRICALCONDUCTIVITY] = "electricalconductivity",
   [IIO_COUNT] = "count",
   [IIO_INDEX] = "index",
   [IIO_GRAVITY]  = "gravity",
};
  • lindex 索引模式取決于是否設(shè)置了通道.indexed字段。如果設(shè)置,索引將從.channel字段中獲取,以替換{index}模式。
  • modifier 模式取決于通道所設(shè)置的.modified字段。如果設(shè)置,修飾符將從.channel2字段中獲取,{modifier}模式將根據(jù)char數(shù)組struct iio_modifier_names結(jié)構(gòu)替換:
static const char * const iio_modifier_names[] = {
   [IIO_MOD_X] = "x",
   [IIO_MOD_Y] = "y",
   [IIO_MOD_Z] = "z",
   [IIO_MOD_X_AND_Y] = "x&y",
   [IIO_MOD_X_AND_Z] = "x&z",
   [IIO_MOD_Y_AND_Z] = "y&z",
   [...]
   [IIO_MOD_CO2] = "co2",
   [IIO_MOD_VOC] = "voc",
};

l info_mask取決于char數(shù)組iio_chan_info_postfix中的通道信息掩碼,私有或共享索引值:

/* relies on pairs of these shared then separate依賴(lài)于這些共享的對(duì),然后分離*/
static const char * const iio_chan_info_postfix[] = {
   [IIO_CHAN_INFO_RAW] = "raw",
   [IIO_CHAN_INFO_PROCESSED] = "input",
   [IIO_CHAN_INFO_SCALE] = "scale",
   [IIO_CHAN_INFO_CALIBBIAS] = "calibbias",
   [...]
   [IIO_CHAN_INFO_SAMP_FREQ] = "sampling_frequency",
   [IIO_CHAN_INFO_FREQUENCY] = "frequency",
   [...]
};

通道區(qū)分

當(dāng)每種通道類(lèi)型有多個(gè)數(shù)據(jù)通道時(shí),您可能會(huì)遇到麻煩。困境將是:如何識(shí)別它們。有兩種解決方案:索引和修飾符。

使用索引:給定具有一個(gè)通道線(xiàn)的ADC器件,不需要索引。通道定義如下:

static const struct iio_chan_spec adc_channels[] = {
                {
                        .type = IIO_VOLTAGE,
                        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),

               },
}

由前面描述的通道產(chǎn)生的屬性名稱(chēng)將是in_voltage_raw。

/sys/bus/iio/iio:deviceX/in_voltage_raw

現(xiàn)在讓我們看一下有4個(gè)甚至8個(gè)通道的轉(zhuǎn)換器。我們?nèi)绾巫R(shí)別它們?解決方案是使用索引。將.indexed字段設(shè)置為1將使用.channel值替換{index}模式來(lái)替換通道屬性名稱(chēng):

  static const struct iio_chan_spec adc_channels[] = {
        {
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 0,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),

        },

        {
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 1,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
        },
        {
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 2,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
        },
        {
                .type = IIO_VOLTAGE,
                .indexed = 1,
                .channel = 3,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
        },
}

生成的通道屬性為:

/sys/bus/iio/iio:deviceX/in_voltage0_raw
/sys/bus/iio/iio:deviceX/in_voltage1_raw
/sys/bus/iio/iio:deviceX/in_voltage2_raw
/sys/bus/iio/iio:deviceX/in_voltage3_raw

使用修飾符:給定一個(gè)帶有兩個(gè)通道的光傳感器 - 一個(gè)用于紅外光,一個(gè)用于紅外和可見(jiàn)光,沒(méi)有索引或修改器,屬性名稱(chēng)將為in_intensity_raw。在這里使用索引可能容易出錯(cuò),因?yàn)槭褂胕n_intensity0_ir_raw和in_intensity1_ir_raw是沒(méi)有意義的。使用修飾符將有助于提供有意義的屬性名稱(chēng)。通道的定義如下:

static const struct iio_chan_spec mylight_channels[] = {

        {
                .type = IIO_INTENSITY,
                .modified = 1,
                .channel2 = IIO_MOD_LIGHT_IR,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
                .info_mask_shared = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        },
        {
                .type = IIO_INTENSITY,
                .modified = 1,
                .channel2 = IIO_MOD_LIGHT_BOTH,
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
                .info_mask_shared = BIT(IIO_CHAN_INFO_SAMP_FREQ),
        },
        {
                .type = IIO_LIGHT,
                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
                .info_mask_shared =BIT(IIO_CHAN_INFO_SAMP_FREQ),

        },
       }

屬性結(jié)果:

l /sys/bus/iio/iio:deviceX/in_intensity_ir_raw 用于測(cè)量IR強(qiáng)度的通道
l /sys/bus/iio/iio:deviceX/in_intensity_both_raw用于測(cè)量紅外和可見(jiàn)光的通道
l /sys/bus/iio/iio:deviceX/in_illuminance_input用于處理后的數(shù)據(jù)
l /sys/bus/iio/iio:deviceX/sampling_frequency 用于采樣頻率,由所有人共享

這也適用于加速度計(jì),我們將在案例研究中進(jìn)一步了解。現(xiàn)在,讓我們總結(jié)一下我們到目前為止在虛擬IIO驅(qū)動(dòng)程序中討論過(guò)的內(nèi)容。

總結(jié)

讓我們總結(jié)一下迄今為止我們?cè)谝粋€(gè)簡(jiǎn)單的虛擬驅(qū)動(dòng)器中看到的內(nèi)容,它將暴露出四個(gè)電壓通道。我們將忽略read()或write()函數(shù):

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/events.h>
#include <linux/iio/buffer.h>


#define FAKE_VOLTAGE_CHANNEL(num)                  \
   {                                               \
         .type = IIO_VOLTAGE,                      \
         .indexed = 1,                             \
         .channel = (num),                         \
         .address = (num),                         \
         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),   \
         .info_mask_shared_by_type =BIT(IIO_CHAN_INFO_SCALE) \

   }

struct my_private_data {
    int foo;
    int bar;
    struct mutex lock;
};

static int fake_read_raw(struct iio_dev *indio_dev,
                   struct iio_chan_spec const *channel, int *val,
                   int *val2, long mask)

{
    return 0;
}

static int fake_write_raw(struct iio_dev *indio_dev,
                   struct iio_chan_spec const *chan,
                   int val, int val2, long mask)

{
    return 0;
}

static const struct iio_chan_spec fake_channels[] = {
   FAKE_VOLTAGE_CHANNEL(0),
   FAKE_VOLTAGE_CHANNEL(1), 
   FAKE_VOLTAGE_CHANNEL(2),
   FAKE_VOLTAGE_CHANNEL(3),

};

static const struct of_device_id iio_dummy_ids[] = {
    { .compatible = "packt,iio-dummy-random", },
    { /* sentinel */ }
};

static const struct iio_info fake_iio_info = {
   .read_raw = fake_read_raw,
   .write_raw        = fake_write_raw,
   .driver_module = THIS_MODULE,
};

static int my_pdrv_probe (struct platform_device *pdev)
{
    struct iio_dev *indio_dev;
    struct my_private_data *data;
   indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*data));

   if (!indio_dev) {
         dev_err(&pdev->dev, "iio allocation failed!\n");
         return -ENOMEM;
   }

   data = iio_priv(indio_dev);
   mutex_init(&data->lock);
   indio_dev->dev.parent = &pdev->dev;
   indio_dev->info = &fake_iio_info;
   indio_dev->name = KBUILD_MODNAME;
   indio_dev->modes = INDIO_DIRECT_MODE;
   indio_dev->channels = fake_channels;
   indio_dev->num_channels = ARRAY_SIZE(fake_channels);
   indio_dev->available_scan_masks = 0xF;
    iio_device_register(indio_dev);
    platform_set_drvdata(pdev, indio_dev);
    return 0;
}
static void my_pdrv_remove(struct platform_device *pdev)
{
    struct iio_dev *indio_dev = platform_get_drvdata(pdev);
    iio_device_unregister(indio_dev);
}
static struct platform_driver mypdrv = {
    .probe      = my_pdrv_probe,
    .remove     = my_pdrv_remove,
    .driver     = {
        .name     = "iio-dummy-random",
        .of_match_table = of_match_ptr(iio_dummy_ids),  
        .owner    = THIS_MODULE,
    },
};
module_platform_driver(mypdrv);
MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
MODULE_LICENSE("GPL");

加載上述模塊后, 我們將有以下輸出, 顯示我們的設(shè)備確實(shí)對(duì)應(yīng)于我們已注冊(cè)的平臺(tái)設(shè)備:

  ~# ls -l /sys/bus/iio/devices/
lrwxrwxrwx 1 root root 0 Jul 31 20:26 iio:device0 -> ../../../devices/platform/iio-dummy-random.0/iio:device0
lrwxrwxrwx 1 root root 0 Jul 31 20:23 iio_sysfs_trigger -> ../../../devices/iio_sysfs_trigger

下面的列表顯示了此設(shè)備的通道及其名稱(chēng), 這些通道與我們?cè)隍?qū)動(dòng)程序中描述的內(nèi)容完全對(duì)應(yīng):

 ~# ls /sys/bus/iio/devices/iio\:device0/
dev in_voltage2_raw name uevent
in_voltage0_raw in_voltage3_raw power
in_voltage1_raw in_voltage_scale subsystem
~# cat /sys/bus/iio/devices/iio:device0/name
iio_dummy_random

END

來(lái)源:嵌入式客棧

版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

推薦閱讀

飛機(jī)上一般是什么操作系統(tǒng)?

高速CAN、容錯(cuò)CAN、LIN總線(xiàn)有什么區(qū)別?

大佬終于把鴻蒙OS講明白了,收藏了!

嵌入式ARM 關(guān)注這個(gè)時(shí)代最火的嵌入式ARM,你想知道的都在這里。
評(píng)論
  • 導(dǎo)語(yǔ):進(jìn)入8月,全球LCD TV面板采購(gòu)需求受年底大促備貨、以?xún)r(jià)換量策略雙重拉動(dòng)呈現(xiàn)邊際回暖,但修復(fù)力度整體有限。由于頭部面板廠(chǎng)持續(xù)維持高稼動(dòng)生產(chǎn),行業(yè)供需格局仍處寬松區(qū)間,面板價(jià)格整體延續(xù)小幅回落態(tài)勢(shì),尺寸結(jié)構(gòu)性分化特征持續(xù)顯現(xiàn)。CINNO Research 簡(jiǎn)評(píng)今年8月,全球 LCD TV面板市場(chǎng)呈現(xiàn)需求弱修復(fù)、供給高位運(yùn)行的特征,整體價(jià)格延續(xù)下行且結(jié)構(gòu)性分化顯著。需求端受年底大促備貨、以?xún)r(jià)換量策略拉動(dòng)邊際回暖,但修復(fù)力度有限且建立在以?xún)r(jià)換量的基礎(chǔ)上;供給端高世代線(xiàn)稼動(dòng)率維持85%以上,供需
    CINNOResearch 2026-08-12 11:00 151瀏覽
  • 100 字導(dǎo)語(yǔ)現(xiàn)場(chǎng)防爆航插頻繁出現(xiàn)插拔卡頓、沙沙異響、對(duì)位卡死等問(wèn)題,大多不是產(chǎn)品質(zhì)量問(wèn)題,而是粉塵進(jìn)腔、觸點(diǎn)氧化、防呆鍵位磨損導(dǎo)致。本文結(jié)合 3 針 3 孔、4 芯、5PIN、8 芯圓形防爆連接器運(yùn)行特性,梳理異響卡頓故障根源,制定標(biāo)準(zhǔn)化清潔修復(fù)流程,保障防爆航空插頭對(duì)接順暢、密封到位。關(guān)鍵詞:圓形防爆連接器,防爆航空插頭,防爆端子接頭,防爆接插件,插拔卡頓,IP67,5PIN,8 芯,防爆傳感器航插接頭1 產(chǎn)品概述圓形防爆連接器公母頭依靠精密鍵位、冠簧插孔、密封面精準(zhǔn)配合實(shí)現(xiàn)對(duì)接。現(xiàn)場(chǎng)粉塵堆
    kyfbest科迎法電氣 2026-08-12 11:43 257瀏覽
  • 8月8日,國(guó)聯(lián)民生證券發(fā)布了一則公告,內(nèi)容表明公司董事會(huì)收到了非執(zhí)行董事楊振興提交的辭職報(bào)告,其因個(gè)人原因辭去公司非執(zhí)行董事這一職務(wù)。而且在辭職之后,楊振興將不再擔(dān)任國(guó)聯(lián)民生證券以及其控股子公司的任何職務(wù)。僅僅兩天之后,公司第六屆董事會(huì)第7次會(huì)議召開(kāi),這次會(huì)議一口氣通過(guò)了多項(xiàng)議案,包括審議通過(guò)《國(guó)聯(lián)民生證券股份有限公司“十五五”發(fā)展規(guī)劃(2026-2030)》、1億至2億元A股回購(gòu)方案以及為子公司民生證券提供不超過(guò)40億元的動(dòng)態(tài)凈資本擔(dān)保承諾等等。同時(shí),為優(yōu)化資源配置,公司還擬減少民生證券注冊(cè)資
    用戶(hù)1782919753097 2026-08-13 00:00 244瀏覽
  • 我在唯創(chuàng)知音做門(mén)鎖語(yǔ)音方案這幾年,常被廠(chǎng)商問(wèn)到一個(gè)看似簡(jiǎn)單的問(wèn)題,門(mén)鎖里的語(yǔ)音到底要做什么。門(mén)鎖語(yǔ)音在門(mén)鎖里早就不是加個(gè)喇叭那么回事。它要管門(mén)鈴、提示音、貓眼對(duì)講、藍(lán)牙配網(wǎng)播報(bào)、離線(xiàn)喊一聲開(kāi)門(mén),還有大屏上的菜單動(dòng)效。這些功能分散在前板、后板、貓眼和 APP 四個(gè)部位,芯片怎么選,各部位完全不一樣。最基礎(chǔ)的一塊是門(mén)鈴和固定提示音。很多走量機(jī)型到現(xiàn)在還是一顆小容量語(yǔ)音芯片扛著,像 WTN 系列里的 WTN6006、WTN6020,F(xiàn)lash 從 低時(shí)長(zhǎng)到高時(shí)長(zhǎng)都有不同的芯片,協(xié)議相同可以無(wú)縫切換。它
    唯創(chuàng)知音語(yǔ)音芯片 2026-08-12 17:34 203瀏覽
  • 報(bào)警語(yǔ)音在工業(yè)設(shè)備里的難題做工業(yè)設(shè)備的工程師多半遇到過(guò)這種事。設(shè)備上要播的語(yǔ)音條數(shù)越來(lái)越多,正常開(kāi)機(jī)提示、運(yùn)行狀態(tài)播報(bào)、故障報(bào)警、維護(hù)提醒、安全警告,加起來(lái)幾十條甚至上百條。一開(kāi)始用小容量 OTP 芯片還能應(yīng)付,條數(shù)一多就不夠用了。換大容量芯片,成本又上去了。更大的麻煩在報(bào)警優(yōu)先級(jí)上。工業(yè)設(shè)備運(yùn)行時(shí),語(yǔ)音芯片可能正在播放一段正常運(yùn)行狀態(tài)提示,比如"設(shè)備運(yùn)行中,請(qǐng)勿靠近"。這時(shí)候突然檢測(cè)到故障,需要立刻插播一條緊急報(bào)警語(yǔ)音"溫度過(guò)高,請(qǐng)立即停機(jī)檢查"。傳統(tǒng)語(yǔ)音芯片做不到這件事。它要么得先發(fā)停止命令
    唯創(chuàng)知音語(yǔ)音芯片 2026-08-12 17:50 247瀏覽
  • 100 字導(dǎo)語(yǔ)廠(chǎng)區(qū)停機(jī)檢修、設(shè)備長(zhǎng)期靜置存放,防爆航插易受潮、積塵、膠圈老化、觸點(diǎn)氧化。本文針對(duì)停機(jī)復(fù)工場(chǎng)景,制定 3 針 3 孔、5PIN、8 芯圓形防爆連接器全套檢測(cè)保養(yǎng)流程,明確絕緣、導(dǎo)通、密封、屏蔽復(fù)工核驗(yàn)標(biāo)準(zhǔn),避免復(fù)工跳閘、信號(hào)異常。關(guān)鍵詞:圓形防爆連接器,復(fù)工檢測(cè),防爆航空插頭,防爆法蘭插座,防爆接插件,IP67, 靜置保養(yǎng),5PIN,8 芯1 產(chǎn)品概述設(shè)備長(zhǎng)期停機(jī)靜置,防爆連接器腔體密閉不通風(fēng),極易積聚潮氣、凝結(jié)水汽;密封件長(zhǎng)期靜態(tài)受壓出現(xiàn)永久形變;鍍金觸點(diǎn)鈍化氧化。直接通電復(fù)工極
    kyfbest科迎法電氣 2026-08-12 13:32 305瀏覽
  • 在國(guó)內(nèi)大量通用制造產(chǎn)線(xiàn)與工業(yè)場(chǎng)站里,智能化升級(jí)正普遍面臨著的現(xiàn)實(shí)困境:小到產(chǎn)線(xiàn)外觀質(zhì)檢、設(shè)備狀態(tài)監(jiān)測(cè)終端,大到站房智能網(wǎng)關(guān)、工業(yè)人機(jī)交互設(shè)備,企業(yè)既想落地本地AI推理、多設(shè)備聯(lián)網(wǎng)協(xié)同等智能化功能,又難以承擔(dān)高端工控方案的高昂部署成本;既要求硬件能適應(yīng)高低溫、粉塵、電磁干擾的復(fù)雜工業(yè)環(huán)境,又受制于預(yù)算門(mén)檻退而選擇消費(fèi)級(jí)主控,最終往往陷入“改得起、用不住”的尷尬局面。這是當(dāng)前工業(yè)智能化向中端下沉過(guò)程中的共性痛點(diǎn)。一方面,高端算力方案性能過(guò)剩、單價(jià)居高不下,多設(shè)備批量部署時(shí)成本壓力陡增,而入門(mén)級(jí)主控又
    飛凌嵌入式 2026-08-12 08:52 219瀏覽
  • 隨著AI算力需求的爆發(fā)式增長(zhǎng),400G、800G乃至1.6T高速光模塊正加速走向商用部署。在這場(chǎng)速率競(jìng)賽的背后,一個(gè)不容忽視的挑戰(zhàn)正浮出水面——硅光模塊對(duì)溫度的“敏感體質(zhì)” ,正在成為可靠性驗(yàn)證領(lǐng)域的新課題。一、為什么硅光模塊如此“怕熱怕冷”?傳統(tǒng)光模塊主要采用III-V族化合物半導(dǎo)體材料(如InP、GaAs),而硅光模塊則以硅基材料為核心,借助CMOS兼容工藝實(shí)現(xiàn)光電器件的單片集成。這種技術(shù)路線(xiàn)帶來(lái)了成本低、集成度高、功耗小的優(yōu)勢(shì),但也埋下了溫度敏感性的隱患。根源在于材料的熱膨脹系數(shù)
    用戶(hù)1774416745629 2026-08-13 09:40 246瀏覽
  • 100 字導(dǎo)語(yǔ)工業(yè)防爆鎧裝線(xiàn)纜硬度高、結(jié)構(gòu)特殊,普通圓形防爆連接器密封結(jié)構(gòu)難以適配,極易出現(xiàn)夾不緊、滲水、線(xiàn)纜滑脫問(wèn)題。本文針對(duì)鎧裝線(xiàn)纜特性,匹配 4 芯、5PIN、8 芯防爆法蘭插座安裝工藝,明確鎧裝固定、密封壓緊、應(yīng)力釋放全套施工標(biāo)準(zhǔn)。關(guān)鍵詞:圓形防爆連接器,鎧裝線(xiàn)纜,防爆法蘭插座,防爆防水連接器,IP67,8 芯,防爆電源接頭,防爆接插件1 產(chǎn)品概述鎧裝線(xiàn)纜自帶金屬保護(hù)層,硬度大、不可隨意彎折,常規(guī)塑料密封套無(wú)法有效抱緊。很多現(xiàn)場(chǎng)直接使用普通格蘭密封鎧裝線(xiàn),導(dǎo)致尾部密封失效、鎧裝層懸空松動(dòng)
    kyfbest科迎法電氣 2026-08-12 12:48 288瀏覽
  • 一只光模塊在出廠(chǎng)前,要在-40℃的極寒、25℃的常溫、85℃的高溫之間反復(fù)“渡劫”。稍有不慎,輕則參數(shù)漂移,重則整批報(bào)廢——這就是三溫測(cè)試,高速光模塊量產(chǎn)前的最后一道生死線(xiàn)。引言:AI越熱,測(cè)試越難AI數(shù)據(jù)中心的爆發(fā)式增長(zhǎng),讓400G、800G甚至1.6T光模塊的需求如火箭般躥升。但鮮為人知的是:光模塊速率每翻一番,測(cè)試時(shí)間卻不降反升。一組殘酷的數(shù)據(jù)對(duì)比:速率單只模塊測(cè)試耗時(shí)測(cè)試設(shè)備帶寬要求400G約15-20分鐘50GHz800G約20-30分鐘50GHz1.6T約40-60分鐘≥65GHz設(shè)
    用戶(hù)1774416745629 2026-08-12 13:36 301瀏覽
  • 導(dǎo)語(yǔ):根據(jù)CINNO ? ePaper Insight數(shù)據(jù),2026年上半年,全球電子紙終端總銷(xiāo)量約2.9億臺(tái)(枚),同比增長(zhǎng)25%。其中,電子紙價(jià)簽終端銷(xiāo)量2.8億枚,同比增長(zhǎng)27%,繼續(xù)成為產(chǎn)業(yè)增長(zhǎng)的核心動(dòng)力;電子紙平板銷(xiāo)量610萬(wàn)臺(tái),同比下降超過(guò)16%,較2025年上半年730萬(wàn)臺(tái)有所回落。細(xì)分市場(chǎng)看,閱讀器銷(xiāo)量480萬(wàn)臺(tái),辦公本銷(xiāo)量130萬(wàn)臺(tái)。整體來(lái)看,電子紙應(yīng)用結(jié)構(gòu)進(jìn)一步向智慧零售集中,價(jià)簽高景氣與平板階段性調(diào)整形成明顯分化。全球終端銷(xiāo)量同比增長(zhǎng)25%,價(jià)簽貢獻(xiàn)主要增量CINNO ?
    CINNOResearch 2026-08-12 11:05 248瀏覽
我要評(píng)論
0
點(diǎn)擊右上角,分享到朋友圈 我知道啦
請(qǐng)使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 女超人未删减版| 坎贝奇作品《品味人生》| 色情玉蒲之玉女心经电影| 内衣推销员2未删减版| 巧奔妙逃高清完整版免费观看| 巨人族的新娘花嫁| 让一切随风 钟镇涛| 午夜人在线观看完整版| 希要爸爸的种子| 庆余年46集资源| 《神话》| 日剧特殊的治疗| 山河令电视剧在线观看| 爱丫爱丫免费观看高清版| 金螺王子| 漂亮的妈妈中字开头5个字| 致命弯道5完整版在线观看视频| 需要爸爸种子电影| 西游降魔篇 影音| 《爱我几何》免费版| 美好的时光电视剧| 王李丹妮新片维修工| 《关于爱》在线观看免费| 电视剧《流金岁月》免费观看| 天上人间高清| 玩命爱一个姑娘完整版| 木下之影| 369你懂的电影永久入口| 白马醉春风电视剧在线高清免费观看| 锵锵锵锵锵游戏免费完整观看| 一站到底2018| 蓝色隐身帽在线观看免费高清| 四少妇的秘密按摩在线观看伦理电影 | 少年包青天2部| 菲律宾电影楼上楼下| 伊波拉病毒国语在线观看| 巩留县| 吉尺明步 110部全集| 凶降喜讯电影| 儿媳妇的滋味| 巧奔妙逃高清完整版免费观看| 动漫美女性侵| 新金银悔5一10普通话| 移动迷宫西瓜影音| 襄樊市| 金瓶梅在线电影完整版播放| 女销售的秘密在线观看| 帝国刺客| 林珍娜为艺术献身电影在线观看| 我老婆是学生会长第二季| 电影囧妈免费观看| 三级《偷妻》| 电竞国家集训队集体亮相| 三年成全观看影视大全| 电视剧日出日落| 险恶绣感完整版在线观看| 泰罗奥特曼国语版全集| 绝战桂林电视剧全集| 伪装者电视剧全集免费观看| 公公与儿媳电影| 马永贞百度影音| 三客电影| 俘虏之锁1| 电影《功夫》国语免费观看| 法国空乘1980版未删减版下载| 盲盒旅行局综艺免费观看完整版| 最终列车醉汉动漫第三集免费观看 | 东北警察故事| 快乐向前冲2013年度总决赛| 善良的小姨子无删减| 妖精的尾巴剧场版2| 宫电影版| 女超人手机在线观看| 高清世外| 女主麦乐迪在线观看| 花的勇气ppt| 新有菜在线| 加勒比影音先锋| 真白みな| 迷人的保姆手机在线| 亲爱的律师大人 小说| 欧美5一10普通话| 还珠格格之风儿阵阵吹全集| 苏菲玛索狂野的爱| 男女一起愁愁电视剧免费播放在线观看| 法证先锋5粤语全集免费观看| (已屏蔽)| 无彩限的怪灵世界| 被可怕的科长欺负| 我是刑警38集| 战狼6免费观看完整版高清版| 魔力宝贝监狱 完整版在线观看 | 蓝志什么脱口秀| 私人助理2法国版| 大王别慌张免费观看全集| 毕有财电视剧| 父亲的战争电视剧| 刑侦12国语免费观看全集 | xl司令第一季无马赛| 隐身帽子电影| 龙凤店国语| 杨思梅敏金瓶完整国语| 《爱我几何》原版高清免费看| 总统之夜1997| 激情厨房| 只是结婚的关系免费观看电视剧| 新地道战2| 王力宏事件始末| 大内密探零零星星无删减版| 妈祖电视剧全集优酷| 爸爸的种子电影| 消失的厨神短剧免费观看| 爸爸的大几8好吃| 克莱尔的迷宫在线观看| 成全高清免费动漫观看| 私人诊所的特殊待遇4| 部长出差的日子完整版| 父辈爱情故事短剧免费观看| 动感之星妖精168集免费播放在线观看 | 出轨同学会4| 暮光之城4破晓下bd| 丁度阿斯巴电影| 让爱留在心底第三部| 《青囊传》电视剧| 名侦探柯南700| 喜爱夜蒲电影完整版| 电视剧嘎达梅林| 张婉悠电影| 拆弹专家2完整版播放网站 | 捉鬼敢死队女版满天星在线观看| 非你莫属2011| 新的景色电影| 周生如故分集剧情介绍| 《超时空辉夜姬!》| 捉鬼敢死队满天星版| 仙逆动漫免费在线| 布兰迪《不当军事行为》在线播放| 欢乐颂电视剧全集免费观看| 正在播放: JUQ-101 在没有我丈夫的五天里,我被命令禁欲到第一个晚上。不想要 | 桃色凶器 | 韩剧国语爱在何方| 袖珍妈妈电视剧全集| 斗罗大陆在线观看免费全集高清| 麦乐迪超人系列nice| 传闻中的七公主 电视剧| 《特殊游泳教练》完整版》 - 国语剧情手机免费观看... 韩国其它2017很 | 艳母动漫| 黑白配高清国语免费观看| 电视剧天地粮人| 《高压监狱3》伦理| 娄艺潇新恋情曝光| 荒岛女儿国美版| 《莲花楼》电视剧| 年轻的的小瘦子5| 亡国公主短剧全集| 四个少妇按摩视频| 最美情侣在线播放观看| 和部长| 人民的正义 电视剧| 公交车上的那些事免费看中文| 终极一班5| 美容院待遇电影| 若宫莉娜| 爱情理论免费观看| 金玉满堂电视剧| 《黏糊糊的你》| 两个妈妈韩剧电视剧免费观看全集| 女扮男装短剧全集| 杨光的夏天 电视剧| 英雄虎胆电影| 隋唐英雄117| 台媒高度关注东部战区军演| 电影聊斋兰若寺免费播放| 斯巴达300勇士在线观看| 傻王闯天下主题曲| 超新星全运会第二季| 《私人航空》在线看免费| 人间空间时间和人 在线观看| 壮志凌云女版啄木鸟满天星法版系列| 斗罗大陆178集| 梦幻军事地区电影| 3d肉蒲电影在线观看| 游泳教练的特殊待遇电影| 叛逆者免费观看完整| 古墓丽影山寨版满天星在线观看| 剃须然后捡到女高中生| 公之浮手中字15| 夏娃电视剧在哪看| 末路狂花钱免费观看全部剧情| 隋唐英雄102集| 熊出没高清观看| 指甲刀人魔| 谁能百里挑一20130504| 我的刑警朋友| 非诚勿扰20110220| 正阳门下电视剧36集全免费| 情圣 周星驰| 喝茶影视《部长出差的日子》| 魔方小站三阶魔方教程| 法国《荣誉守则》满天星高清在线观| 美国队长4在线观看| (女学生的滋味)HD| 圣斗士混沌篇| 法国电影空乘1999演员表| 黑客帝国在线看| 特殊保险公司推销员8| 妻子的秘密教学动漫| 屠宰场呕吐娃娃高清完整版| 杜琪峰复仇| 布鲁克读大学完整版| 迷人的保姆| 战争暴行女囚HD版| 欧洲超级杯| 法国《空乘》2009| 美人谋电视剧免费观看| 高庄监狱完整版观看| 秘制牛杂配方| 特殊的酒店客房中字2| 你莫走原唱| 女婿爱上母娘免费版电视剧2| 痞子英雄续集| 神探飞机头3| 廖凡宿敌免费观看| 密爱高清下载| 男生吃女生的兔子头会变黑吗| 我是路人甲电影| 监狱风云之传教士| 爰你电视剧免费观看| 数字马戏团动画片全集| 完美犯罪在线观看免费完整观看| 璀璨人生下载| 格雷的五十度灰 电影| 一路向西在线观看完整 | 甜心医生泰剧在线观看| 狂飙西瓜影视免费观看| 一个陌生女人的来信下载| 落花时节又逢君电视| 极乐宝岛| 打110叫外卖| 韩国情书第二季| 贝尔法斯特天堂路| 超凡蜘蛛侠2在线观看| 疯狂小说家电影| 你比星光美丽电视剧免费观看最新| 语义错误动漫| 高清《死人开关》电影| 火烧岛 电影| 女状元短剧全集| 巜性刑房3捆绑凌虐电影免费观看| 天行者电影| 三年大片在线观看免费| 斯诺克虎牙4| 美容院待遇电影| 情色小游戏| 水手服的饲养完整版在线播放| 龚玥菲新金瓶高清什么时候上映| 播九公社在线观看| 黑蝴蝶电影完整版在线| 女海盗在线观看| 一起愁愁愁高清免费看| 大波女唐三藏免费观看电视剧西瓜| 继承者们全集在线观看| 你懂得369手机看片| 纯真时代在线观看| 白峰美羽《被讨厌的上司》完整版| 短剧《出鞘》全集播放 | 父母爱情免费观看| 牙医姐妹1986日语版在线观看| 欢乐颂3免费观看| 《混血的摇篮曲》日本 | 爱我几何高清免费观看完整版 | 北越暴行2完整版免费| 一次邂逅| 《特殊的治疗》2李采潭中文| 异蟒狂袭| HD版《激战丛林》完整版播放| 唐诡奇谭在线观看免费| 青春环游记第四季综艺| 高清《在你眉梢种红豆》电视剧| 《先婚后爱》网剧| 老旦是一棵树电视剧全集在线观看| 电视剧扫黑风暴40集在线观看 | 加勒比女海盗1在线观看| 王李丹妮《维修工》在线观看| 欢天喜地七仙女2| 《吴健农民伯伯下乡》播放| 双枪李向阳 电视剧| 巴西电影《营销技巧》| 氪金玩家的3d动漫| 人猿泰山Hrd| 血恋电影免费播放高清在线观看| 战狼6免费观看在线播放下载电影视频| 和台湾这次打得起来吗| 意大利八尺夫人满天星原名| 憨豆先生全集高清| 千次的吻电视剧| 电视剧保姆与保安| 魔童降世在线观看| 华丽上班族西瓜影音| 特警突击队电视剧| 我朋友的年轻搜子8| 张玉贞国语版全集| 粗野派免费观看完整版普通话| 地铁举行集体婚礼| 特别酒店3跳舞| 小泽玛利亚 bt| 花与蛇牙医电影完整版| 世界第一初恋剧场版| 朱莉安妮版《售楼女王》英文名字. | 麻生希有几部| 橄榄球的电影| 游泳女教练在线观看整板| 超级魔术师克里斯| 天星术张涵予在线观看| 法网柔情主题曲| 《忘年恋曲》海外版| 爱情诡计第6集| 同学的妈妈中字ID英文| 魔神英雄传| 中文字Dl幕岳 和女胥友田真希在线| 小时代3| 周星驰粤语| 最后一条美人鱼| 善良的嫂子2 电影| 浙江卫视美食爽天下| 小月子15天| 要爸爸的种子美国电视剧| 鹰爪铁布衫第二部| 半夜影院村妓| 狼毒人电视剧全集在线观看免费高清| 高压监控2法国版播放 | 婬乱办公室国语版免费看| 温暖的村庄电视剧全集在线观看| 电影《第八日》凯登克罗斯| 踏血寻梅电影观看普通话在线观看 | 电影《汤唯》免费播放| melodymarks女超人免费观看全部| 湛江电视台| 平和县| 神雕侠侣电影版| 误杀3 电影 在线观看| 鉴证实录1| 刘亦菲承认怀孕三个月| 叶问外传张天志在线观看免费版| 屋顶上的绿宝石全集| 电视剧婚巢| 落翅女的黄昏| 偃师市| 灌篮高手大电影免费观看完整版| 致命id在线观看| 刘三姐电影全集| 棋魂国语版| 头号公敌| 夫妻一场 19楼| 意大利八尺夫人在线观看| 乌海电影在线观看完整版免费| 美女性私密按摩精油的电影手机能看的| 嫂嫂三角裤湿湿| 麦乐迪 女超人| 德国空姐电影完整版| 断背山在线观看| 南少林三十六房全集| xl司令第一季全集在线看免费版 | 盗花野史| 绝密押运18| 狄仁杰电影| 慈禧的秘密生活下载| 三年中国在线中文免费| 错点鸳鸯电视剧50集免费播放 | 电影花与蛇| 维修人员的艳遇| jux-422| 男女一起愁愁愁电影全集播放免费观 | 混血大学生精油按摩电影| 善良的嫂子2中文| 妻子的谎言大结局剧情| 刘德华2011上海演唱会| 漂亮的保姆6高清观看| 空调维修工人的艳遇在线观看全集| 亲爱的你电视剧免费观看完整版| 电影《布兰迪之不当行为》在线观看| 三打白骨精剧情攻略| 《佐佐木希公与媳| 绅士大盗| 人蛇大战 电影| 自古英雄出少年全集| 小五弟最近山歌| 巨茎挺进李淑芬体内视频| 肉脯团电影完整版| 《美丽妻子替丈夫还债》电影完整版 | 房产销售的秘密电影在线观看| 失笑电视剧沈月在线观看| 需要爸爸的种子免费观看电视剧意大 | 无限资源在线观看完整免费| 奥美迦奥特曼免费播放| 高清《妥协》短剧免费观看| 公的浮之手中字电影| 亮剑3gp下载| 安泽县| 布洛芬多少钱一盒| 新还珠格格发布会| 污污污双人调情按摩术免费在线播放 | 金沙朗电影| 神秘人质电视剧全集41| 湿润的继拇hd| 超级战警高清| 82板杨敏思版本1-5电视剧在线 | 万源市| 西湖电视| 甄嬛传全集播放| 《特殊游泳教练》在线观看 | 《性生话电影| 迷人的保姆免费观看| 新还珠格格独家纪录片| 争艳女王| 降央卓玛歌曲大全播放| 高压监狱2无删减完整版| 完美人生电影免费观看完整版| xL司令第一季马赛免费观看高清| 电视剧特殊使命| 丰满大胸年轻继坶4| 电影一路向西在线观看| 廊桥遗梦百度影音| 高压监狱2成人版在线观看| 渣男退散短剧全集| 莫莉特别的酒店| 倚天剑屠龙刀电视剧| 特种兵之火凤凰剧情| 晓庄秘史| 元气满满的哥哥| 三年免费观看在线观看高清| 《偿还3》完整版| 尚志市| 十二罗汉| 《咒》电影在线观看| 日本战狼6大牛老黑免费观看| 春雨电影大全免费观看在线| 韩国电影售楼处的秘密 | 九龙城寨之围城完整版免费看| tobu8XXⅩHD440| 种其因者 须食其果短剧免费观看| 51吃瓜.world戴璐蘑菇| 酒店1-80集| 拯救瑞恩| 售楼部的秘密| 下女 完整版| 电视剧非常有喜全集| 花子小姐vs驱魔师在线观看免费| 和老师在她家啪| 壮志凌云2011满天星| 湛江电视台| 电视剧虎胆雄心全集免费观看| 绽放许开心电视剧全集免费观看| 我的奇妙室友| 交换上司的女秘书| 同桌的你免费| 女超人免费完整版满天星| 精神病患者电影| 神奇燕尾服| 黑人大鸡巴大战俄罗斯美女| 首尔之春历史真实事件 | 刘旭威演的电视剧| 《心不由己》| 野孩子电影| 穿靴子的猫第二季国语版| 《和部长一起去出差旅》韩剧| 与凤行电视剧在线观看完整版免费| 刀剑神域ii| 风流一夜情在线观看| 黑帮大佬和我的365五天| 巨茎进入李淑芬视频| 《曼蒂的觉醒》完整版| 法官李汉英全集观看| 经山历海| 古典写真| 麦乐迪电影| 披荆斩棘的哥哥第三季在线观看| 出轨人妇各系列25目录| 思凡mv| 不能说的秘密| 年轻丰满的继牳3伦A片201| 挺进大别山电视剧免费全集 | 鉴证实录3免费国语版在线观看| 战至巅峰第三季2024免费观看| 女学生被爆视频在线观看| 神秘感染电影| 战狼6大牛免费观看| 我和我的家乡免费高清完整版| 宫锁连城电视剧免费观看完整版| 最佳李顺心| 我的人间烟火电视剧免费下载| 牙医姐妹1986完整版手机在线观看| 蝴蝶梦越剧| 为爱而战电影| 女超人满天星版麦乐迪第一季| 暗算全集| 赤子板栗千金大小姐| 普京为何此时在盟国领土部署核武| 黑帮大佬和我的的356在线观看| 渔夫荒淫史在线| 奇星记之鲜衣怒马少年时 电视剧| 女儿复仇满天星版| 危情瘾难耐| 在悠长的时光里等你| 《荷尔蒙》6| 黑帮大佬和我的365天 第二| 海竿组装图解| 浴血狂沙国语版下载| 偷换人生真假千金短剧| 《女律师替丈夫还钱》电影中文版| 燃烧电视剧全集免费观看| 中文字幕按摩做爰| 和部长出差旅电视剧免费观看| 像小强一样活着电影| 黑色眼泪麻生香织原版| 姐姐6免费完整高清电视剧| 《恋爱》大结局| 《法国空乘5》在线看| 女女电影免费观看完整版大结局| 张警官三部曲免费观看百度网盘| 百兽战队牙吠连者动漫| 动漫二人生猴子免费观看动漫视频| 男女愁愁愁愁| 我的上司尺码是XL类似| 朝国年经继2| 狼人大战| 指环王2:双塔奇兵免费| 电影《战狼6》国语高清| 满天星八尺夫人在线观看免费播 | 不惧风暴观看免费完整高清 | 强奸电影下载| 苹果在线观看免费| 顺风妇产科国语| 插曲的痛60集全免费观看| 国足大连备战仅不到20名记者到场| 花房姑娘第四季免费大全好看| 腹黑总裁:独宠一人全集免费 | 小夫妻时代演员表| 《初体验5》在线观看完整免费版电视 | 地爆天星无删减版免费观看| 你给我的喜欢电视剧免费| 日军兽行未删减版免费观看第几集| 毒爱泰剧| 卧底警察| 曾经是超人的男子| 珠光宝气| 我的游泳池工作2| 欲望谎言| 真爱谎言下载| 维修工的艳遇在线观看| 新乱世佳人电视剧免费观看全集| 杯水情歌歌词| 美胸按摩电影| 《勇敢的心》完整版免费观看| 阿瓦人民唱新歌| 追爱家族大结局| 最好的我们电视剧免费观看| 日本电影特殊治疗的医护| 屠夫网电影免费观看影视大全| 韩剧想你国语版| 日韩一级伦理强奸电影在线观看| 海天雄鹰免费观看| 甜心医生泰剧在线观看| 欧美人性爱ZZZOOOXXX| 隐形战队国语电视剧免费观看| 兄弟姐妹第二季| 《地爆天星小姐》| 校花的贴身高手无删减版电视剧 | 全球冠军:电竞大神全集免费| 乐清市| 泰剧血脉| 天美星空mv| 电影《姐妹牙医》完整版哪里可以看| 错嫁豪门全集免费| 老卫和淑蓉在船上1一7集| 吧唧吧唧吧唧一口一口吃掉了 | 时光与他 恰是正好| 《激战丛林》在线观看 | 企业宣传短片| 爷们儿电视剧大结局| 欲望酒店 百度影音| 电视连续剧楼外楼免费观看| 视频电影在线观看免费观看完整版| 密室大逃脱第二季第二期| 黄秋生电影人肉叉烧包| 斗罗大陆140| 母乳喂养宣传片10分钟| 插曲的痛| 婆婆来了分集介绍| 一起老去| 美女餐厅2修改器| 爸爸播种电影免费观看高清版下载 | 赛德克 巴莱(下)彩虹桥| 樱桃在线观看免费全集高清完整| 双人调情按摩术hd在线播放视频| 生命缘桐桐| 法国电影《私人助理》叫什么名字 | 杨思梅金瓶敏第1一5集在线观看| 战狼4欧美版免费观看完整版国语电影| 相思原唱| 公之孚之中字6| 动漫在线高清在线完整版免费| 刘宇宁直播回放大全| 莺长的女儿满天星| 高达00第二季下载| 春潮烂漫海棠红下载| 独步万古动漫在线观看免费完整版| 逆世界在线观看| 世界上最小的鸡走红| 坎贝奇无憾140分免费看| 黄了为什么是失败的意思| 《肖申克的救赎》续集| 最高的爱人诏不干涉工作和家庭| 美国派9我爱熟女| 乡村爱情小夜曲| 荒野渔夫完整版| 上门女婿2| 电视剧武则天全集| 娱乐百分百黑girl| 赤子板牙医现在观看| 政府工作报告2019| 你给老子不上班| 替夫还债2| 倩女喜相逢| 光环电影完整版在线看高清| 战狼6高清完整版下载| 欧美vivoestv高清| 千金互换:人生翻盘全集免费| 需要爸爸播种子免费观看| 湿濡的女人 电影| 韩剧拜托小姐| 笨蛋你在做什么第11集| 做AJ免费观看完整版| 森奈奈子作品| 临时劫案 免费观看| 法国空姐2019满天星法版在线观看免费版 | 克莱尔总统之夜全集| 我的漂亮女房东完整版BD| 河南版猫和老鼠全集| 《准儿媳》完整版| 影子战士| 老版三国演义全集高清| 越南《性的暴行》电影 | 《国宝》| 今人不见古时玥| 高清《秘密囚禁》完整版| 天海翼女教师电影| 高清《仙逆剧场版 神临之战》电影| 江南媳妇| 辣妹子的电视剧在线观看 | 古堡女仆服务电影在线观看| 幸福最晴天| 台湾版,小凤新婚| 信义兄弟| 81号档案| 坎贝尔《无憾》播放| 地球脉动第一季免费观看| 烟火人家电视剧简介| 中国女警的一级播放| 死囚大逃杀| 哈利 波特与死亡圣器下| 诱惑韩语学校| 女超人韩国在线观看电影| 大红灯笼高高挂电视剧全集在线观看| 唐宫美人天下杨幂 | 银魂188| 美国粉红大白菜在线播放| 德国最强大脑| 锦衣之下电视剧在线观看| 韩国金牌销售完整版| 鬼吹灯之南海归墟 在线观看 | 原始女人| 复仇者联盟什么时候上映| 黑白配高清中文完整版 | 伦理《法国护士未删减》| 司法局谈女工作人员被曝出轨| 长乐曲在线观看| 美乃雀| 周渝民最新电影| 命运之夜前传| 夏日少年派在线观看免费完整版| 台湾版《棘手狂情》星辰| 圣斗士星矢黄金魂| 傅玄屹魏语娴全文免费结局| 甄嬛传免费全集观看完整版在线| 印度歌曲mp3| 蛇姬恋电影高清完整版| 成均馆罗曼史| 南拳北腿粤语| 韩剧《下属的妻子》主演名单表| 照亮你电视剧在线观看| 私じゃなかったんだね谐音| 保罗一家1一4| 1984美式保罗2| 大蛇王电影| 女友的妈妈4完整视频有翻译英文| 《阿姨住洒店动漫在线观看| 高清《历史的天空》电视剧| 按摩店待遇1在线观看| 七大罪第一季| 姚乐怡 三级| 小时代电影在线观看完整版| 牙医姐妹1986日语版免费| 全美超模大赛第20季| 刺杀游戏2011| 入室强奸三级片| 韩国好姑娘免费视屏播放| 温碧霞《灯草和尚》| 士兵突击电视剧全集免费| 六福喜事百度影音| 时间静止器全集免费观看第二集 | 很想和你在一起粤语| 台北县| 《瑜伽的狂热》完整版在线观看| 惊变电影国语版在线观看| 高清《三大队》电视剧| 薄暮传说剧场版| 空盆来蛇| 八尺夫人满天星英语翻译版| 大锅饭养懒汉| 山河令彩蛋| 我的堂妹| 公车乱欲| 电视剧大漠枪神| 别动我的奶酪第二季免费动漫| 《战·争》| 女教师白洁张敏玩交换| 公交车扒开稚嫩挺进去J赵知梨| 亡命父女未删减| 仙逆113| 撕掉美女衣| 意大利《开放庄园》在线观看| 斗罗大陆樱花动漫观看第26集| 《法国空姐2024版》完整版在线播放| 《惊天魔盗团3》| 画江湖之天罡传什么时候上映| 韩国金牌销售完整版| 冰天雪地| 怪奇笔记电视剧免费观看| 冲锋陷阵电影| 哇嘎电影在线看免费| 复仇者联盟4票价| 巨神战击队玩具| 我的娜塔莎电视剧免费观看| 波多野吉衣销魂120分钟电影| 棋士电视剧免费观看完整版| 睫毛膏4美版免费观看| 意大利《夫人和园丁》 | tobu8XXⅩHD440| 金枝缠梦短剧全集完整版| 黑草莓帝国| 铁血娇娃| 《公的浮之手中字》免费| 年轻老师4韩国手机在线| 我和我的三个姐姐| 电视剧大唐荣耀| 老婆的闺蜜ID中字| 《满天星女版西部通缉令》| 新还珠格格98集| 麻吉弟弟| 三年大片中文在线观看免费国语全集 | 绝代双骄在线观看| 点解阿sir系阿sir粤语版| 滚烫公媳全集免费观看电视剧| 欧美满天星电影《maruzzella》是什么电 | 动画乐翻天| 入室暴行魔免费观看| 情劫在线观看| 奇妙的美发沙龙| 人世间全集免费观看| 美式禁忌3| 某科学的超电磁炮动漫| 苏里南韩剧免费观看| 酒店激战2第5集在线播放| 且试天下电视剧在线观看完整版| 心理测量者| 爱的三人行| 阿朱无删减版HD免费观看| 播放女流氓完整版电影| 情陷百乐门| 《越南暴行3》在线观看| 我老婆是80后| 一舞倾城粤语在线观看| 军人道德组歌| 渔夫荒| 胃癌的发生与生活习惯密切相关| 小舍得电视剧在线观看| 木下檀檩子电影免费观看| 小776| 海绵宝宝全集| 《家庭矛盾》4麦乐迪| 肉蒲团演员表| 大侦探拾光季| 花与蛇2之牙医姐妹| 曹操跑腿| 熟妇的滚烫的肉唇翻进翻出| 我在北京挺好的剧情分集介绍| 混血儿的摇篮| 兰花草电影高清在线观看方法| 红蜘蛛第一部免费观看全集| 村上沙兽皇电影高清下载| 木下凛凛子在线观看| 今天是个好日子舞蹈| 色戒 迅雷下载| 不良义姐电影| 塔日酒店电影在线观看| 《姐姐今天怪怪的》动漫| 加勒比女海盗1| 战狼7欧式少女战狼12| 成都大熊猫玩菜刀| 抖音官网网页版| 收割伊丽莎白| 卡一卡二在线入口| 人脉王韩剧在线观看星辰| 财经郎眼2015| 见面吧就现在| 电影爱我几何在线观看| 唐朝妖姬| 法政先锋第三部粤语| 体感预报日剧免费观看| 出差被讨厌的部长侵犯| 大笑江湖百度影音| 幸福到万家电视剧免费观看完整版 | 巨人捕手杰克快播| 《杨贵妃秘史》| 雪中悍刀行在线观看| 爱我几何原版在线观看| 三哥田螺| 黔乡牧人| 清徐县| 成全动漫观看免费高清| 高清《香港奇案之吸血贵利王》电影| 大陆剧以法之名在线观看| 杰西简无删减版在线观看| 八八戒在线| 风水弃少全集免费| 两不疑动漫全集在线观看| 扫黑风暴在线观看全集| 盛唐风流国语版在线播放免费观看| 少年嘉庆电视剧| 《恋爱暴君》动漫全集观看| 头脑特工队2国语版免费播放| 《维修工的艳遇HD》中文| 欲望爱人在线播放| 少年四大名捕 电视剧| 年轻的瘦了3| 金刚2帝国崛起免费播放在线观看| 齐天大剩| 黑白配高清国语免费观看教程| 战狼3电影免费观看高清完整版| 爱情美剧盛典爱情公寓完整版|