0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

光傳感器和距離傳感器max44000源代碼執(zhí)行過(guò)程分析

ss ? 作者:工程師譚軍 ? 2018-09-11 15:07 ? 次閱讀

本文主要是關(guān)于光傳感器和距離傳感器的相關(guān)介紹,并著重對(duì)光傳感器和距離傳感器max44000源代碼執(zhí)行過(guò)程進(jìn)行了詳盡的分析敘述。

光傳感器

光傳感器通常是指能敏感由紫外光到紅外光的光能量,并將光能量轉(zhuǎn)換成電信號(hào)的器件。

光傳感器是一種傳感裝置,主要由光敏元件組成,主要分為環(huán)境光傳感器、紅外光傳感器、太陽(yáng)光傳感器、紫外光傳感器四類(lèi),主要應(yīng)用在改變車(chē)身電子應(yīng)用和智能照明系統(tǒng)等領(lǐng)域?,F(xiàn)代電測(cè)技術(shù)日趨成熟,由于具有精度高、便于微機(jī)相連實(shí)現(xiàn)自動(dòng)實(shí)時(shí)處理等優(yōu)點(diǎn),已經(jīng)廣泛應(yīng)用在電氣量和非電氣量的測(cè)量中。然而電測(cè)法容易受到干擾,在交流測(cè)量時(shí),頻率響應(yīng)不夠?qū)捈皩?duì)耐壓、絕緣方面有一定要求,在激光技術(shù)迅速發(fā)展的今天,已經(jīng)能夠解決上述的問(wèn)題。

磁光效應(yīng)傳感器就是利用激光技術(shù)發(fā)展而成的高性能傳感器。激光,是20世紀(jì)60年代初迅速發(fā)展起來(lái)的又一新技術(shù),它的出現(xiàn)標(biāo)志著人們掌握和利用光波進(jìn)入了一個(gè)新的階段。由于以往普通光源單色度低,故很多重要的應(yīng)用受到限制,而激光的出現(xiàn),使無(wú)線電技術(shù)和光學(xué)技術(shù)突飛猛進(jìn)、相互滲透、相互補(bǔ)充。利用激光已經(jīng)制成了許多傳感器,解決了許多以前不能解決的技術(shù)難題,使它適用于煤礦、石油、天然氣貯存等危險(xiǎn)、易燃的場(chǎng)所。比如說(shuō)用激光制成的光導(dǎo)纖維傳感器,能測(cè)量原油噴射、石油大罐龜裂的情況參數(shù)。在實(shí)測(cè)地點(diǎn),不必電源供電,這對(duì)于安全防爆措施要求很?chē)?yán)格的石油化工設(shè)備群尤為適用,也可用來(lái)在大型鋼鐵廠的某些環(huán)節(jié)實(shí)現(xiàn)光學(xué)方法的遙測(cè)化學(xué)技術(shù)。磁光效應(yīng)傳感器的原理主要是利用光的偏振狀態(tài)來(lái)實(shí)現(xiàn)傳感器的功能。當(dāng)一束偏振光通過(guò)介質(zhì)時(shí),若在光束傳播方向存在著一個(gè)外磁場(chǎng),那么光通過(guò)偏振面將旋轉(zhuǎn)一個(gè)角度,這就是磁光效應(yīng)。也就是可以通過(guò)旋轉(zhuǎn)的角度來(lái)測(cè)量外加的磁場(chǎng)。在特定的試驗(yàn)裝置下,偏轉(zhuǎn)的角度和輸出的光強(qiáng)成正比,通過(guò)輸出光照射激光二極管LD,就可以獲得數(shù)字化的光強(qiáng),用來(lái)測(cè)量特定的物理量。

簡(jiǎn)單原理

