Linux内核基础 -- I2C 控制器驱动开发指南

2024-05-16 13:12

本文主要是介绍Linux内核基础 -- I2C 控制器驱动开发指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux Kernel I2C 控制器驱动开发指南

本文档旨在指导开发者如何在 Linux 内核中编写和注册 I2C 控制器驱动。

1. I2C 控制器驱动代码位置

在 Linux 内核中,I2C 控制器的驱动代码通常位于以下路径:

drivers/i2c/busses/

在这个目录中,每个 I2C 控制器的驱动通常都有一个独立的 C 文件。例如,i2c-bcm2835.ci2c-imx.c 等。

2. 将 I2C 控制器驱动注册进 Linux 框架

要将 I2C 控制器驱动注册进 Linux 框架,通常需要完成以下步骤:

2.1 定义并初始化 I2C 控制器的 i2c_adapter 结构体

static struct i2c_adapter my_i2c_adapter = {.owner = THIS_MODULE,.class = I2C_CLASS_HWMON,.algo = &my_i2c_algorithm,.dev.parent = &pdev->dev,.nr = my_i2c_bus_number,.name = "My I2C Adapter",
};

2.2 实现 I2C 控制器的操作函数

这些操作函数包括 master_xferfunctionality 等,通常在 i2c_algorithm 结构体中定义。

static struct i2c_algorithm my_i2c_algorithm = {.master_xfer = my_i2c_master_xfer,.functionality = my_i2c_functionality,
};

2.3 注册 I2C 适配器

在驱动的 probe 函数中调用 i2c_add_adapter 将 I2C 适配器注册到 I2C 核心框架中。

static int my_i2c_probe(struct platform_device *pdev)
{// 设备初始化代码...// 注册 I2C 适配器ret = i2c_add_adapter(&my_i2c_adapter);if (ret)return ret;...
}

2.4 注销 I2C 适配器

在驱动的 remove 函数中调用 i2c_del_adapter 注销 I2C 适配器。

static int my_i2c_remove(struct platform_device *pdev)
{i2c_del_adapter(&my_i2c_adapter);...
}

2.5 定义平台驱动结构体

包含 proberemove 函数,并通过 module_platform_driver 宏进行注册。

static struct platform_driver my_i2c_driver = {.probe = my_i2c_probe,.remove = my_i2c_remove,.driver = {.name = "my_i2c",.of_match_table = of_match_ptr(my_i2c_dt_ids),},
};module_platform_driver(my_i2c_driver);

3. my_i2c_functionality 函数的作用

my_i2c_functionality 函数在 I2C 控制器驱动中用于返回该 I2C 控制器所支持的功能。这些功能定义在 I2C 核心框架中,并以一组标志(flags)的形式表示。这些标志可以是对 I2C 核心框架提供的一些标准功能的支持,比如 10-bit 地址模式、多主模式等。

3.1 常见的功能标志

以下是一些常见的 I2C 功能标志,它们定义在 include/linux/i2c.h 文件中:

  • I2C_FUNC_I2C: 标准 I2C-level 功能(读写传输)。
  • I2C_FUNC_10BIT_ADDR: 支持 10-bit 地址。
  • I2C_FUNC_PROTOCOL_MANGLING: 支持协议转换。
  • I2C_FUNC_SMBUS_EMUL: 支持 SMBus 仿真。
  • I2C_FUNC_SMBUS_QUICK: 支持 SMBus Quick 命令。
  • I2C_FUNC_SMBUS_READ_BYTE: 支持 SMBus 读字节命令。
  • I2C_FUNC_SMBUS_WRITE_BYTE: 支持 SMBus 写字节命令。
  • I2C_FUNC_SMBUS_READ_BYTE_DATA: 支持 SMBus 读字节数据命令。
  • I2C_FUNC_SMBUS_WRITE_BYTE_DATA: 支持 SMBus 写字节数据命令。
  • I2C_FUNC_SMBUS_READ_WORD_DATA: 支持 SMBus 读字数据命令。
  • I2C_FUNC_SMBUS_WRITE_WORD_DATA: 支持 SMBus 写字数据命令。
  • I2C_FUNC_SMBUS_BLOCK_DATA: 支持 SMBus 块数据传输。

3.2 示例

假设我们的 I2C 控制器支持标准 I2C 功能和 SMBus 仿真功能,那么 my_i2c_functionality 函数可以这样实现:

static u32 my_i2c_functionality(struct i2c_adapter *adap)
{return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}

这个函数返回一个 32-bit 的整数,其中每个 bit 表示一个支持的功能。I2C 核心框架调用这个函数以了解该 I2C 控制器的能力,然后可以相应地执行不同的操作。

这篇关于Linux内核基础 -- I2C 控制器驱动开发指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995006

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文