Linux 驱动 | 高级驱动 | I2C子系统

Linux 驱动 | 高级驱动 | I2C子系统

学习笔记

主要内容:
1,i2c协议和时序
2,i2c子系统软件框架
3,i2c从设备驱动编写方式–不考虑具体的硬件
4,mpu6050硬件连接,陀螺仪和加速度工作原理,它们的应用
5,mpu6050数据和获取
6,mpu6050从设备驱动编写

I2C驱动开发:
I2C从设备驱动开发
硬件芯片:从设备
cmos camera
ts :电容触摸屏
gsenor: 重力传感器
eeprom: 存储设备
HDMI:高清输出接口

2,i2c子系统软件框架

应用
------------------------------------------
i2c driver:从设备驱动层需要和应用层进行交互封包数据,不知道数据是如何写入到硬件------------------------------------------
i2c 核心层:维护i2c 总线,包括i2c driver, i2c client链表
drivers/i2c/i2c-core.c
---------------------------------------------------
i2c adapter层:i2c控制层,初始化i2c控制器完成将数据写入或读取-从设备硬件不知道数据具体是什么,但是知道如何操作从设备
drivers/i2c/busses/i2c-s3c2410.c
================================================================
确保i2c core和i2c adatper层必须编译进内核:make menuconfigDevice Drivers  --->-*- I2C support  ---> //编译i2c-core.cI2C Hardware Bus support  ---><*> S3C2410 I2C Driver // i2c-s3c2410.c/sys/bus/i2c/
/sys/bus/i2c/devices/i2c-0 [root@farsight i2c-0]# cat names3c2410-i2c

3, I2c子系统中涉及到的设备树文件:
i2c控制器地址
0x1386_0000,
0x1387_0000,
0x1388_0000,
0x1389_0000,
0x138A_0000,
0x138B_0000, ------ MPU6050
0x138C_0000,
0x138D_0000,
0x138E_0000