自60年代末開(kāi)始,RC Lecraw提出有關(guān)磁光效應(yīng)的研究報(bào)告后,引起大家的重視。日本,蘇聯(lián)等國(guó)家均開(kāi)展了研究,國(guó)內(nèi)也有學(xué)者進(jìn)行探索。磁光效應(yīng)的傳感器具有優(yōu)良的電絕緣性能和抗干擾、頻響寬、響應(yīng)快、安全防爆等特性,因此對(duì)一些特殊場(chǎng)合電磁參數(shù)的測(cè)量,有獨(dú)特的功效,尤其在電力系統(tǒng)高壓大電流的測(cè)量方面、更顯示它潛在的優(yōu)勢(shì)。同時(shí)通過(guò)開(kāi)發(fā)處理系統(tǒng)的軟件和硬件,也可以實(shí)現(xiàn)電焊機(jī)和機(jī)器人控制系統(tǒng)的自動(dòng)實(shí)時(shí)測(cè)量。在磁光效應(yīng)傳感器的使用中,最重要的是選擇磁光介質(zhì)和激光器,不同的器件在靈敏度、工作范圍方面都有不同的能力。隨著近幾十年來(lái)的高性能激光器和新型的磁光介質(zhì)的出現(xiàn),磁光效應(yīng)傳感器的性能越來(lái)越強(qiáng),應(yīng)用也越來(lái)越廣泛。

磁光效應(yīng)傳感器做為一種特定用途的傳感器,能夠在特定的環(huán)境中發(fā)揮自己的功能,也是一種非常重要的工業(yè)傳感器。在電子防盜探測(cè)器領(lǐng)域,被動(dòng)紅外探測(cè)器的應(yīng)用非常廣泛,因其價(jià)格低廉、技術(shù)性能穩(wěn)定而受到廣大用戶(hù)和專(zhuān)業(yè)人士的歡迎。但隨著入侵者的反偵測(cè)技術(shù)手段的提高,從而對(duì)探頭的要求也越來(lái)越高,普通被動(dòng)紅外探頭的局限性也越來(lái)越明顯,這樣,新一代的被動(dòng)紅外探頭也應(yīng)運(yùn)而生。因?yàn)榧幽么蟮腜ARADOX SUCURITY SYSTEMS LTD的楓葉牌探頭采用了很多最新技術(shù),使用也較為廣泛。所以,下面就結(jié)合該產(chǎn)品的技術(shù)特性來(lái)闡述被動(dòng)紅外探頭的最新技術(shù)。

1、反射式光傳感器的工作原理及特性

反射式光傳感器是靠探測(cè)人體發(fā)射的紅外線而進(jìn)行工作的。探頭收集外界的紅外輻射通過(guò)聚集到紅外感應(yīng)源上面。紅外感應(yīng)源通常采用熱釋電元件,這種元件在接收了紅外輻射溫度發(fā)生變化時(shí)就會(huì)向外釋放電荷,檢測(cè)處理后產(chǎn)生報(bào)警。

1) 這種探頭是以探測(cè)人體輻射為目標(biāo)的。所以輻射敏感元件對(duì)波長(zhǎng)為10UM左右的紅外輻射必須敏感。

2) 為了僅僅對(duì)人體的紅外輻射敏感,在它的輻射照面通常覆蓋有特殊的濾光片,使環(huán)境的干擾受到明顯的控制作用。

3) 被動(dòng)紅外探頭,其傳感器包含兩個(gè)互相串聯(lián)或并聯(lián)的熱釋電元。而且制成的兩個(gè)電極化方向正好相反,環(huán)境背景輻射對(duì)兩個(gè)熱釋元件幾乎具有相同的作用,使其產(chǎn)生釋電效應(yīng)相互抵消,于是探測(cè)器無(wú)信號(hào)輸出。

4) 一旦人侵入探測(cè)區(qū)域內(nèi),人體紅外輻射通過(guò)部分鏡面聚焦,并被熱釋電元接收,但是兩片熱釋電元接收到的熱量不同,熱釋電也不同,不能抵消,經(jīng)信號(hào)處理而報(bào)警。

5) 多視場(chǎng)的獲得,一是多法線小鏡面組成的反光聚焦,聚光到傳感器上稱(chēng)之為反射式光學(xué)系統(tǒng)。另一種是透射式光學(xué)系統(tǒng),是多面組合一起的透鏡——菲尼爾透鏡聚焦在紅外傳感器上。

6) 這要指出的是被動(dòng)紅外的幾束光表示有幾個(gè)視場(chǎng),并非被動(dòng)紅外發(fā)紅外光,視場(chǎng)越多,控制越嚴(yán)密。

被動(dòng)紅外探頭的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):本身不發(fā)任何類(lèi)型的輻射,器件功耗很小,隱蔽性好。 光傳感器

價(jià)格低廉。

缺點(diǎn):

◆容易受各種熱源、光源干擾

◆被動(dòng)紅外穿透力差,人體的紅外輻射容易被遮擋,不易被探頭接收。

◆易受射頻輻射的干擾。

距離傳感器

