91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

Kernel 6.1?中?MS5607?溫度傳感器驅(qū)動(dòng)深度解析

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-04-01 08:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)中,溫度傳感器是硬件監(jiān)控的核心組件之一,MS5607作為一款高精度的壓力/溫度傳感器,被廣泛應(yīng)用在工業(yè)控制消費(fèi)電子等場(chǎng)景。本文基于Linux Kernel 6.1版本,深入解析drivers/input/sensors/temperature/tmp_ms5607.c驅(qū)動(dòng)代碼的實(shí)現(xiàn)邏輯,帶你搞懂傳感器驅(qū)動(dòng)的注冊(cè)、初始化、數(shù)據(jù)采集與上報(bào)全流程,以及如何在系統(tǒng)中獲取傳感器的狀態(tài)和數(shù)據(jù)。

一、MS5607傳感器基礎(chǔ)

MS5607是MEAS(TE Connectivity)推出的高精度數(shù)字壓力傳感器,集成溫度傳感功能,采用I2C接口通信,內(nèi)置128位校準(zhǔn)數(shù)據(jù)(PROM)。驅(qū)動(dòng)通過讀取校準(zhǔn)數(shù)據(jù)補(bǔ)償溫度和壓力的測(cè)量誤差,最終輸出-40~85℃范圍內(nèi)的高精度溫度值,以及對(duì)應(yīng)的壓力值。

二、驅(qū)動(dòng)代碼核心結(jié)構(gòu)解析

驅(qū)動(dòng)代碼基于LinuxI2C子系統(tǒng)Input子系統(tǒng)實(shí)現(xiàn),整體結(jié)構(gòu)分為「驅(qū)動(dòng)注冊(cè)」「核心操作函數(shù)」「數(shù)據(jù)采集與上報(bào)」三大模塊,下面逐一拆解。

2.1驅(qū)動(dòng)注冊(cè):I2C驅(qū)動(dòng)框架

Linux下I2C設(shè)備驅(qū)動(dòng)遵循標(biāo)準(zhǔn)的I2C驅(qū)動(dòng)框架,核心是i2c_driver結(jié)構(gòu)體和設(shè)備ID表,這是驅(qū)動(dòng)被內(nèi)核識(shí)別的基礎(chǔ):

// 設(shè)備ID表:匹配I2C設(shè)備staticconststructi2c_device_id temperature_ms5607_id[] = {  {"tmp_ms5607", TEMPERATURE_ID_MS5607},  {}};// I2C驅(qū)動(dòng)核心結(jié)構(gòu)體staticstructi2c_driver temperature_ms5607_driver = {  .probe = temperature_ms5607_probe,   // 設(shè)備匹配成功后執(zhí)行  .remove= (void*)temperature_ms5607_remove,// 設(shè)備卸載時(shí)執(zhí)行  .shutdown = sensor_shutdown,  .id_table = temperature_ms5607_id,   // 設(shè)備ID匹配表  .driver = {    .name ="temperature_ms5607", #ifdef CONFIG_PM    .pm = &sensor_pm_ops,        // 電源管理 #endif  },};// 簡(jiǎn)化I2C驅(qū)動(dòng)注冊(cè)/注銷的宏module_i2c_driver(temperature_ms5607_driver);

?module_i2c_driver:底層調(diào)用i2c_add_driver完成驅(qū)動(dòng)注冊(cè),無需手動(dòng)寫init/exit函數(shù);

?probe函數(shù):I2C設(shè)備匹配成功后觸發(fā),調(diào)用sensor_register_device完成傳感器設(shè)備注冊(cè);

?remove函數(shù):設(shè)備卸載時(shí)注銷傳感器設(shè)備,釋放資源。

2.2核心操作函數(shù):初始化與激活

驅(qū)動(dòng)通過sensor_operate結(jié)構(gòu)體封裝傳感器的核心操作(初始化、激活、數(shù)據(jù)上報(bào)),核心函數(shù)如下:

