首页 > 系统相关 >Linux驱动开发(I2C系统的重要结构体)

Linux驱动开发(I2C系统的重要结构体)

时间:2023-06-08 11:03:40浏览次数:56  
标签:i2c struct int adapter Linux 驱动 I2C 设备

@TOC


前言

本篇文章来讲解I2C系统的重要结构体,了解这些结构体对于编写I2C驱动来说是至关重要的,所以要想编写好一个I2C驱动程序那么就必须先了解这些结构体。

一、I2C硬件框架

这里使用百问网的一张图片来讲解:

Linux驱动开发(I2C系统的重要结构体)_#define

一个芯片中可以有多个I2C控制器,并且一个I2C控制器可以控制多个设备。那么在对应的驱动中I2C控制器和这些设备还有传输的消息都是用什么来表示的呢?

在Linux内核中:使用i2c_adapter这个结构体来代表一个I2C控制器。传输的消息使用i2c_msg结构体表示。设备使用i2c_client结构体表示。

二、i2c_adapter

i2c_adapter结构体:

struct i2c_adapter {
	struct module *owner;
	unsigned int class;		  /* classes to allow probing for */
	const struct i2c_algorithm *algo; /* the algorithm to access the bus */
	void *algo_data;

	/* data fields that are valid for all devices	*/
	const struct i2c_lock_operations *lock_ops;
	struct rt_mutex bus_lock;
	struct rt_mutex mux_lock;

	int timeout;			/* in jiffies */
	int retries;
	struct device dev;		/* the adapter device */

	int nr;
	char name[48];
	struct completion dev_released;

	struct mutex userspace_clients_lock;
	struct list_head userspace_clients;

	struct i2c_bus_recovery_info *bus_recovery_info;
	const struct i2c_adapter_quirks *quirks;
};

在Linux内核中我们能找到这个结构体,下面我们来讲解一下其中比较重要的成员。

nr成员:这个成员变量代表的是第几个I2C控制器,因为在一个芯片中I2C控制器的数量肯定是不止一个的,所以需要有一个变量来标识具体是第几个I2C控制器。

const struct i2c_algorithm *algo

const struct i2c_algorithm *algo 是指向 I2C 访问算法的结构体指针,该指针指向一个常量类型的 struct i2c_algorithm 结构体,其中定义了 I2C 总线上的访问操作函数指针,包括了 master_xfer、smbus_xfer 以及 functionality 等。通过这些访问函数,可以实现对 I2C 总线上的传感器、EEPROM 和其他设备的读写操作。

在实现 I2C 设备驱动程序时,通常需要根据具体的 I2C 总线访问算法进行编程。而在适配器结构体 struct i2c_adapter 中,通过 algo 指针可以方便地获取到对应的 I2C 总线访问算法信息,从而实现 I2C 设备的访问。

algo结构体:

struct i2c_algorithm {
	/* If an adapter algorithm can't do I2C-level access, set master_xfer
	   to NULL. If an adapter algorithm can do SMBus access, set
	   smbus_xfer. If set to NULL, the SMBus protocol is simulated
	   using common I2C messages */
	/* master_xfer should return the number of messages successfully
	   processed, or a negative value on error */
	int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
			   int num);
	int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
			   unsigned short flags, char read_write,
			   u8 command, int size, union i2c_smbus_data *data);

	/* To determine what the adapter supports */
	u32 (*functionality) (struct i2c_adapter *);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
	int (*reg_slave)(struct i2c_client *client);
	int (*unreg_slave)(struct i2c_client *client);
#endif
};

三、i2c_client

i2c_client结构体:

struct i2c_client {
	unsigned short flags;		/* div., see below		*/
	unsigned short addr;		/* chip address - NOTE: 7bit	*/
					/* addresses are stored in the	*/
					/* _LOWER_ 7 bits		*/
	char name[I2C_NAME_SIZE];
	struct i2c_adapter *adapter;	/* the adapter we sit on	*/
	struct device dev;		/* the device structure		*/
	int irq;			/* irq issued by device		*/
	struct list_head detected;
#if IS_ENABLED(CONFIG_I2C_SLAVE)
	i2c_slave_cb_t slave_cb;	/* callback for slave mode	*/
#endif
};

在 Linux 内核中,i2c_client 是 I2C 从设备的设备结构体,表示连接到 I2C 总线上的一个 I2C 从设备。它包含了该从设备的一些信息,例如设备地址、从设备驱动程序、从设备所在的 I2C 适配器等。

重要的成员:unsigned short addr:I2C 从设备的地址,存储在 7 位中。注意,这个地址不包括 I2C 地址的读写位,即 7 位地址用于标识从设备的身份。

struct i2c_adapter *adapter:指向从设备所连接的 I2C 适配器的指针。有了适配器信息,可以通过适配器的接口访问连接的从设备。

四、i2c_msg

i2c_msg结构体:

struct i2c_msg {
	__u16 addr;	/* slave address			*/
	__u16 flags;
#define I2C_M_RD		0x0001	/* read data, from slave to master */
					/* I2C_M_RD is guaranteed to be 0x0001! */
#define I2C_M_TEN		0x0010	/* this is a ten bit chip address */
#define I2C_M_RECV_LEN		0x0400	/* length will be first received byte */
#define I2C_M_NO_RD_ACK		0x0800	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK	0x1000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR	0x2000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NOSTART		0x4000	/* if I2C_FUNC_NOSTART */
#define I2C_M_STOP		0x8000	/* if I2C_FUNC_PROTOCOL_MANGLING */
	__u16 len;		/* msg length				*/
	__u8 *buf;		/* pointer to msg data			*/
};