距離傳感器,又叫做位移傳感器,是傳感器的一種,用于感應(yīng)其與某物體間的距離以完成預(yù)設(shè)的某種功能,得到了相當(dāng)廣泛的應(yīng)用。主要產(chǎn)品有手機(jī)距離傳感器、遠(yuǎn)距離測(cè)量傳感器等,應(yīng)用于智能皮帶中。

原理

“飛行時(shí)間法”(flying time)是通過(guò)發(fā)射特別短的并測(cè)量此光脈沖從發(fā)射到被物體反射回來(lái)的時(shí)間,通過(guò)測(cè)時(shí)間間隔來(lái)計(jì)算與物體之間的距離。

距離傳感器根據(jù)其工作原理的不同可分為光學(xué)距離傳感器、紅外距離傳感器、超聲波距離傳感器等多種。手機(jī)上使用的距離傳感器大多是紅外距離傳感器,其具有一個(gè)紅外線發(fā)射管和一個(gè)紅外線接收管,當(dāng)發(fā)射管發(fā)出的紅外線被接收管接收到時(shí),表明距離較近,需要關(guān)閉屏幕以免出現(xiàn)誤操作現(xiàn)象,而當(dāng)接收管接收不到發(fā)射管發(fā)射的紅外線時(shí),表明距離較遠(yuǎn),無(wú)需關(guān)閉屏幕。其它類(lèi)型距離傳感器的工作原理也大同小異,也是通過(guò)某種物質(zhì)的發(fā)射與接受來(lái)判斷其距離的遠(yuǎn)近,其發(fā)射的物質(zhì)可以是超聲波,光脈沖等等 [1] 。

應(yīng)用

距離傳感器最廣泛的應(yīng)用就是手機(jī)了,市場(chǎng)上的智能手機(jī)都含有距離傳感器,當(dāng)使用者接通電話時(shí),手機(jī)距離耳朵較近,此時(shí)容易出現(xiàn)誤操作現(xiàn)象(如大笑時(shí)鼓起的臉蛋兒易掛斷電話),因此就需要距離傳感器及時(shí)對(duì)距離進(jìn)行監(jiān)視,當(dāng)出現(xiàn)距離過(guò)近時(shí)自動(dòng)關(guān)閉屏幕,以避免誤操作現(xiàn)象的發(fā)生。此外,距離傳感器還可多用于礦井深度的測(cè)量、飛機(jī)高度的檢測(cè)、野外環(huán)境的探查等方面,隨著科技的不斷發(fā)展,在可穿戴設(shè)備中也有突出表現(xiàn)(如智能皮帶) 。

光傳感器和距離傳感器max44000源代碼執(zhí)行過(guò)程分析

TMD27713T內(nèi)部集成一個(gè)光傳感器,一顆紅外發(fā)射管和一顆紅外接收極管。

ALS環(huán)境光傳感器,距離檢測(cè)和紅外燈在一個(gè)模塊上,ALS:近似于人眼的反應(yīng),可編程積分時(shí)間,可編程的中斷閥值,很高的靈敏度。距離檢測(cè):校準(zhǔn)到100mm的精度,消除工廠校準(zhǔn),可編程的數(shù)字紅外脈沖??删幊痰?a target="_blank">電流源的紅外燈,可編程的中斷閥值,可編程的等待時(shí)間。帶微光學(xué)透鏡的裝置為紅外線能的發(fā)送和接收提供高能有效的能量,降低整體功耗。

Detailed Description:光到數(shù)字的裝置提供了片上光敏二極管,AD轉(zhuǎn)換,時(shí)鐘,累加器,緩存,校準(zhǔn),狀態(tài)機(jī)和I2C接口。

光傳感器,根據(jù)光線強(qiáng)度輸出模擬信號(hào),按電壓大小指示環(huán)境光線強(qiáng)度。配合LED驅(qū)動(dòng)芯片,自動(dòng)調(diào)整LCD的背光強(qiáng)度。光線傳感器根據(jù)光線強(qiáng)度輸出一個(gè)指示信號(hào),然后經(jīng)過(guò)放大器送出。