MPU6050: 从设备地址是0x68soc GPB_3---	I2C_SCL5GPB_3---  I2C_SDA5GPX3_3--- GYRO_INT在内核中默认就有了i2c0--13860000.i2c模板:控制器对应的设备树:arch/arm/boot/dts/exynos4.dtsii2c_0: i2c@13860000 {#address-cells = <1>;#size-cells = <0>;compatible = "samsung,s3c2440-i2c";reg = <0x13860000 0x100>;interrupts = <0 58 0>;clocks = <&clock 317>;clock-names = "i2c";pinctrl-names = "default";pinctrl-0 = <&i2c0_bus>;status = "disabled";};i2c_5: i2c@138B0000 {#address-cells = <1>;#size-cells = <0>;compatible = "samsung,s3c2440-i2c";reg = <0x138B0000 0x100>;interrupts = <0 63 0>;clocks = <&clock 322>;clock-names = "i2c";status = "disabled";};描述从设备信息的设备树的模板arch/arm/boot/dts/exynos4412-fs4412.dtsi2c@13860000 {#address-cells = <1>;#size-cells = <0>;samsung,i2c-sda-delay = <100>;samsung,i2c-max-bus-freq = <20000>;pinctrl-0 = <&i2c0_bus>;pinctrl-names = "default";status = "okay";s5m8767_pmic@66 {compatible = "samsung,s5m8767-pmic";reg = <0x66>;}}新增加i2c从设备,arch/arm/boot/dts/exynos4412-fs4412.dts增加i2c5控制和它包含了设备设备i2c@138B0000 {/*i2c adapter5信息*/#address-cells = <1>;#size-cells = <0>;samsung,i2c-sda-delay = <100>;samsung,i2c-max-bus-freq = <20000>;pinctrl-0 = <&i2c5_bus>;pinctrl-names = "default";status = "okay";mpu6050@68 { /*i2c client信息*/compatible = "invensense,mpu6050";reg = <0x68>;};};保存后make dtbscp -raf arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/

4,i2c driver驱动的编写:
a, 添加i2c client的信息,必须包含在控制器对应的节点中
b,直接编写i2c driver
1,构建i2c driver,并注册到i2c总线
2,实现probe:
|
申请设备号,实现fops
创建设备文件
通过i2c的接口去初始化i2c从设备

几个常用的对象:
struct i2c_driver {//表示是一个从设备的驱动对象int (*probe)(struct i2c_client *, const struct i2c_device_id *);int (*remove)(struct i2c_client *);struct device_driver driver; //继承了父类|const struct of_device_id	*of_match_table;const struct i2c_device_id *id_table;//用于做比对,非设备树的情况
}
注册和注销int i2c_add_driver( struct i2c_driver *driver);void i2c_del_driver(struct i2c_driver *);struct i2c_client {//描述一个从设备的信息,不需要在代码中创建,因为是由i2c adapter帮我们创建unsigned short addr;		//从设备地址,来自于设备树中<reg>char name[I2C_NAME_SIZE]; //用于和i2c driver进行匹配,来自于设备树中compatiblestruct i2c_adapter *adapter;//指向当前从设备所存在的i2c adapterstruct device dev;		// 继承了父类
};
创建i2c client的函数
struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)struct i2c_adapter {//描述一个i2c控制器,也不是我们要构建,原厂的代码会帮我们构建const struct i2c_algorithm *algo; //算法|int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);struct device dev; //继承了父类,也会被加入到i2c busint nr; //编号}
注册和注销:
int i2c_add_adapter(struct i2c_adapter * adapter);
void i2c_del_adapter(struct i2c_adapter * adap);struct i2c_msg {//描述一个从设备要发送的数据的数据包__u16 addr;	 //从设备地址,发送给那个从设备__u16 flags; //读1还是写0__u16 len;		//发送数据的长度__u8 *buf;		//指向数据的指针
};
//写从设备
int i2c_master_send(const struct i2c_client * client,const char * buf,int count)
//读从设备
int i2c_master_recv(const struct i2c_client * client,char * buf,int count)
以上两个函数都调用了:
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

5,陀螺仪和加速度工作原理,它们的应用
陀螺仪的作用:
原理:
小时候玩过陀螺,如果给它一定的旋转速度,陀螺会竖立旋转起来而不会倒,
主要因为高速旋转有抗拒方向改变的趋向

		陀螺仪就是内部的转子高速旋转,形成一个固定的初始化的参考平面,这样就可以通过测量初始的参考平面偏差计算出物体的旋转情况陀螺仪的强项在于测量设备自身的旋转运动陀螺仪的产生:1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),由于惯性作用它的旋转轴永远指向一固定方向,他用希腊字gyro(旋转)和skopein(看)两字合为gyro scopei一字来命名这种仪表陀螺仪的基本部件:(1) 陀螺转子,转子装在一支架内(2)内、外环,它是使陀螺自转轴获得所需角转动自由度的结构内环可环绕平面两轴作自由运动在内环架外加上一外环架,可以环绕平面做三轴作自由运动(3) 附件(是指力矩马达、信号传感器等)。陀螺仪的数据获取:		XYZ分别代表设备围绕XYZ三个轴旋转的角速度,陀螺仪可以捕捉很微小的运动轨迹变化,因此可以做高分辨率和快速反应的旋转检测,但不能测量当前的运行方向应用:1,陀螺仪用于飞行体运动的自动控制系统中,作为水平、垂直、俯仰、航向和角速度传感器2,手机上的摄像头配合使用,比如防抖3,各类手机游戏的传感器,包括一些第一视角类射击游戏,陀螺仪完整监测游戏者手的位移手机中的陀螺仪最早被iphone4应用,所以被大家所熟知4,导航,手机配合GPS,导航能力已经可以达到专用的gps导航仪重力加速度:原理:重力施加在物体上,使它产生一个加速度,重力大小和此物体的质量成正比物体在不同的运行中,会产生不同的重力,从而可以测量出物体的运动情况重力加速度的数据获取:加速度测量传感器有x、y、z三轴,注意在手机上屏幕的坐标,以左上角作为原点的,而且Y向下。注意区分这两个不同的坐标系。加速传感器的单位是加速度m/s2。如果手机平放好,x,y在位置为0,而z轴方向加速度=当前z方向加速度-g。由于g(重力加速度)垂直向下,则g=-9.81m/s2,即z轴 a=0-(-9.81)=9.81m/s2应用:1,图像自动翻转2,游戏控制3,计步器功能

