IIC子系统之控制器(Adapter)驱动开发实例
创建一条虚拟的 I2C 总线定义总线怎么收发数据写i2cset -f -y 3 0x50 0 0x55 ( 往第三条I2C总线的0x50地址写入0x55)读i2cget -f -y 3 0x50 0#include linux/completion.h #include linux/debugfs.h #include linux/delay.h #include linux/gpio/consumer.h #include linux/i2c-algo-bit.h #include linux/i2c.h #include linux/init.h #include linux/interrupt.h #include linux/module.h #include linux/of.h #include linux/platform_data/i2c-gpio.h #include linux/platform_device.h #include linux/slab.h // 先定义一个i2c_adapter的全局变量后面在probe函数中分配和注册这个i2c_adapter static struct i2c_adapter *g_adapter; // 模拟一个eeprom设备地址为0x50容量为512字节 static unsigned char eeprom_buffer[512]; static int eeprom_cur_addr 0; static void eeprom_emulate_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) { int i; if (msg-flags I2C_M_RD) { // 读操作从eeprom_buffer中读取数据到msg-buf中 for (i 0; i msg-len; i) { msg-buf[i] eeprom_buffer[eeprom_cur_addr]; if (eeprom_cur_addr 512) eeprom_cur_addr 0; } } else { // 写操作从msg-buf中写数据到eeprom_buffer中 if (msg-len 1) { eeprom_cur_addr msg-buf[0]; for (i 1; i msg-len; i) { eeprom_buffer[eeprom_cur_addr] msg-buf[i]; if (eeprom_cur_addr 512) eeprom_cur_addr 0; } } } } static int i2c_bus_virtual_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) { int i; // emulate eeprom , addr 0x50 for (i 0; i num; i) { if (msgs[i].addr 0x50) // 对输入的指令解析若有0x50则进行EEPROM的读写模拟 { eeprom_emulate_xfer(i2c_adap, msgs[i]); } else { i -EIO; break; } } return i; } static u32 i2c_bus_virtual_func(struct i2c_adapter *adap) { return I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL | I2C_FUNC_PROTOCOL_MANGLING; } // I2C虚拟总线算法 const struct i2c_algorithm i2c_bus_virtual_algo { .master_xfer i2c_bus_virtual_master_xfer, .functionality i2c_bus_virtual_func, }; // 3. probe函数 static int i2c_bus_virtual_probe(struct platform_device *pdev) { /* get info from device tree, to set i2c_adapter/hardware */ /* alloc, set, register i2c_adapter */ /* 分配设置注册一个 i2c_adapter*/ g_adapter kzalloc(sizeof(*g_adapter), GFP_KERNEL); g_adapter-owner THIS_MODULE; g_adapter-class I2C_CLASS_HWMON | I2C_CLASS_SPD; g_adapter-nr -1; // -1表示让系统自动分配 snprintf(g_adapter-name, sizeof(g_adapter-name), i2c-bus-virtual); g_adapter-algo i2c_bus_virtual_algo; // 编写这个algorithm // 注册这个i2c_adapter到i2c核心注册成功后这个i2c_adapter就可以被用户空间访问 i2c_add_adapter(g_adapter); // i2c_add_numbered_adapter(g_adapter); return 0; } // remove函数 static int i2c_bus_virtual_remove(struct platform_device *pdev) { // 清除 adapter i2c_del_adapter(g_adapter); return 0; } // 和设备树中的 compatible 匹配即compatible 100ask,i2c-bus-virtual一旦匹配成功就调用platform_driver中的probe函数 static const struct of_device_id i2c_bus_virtual_dt_ids[] { { .compatible 100ask,i2c-bus-virtual, }, { /* sentinel */ } }; // 2. platform_driver结构体 static struct platform_driver i2c_bus_virtual_driver { .driver { .name i2c-gpio, .of_match_table of_match_ptr(i2c_bus_virtual_dt_ids), }, .probe i2c_bus_virtual_probe, .remove i2c_bus_virtual_remove, }; // 入口函数-和出口函数对应 static int __init i2c_bus_virtual_init(void) { int ret; ret platform_driver_register(i2c_bus_virtual_driver); // 注册一个platform_driver if (ret) printk(KERN_ERR i2c-gpio: probe failed: %d\n, ret); return ret; } module_init(i2c_bus_virtual_init); // 出口函数 static void __exit i2c_bus_virtual_exit(void) { platform_driver_unregister(i2c_bus_virtual_driver); } module_exit(i2c_bus_virtual_exit); MODULE_AUTHOR(www.100ask.net); MODULE_LICENSE(GPL);

