# virt_i2c **Repository Path**: wangbin224/virt_i2c ## Basic Information - **Project Name**: virt_i2c - **Description**: 虚拟i2c控制器驱动实例,可通过该实例进行linux下i2c子系统下i2c driver的学习 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 9 - **Created**: 2020-11-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # virt_i2c #### 介绍 虚拟i2c控制器驱动实例,可通过该实例进行linux下i2c子系统下i2c driver的学习 #### 软件架构 软件架构说明 在之前分析mdio子系统时,我们提到系统实现了fixed-mii_bus,从而为mac2mac提供虚拟mii_bus和虚拟phy_device,实现对虚拟phy_device的模拟。受此启发,我打算实现一个虚拟的i2c adapter,并基于该i2c adapter挂载一个虚拟的i2c device,并基于虚拟i2c adapter、i2c device搭建一个虚拟的i2c controller即i2c设备,以便为需要学习linux i2c驱动模型的童鞋可以方便的练习i2c device driver。 本篇文章的目的如下: 1. 当你没有开发板,又想学习i2c驱动模型,并想进行linux i2c device driver的练习时; 2. 当你完成了i2c device driver,在硬件开发板出来之前进行i2c device driver的验证时。 若对linux i2c驱动模型不熟悉时,可参考我之前写的文章: 《https://www.toutiao.com/i6755852803836477955/》 一、 virtual i2c adapter的实现分析 我们知道linux系统针对i2c controller抽象了数据结构i2c_adapter,因此我们在进行虚拟i2c controller的实现,也就是实现一个i2c_adapter类型的变量,并将其注册至i2c子系统中。 数据结构定义及关联 因我们需要模拟的是一个虚拟的i2c controller,以及多个依附于虚拟i2c controller的i2c device,所以我们定义而定数据结构包含i2c controller、i2c device两部分的内容。 我们定义了数据结构体virtual_i2c_bus_t,该结构体中包含了i2c_adapter类型的成员和virtual_i2c_adapter_info_t类型的成员,其中: 1. i2c_adapter类型的成员中,我们需要实现i2c_adapter->algo,因我们抽象的是i2c ,因此我们需要实现master_xfer接口和functionality接口; 而virtual_i2c_adapter_info_t结构体则主要包含了一个双向链表头list,和一个互斥量。list链表用于将所有虚拟i2c设备连接在一起,虚拟i2c设备对应的数据结构为virtual_i2c_dev_info_t,该数据结构包括node节点、virtual i2c device的地址addr,virtual i2c device对应的寄存器等