struct i2c_msg 是 Linux 内核中 I2C/SMBus 消息的结构体,用于描述 I2C 总线上的一条消息。

重要的成员:

__u16 addr:I2C 从设备的地址,用于指定消息要发送到哪个从设备上。

__u16 flags:消息的标志参数,包括多种不同的位掩码:

通过这些参数,struct i2c_msg 结构体可以描述出 I2C 总线上的一条具体的消息,并通过设备驱动程序对该消息进行操作。

总结

有了这些重要结构体的知识我们就可以开始编写驱动程序了。

标签:i2c,struct,int,adapter,Linux,驱动,I2C,设备
From: https://blog.51cto.com/u_16153875/6438337

相关文章

  • linux配置虚拟ip实现主备双击高可用
    linux配置虚拟ip实现主备双击高可用背景:设置了虚拟ip指向两台服务器,但是没有配置虚拟网卡,虚拟ip10.249.134.227分别指向10.249.134.193,10.249.134.194,使用HaVip结合keepalived实现主备双机高可用转自HaVip结合keepalived实现主备双机高可用(aliyun.com)1.执行以下命令,主......
  • 为什么程序员相互用linux
    程序员相互使用Linux主要因为以下原因:1、开放源代码:Linux是开源的操作系统,可以自由地获取、修改和分发,这意味着任何开发人员都可以对其进行自定义设置和调整,而且还可以以相同或类似方式与其他人共享和协作工作。2、适合开发环境:Linux提供了丰富的命令行工具、新增工具和脚......
  • linux设置开机启动nginx、java
    linux设置开机启动nginx、java1、开机启动nginx我是用yum安装的nginx,nginx启动程序在/usr/sbin/nginx#修改/etc/rc.d/rc.local文件#添加/usr/sbin/nginx#添加后执行chmod+x/etc/rc.d/rc.local#如果重启后没有自启成功,查看/var/log/boot.log日志中是否有错误#!/bin/bash#......
  • linux下安装erlang
    1.安装依赖环境:1)安装GCCGCC-C++Openssl等模块,安装过就不需要安装了yum-yinstallmakegccgcc-c++kernel-develm4ncurses-developenssl-devel 2)安装ncursesyum-yinstallncurses-devel2.下载erlang:官网下载:http://erlang.org/download/或者直接下载[root@manmanda20......
  • VK2C21A/B/C/D低功耗LCD液晶段码驱动IC适用于水电气表/工控仪表类产品
    产品品牌:永嘉微电/VINKA产品型号:VK2C21A/B/C/D封装形式:SOP28/24/20、NSOP16、SSOP24(新封装:0.635脚距)产品年份:新年份概述:VK2C21是一个点阵式存储映射的LCD驱动器,可支持最大80点(20SEGx4COM)或者最大128点(16SEGx8COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也......
  • linux环境下jenkins搭建过程+Flutter打包集成
    安装jenkins配置java环境,androidsdk环境,flutter环境配置flutter自动打包脚本安装jenkins1.下载jenkins安装包首先下载jenkins安装包,官网下载地址:https://www.jenkins.io/download/,如果嫌太慢可以使用镜像下载:http://mirrors.jenkins-ci.org/解压并安装jenkinsrpm-......
  • 驱动开发:内核封装WFP防火墙入门
    WFP框架是微软推出来替代TDIHOOK传输层驱动接口网络通信的方案,其默认被设计为分层结构,该框架分别提供了用户态与内核态相同的AIP函数,在两种模式下均可以开发防火墙产品,以下代码我实现了一个简单的驱动过滤防火墙。WFP框架分为两大层次模块,用户态基础过滤引擎BFE(BaseFiltering......
  • 一分钟学一个 Linux 命令 - mv 和 cp
    前言大家好,我是god23bin。欢迎来到《一分钟学一个Linux命令》系列,今天需要你花两分钟时间来学习下,因为今天要讲的是两个命令,mv和cp命令。mv什么是mv命令?mv是英文单词move的缩写,顾名思义,可以用来移动东西,那么移动什么呢?答案就是可以移动文件或目录,将其从一个位置移到......
  • 2023.6.7 Linux系统日志管理
    01Linux系统⽇志管理系统⽇志架构概述syslog⽇志审查Journal⽇志审查Journal⽇志持久化⽇志轮询logrotate系统⽇志架构概述在rhel7系统中有两个⽇志服务,分别是传统的rsyslog和新添加的systemd-journalsystemd-journald是⼀个改进型的⽇志管理服务,可以收集来⾃内核......
  • MX Linux 23现在可以进行基于Debian 12 “Bookworm “的测试
    MX Linux开发者今天宣布,即将发布的MXLinux23“Libretto“的测试版可供公众测试。基于即将推出的Debian12“Bookworm“操作系统系列,MXLinux23采用了长期支持的Linux6.1LTS内核系列,使用sysVinit作为默认的初始系统,而不是系统,并有三个版本的Xfce4.18、KDEPlasma......