相关新闻

5分钟从零开始:小熊猫Dev-C++让C++编程学习变得如此简单

5分钟从零开始:小熊猫Dev-C++让C++编程学习变得如此简单

5分钟从零开始:小熊猫Dev-C让C编程学习变得如此简单 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否曾因为复杂的开发环境配置而放弃学习C编程?是否在安装编译器、配置环境变…

2026/8/13 13:48:39 阅读更多 →
关于图论【最短路径之Floyd 算法|卡码网97.小明逛公园的思考】

关于图论【最短路径之Floyd 算法|卡码网97.小明逛公园的思考】

目录 一、本题题目 二、本题代码 三、关键思路 四、注意事项 一、本题题目 二、本题代码 // 展示完整代码 三、关键思路 1、Floyd和动态规划结合 2、三维数组,dp[i][j][k] 3、遍历顺序,先遍历k 四、注意事项 1、用邻接矩阵存无向图的时候要注意s…

2026/8/13 13:48:39 阅读更多 →
C++ std::function 解读

C++ std::function 解读

前言:std::function大家用过吗?它是C11引入的一个新特性。今天,我们从原理、应用实例等方面对std::fucntion进行深度剖析。 目录 一、基本定义与使用 二、底层机制 三、典型应用场景 一、基本定义与使用 std::function是一种多态函数包装…

2026/8/13 13:48:39 阅读更多 →

最新新闻

大模型发展瓶颈深度解析:算力、数据、对齐与系统工程

大模型发展瓶颈深度解析:算力、数据、对齐与系统工程

1. 从狂热到冷静:大模型发展进入深水区 最近和几个圈内的老朋友聊天,话题总绕不开大模型。大家的感觉出奇地一致:前两年那种“一天一个新模型,一周一个新突破”的狂热劲儿过去了,取而代之的是一种更审慎、更务实的讨论…

2026/8/13 14:42:30 阅读更多 →
pandoc/lua-filters与学术出版:如何利用过滤器实现参考文献管理与格式标准化

pandoc/lua-filters与学术出版:如何利用过滤器实现参考文献管理与格式标准化

pandoc/lua-filters与学术出版:如何利用过滤器实现参考文献管理与格式标准化 【免费下载链接】lua-filters A collection of lua filters for pandoc 项目地址: https://gitcode.com/gh_mirrors/lu/lua-filters 在学术写作中,参考文献管理和格式标…

2026/8/13 14:42:30 阅读更多 →
5分钟让Alto Clef跑起来:Minecraft机器人模组上手、命令与避坑全攻略

5分钟让Alto Clef跑起来:Minecraft机器人模组上手、命令与避坑全攻略

5分钟让Alto Clef跑起来:Minecraft机器人模组上手、命令与避坑全攻略 【免费下载链接】altoclef Plays block game 项目地址: https://gitcode.com/gh_mirrors/al/altoclef Alto Clef(altoclef)是一个基于 Java 的 Minecraft 客户端机…

2026/8/13 14:42:30 阅读更多 →
x-cmd终极指南:5分钟解决Git for Windows安装难题

x-cmd终极指南:5分钟解决Git for Windows安装难题

x-cmd终极指南:5分钟解决Git for Windows安装难题 【免费下载链接】x-cmd Posix Shell 工具库 项目地址: https://gitcode.com/x-cmd/x-cmd x-cmd是一个强大的POSIX Shell工具库,专为现代命令行环境设计。在Windows系统上部署x-cmd时,…

2026/8/13 14:42:30 阅读更多 →
Krokiet:12款工具彻底清理电脑垃圾,拯救你的硬盘空间

Krokiet:12款工具彻底清理电脑垃圾,拯救你的硬盘空间

Krokiet:12款工具彻底清理电脑垃圾,拯救你的硬盘空间 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 还在为电脑存储空间不…

2026/8/13 14:42:30 阅读更多 →
ROS2 TF2坐标变换机制与实战应用解析

ROS2 TF2坐标变换机制与实战应用解析

1. ROS2 TF2坐标变换核心机制解析 在机器人系统中,坐标变换(Transform)是描述不同坐标系之间位置和姿态关系的基础工具。ROS2中的TF2库作为坐标变换的核心组件,其动态发布、静态发布、缓存机制和监听功能构成了完整的坐标管理体系…

2026/8/13 14:41:29 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →