最近刚看完freescale mma8451的驱动,并且一直了驱动,自己也没怎么改代码,不过读了一下代码,还是有点体会的,下面我就来分析一下。
首先看下代码结构,有兴趣的可以从一下方式获得代码,git@github.com:zhangjie201412/WorkSpace.git ,最好是先发mail给我,
jay@jay:~/mygit$ tree
.
└── kernel
├── arch
│ └── arm
│ └── mach-mx5
│ └── mx53_smd.c
├── drivers
│ └── hwmon
│ └── mma845x
│ ├── Makefile
│ ├── mma845x.c
│ ├── mma845x.h
│ ├── mma_char.c
│ ├── mma_core.c
│ ├── mma_input.c
│ ├── mma_regs.h
│ ├── mma_sysfs.c
│ └── mma_sysfs.h
└── include
└── linux
└── mma845x.h
其中一个头文件,然后是一个驱动包,里面内容蛮丰富的,还有就是要在板级文件里面注册platform的device端,我这里是基于iMX53的Android BSP
首先咱还是来找源头吧,找啊找,看名字就知道我们先要分析这个mma_core.c文件
这个初始化和卸载模块就不多说了,注册了i2c类型的驱动,接着去platform文件中找注册的device端,mx53_smd.c
这里,填充了mma845x驱动的一些platform_data
然后是注册,
这个函数会把i2c0上的所有驱动都挂到platform driver的device上去,进行匹配,这里我要提示的一点是,这里的2根GPIO 中断引脚,我们要设置为input
接下来分析mma_core.c中的probe函数,这里是最终要的一个函数了
注释也写的蛮清楚的但是咱还是一起来看一下
这里是由probe函数传进来的client参数来得到platform_data,就是我们在板级文件中填充的那些个结构体,我觉得Linux设计的这个platform架构的驱动很好,他可以很好的把驱动和设备隔离开来,虽然有的时候还是会联系到一起,但是对于可移植性更强了,因为,驱动只是对设备的统一管理,而platform device端只需要配置cpu的gpio跟deivce的连接情况,还有一些soc中继承的功能的配置以及注册。
接着这里是给我们驱动中定义的mxc_mma_device_t结构体分配内存,然后是一些kernel info的打印没什么好说了。
还是先来看一下这个结构体吧,
这个结构体比较简单,定义了2个中断号,还有中断GPIO的get和put,我们这边对这2个函数没有实现,我猜想get函数是对中断GPIO的配置,put是对中断GPIO的free,拙见而已,
这里首先是对mma_845x器件身份的识别,来看下IdentifyChipset函数
读i2c bus上面mma传感器的WHO_AM_I 寄存器,来判断连上的是哪个device
这里首先是对芯片层的一些赋值,找到这里我们注册的是哪款芯片,然后把i2c client,chip id, chiptype等信息赋值给这里的局部变量,然后再把局部变量赋值给全局的几个指针,然后再试对芯片寄存器设置一些默认值。
然后是初始化芯片的事件类型,这里这块芯片分很多事件类型,有撞击事件,横竖切换事件等,接下来如果pChip结构体中Init成员函数非空的话就执行这个函数。
接下来注册了一个字符类型的驱动,咱来看看这个驱动是干啥用的,最主要的还是看mma_fops这个文件操作结构体中实现了哪些个东西,mma_char.c
这里有打开关闭,读,还有ioctl功能,
首先是open函数,这里还要先看下pContext_t这个结构体
里面有3个成员变量,乍看之下还不清楚是用来干嘛的,先不管,接着往下看就明白了,回到open函数中,首先把文件结构体中的数据给这个结构体,然后判断,这里的意思应该是如果open函数被打开了一次那么就会执行if中的代码,如果已经被打开了,那么就直接返回零,if语句中也就是多结构体的初始化,还有初始化了一个信号量,然后把p指针传给file->private,代表已经被打开了,非空。
release中的代码就不多说了,跟open函数正好相反。
然后是比较重要的ioctl和read function
这个ioctl函数很简单,通过switch case语句,把用户传进去的参数分类,然后做出不同的动作,其中有对threshold的设置,读取,对acclerometer_flag的设置和获取等动作。
这个函数看上去很复杂,其实就做了一件事情,调用copy_to_user把数据传到用户空间,其实这里我很不明白这个字符驱动到底跟我们的mma器件有什么关系,因为这里read函数中我没有看到一点关于i2cread 的内容,所以我觉得,这里这个字符驱动是多余的,不过这里对等待队列的读操作有待学习。
我们也可以自己再这里加上对I2C的读操作来把这里的read函数挂到用户空间,我想这里的ioctl函数应该是来设置threshold的,应该是用在HAL层中来被设置的。
而这里的read函数也可以当做poll模式下来读取xyz的数据,大家可以看到在read中有作比较,当读回来的数据大于threshold时才把数据copy到用户空间。
OK,这个字符驱动暂时介绍到这边,下面我们接着看mma_core.c中的probe函数
这里是一些列的初始化,input sybsystem、文件系统、信号量、定时器、线程的初始化,先看输入子系统初始化过程
分别调用input_allocate_device和input_register_device函数来注册input 驱动,然后就是设置input 驱动的类型,下面还注册了一个输入设备这里我的理解是这样的,input1主要是输出xyz方向上的重力加速度分量,而input2主要是用来输出一些碰撞和震动,还有横竖切换等事件。
下面是初始化文件系统
这里代码很多,在mma_sysfs.c中,其实一点都不难,就是太多了有点复杂,看过内核驱动模型的同学应该很熟悉这里,这里就是建立了一个名为sensor的class,来作为这些文件的父类,具体的我不多说了,这里的文件太多了,也讲不完,可以一边参照data sheet一边看这里的文件时用来干嘛的,这里read/write 的时候就分别会回调这里相关的函数,然后去设置寄存器。大家可以看到下面就是这里建立的文件系统
/sys/class/sensor # ls -l
lrwxrwxrwx 1 root root 0 Jan 2 01:10 mma -> ../../devices/virtual/sensor/mma
lrwxrwxrwx 1 root root 0 Jan 2 01:10 motion_detection0 -> ../../devices/virtual/sensor/mma/motion_detection0
lrwxrwxrwx 1 root root 0 Jan 2 01:10 orientation_detection0 -> ../../devices/virtual/sensor/mma/orientation_detection0
lrwxrwxrwx 1 root root 0 Jan 2 01:10 tap_detection0 -> ../../devices/virtual/sensor/mma/tap_detection0
lrwxrwxrwx 1 root root 0 Jan 2 01:10 transient_detection0 -> ../../devices/virtual/sensor/mma/transient_detection0
/sys/class/sensor #
然后是初始化信号量和定时器,这里就不多说了。
接下来是创建了一个线程并执行他,这个线程是一个死循环,也就是我们这里最关键的一个函数,之后再说。
然后这里是申请中断,如果我们使用中断模式的话就申请中断,如果没有使用中断模式的话这里有一个flag,poll_mode被设置成1,初始化的时候是0.
porbe函数就先讲到这里,这里主要还是做了一些初始化的东西,下面来分析一下这个驱动是如何工作的,其实相关的就是这里最重要的2个东西,一个是定时器,还有一个是这个thread的处理,我们下面接着看
首先看下这里的中断响应函数和定时器响应函数,这里基本啥也没做,就是释放信号量,关键就在这,我们接着看
看下我们的线程,一开始是初始化了一堆变量,然后把data转化为我们这里的一个ChipInfo_t结构体指针,然后初始化等待队列,然后是修改定时器下次定时到达时间为1秒钟,然后是一个while循环,看下这个循环中到底做了啥事情。
首先是一个do while来试图获取信号量,这里信号量被初始化为0,所以这边是得不到的,就会一直等在这边,前面我们看过定时器和中断函数中都做了对信号量的释放动作,联想到这边就是说,我们的线程不是一直在走的,只有当发生定时器时间到达和中断发生了,才会让我们这里的线程继续往下走,也就实现了这里的polling和interrupt 这2中模式。
这个线程下面的代码我们都能猜到,就是通过I2C读取芯片中的数据,然后利用input子系统push到用户空间,如果是polling mode的话就修改下次定时到达的时间,这里的设计还是满巧妙的,有待学习,特别是我觉得代码写的比较规范。
下面来一张图来分析这里的处理流程。