Proximity Sensor是由一顆紅外發(fā)射管和一顆紅外接收極管組成。通電后,紅外管發(fā)射的紅外光由于沒(méi)有遮擋物反射紅外信號(hào),紅外接收管沒(méi)有動(dòng)作。當(dāng)有遮擋物時(shí),會(huì)反射紅外光,接收管接收到信號(hào)后,紅外管導(dǎo)通,發(fā)出中斷信號(hào)給DBB。LC1810通過(guò)I2C接口控制Gsensor、ALS&PS、COMPASS、Gyroscope芯片,通過(guò)GPIO完成各芯片的中斷處理。接近光檢測(cè)器被配置好相關(guān)紅外感知靈敏度,但紅外LED反射收到時(shí),接近光檢測(cè)器內(nèi)部光敏二極管產(chǎn)生對(duì)應(yīng)強(qiáng)度的電流,并轉(zhuǎn)化為相應(yīng)的數(shù)字量,并產(chǎn)生中斷給微控制器(LC1810),LC1810通過(guò)I2C得到相關(guān)數(shù)字信息,并通過(guò)檢測(cè)內(nèi)部算法得到最終“接近信息”。

板子上的信息:

/*ALS + PS*/tmd22713初始化時(shí)i2c_client的配置信息

#if defined(CONFIG_LIGHT_PROXIMITY_TMD22713T)

static structtaos_cfgcomip_i2c_tmd22713_info= {

.calibrate_target = 300000,

.als_time = 50,//200,

.scale_factor = 1,

.gain_trim = 512,

.filter_history = 3,

.filter_count = 1,

.gain = 1,//2,

.prox_threshold_hi = 500,//120,

.prox_threshold_lo = 400,//80,

.als_threshold_hi = 3000,

.als_threshold_lo = 10,

.prox_int_time = 0xee, /* 50ms */

.prox_adc_time = 0xff,

.prox_wait_time = 0xee,

.prox_intr_filter = 0x11,//0x23,

.prox_config = 0,

.prox_pulse_cnt = 0x08,

.prox_gain = 0x61,//0x62,

.int_gpio = mfp_to_gpio(TMD22713T_INT_PIN),

};

#endif

//TMD22713在板子上的I2C接口信息:

static struct i2c_board_info comip_i2c1_board_info[] = {

#if defined(CONFIG_LIGHT_PROXIMITY_TMD22713T)

{

.type = “tritonFN”,

.addr = 0x39,

.platform_data = &comip_i2c_tmd22713_info,

},

#endif

#if defined(CONFIG_LIGHT_PROXIMITY_TAOS_TMD22713T)

{

.type = “tritonFN”,

.addr = 0x39,

},

#endif

……。}

代碼位置:kernel\lc1810\drivers\misc\light_prox\Tmd22713.c

DECLARE_WAIT_QUEUE_HEAD(waitqueue_read); //定義一個(gè)等待隊(duì)列用于處理中斷

#define ALS_PROX_DEBUG

static char pro_buf[4];

static int mcount = 0;

static char als_buf[4];

static bool enable_irq_mask = (bool)0;

// per-device data

struct taos_data { //定義taos_data結(jié)構(gòu)體

struct i2c_client *client; //定義I2c_client表示用的實(shí)際設(shè)備

struct taos_cfg *taos_cfg_data; //初始化的配置信息

struct work_struct work; //定義一個(gè)work_struct結(jié)構(gòu)體處理任務(wù)

struct wake_lock taos_wake_lock; //定義一個(gè)鎖

struct semaphore update_lock; //定義一個(gè)信號(hào)量

struct miscdevice light_dev; //定義一個(gè)misc的設(shè)備light_dev

struct miscdevice prox_dev; //定義一個(gè)misc的設(shè)備prox_dev

wait_queue_head_t light_event_wait; //定義一個(gè)光傳感器的等待隊(duì)列

wait_queue_head_t proximity_event_wait; //定義一個(gè)距離傳感器的等待隊(duì)列

int lux_state; //lux的狀態(tài)?

int light_event; //light的事件

int light_poll_delay; //light輪詢(xún)時(shí)間

int prox_state; //prox的狀態(tài)

int prox_event; //prox的事件

int prox_poll_delay; //prox的輪詢(xún)時(shí)間

int irq; //中斷

};

程序執(zhí)行時(shí):

1、 module_init(taos_init);調(diào)用taos_init

2、 static int __init taos_init(void)調(diào)用 i2c_add_driver(&taos_driver)加載驅(qū)動(dòng);

3、 驅(qū)動(dòng)定義如下:

static struct i2c_driver taos_driver = {

.driver = {

.owner = THIS_MODULE,

.name = TAOS_DEVICE_NAME,

},

.suspend = taos_suspend,

.resume = taos_resume,

.id_table = taos_idtable,//用于I2C driver的probe函數(shù)調(diào)用

.probe = taos_probe, /* bus-》match成功后調(diào)用 */

.remove = __devexit_p(taos_remove),

}

I2C_driver對(duì)應(yīng)一套驅(qū)動(dòng)方法,主要成員是probe()、remove()、suspend()等。另外id_table是該驅(qū)動(dòng)所支持的I2C設(shè)備的ID表。I2C_client對(duì)應(yīng)于真實(shí)的物理設(shè)備,每個(gè)I2C設(shè)備都需要一個(gè)I2C_client來(lái)描述。I2C_driver與I2c_client的關(guān)系是一對(duì)多,一個(gè)I2C設(shè)備上可以支持多個(gè)同類(lèi)型的I2c_client.

I2C_client的信息在BSP板文件board-lc1810.c中通過(guò)i2c_borad_info填充。

在I2C總線驅(qū)動(dòng)i2c_bus_type的match()函數(shù)i2c_device_match()中,會(huì)調(diào)用i2c_match_id()函數(shù)匹配板文件中定義的ID和i2c_driver所支持的ID表。通過(guò)bus-》match()匹配成功后開(kāi)始調(diào)用probe函數(shù)進(jìn)行一系列初始化動(dòng)作。

4、 static int taos_probe(struct i2c_client *clientp, const struct i2c_device_id *idp)的執(zhí)行過(guò)程。

1)、讀取chipID,檢測(cè)是否正確。

2)、為taos_data分配空間并利用memset清零。

3)、使用函數(shù)wake_lock_init()新建wakelock,該函數(shù)設(shè)置鎖的名字,類(lèi)型,最后將新建的鎖掛接到一個(gè)專(zhuān)門(mén)鏈接這些非鎖狀態(tài)的鏈表上

4)、初始化taos_data中兩個(gè)設(shè)備的輪詢(xún)等待時(shí)間,獲取client指針。

5)、INIT_WORK(&(taos_datap-》work),taos_work_func);

第一個(gè)參數(shù)是初始化的一個(gè)工作隊(duì)列,第二個(gè)參數(shù)是對(duì)這個(gè)工作隊(duì)列的處理函數(shù)。INIT_WORK()函數(shù)把這個(gè)隊(duì)列和處理函數(shù)綁定。

處理函數(shù)如下:

static void taos_work_func(struct work_struct * work)

{

struct taos_data *taos_data = container_of(work, struct taos_data, work);

wake_lock(&taos_datap-》taos_wake_lock);

taos_get_data();

/*《after read data done, taos will not clear interrupts self-motion》*/

taos_interrupts_clear(taos_data);

wake_unlock(&taos_datap-》taos_wake_lock);

}利用鎖互斥訪問(wèn),通過(guò)taos_get_data()獲取數(shù)據(jù)。Taos_get_data()通過(guò)I2C命令讀取寄存器和當(dāng)前的狀態(tài)設(shè)置距離傳感器prox的閥值或者設(shè)置光傳感器als的閥值,通過(guò)taos_als_get_data()最終獲取數(shù)據(jù)。

6)、通過(guò)init_waitqueue_head()函數(shù)分別初始化light和prox的等待隊(duì)列。

7)、填充light_dev和prox_dev的結(jié)構(gòu)體,然后通過(guò)misc_register()函數(shù)注冊(cè)兩個(gè)設(shè)備,分別是light設(shè)備和prox設(shè)備。

8)、通過(guò)i2c_smbus_write_byte操作控制寄存器。Sensor powerdown for init。

9)、ret = gpio_request(taos_datap-》taos_cfg_data-》int_gpio, “taos irq”);

gpio_direction_input(taos_datap-》taos_cfg_data-》int_gpio);

taos_datap-》irq =gpio_to_irq(taos_datap-》taos_cfg_data-》int_gpio);

ret =request_irq(taos_datap-》irq,taos_irq_handler,

IRQ_TYPE_EDGE_FALLING, “taos_irq”, taos_datap);

其中request_irq()函數(shù)通過(guò)中斷申請(qǐng),得到中斷后用中斷處理函數(shù)taos_irq_handler()進(jìn)行處理。中斷函數(shù)如下:

static irqreturn_t taos_irq_handler(int irq, void *dev_id)

