linux內核驅動:電流/電壓/功率監控模塊INA226調試

目錄

    • 背景
    • 一、芯片介紹
    • 二、手冊
    • 三、內核驅動配置
      • 3.1 設備樹配置
      • 3.2 修改內核配置文件
      • 3.3 編譯
    • 四、內核驅動分析
      • 1、初始化流程
      • 2、屬性文件/解釋
    • 五、調試和計算

背景

最近調試了一款德州儀器的帶有I2C控制接口的可以實現電壓、電流、功率監測,并可以進行報警設置的芯片INA226;
本文主要總結在linux 5.10下怎么配置內核將此芯片用起來,并總結內核中此芯片的驅動實現;

一、芯片介紹

INA226 是具有 I2C? 或 SMBUS 兼容接口的電流分流
器和功率監測器。該器件同時監控分流壓降和總線電源
電壓。可編程校準值、轉換時間、和均值計算,與一個
內部乘法器相組合,實現電流值(安培)和功率值
(瓦)的直接讀取。
INA226 可在 0V 至 36V 的共模總線電壓范圍內感測電
流,與電源電壓無關。 該器件由一個 2.7V 至 5.5V 的
單電源供電,汲取 330μA 的典型電源電流。該器件的
額定工作溫度范圍為 –40°C 至 125°C,I2C 兼容接口
上具有多達 16 個可編程地址。

二、手冊

https://www.ti.com.cn/product/cn/INA226/part-details/INA226AIDGST
詳細描述和硬件參考設計等見手冊;

三、內核驅動配置

3.1 設備樹配置

&i2cXXX {
status = “okay”;
ina226@xx {
compatible = “ti,ina226”;
reg = <0xXX>; //器件地址結合手冊和硬件配置定義
shunt-resistor = <1000>; //采樣電阻值單位是: micro-ohm 微歐姆,如果是1毫歐就乘以1000
};
};

3.2 修改內核配置文件

修改內核源碼/arch/arm64/configs/xxxxxxx_defconfg配置文件,添加編譯選項
CONFIG_SENSORS_INA2XX=y 編譯到內核 或者
CONFIG_SENSORS_INA2XX=m 編譯成模塊

3.3 編譯

配置成模塊時,查看是否生成ina2xx.o 和 ina2xx.ko;
配置編譯到內核時,查看是否生成ina2xx.o;

四、內核驅動分析

1、初始化流程

驅動和設備樹表示的設備match后 -> ina2xx_probe 執行

static int ina2xx_probe(struct i2c_client *client)
{struct device *dev = &client->dev;struct ina2xx_data *data;struct device *hwmon_dev;u32 val;int ret, group = 0;enum ina2xx_ids chip;if (client->dev.of_node)chip = (enum ina2xx_ids)of_device_get_match_data(&client->dev);//獲取設備與驅動匹配后的of_device_id 結構里的數據,這的data為驅動不同芯片自定義的索引 ina219 為0 ,ina226為1elsechip = i2c_match_id(ina2xx_id, client)->driver_data;data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); //分配data結構的內存if (!data)return -ENOMEM;/* set the device type */data->config = &ina2xx_config[chip]; //結構ina2xx_config 的結構體賦值mutex_init(&data->config_lock);if (of_property_read_u32(dev->of_node, "shunt-resistor", &val) < 0) {struct ina2xx_platform_data *pdata = dev_get_platdata(dev); //讀取設備樹中定義的采樣電阻值if (pdata)val = pdata->shunt_uohms; //得到采樣電阻的阻值微歐姆elseval = INA2XX_RSHUNT_DEFAULT;}ina2xx_set_shunt(data, val);//  struct ina2xx_data結構成員初始化ina2xx_regmap_config.max_register = data->config->registers; //芯片寄存器的個數data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config);//寄存器地址和值的位寬定義if (IS_ERR(data->regmap)) {dev_err(dev, "failed to allocate register map\n");return PTR_ERR(data->regmap);}ret = ina2xx_init(data);//初始化將默認值配置給配置寄存器,校準值配置給校準寄存器if (ret < 0) {dev_err(dev, "error configuring the device: %d\n", ret);return -ENODEV;}data->groups[group++] = &ina2xx_group;//通用屬性組if (chip == ina226)data->groups[group++] = &ina226_group; //ina226 屬性組hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,data, data->groups); //注冊成硬件監控設備類if (IS_ERR(hwmon_dev))return PTR_ERR(hwmon_dev);dev_info(dev, "power monitor %s (Rshunt = %li uOhm)\n",client->name, data->rshunt);return 0;
}

2、屬性文件/解釋

