当前位置: 首页 > news >正文

一篇看懂Linux下的IIC驱动

IIC驱动概述

IIC(Inter-Integrated Circuit)是一种串行通信协议,广泛应用于嵌入式系统中连接低速外设。Linux内核提供了完善的IIC子系统,包括核心层、适配器驱动和设备驱动。

内核IIC子系统架构

Linux IIC子系统分为三层:

  • IIC核心层:提供注册/注销适配器和设备的API,实现协议的核心逻辑。
  • IIC适配器驱动:针对具体SoC或IIC控制器硬件实现底层操作。
  • IIC设备驱动:实现具体外设的功能逻辑。

适配器驱动开发

适配器驱动需要实现i2c_algorithmi2c_adapter

static const struct i2c_algorithm foo_algorithm = { .master_xfer = foo_i2c_xfer, .functionality = foo_i2c_func, }; static int foo_i2c_probe(struct platform_device *pdev) { struct foo_adapter *adap; adap = devm_kzalloc(&pdev->dev, sizeof(*adap), GFP_KERNEL); adap->adapter.owner = THIS_MODULE; adap->adapter.algo = &foo_algorithm; i2c_add_adapter(&adap->adapter); }

设备驱动开发

设备驱动通过i2c_driver结构体注册:

static const struct i2c_device_id foo_id[] = { { "foo_device", 0 }, { } }; static struct i2c_driver foo_driver = { .driver = { .name = "foo", }, .probe = foo_probe, .remove = foo_remove, .id_table = foo_id, }; module_i2c_driver(foo_driver);

用户空间访问

通过sysfs接口或i2c-dev字符设备访问:

# 扫描IIC总线 i2cdetect -y 1 # 读写寄存器 i2cset -y 1 0x50 0x00 0x12 i2cget -y 1 0x50 0x00

设备树配置

在设备树中声明IIC设备和适配器:

i2c1: i2c@40005400 { compatible = "st,stm32-i2c"; reg = <0x40005400 0x400>; interrupts = <31>; clocks = <&rcc 0 150>; #address-cells = <1>; #size-cells = <0>; eeprom@50 { compatible = "atmel,24c256"; reg = <0x50>; }; };

调试技巧

使用内核动态调试功能:

echo "file i2c-* +p" > /sys/kernel/debug/dynamic_debug/control dmesg -w

常见问题解决

  • NACK错误:检查设备地址、上拉电阻和电源
  • 时钟拉伸:确认设备支持标准模式(100kHz)或快速模式(400kHz)
  • 时序问题:使用逻辑分析仪抓取波形验证时序

性能优化

  • 使用DMA传输减少CPU占用
  • 合理设置超时时间避免总线挂起
  • 批量读写减少启动/停止条件开销
http://www.jsqmd.com/news/888787/

相关文章:

  • 2026年京东云618活动时间、活动入口、优惠活动详细解读
  • CentOS7 OpenSSL 1.1.1 ABI冲突与安全隔离部署指南
  • HarmonyOS ClickUtil 节流与防抖:彻底搞懂按钮防重复点击
  • 从文本到PDF:极简文档转换工具的技术实现与设计哲学
  • 2026年亲测有效:3种高效降论文AIGC率的方法 - 降AI实验室
  • JMeter高并发压测脚本设计范式:可伸缩、可观测、可诊断
  • 如何快速定位手机号码地理位置:终极开源工具使用指南
  • 从零到一:手把手教你用Playwright+Pytest+Yaml+Allure搭建一个能跑起来的UI自动化框架(保姆级避坑指南)
  • 从零实现五子棋AI:极小化极大算法与Alpha-Beta剪枝实战
  • 2026 年福建莆田全屋高端定制家居设计与选材选型指南
  • 3步解锁百度网盘真实下载速度:告别龟速下载的技术秘籍
  • Java集合全解析:体系架构+分类详解+底层原理+使用场景
  • 01-认知篇-总览-HybridCLR是什么
  • 基于大语言模型的GitHub PR描述自动生成工具设计与实践
  • 微信聊天记录误删别慌!官方恢复方法实操指南
  • 安全攻防 - 03 TLCP 握手:双证书、密码套件与常见术语
  • 用Xilinx Artix-7 FPGA驱动TDC-GPX2:一个完整的状态机SPI控制模块实现
  • 学生党免费降AI工具实测:靠谱降重降AI首选推荐
  • 2026年昭通市本地上门黄金回收门店指南 彩金+铂金+金条+白银回收门店联系方式推荐 - 大熊猫898989
  • 三步实现百度网盘高速下载:告别龟速,拥抱全速时代
  • 百度网盘提取码一键查询:3步告别资源获取烦恼
  • 别再盲选大模型了!DeepSeek-V2/V3/R1在中文长文本、代码生成、数学推理三类场景的TOP-1准确率差距高达23.6%,你用对版本了吗?
  • bili2text终极指南:三分钟将B站视频变文字稿的免费神器
  • BepInEx插件框架:让每个玩家都能成为游戏改造师
  • 2026年岳阳市正规上门黄金白银回收品牌门店名录 K金+铂金+金条+银条回收门店联系方式推荐+指南 - 盛世金银回收
  • 2026年肇庆市本地上门黄金回收门店指南 彩金+铂金+金条+白银回收门店联系方式推荐 - 大熊猫898989
  • IDA Pro花指令清除三法:字节匹配、CFG裁剪与语义替换
  • 2026 SSH工具怎么选:多台 VPS 管理时,什么类型更省心?
  • 智能体+RAG+规划:构建AI节日助手的架构设计与工程实践
  • 三维针刺材料多尺度力学仿真复现