{

disable_irq_nosync(taos_datap-》irq);

schedule_work(&taos_datap-》work);

enable_irq(taos_datap-》irq);

return IRQ_HANDLED;

}

系統(tǒng)調(diào)用處理在等待隊(duì)列中的work事件。

其中:workqueue內(nèi)核實(shí)現(xiàn)原理可以描述如下:

在Workqueue機(jī)制中,提供了一個(gè)系統(tǒng)默認(rèn)的workqueue隊(duì)列——keventd_wq,這個(gè)隊(duì)列是Linux系統(tǒng)在初始化的時(shí)候就創(chuàng)建的。用戶(hù)可以直接初始化一個(gè)work_struct對(duì)象,然后在該隊(duì)列中進(jìn)行調(diào)度,使用更加方便。

Workqueue編程接口序號(hào)接口函數(shù)說(shuō)明:

a、 create_workqueue 用于創(chuàng)建一個(gè)workqueue隊(duì)列,為系統(tǒng)中的每個(gè)CPU都創(chuàng)建一個(gè)內(nèi)核線程。

輸入?yún)?shù):@name:workqueue的名稱(chēng)

b、 create_singlethread_workqueue 用于創(chuàng)建workqueue,只創(chuàng)建一個(gè)內(nèi)核線程。輸入?yún)?shù):@name:workqueue名稱(chēng)

c、 destroy_workqueue 釋放workqueue隊(duì)列。輸入?yún)?shù):@ workqueue_struct:需要釋放的workqueue隊(duì)列指針

d、 schedule_work 調(diào)度執(zhí)行一個(gè)具體的任務(wù),執(zhí)行的任務(wù)將會(huì)被掛入Linux系統(tǒng)提供的workqueue——keventd_wq輸入?yún)?shù):@ work_struct:具體任務(wù)對(duì)象指針

e、 schedule_delayed_work 延遲一定時(shí)間去執(zhí)行一個(gè)具體的任務(wù),功能與schedule_work類(lèi)似,多了一個(gè)延遲時(shí)間,輸入?yún)?shù):@work_struct:具體任務(wù)對(duì)象指針@delay:延遲時(shí)間

f、 queue_work 調(diào)度執(zhí)行一個(gè)指定workqueue中的任務(wù)。輸入?yún)?shù):@ workqueue_struct:指定的workqueue指針@work_struct:具體任務(wù)對(duì)象指針

g、 queue_delayed_work 延遲調(diào)度執(zhí)行一個(gè)指定workqueue中的任務(wù),功能與queue_work類(lèi)似,輸入?yún)?shù)多了一個(gè)delay。

在進(jìn)行系統(tǒng)調(diào)用處理時(shí)用的是輪詢(xún)處理的方法,程序中分別為light和prox定義了兩個(gè)file_operations,連接如下:

const structfile_operations taos_light_fops = {

.owner = THIS_MODULE,

.read = light_read,

.poll = light_poll,//輪詢(xún)函數(shù)

.unlocked_ioctl = light_ioctl,

.open = light_open,

.release = light_release,

};

const structfile_operations taos_prox_fops= {

.owner = THIS_MODULE,

.read = prox_read,

.poll = prox_poll,//輪詢(xún)函數(shù)

.unlocked_ioctl = prox_ioctl,

.open = prox_open,

.release = prox_release,

};

Select()和poll()是與設(shè)備阻塞與非阻塞訪問(wèn)息息相關(guān)的,使用非阻塞I/O的應(yīng)用程序通常會(huì)使用select和poll()系統(tǒng)調(diào)用查詢(xún)是否可對(duì)設(shè)備進(jìn)行無(wú)阻塞的訪問(wèn)。

static unsigned intlight_poll(struct file *file, struct poll_table_struct *poll)

{

int mask = 0;

struct taos_data *data = (struct taos_data*)file-》private_data;

poll_wait(file, &data-》light_event_wait, poll);

if (data-》light_event)

mask |= POLLIN | POLLRDNORM;

return mask;

}

//第一個(gè)參數(shù)是file結(jié)構(gòu)體指針,第二個(gè)為輪詢(xún)表指針

static unsigned intprox_poll(struct file *file, struct poll_table_struct *poll)

{

int mask = 0;

struct taos_data *data = (struct taos_data*)file-》private_data;

poll_wait(file, &data-》proximity_event_wait, poll);

if (data-》prox_event)

mask |= POLLIN | POLLRDNORM;

return mask;

}