(1)sensor_init:傳感器初始化

初始化的核心目標(biāo)是將傳感器置為「關(guān)閉狀態(tài)」,為后續(xù)激活做準(zhǔn)備:

staticintsensor_init(structi2c_client *client){ structsensor_private_data *sensor =    (structsensor_private_data *) i2c_get_clientdata(client); intresult =0; // 先禁用傳感器,確保初始狀態(tài)為OFF  result = sensor->ops->active(client,0,0); if(result)  {    printk("%s:line=%d,errorn",__func__,__LINE__);   returnresult;  }  sensor->status_cur = SENSOR_OFF;     // 標(biāo)記當(dāng)前狀態(tài)為OFF  g_ms5607_temp_status = sensor->status_cur;// 同步到全局狀態(tài)變量 returnresult;}

(2)sensor_active:傳感器激活與校準(zhǔn)數(shù)據(jù)讀取

激活是傳感器從「OFF→ON」的關(guān)鍵步驟,核心是讀取校準(zhǔn)數(shù)據(jù)(PROM),這是溫度補(bǔ)償?shù)幕A(chǔ):

staticintsensor_active(structi2c_client *client,intenable,intrate){ intresult =0; inti =0; charprom[16]; // 僅當(dāng)「啟用傳感器」且「當(dāng)前為OFF」時(shí)執(zhí)行激活邏輯 if((enable)&&(g_ms5607_pr_status == SENSOR_OFF))  {   // 1. 發(fā)送復(fù)位指令,重置傳感器    result =sensor_write_reg_normal(client, CMD_RESET);   if(result)   printk("%s:line=%d,errorn",__func__,__LINE__);   // 2. 讀取128位校準(zhǔn)數(shù)據(jù)(8組,每組2字節(jié))   memset(prom,0,16);   for(i=0; i<8; i++)? ? ? ? {? ? ? ? ? ? prom[i*2]= CMD_PROM_RD + i*2; ? ?// 校準(zhǔn)數(shù)據(jù)讀取指令? ? ? ? ? ? result =?sensor_rx_data(client, &prom[i*2],?2);? ? ? ? ? ??if(result)?return?result;? ? ? ? }? ? ? ??// 3. 校準(zhǔn)數(shù)據(jù)轉(zhuǎn)存到全局?jǐn)?shù)組C,供后續(xù)溫度計(jì)算使用? ? ? ??for?(i=0;i<8;i++)? ? ? ? {? ? ? ? ? ? C[i] = prom[2*i] <

關(guān)鍵說明:MS5607的校準(zhǔn)數(shù)據(jù)(PROM)是出廠時(shí)寫入的,包含8組補(bǔ)償參數(shù),決定了溫度測(cè)量的精度,必須在激活階段讀取并保存。

2.3數(shù)據(jù)采集與上報(bào):溫度計(jì)算+Input子系統(tǒng)

sensor_report_value是驅(qū)動(dòng)的核心數(shù)據(jù)處理函數(shù),負(fù)責(zé)「觸發(fā)AD轉(zhuǎn)換→讀取數(shù)據(jù)→溫度補(bǔ)償→上報(bào)數(shù)據(jù)」全流程:

staticintsensor_report_value(structi2c_client *client){ // 省略變量定義... if(g_ms5607_pr_status == SENSOR_OFF)  {   // 1. 觸發(fā)壓力(D1)AD轉(zhuǎn)換(4096倍過采樣,平衡精度/速度)    sensor_write_reg_normal(client, CMD_ADC_CONV+CMD_ADC_D1+CMD_ADC_4096);    msleep(10);// 等待轉(zhuǎn)換完成    result = sensor_rx_data(client, &buffer[0],3);    D1 = (buffer[0] <>23));   // 4. 二階補(bǔ)償(低溫場(chǎng)景<20℃,提升精度)? ? ? ??if?(g_ms5607_temp >31);      OFF2 = (((longlong)tmp *61)*((longlong)tmp *61)) >>4;      SENS2 = (longlong)((tmp*tmp) <input_dev, g_ms5607_temp);  } // 省略其他邏輯... returnresult;}

核心細(xì)節(jié)

?AD過采樣配置:代碼中使用CMD_ADC_4096(4096倍過采樣),也可切換為256/512/1024倍,過采樣率越高,精度越高但功耗/耗時(shí)越大;

?溫度單位:g_ms5607_temp的單位是0.01℃(如2500代表25.00℃);

?Input上報(bào):通過input_report_abs上報(bào)ABS_THROTTLE類型數(shù)據(jù),input_sync同步數(shù)據(jù),用戶態(tài)可通過Input節(jié)點(diǎn)讀取。

三、驅(qū)動(dòng)在系統(tǒng)中的體現(xiàn)

MS5607驅(qū)動(dòng)依托Linux內(nèi)核子系統(tǒng)實(shí)現(xiàn),在系統(tǒng)中的體現(xiàn)可分為「驅(qū)動(dòng)加載」「設(shè)備注冊(cè)」「數(shù)據(jù)流轉(zhuǎn)」三個(gè)層面,以下是核心流程可視化:

3.1驅(qū)動(dòng)加載流程圖

wKgZPGnMYlqAEyomAABuwbGO918927.png

3.2系統(tǒng)層面的關(guān)鍵體現(xiàn)

1.驅(qū)動(dòng)加載狀態(tài)

?查看已加載的I2C驅(qū)動(dòng):

cat /sys/bus/i2c/drivers/temperature_ms5607/;

?查看驅(qū)動(dòng)日志:dmesg | grep tmp_ms5607,可排查初始化/激活錯(cuò)誤。

2.Input子系統(tǒng)節(jié)點(diǎn)

驅(qū)動(dòng)通過Input子系統(tǒng)上報(bào)數(shù)據(jù),系統(tǒng)會(huì)生成/dev/input/eventX節(jié)點(diǎn)(X為設(shè)備號(hào)),可通過以下命令查看設(shè)備信息:

cat/proc/bus/input/devices | grep -A 5 tmp_ms5607

3.全局狀態(tài)變量

驅(qū)動(dòng)通過g_ms5607_temp_status(激活狀態(tài):0=OFF/1=ON)、g_ms5607_temp(溫度值)維護(hù)核心狀態(tài),內(nèi)核態(tài)可直接訪問。

四、如何獲取傳感器狀態(tài)與數(shù)據(jù)

4.1內(nèi)核態(tài)獲取

1.調(diào)試打印:開啟CONFIG_PR_MS5607后,驅(qū)動(dòng)會(huì)打印溫度/壓力值,通過dmesg查看:

dmesg| grep sensor_report_value# 輸出示例:sensor_report_value:pressure=101325,temperature=2500

2.全局變量引用:其他內(nèi)核模塊可通過extern引用全局變量:

externintg_ms5607_temp;   // 溫度值(0.01℃)externintg_ms5607_temp_status;// 激活狀態(tài)printk("MS5607 Temp: %.2f℃, Status: %dn", g_ms5607_temp/100.0, g_ms5607_temp_status);

4.2用戶態(tài)獲取

方式1:讀取Input事件(原生方式)

編寫簡(jiǎn)單的C程序讀取/dev/input/eventX節(jié)點(diǎn):

#include#include#includeintmain(){ intfd =open("/dev/input/eventX", O_RDONLY);// 替換為實(shí)際的eventX structinput_eventev; while(read(fd, &ev,sizeof(ev)) >0) {   // 過濾溫度事件(ABS_THROTTLE類型)   if(ev.type == EV_ABS && ev.code == ABS_THROTTLE) {     printf("MS5607 Temperature: %.2f℃n", ev.value /100.0);    }  } close(fd); return0;}

方式2:擴(kuò)展sysfs節(jié)點(diǎn)

原驅(qū)動(dòng)未暴露sysfs節(jié)點(diǎn),可擴(kuò)展代碼添加,簡(jiǎn)化用戶態(tài)讀取:

// 1. 定義sysfs屬性讀取函數(shù)staticssize_ttemp_show(structdevice *dev,structdevice_attribute *attr,char*buf){ returnsprintf(buf,"%.2fn", g_ms5607_temp /100.0);}staticDEVICE_ATTR(temp, S_IRUGO, temp_show,NULL);// 只讀權(quán)限// 2. 在probe函數(shù)中創(chuàng)建sysfs節(jié)點(diǎn)staticinttemperature_ms5607_probe(structi2c_client *client,conststructi2c_device_id *devid){ intret =sensor_register_device(client,NULL, devid, &temperature_ms5607_ops); if(!ret) {   device_create_file(&client->dev, &dev_attr_temp);// 創(chuàng)建temp節(jié)點(diǎn)  } returnret;}

添加后,用戶態(tài)可直接讀?。?/p>

cat/sys/bus/i2c/devices/0-0048/temp# 替換為實(shí)際的I2C設(shè)備地址# 輸出示例:25.00

五、核心流程腦圖

wKgZPGnMYlqABILOAAK5fbwAjwI958.png

六、總結(jié)與拓展

MS5607驅(qū)動(dòng)是典型的「I2C設(shè)備+Input子系統(tǒng)」傳感器驅(qū)動(dòng)實(shí)現(xiàn),核心設(shè)計(jì)思路可總結(jié)為:

1.遵循內(nèi)核框架:基于I2C驅(qū)動(dòng)框架完成設(shè)備匹配,基于Input子系統(tǒng)完成數(shù)據(jù)上報(bào);

2.校準(zhǔn)是核心:必須讀取PROM校準(zhǔn)數(shù)據(jù),才能通過補(bǔ)償算法得到高精度溫度;

3.分層設(shè)計(jì):將初始化、激活、上報(bào)封裝為獨(dú)立函數(shù),符合Linux驅(qū)動(dòng)的模塊化思想。

拓展優(yōu)化方向

?內(nèi)核版本適配:Kernel 6.1后I2C/Input子系統(tǒng)接口可能微調(diào),需驗(yàn)證兼容性;

?功耗優(yōu)化:結(jié)合PM子系統(tǒng),在休眠時(shí)關(guān)閉傳感器AD轉(zhuǎn)換,降低功耗;

?功能擴(kuò)展:添加閾值中斷、sysfs節(jié)點(diǎn)配置采樣率等功能;

?精度調(diào)優(yōu):根據(jù)場(chǎng)景切換AD過采樣率(如低功耗場(chǎng)景用256倍)。

審核編輯 黃宇

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

    關(guān)注

    48

    文章

    3235

    瀏覽量

    163284
  • MS5607
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7663
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SGM448:高性能2.7V - 10V SOT - 23溫度傳感器深度解析

    SGM448:高性能2.7V - 10V SOT - 23溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),溫度
    的頭像 發(fā)表于 03-17 17:10 ?348次閱讀

    SGM446:高精度兩引腳電流輸出溫度傳感器深度解析

    SGM446:高精度兩引腳電流輸出溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),溫度
    的頭像 發(fā)表于 03-17 17:00 ?283次閱讀

    深度解析LM62溫度傳感器:特性、應(yīng)用與設(shè)計(jì)要點(diǎn)

    深度解析LM62溫度傳感器:特性、應(yīng)用與設(shè)計(jì)要點(diǎn) 一、引言 在電子設(shè)備的設(shè)計(jì),準(zhǔn)確測(cè)量溫度是至
    的頭像 發(fā)表于 02-26 14:10 ?256次閱讀

    深度解析LM95221:精準(zhǔn)溫度傳感的理想之選

    深度解析LM95221:精準(zhǔn)溫度傳感的理想之選 在電子工程師的日常設(shè)計(jì)工作,溫度
    的頭像 發(fā)表于 02-26 10:50 ?225次閱讀

    LM95231:高精度雙遠(yuǎn)程二極管溫度傳感器深度解析

    LM95231:高精度雙遠(yuǎn)程二極管溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),溫度監(jiān)測(cè)是至關(guān)重要的
    的頭像 發(fā)表于 02-26 10:25 ?247次閱讀

    深度解析TMP401:一款強(qiáng)大的數(shù)字溫度傳感器

    深度解析TMP401:一款強(qiáng)大的數(shù)字溫度傳感器 在電子設(shè)備的設(shè)計(jì),溫度監(jiān)測(cè)是至關(guān)重要的一環(huán)。今
    的頭像 發(fā)表于 02-26 09:45 ?254次閱讀

    深度解析TMP421、TMP422、TMP423溫度傳感器:特性、應(yīng)用與設(shè)計(jì)要點(diǎn)

    深度解析TMP421、TMP422、TMP423溫度傳感器:特性、應(yīng)用與設(shè)計(jì)要點(diǎn) 在電子設(shè)備的設(shè)計(jì),精確的
    的頭像 發(fā)表于 02-25 17:35 ?1096次閱讀

    高精度LM95245數(shù)字溫度傳感器深度解析

    高精度LM95245數(shù)字溫度傳感器深度解析 在電子設(shè)備溫度監(jiān)測(cè)至關(guān)重要,特別是對(duì)于對(duì)
    的頭像 發(fā)表于 02-25 17:35 ?994次閱讀

    深入解析LMT86:高精度模擬溫度傳感器的卓越之選

    深入解析LMT86:高精度模擬溫度傳感器的卓越之選 在電子設(shè)備設(shè)計(jì),溫度傳感器是至關(guān)重要的組件
    的頭像 發(fā)表于 02-25 14:30 ?296次閱讀

    高精度溫度監(jiān)控利器——TMP451溫度傳感器深度剖析

    高精度溫度監(jiān)控利器——TMP451溫度傳感器深度剖析 在當(dāng)今的電子設(shè)備,精確的溫度測(cè)量至關(guān)重要
    的頭像 發(fā)表于 02-25 14:15 ?313次閱讀

    TMP102-Q1:高性能低功耗數(shù)字溫度傳感器深度解析

    TMP102-Q1:高性能低功耗數(shù)字溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),溫度監(jiān)測(cè)是一個(gè)至關(guān)
    的頭像 發(fā)表于 02-25 11:40 ?206次閱讀

    TMP461-SP:輻射加固高精度溫度傳感器深度解析

    TMP461-SP:輻射加固高精度溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),精確的溫度監(jiān)測(cè)至關(guān)重
    的頭像 發(fā)表于 02-12 11:25 ?450次閱讀

    TMP23x系列溫度傳感器在硬件電路的應(yīng)用解析

    TMP23x系列溫度傳感器在硬件電路的應(yīng)用解析 在硬件設(shè)計(jì)領(lǐng)域,溫度傳感器作為獲取環(huán)境
    的頭像 發(fā)表于 02-12 09:25 ?379次閱讀

    汽車級(jí) ISOTMP35-Q1 隔離式溫度傳感器深度解析

    汽車級(jí) ISOTMP35-Q1 隔離式溫度傳感器深度解析 在電子設(shè)備的設(shè)計(jì),溫度監(jiān)測(cè)是一個(gè)至關(guān)
    的頭像 發(fā)表于 01-20 14:40 ?320次閱讀

    TDK B58101A0851A000油回路溫度傳感器OCTS的深度解析

    TDK B58101A0851A000油回路溫度傳感器OCTS的深度解析 在電子工程師的日常工作,溫度
    的頭像 發(fā)表于 12-25 15:50 ?415次閱讀