6,寄存器:
#define SMPLRT_DIV 0x19 //采样频率寄存器-25 典型值:0x07(125Hz)
//寄存器集合里的数据根据采样频率更新
#define CONFIG 0x1A //配置寄存器-26-典型值:0x06(5Hz)
//DLPF is disabled(DLPF_CFG=0 or 7)
#define GYRO_CONFIG 0x1B//陀螺仪配置-27,可以配置自检和满量程范围
//典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速度配置-28 可以配置自检和满量程范围及高通滤波频率
//典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B //59-65,加速度计测量值 XOUT_H
#define ACCEL_XOUT_L 0x3C // XOUT_L
#define ACCEL_YOUT_H 0x3D //YOUT_H
#define ACCEL_YOUT_L 0x3E //YOUT_L
#define ACCEL_ZOUT_H 0x3F //ZOUT_H
#define ACCEL_ZOUT_L 0x40 //ZOUT_L—64
#define TEMP_OUT_H 0x41 //温度测量值–65
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43 //陀螺仪值–67,采样频率(由寄存器 25 定义)写入到这些寄存器
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48 //陀螺仪值–72
#define PWR_MGMT_1 0x6B //电源管理 典型值:0x00(正常启用)

7, ioctl: 给驱动发送不同指令
应用程序:
ioctl(fd, cmd, args);
========================================
驱动中:xxx_ioctl()
{
switch(cmd){

		}
}如何定义命令:1, 直接定义一个数字#define IOC_GET_ACCEL  0x99992, 通过系统的接口_IO(x,y)_IOR(x,y,z)_IOW(x,y,z)参数1:表示magic,字符参数2:区分不同命令,整数 参数3:传给驱动数据类型

8,mpu6050的数据
陀螺仪可测范围为 欧拉角格式±250,±500,±1000,±2000°/秒(dps) ,加速度计可测范围为±2,±4,±8,±16g
加速度读取的值为:
AFS_SEL Full scale rang LSB Sensitivy
0 ±2g -----------------------16384 LSB/g
1 ±4g -----------------------8192 LSB/g
2 ±8g -----------------------4096 LSB/g
3 ±16g------------------------2048 LSB/g

	温度值:C = (TEMP_OUT Register Value )/340 + 36.53陀螺仪值:FS_SEL      Full scale rang                  LSB  Sensitivy0				+-250 度/s ------------------131 LSB 度/s1				+-500 度/s ------------------65.5 LSB 度/s2				+-1000 度/s -----------------32.8 LSB 度/s3				+-2000 度/s ------------------16.4 LSB 度/s

代码

驱动代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_gpio.h>
#include <linux/i2c.h>#include <asm/io.h>
#include <asm/uaccess.h>#include "mpu6050.h"#define SMPLRT_DIV		0x19 //采样频率寄存器-25 典型值:0x07(125Hz)//寄存器集合里的数据根据采样频率更新
#define CONFIG			0x1A	//配置寄存器-26-典型值:0x06(5Hz)//DLPF is disabled(DLPF_CFG=0 or 7)
#define GYRO_CONFIG		0x1B//陀螺仪配置-27,可以配置自检和满量程范围//典型值:0x18(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#QT(本地音乐播放器)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;之前做的音乐播放器只做了一个界面&#xff0c;是因为跟的课程发现到后面需要付费&#xff0c;并且WINGW6.2.0运行QMediaPlayer时无法运行&#xff0c;会崩溃&#xff0c;现在退一步用WINGW5.12.2做一个本地音乐播放器 3.记录&am…

pyside6 pytq PyDracula QVideoWidget视频只有画面没有声音

解决方案&#xff1a; 先不使用框架&#xff0c;纯pyside6代码&#xff0c;如果添加视频有画面有声音&#xff0c;那可以排除是硬件问题&#xff0c;如果没有画面只有声音&#xff0c;可能是视频解码器无法解码&#xff0c;换个格式的视频文件如果只有使用PyDracula 出问题&am…

[论文笔记] Open-sora 2、视频数据集介绍 MSR-VTT

MSR-VTT COVE - Computer Vision Exchange 论文参考:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/cvpr16.msr-vtt.tmei_-1.pdf 用于视频理解的大规模视频基准,特别是将视频翻译为文本的新兴任务。这是通过从商业视频搜索引擎收集 257 个热门查询…

Rust多线程访问数据,推荐使用mutex还是channel?

在Rust中&#xff0c;选择使用互斥锁&#xff08;mutex&#xff09;还是通道&#xff08;channel&#xff09;来进行多线程间的数据访问&#xff0c;主要取决于你的具体需求和数据共享的模式。 互斥锁&#xff08;Mutex&#xff09; 互斥锁是一种同步原语&#xff0c;用于保护…

小蓝的钥匙(蓝桥杯错排)

现在有28个小朋友&#xff0c;每个人手上有一把钥匙&#xff0c;每一个钥匙都只能打开自己的房间门&#xff0c;现在将所有钥匙都收上来&#xff0c;然后再随机打乱分给每个小朋友&#xff0c;也就是有28&#xff01;的分法&#xff0c;请问现在其中14个小朋友的钥匙能恰好打开…

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数&#xff08;命令行、配件文件&#xff09;1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动&#xff0c;以及配置密码文件 1.2 查询表的相关参数&#xff0c;以及表空间管理 2、Mysql高级优化&#xff08;SQL&…

Android中显式Intent和隐式Intent的区别

1、intent的中文名 称是意图&#xff0c;Intent是各个组件之间信息沟通的桥梁&#xff0c; 既能在Activity之间沟通&#xff0c;又能在Activity与Service之间沟通&#xff0c;也能在Activity与Broadcast之间沟通 **intent组成元素的列表说明**2、显式Intent&#xff0c;直接指定…

编译支持国密的抓包工具 WireShark

目录 前言WireShark支持国密的 WireShark小结前言 在上一篇文章支持国密的 Web 服务器中,我们搭建了支持国密的 Web 服务器,但是,我们使用 360 安全浏览器去访问,却出现了错误: 是我们的 Web 服务器没有配置好?在这里插入图片描述还是 360 安全浏览器不支持国密?还是两…

C++面试宝典一部分

今天整理书籍资料时&#xff0c;发现多年前打印的面试资料&#xff0c;拍照分享给大家。

基于网络爬虫的购物平台价格监测系统的设计与实现

通过对网络爬虫的购物平台价格监测系统的业务流程进行梳理可知&#xff0c;网络爬虫的购物平台价格监测系统主要由前台买家模块、后台卖家模块以及管理员模块构成。前台功能包含登录功能、注册功能、系统首页功能、唯品会商品详情浏览、唯品会商品收藏、唯品会商品点赞、唯品会…

[蓝桥杯Java组] k倍区间

题目描述 给定一个长度为N的数列&#xff0c;A1, A2, … AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, … Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗&#xff1f; 输入&#xff1a; 第一行包含两个…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

ZYNQ实验--PDM波形生成

一、PDM简介 将信号的振幅变化按比例地变换成脉冲宽度的变化&#xff0c;得到脉冲宽度调制(PDM)。详细的原理理论可以参考该文&#xff1a;文献阅读–Pulse-Width Modulation&#xff0c;本文主要介绍PDM的FPGA实现&#xff0c;PDM的生成方式很多具体形式根据需求会有所不同 二…

【Stable Diffusion】入门:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

中国广电的独特优势:与三大运营商相比的亮点

2023年&#xff0c;中国广电正式上市了&#xff0c;发出了第一批号段192的号码&#xff0c;然而值得大家了解的是&#xff1a;在中国的通信市场中&#xff0c;中国移动、中国联通和中国电信长期以来占据主导地位。然而&#xff0c;随着中国广电的加入&#xff0c;市场格局正在发…

了解转义字符

了解转义字符 也许在前面的代码中你看到 \n , \0 很纳闷是啥。其实在字符中有⼀组特殊的字符是转义字符&#xff0c;转义字符顾名思义&#xff1a;转变原来的意思的字符。 比如&#xff1a;我们有字符 n &#xff0c;在字符串中打印的时候自然能打印出这个字符&#xff0c;如下…

景安空间不支持指定运行目录tp5

/WEB/public/.htaccess配置 <IfModule mod_rewrite.c> Options FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s$1 [QSA,PT,L] </IfModule>. 2./WEB/.ht…

鸿蒙操作系统 HarmonyOS 3.2 API 9 Stage模型通过ArkTS接入高德地图

用鸿蒙ArkTS语言开发地图APP应用时&#xff0c;很多地图厂商只接入了鸿蒙Java&#xff0c;ArkTS版本陆续接入中&#xff0c;等一段时间才能面世&#xff0c;当前使用地图只能通过鸿蒙的Web组件&#xff0c;将HTML页面嵌入到鸿蒙APP中。具体方法如下&#xff1a;编写HTML <!…

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

IAR全面支持小华全系芯片,强化工控及汽车MCU生态圈

IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片&#xff0c;加速高端工控MCU和车用MCU应用的安全开发 嵌入式开发软件和服务的全球领导者IAR与小华半导体有限公司&#xff08;以下简称“小华半导体”&#xff09;联合宣布&#xff0c;IAR Embedded Workbench fo…