Poll()第一個(gè)參數(shù)是file的結(jié)構(gòu)體指針,第二個(gè)參數(shù)是輪詢(xún)表指針。這個(gè)函數(shù)的兩項(xiàng)工作:

、對(duì)可能引起的設(shè)備文件狀態(tài)變化的等待隊(duì)列調(diào)用poll_wait()函數(shù),將對(duì)應(yīng)的等待隊(duì)列添加到poll_table。

②、返回表示是否能對(duì)設(shè)備進(jìn)行無(wú)阻塞的讀寫(xiě)訪問(wèn)的掩碼。

Poll_wait()的工作是把當(dāng)前的進(jìn)程添加到wait參數(shù)指定的等待列表(poll_table)中。

阻塞和非阻塞訪問(wèn)時(shí)I/O操作的兩種不同的模式,阻塞在I/O操作暫時(shí)不可進(jìn)行時(shí)會(huì)讓進(jìn)程睡眠,非阻塞則不然。在設(shè)備驅(qū)動(dòng)中阻塞I/O一般基于等待隊(duì)列來(lái)實(shí)現(xiàn),等待隊(duì)列可用于同步驅(qū)動(dòng)中事件發(fā)生的先后順序。使用非阻塞I/O的應(yīng)用程序也可借助輪詢(xún)函數(shù)來(lái)查詢(xún)?cè)O(shè)備是否能立即被訪問(wèn),用戶(hù)空間調(diào)用select()和poll()接口,設(shè)備驅(qū)動(dòng)提供poll()函數(shù)。設(shè)備驅(qū)動(dòng)的poll()本身不會(huì)阻塞,但是poll()和select()系統(tǒng)調(diào)用則會(huì)阻塞的等待文件描述集合中至少一個(gè)可訪問(wèn)或超時(shí)。

結(jié)語(yǔ)

關(guān)于光傳感器和距離傳感器的相關(guān)介紹就到這了,如有不足之處歡迎指正。

相關(guān)閱讀推薦:重力感應(yīng)器BMA250源代碼執(zhí)行分析