画的太丑了,见谅!!
分享到:
相关推荐
MMA7455L三轴加速度传感器是一款由Freescale公司设计的数字式三轴消费级加速度计,该传感器是Freescale首次推出的数字三轴加速度计产品系列之一。MMA7455L具有小巧的3x5x1mm尺寸,并且能够通过I2C和SPI两种通信协议...
MMA8452三轴加速度传感器,它是由Freescale Semiconductor生产的智能低功耗三轴电容式微机械加速度计。这款传感器具有12位的分辨率,它内部集成了许多功能,这些功能可以通过用户编程进行灵活配置,能够使用两个中断...
MMA7260是一款由Freescale(现为NXP的一部分)生产的高性能三轴加速度传感器。该传感器因其高性价比而在各种消费电子产品、智能家居、机器人技术等领域得到广泛应用。它具有微小型封装、低功耗、宽量程等特点。 ###...
Freescale公司推出的MMA7455L三轴加速度传感器,以其卓越的性能和广泛的应用场景,成为业界关注的焦点。 #### 二、MMA7455L的原理详解 ##### 1. 结构组成 MMA7455L由两大部分构成:G-单元和信号调理ASIC电路。G-...
【MMA7361三轴加速度传感器】是一款由Freescale(飞思卡尔)公司生产的微型电容式加速度传感器,适用于Arduino平台。这款传感器具有高性能和高性价比,集成信号调理、单级低通滤波器和温度补偿技术。它提供了两种...
MMA7260是一款由Freescale(现为NXP半导体公司的一部分)生产的三轴加速度传感器,广泛应用于移动设备、游戏控制器、震动监测、个人电子设备等多种场合。 MMA7260能够检测出三轴(X、Y、Z轴)的加速度变化,并将这些...
本文将详细介绍Freescale(飞思卡尔)的三轴加速度传感器MMA7455L,该传感器因其体积小、功耗低等特点而受到广泛关注。 #### 二、MMA7455L三轴加速度传感器概述 MMA7455L是一款三轴加速度传感器,能够测量XYZ三个...
在传感器技术领域,三轴加速度传感器MMA7260(以下简称MMA7260)是一款由Freescale Semiconductor公司生产的低成本、高性能的微机械系统(MEMS)加速度计。该传感器不仅具有信号调理、一阶低通滤波器、温度补偿等...
**HQ745x**是一款基于Freescale公司的**MMA7455L**加速度传感器设计的数字三轴加速度模块。该模块可以直接通过单片机控制,无需额外的A/D转换电路,简化了设计流程并提高了整体性能。 #### 二、MMA7455L加速度...
本篇文章将重点介绍Freescale Semiconductor生产的mma7553三轴加速度传感器的相关知识点,包括其基本特性、工作原理、应用领域及优势分析等。 #### mma7553概述 mma7553是一款由Freescale Semiconductor设计制造的...
在本文中使用的加速度传感器是Freescale公司的MMA2260型号,它是一款三轴加速度传感器,可以同时测量三个方向(x、y、z)上的加速度变化。每个轴的输出信号都是模拟电压信号,该信号与所测得的加速度成正比。 - **...
MMA7260是由Freescale公司生产的三轴重力加速度传感器,适用于人体行走时加速度信号的精确测量。这款传感器具备电容式结构,集成了信号调理、低通滤波和温度补偿功能,支持四种不同灵敏度选择模式,最高可达800mv/g...
- MMA8452Q是一款三轴加速度计,可测量X、Y、Z三个方向上的加速度。 - 具有±2g、±4g、±8g三种量程选择,满足不同应用场景需求。 - 自动低功耗模式,支持多种电源管理选项,以延长电池寿命。 - 集成了数字信号...
### 三轴加速度MMA8451Q数据手册知识点总结 #### 一、概述 MMA8451Q是一款由Freescale Semiconductor(现为NXP Semiconductors的一部分)生产的智能低功耗三轴电容式微机械加速计。这款设备拥有14位分辨率,并具备...
本无线采集系统采用了Freescale公司最新推出的一款低成本、单芯片、三轴加速度传感器MMA7260。该微型电容式加速传感器融合了信号调理、单极低通滤波器和温度补偿技术,并提供了4种加速度测量范围,分别为1.5 g、2 g...
MMA7260QT是一款由Freescale(现为NXP)生产的低成本微型电容式三轴加速度传感器。它集成了信号调理电路、单极低通滤波器和温度补偿技术,这些特性使得它非常适合于移动设备和其他需要精确测量加速度的应用场景。...
MMA7341L 是由飞思卡尔半导体(Freescale Semiconductor)生产的一款高性能、低功耗的三轴加速度传感器。该传感器具备±3g 和±11g 的可选量程,适用于多种应用场景。以下是关于该传感器的详细技术特性与应用分析。 ...
"一款G-Sensor芯片.doc"可能包含关于加速度传感器的一般信息,而"Freescale_Low_g_MMA845xQ_sensors_Chinese.pdf"是官方的中文数据手册,详细介绍了MMA8452的规格、操作和应用示例。"8452简单介绍.doc"和"MMA8452....
### MMA7360L 三轴加速度传感器概述 #### 一、产品简介 MMA7360L是一款由飞思卡尔半导体(Freescale Semiconductor)生产的三轴低重力加速度传感器,适用于多种便携式电子设备。这款传感器能够测量±1.5g与±6g两个...
飞思卡尔(Freescale)MMA8452Q是一款高性能、低功耗的三轴数字加速度计,主要用于检测设备在X、Y、Z三个轴向的加速度变化。这款芯片广泛应用于运动监测、计步器、手机、平板电脑、物联网设备以及各种需要精确运动...