1、會生成如下屬性文件和目錄
在這里插入圖片描述
2、舉例解釋

//屬性文件in0_input ,ina2xx_value 屬性只讀對應 ina2xx_value_show 函數,INA2XX_SHUNT_VOLTAGE  采樣電阻分壓寄存器
static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE);//屬性文件in1_input ,ina2xx_value 屬性只讀對應ina2xx_value_show 函數,INA2XX_BUS_VOLTAGE總線電壓寄存器
static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE);

五、調試和計算

1、安裝模塊 或者編譯進內核啟動;
2、查看板卡/設備內屬性目錄
ls /sys/class/hwmon/hwmonX
在這里插入圖片描述
3、以上屬性文件內的數據為數字值,根據表示的數據內容的含義乘以分辨率,并結合具體的單位即可計算測量值,也可以與一期測量結果進行對比;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91669.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ACL 2024 大模型方向優秀論文:洞察NLP前沿?關鍵突破

關注gongzhonghao【計算機sci論文精選】近年來&#xff0c;以Transformer架構為核心的大語言模型重塑了自然語言處理領域的技術范式。當前ACL相關研究呈現多維度深化態勢&#xff0c;從開源社區推動輕量化架構與低成本訓練技術革新&#xff0c;到學術界探索檢索增強等機制突破長…

樂創E20H1型IO從站與Ethercat轉Profinet網關轉換器的配置應用案例

本案例聚焦于西門子 1200PLC 與 E20H1 - T01 IO 從站的連接。在正常運行過程中&#xff0c;E20H1 - T01 IO 從站需支持 EtherCAT 協議&#xff0c;作為 EtherCAT 從站&#xff1b;而監控系統所采用的西門子 S7 - 1200 系列 PLC 則支持 PROFINET 協議。由于協議的不一致性&#…

【2】專業自定義圖表創建及應用方法

一、專業自定義圖表創建及應用方法1&#xff09;不是圖表的圖表制作方法例題1:迷你圖表制作方法&#xfeff;定義&#xff1a;指依靠Excel基本制圖功能之外的其他功能&#xff08;如公式、條件格式、迷你圖等&#xff09;創建的數據可視化圖表特點&#xff1a;引用數據少且占用…

embodied復現所需docker環境配置粗略流程

由于embodied很多安裝包都需要linux環境&#xff0c;所以為了建立虛擬ubuntu系統&#xff0c;在不適用vmvare的情況&#xff0c;可以考慮使用docker容器來實現&#xff0c;也不會出現的vmware的卡頓情況 1.首先建立容器&#xff0c;并和pycharm建立連接,先安裝docker desktop&a…

2025.8-12月 AI相關國內會議

以下是2025年8月至12月國內與人工智能&#xff08;AI&#xff09;相關的重要會議及活動總結&#xff0c;按時間順序排列&#xff1a; 2025年8月第六屆人工智能與機電自動化國際學術會議&#xff08;AIEA 2025&#xff09; ? 時間&#xff1a;8月1-3日 ? 地點&#xff1a;安徽…

計數組合學7.10(舒爾函數的組合定義)

7.10 舒爾函數的組合定義 前幾節討論的四個基 mλm_{\lambda}mλ?、eλe_{\lambda}eλ?、hλh_{\lambda}hλ? 和 pλp_{\lambda}pλ? 的定義都較為直觀。本節將介紹第五個基&#xff0c;其元素記為 sλs_{\lambda}sλ?&#xff0c;稱為舒爾函數&#xff0c;其定義則更為微…

【前端】CSS Grid布局介紹及示例

CSS Grid 簡介 CSS Grid 是一個二維布局系統&#xff0c;專為處理行和列的復雜網頁布局而設計。與 Flexbox&#xff08;一維布局&#xff09;不同&#xff0c;Grid 允許開發者同時控制行和列&#xff0c;實現更精確的布局結構。 核心概念&#xff1a; Grid 容器&#xff1a;通過…

[echarts]多個柱狀圖及圖例

前言 實現多個柱狀圖功能&#xff0c;并設置多個圖例樣式&#xff0c;并定時刷新數據 react引入echarts import React, { useEffect, useRef } from react; import * as echarts from echarts; import DeviceApi from /api/screen/DeviceApi;const CenterDeviceSummary (props…

【讀文獻】Capacitor-drop AC-DC

[1] F. Song, et al., “An 85-to-230VAC to 3.3-to-4.6VDc 1.52W Capacitor-Drop Sigma-Floating-SC AC-DC Converter with 81.3% Peak Efficiency,” 2025 IEEE International Solid-State Circuits Conference (ISSCC), 2025.以下是針對該電容降壓AC-DC轉換器設計的通俗版解…