相關(guān)閱讀推薦:詳解接近傳感器的主要功能及8大應(yīng)用實(shí)例

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 光傳感器
    +關(guān)注

    關(guān)注

    3

    文章

    169

    瀏覽量

    29901
  • 距離傳感器
    +關(guān)注

    關(guān)注

    3

    文章

    74

    瀏覽量

    15102
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MSP430的IIC工程分享

    MSP430讀寫(xiě)MAX44000環(huán)境傳感器,IIC通信
    發(fā)表于 03-02 18:42

    距離傳感器怎么校準(zhǔn)

    、LED燈、主照相機(jī)、副照相機(jī)、閃光燈、接收、Wave回放、回路、耳機(jī)、FM收音機(jī)、OTG、加速度傳感器、加速度傳感器校準(zhǔn)、磁力計(jì)傳感器、距離
    發(fā)表于 08-21 09:29

    激光傳感器測(cè)量距離的方法及技術(shù)優(yōu)勢(shì)

    同時(shí)從被測(cè)物表面漫反射,然后傳感器上的接收透鏡聚焦反射,在線性成像上產(chǎn)生光電?! ”粶y(cè)物與傳感器
    發(fā)表于 02-20 11:44

    結(jié)構(gòu)傳感器模型及特性分析

    給出了結(jié)構(gòu)傳感器的數(shù)學(xué)模型,并依此模型詳細(xì)分析了結(jié)構(gòu)傳感器的各項(xiàng)參量,討論了這些參量對(duì)結(jié)構(gòu)
    發(fā)表于 07-10 15:52 ?16次下載

    傳感器/檢測(cè),傳感器/檢測(cè)是什么意思

    傳感器/檢測(cè),傳感器/檢測(cè)是什么意思 傳感器
    發(fā)表于 04-02 17:03 ?1361次閱讀

    maxim推出MAX44000集成環(huán)境光和接近檢測(cè)傳感器

    MAX44000集成環(huán)境光和接近檢測(cè)傳感器是業(yè)內(nèi)功耗最低的環(huán)境光和接近檢測(cè)傳感器,提供可靠測(cè)量。
    發(fā)表于 08-26 22:16 ?1109次閱讀

    MAX44000中文資料

    MAX44000集成了寬動(dòng)態(tài)范圍環(huán)境傳感器和一個(gè)紅外接近檢測(cè)傳感器,是便攜式觸摸屏控制產(chǎn)品的理想方案。在環(huán)境檢測(cè)+接近檢測(cè)應(yīng)用中, IC
    發(fā)表于 06-04 14:39 ?152次下載
    <b class='flag-5'>MAX44000</b>中文資料

    用接近檢測(cè)傳感器檢測(cè)更遠(yuǎn)的目標(biāo)

    本文討論通過(guò)紅外LED提高MAX44000接近檢測(cè)傳感器驅(qū)動(dòng)電流的幾種方式,包括非常簡(jiǎn)單到比較復(fù)雜的各種方法,使用戶(hù)能夠檢測(cè)與接近檢測(cè)傳感器相距更遠(yuǎn)的目標(biāo)。
    發(fā)表于 06-19 10:13 ?1715次閱讀
    用接近檢測(cè)<b class='flag-5'>傳感器</b>檢測(cè)更遠(yuǎn)的目標(biāo)

    利用MAX44000MAX4729提高LED功率

    為了實(shí)現(xiàn)與MAX44000的最佳組合,增加了一級(jí)電路。模擬開(kāi)關(guān)將設(shè)置電壓送至運(yùn)放電流驅(qū)動(dòng)。
    發(fā)表于 06-19 10:20 ?1775次閱讀
    利用<b class='flag-5'>MAX44000</b>與<b class='flag-5'>MAX</b>4729提高LED功率

    手機(jī)距離傳感器原理及應(yīng)用

    距離傳感器又叫位移傳感器,距離傳感器一般都在手機(jī)聽(tīng)筒的兩側(cè)或者是在手機(jī)聽(tīng)筒凹槽中,這樣便于它的工作。當(dāng)用戶(hù)在接聽(tīng)或撥打電話時(shí),將手機(jī)靠近頭部
    發(fā)表于 09-28 09:39 ?8.7w次閱讀
    手機(jī)<b class='flag-5'>距離</b><b class='flag-5'>傳感器</b>原理及應(yīng)用

    開(kāi)源的傳感器PX4FLOW源代碼

    傳感器英文手冊(cè),使用說(shuō)明加源代碼
    發(fā)表于 07-17 15:54 ?17次下載

    用環(huán)境傳感器封裝近距離傳感器的優(yōu)點(diǎn)

    本文檔內(nèi)容用環(huán)境傳感器封裝近距離傳感器的優(yōu)點(diǎn),供網(wǎng)友參考。
    發(fā)表于 09-14 18:50 ?29次下載
    用環(huán)境<b class='flag-5'>光</b><b class='flag-5'>傳感器</b>封裝近<b class='flag-5'>距離</b><b class='flag-5'>傳感器</b>的優(yōu)點(diǎn)

    距離傳感器原理及應(yīng)用

    距離傳感器是一種利用超聲波或激光來(lái)測(cè)量物體距離傳感器,主要用來(lái)測(cè)量運(yùn)動(dòng)物體的位置隨時(shí)間變化的規(guī)律,使用它可以完成多種運(yùn)動(dòng)學(xué)和動(dòng)力學(xué)測(cè)定。利用各種元件檢測(cè)對(duì)象物的物理變化量,通過(guò)將該變
    發(fā)表于 07-12 16:56 ?1.8w次閱讀

    距離傳感器的原理及分類(lèi)

    距離傳感器是一種利用超聲波或激光來(lái)測(cè)量物體距離傳感器,主要用來(lái)測(cè)量運(yùn)動(dòng)物體的位置隨時(shí)間變化的規(guī)律,使用它可以完成多種運(yùn)動(dòng)學(xué)和動(dòng)力學(xué)測(cè)定。 距離
    的頭像 發(fā)表于 10-02 16:59 ?8414次閱讀

    使用接近傳感器到達(dá)更遠(yuǎn)的距離

    MAX44000將強(qiáng)大的功能集成到纖巧的2mm x 2mm x 0.6mm封裝中,提供緊湊有效的紅外接近檢測(cè)方案。傳感器通過(guò)脈沖紅外發(fā)射二極管并觀察反射信號(hào)的大小來(lái)工作。該信號(hào)的幅度越大,目標(biāo)離
    的頭像 發(fā)表于 01-16 14:43 ?1141次閱讀
    使用接近<b class='flag-5'>傳感器</b>到達(dá)更遠(yuǎn)的<b class='flag-5'>距離</b>