`StreamConfigurationMap` 實現邏輯與解析過程詳解:相機流能力的聲明、匹配與驗證機制全景

StreamConfigurationMap 實現邏輯與解析過程詳解:相機流能力的聲明、匹配與驗證機制全景 關鍵詞: StreamConfigurationMap、CameraCharacteristics、OutputFormat、InputFormat、Size 配置、幀率范圍、流兼容性、配置失敗調試 摘要: StreamConfigurationMap 是 Android 相…

關于“PromptPilot” 之3 -Prompt構造器核心專項能力:任務調度

本篇問題Q20. 以上設計是“原始制造商”的典型范式。在三個不同理論層級&#xff08;Prompt 構造進程的三個子進程&#xff08;線程&#xff09;&#xff09;分別適合三種不同的取向&#xff1a; 面向目標、面向結果和面向過程。不同取向將采取不同的策略 和不同的 監控方式&am…

Solana: 鏈上開發入門,用 Anchor 和 Rust 構建第一個程序

大家好&#xff0c;如果大家對 Solana 開發充滿好奇&#xff0c;但又對 Rust 語言感到陌生&#xff0c;那么大家來對地方了。很多人在探索 Solana 這條高性能公鏈時&#xff0c;遇到的第一個門檻就是其原生開發語言——Rust。Rust 以其高性能和內存安全著稱&#xff0c;但學習曲…

node.js之Koa框架

Koa框架介紹Koa 是一個新的 web 框架&#xff0c;由 Express 原班人馬打造&#xff0c;致力于成為一個更小、更富有表現力、更健壯的 Web 框架。Koa 解決了 Express 存在的一些問題&#xff0c;例如&#xff1a;中間件嵌套回調&#xff08;callback hell&#xff09;錯誤處理不…

C/C++離線環境安裝(VSCode + MinGW)

因為工作需要部署離線C環境&#xff0c;網上有許多大佬分享了不錯的教程&#xff0c;總結一篇完整教程自用&#xff0c;使用VSCode MinGW感謝一、安裝準備二、軟件安裝1.安裝MinGW2.安裝VSCode及插件三、測試環境1.創建工程文件夾2.創建cpp文件總結感謝 本教程參考了以下教程…

如何創建一個飛書應用獲取自己的飛書AppID和AppSecret?

這篇文章是接下來要開發「監控 X&#xff08;原Twitter&#xff09;博主賬號最新推文」 自動化工作流的先導文章&#xff0c;由于內容相對獨立&#xff0c;也可用于飛書應用的其他場景&#xff0c;故單獨發出來&#xff0c;方便查閱。 監控X平臺指定博主最新發文&#xff0c;需…

Prompt工程記錄

Prompt基本建議&#xff1a;1.在查詢中包含詳細信息以獲得更相關的答案總結會議筆記:先將會議筆記總結為一段&#xff0c;然后寫一份演講者的打分表&#xff0c;列出他們的每個要點&#xff1b;最后列出發言者建議的下一步行動或者行動項目&#xff08;如果有的話&#xff09;2…

CTE公用表表達式的可讀性與性能優化

一、可讀性優化CTE通過WITH子句定義臨時命名結果集&#xff0c;將復雜查詢分解為邏輯獨立的模塊&#xff0c;顯著提升代碼清晰度與可維護性?&#xff1a;?解構嵌套查詢?&#xff1a;將多層嵌套的子查詢扁平化&#xff0c;例如傳統嵌套統計訂單的查詢可重構為分步CTE&#xf…

8.1.2 TiDB存儲引擎的原理

TiDB 簡介 TiDB 是 PingCAP 公司自主設計、研發的開源分布式關系型數據 庫&#xff0c;是一款同時支持在線事務處理與在線分析處理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布 式數據庫產品&#xff0c;具備水平擴容或者縮容、金融級高可用、實時 …

PTE之路--01

空格繞過:/**/ URL編碼偽協議:pagezip://xxx/xx/x/x/xxx.jpg%23解壓后的名字pagephar://xxx/xx/x/x/xxx.jpg/解壓后的名字pageddata://ata://text/plain,<?php eval($_POST[x]) ;?>pagedata://text/plain,<?php eval($_POST[x]) ;?>127.0.0.1 | grep . ../key…

企業級日志分析系統ELK

1.什么是 Elastic Stack 如果系統和應用出現異常和問題,相關的開發和運維人員想要排查原因,就要先登錄到應用運行所相應的主機,找到上面的相關日志文件再進行查找和分析,所以非常不方便,此外還會涉及到權限和安全問題,而ELK 的出現就很好的解決這一問題。 ELK 是由一家 …