freescale的MMA7660-gsensor

2024-04-22 18:08
文章标签 freescale gsensor mma7660

本文主要是介绍freescale的MMA7660-gsensor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        i800上使用的 gsensor 是freescale的MMA7660,此芯片能够探测xyz三维方向上大于1.5g的加速度,从I2C接口以数字信号的 形式输出其xyz轴上的加速度值。它的探测极限是10000g,即大约从1.8米自由下落到地面反弹起来时的加速度,也就是说手机从1.8米处掉到地 上,gsensor可能坏掉。

 


MMA7660是MMA7450的简化,有10个寄存器可供 设置 其工作模式,采样速率,中断使能等。 

输入:mma7450.c驱动一个,MMA7660 datasheet一份,i800原理图一份。 
输出:mma7660.c驱动一个。 
辅助设备:示波器一个。 

1. 把drivers/hwmon/mxc_mma7450.c复制为mxc_mma7660.c,并修改drivers/hwmon/Kconfig和 Makefile,使MXC_MMA7660出现在menuconfig中并可编译进内核。 
Kconfig中加入: 
config MXC_MMA7660 
        tristate "MMA7660 device driver" 
        depends on MACH_MX51_3DS 
        default n 
Makefile中加入: 
obj-$(CONFIG_MXC_MMA7660)        += mxc_mma7660.o 

2. 在mx51_3stack.c中为mma7660配置中断引脚MX51_PIN_EIM_CS3(由 原理 图得到),及其所需的DVDD和AVDD电压。 
static void gpio_mma7660_get(void) 

        mxc_request_iomux(MX51_PIN_EIM_CS3, OUTPUTCONFIG_GPIO, INPUTCONFIG_GPIO); 
        mxc_set_gpio_direction(MX31_PIN_STX0, 1); 


static void gpio_mma7660_put(void) 

        mxc_free_iomux(MX51_PIN_EIM_CS3, OUTPUTCONFIG_GPIO, INPUTCONFIG_GPIO); 


static struct mxc_mma7660_platform_data mma7660_data = { 
        .reg_dvdd_io = "VVIDIO", 
        .reg_avdd = "VSD", 
        .gpio_pin_get = gpio_mma7660_get, 
        .gpio_pin_put = gpio_mma7660_put, 
        .irq = IOMUX_TO_IRQ(MX51_PIN_EIM_CS3), 


3. 修改mma7660.c中断、DVDD、AVDD相关代码。 

经过以上步骤,mma7450到mma7660的代码移植就完成了。 

接下来是开机 调试 ,上电后,kernel正常启动,没有崩溃,说明成功了一半。 

查看kernel启动log, 
add mma i2c driver 
input: mma7450 as /devices/platform/i2c-adapter/i2c-0/0-001d/input/input1 
mma7450 0-001d: mma7450 device is probed successfully. 
说明驱动已经加载。 

进入rootfs后,抖动板子,屏幕没有任何反应,进入 命令 行查看,中断 函数 中的log没有 打印 出来,说明无中断产生(probe函数里已经通过 I2C打开了所有中断屏蔽位)。 

无中断产生无外乎3个原因: 
1.芯片供电不正常 
2.中断引脚GPIO配置不正确 
3.芯片模式设置不对 

使用示波器检测各管脚,发现DVDD和AVDD都供电正常,中断引脚一直为高,则排除第一个原因。第二个原因概率较小,先看看第三个原因。由于芯片 datasheet上没有说明如何初始化,对于不知道如何初始化的芯片,可以用“灌寄存器”的方法来尝试。所谓灌寄存器,就是在向sysfs注册 driver的时候提供这样一个结构体:
static struct device_attribute mma7660_dev_attr = { 
        .attr = { 
                 .name = "mma7660_ctl", 
                 .mode = S_IRUSR | S_IWUSR, 
                 }, 
        .show = mma7660_show, 
        .store = mma7660_store, 
}; 
这个结构体向用户层暴露此芯片的所有寄存器。 
show函数用于读取某个寄存器值,store函数用于设置某个寄存器的值。 

设备属性结构体配置完后,用这个函数向sysfs注册这个设备属性: 
device_create_file(&client->dev, & mma7660_dev_attr); 
这样在sys/devices/platform/i2c-adapter/i2c-0/0-001d/input/ 下会产生一个”mma7660_ctl”设备,通过echo 和cat 命令就可以实时读取和设置各寄存器的值。 
由于寄存器较多,排列组合情况很多,最后锁定了3个寄存器,REG_INIT, REG_MODE,REG_SR。 REG_INIT为中断屏蔽寄存器,这里打开所有中断,即无论是震动,位移,旋转,gsensor都产生中断(反正现在是要不择手段的获得一个中断 先。。。),REG_MODE使其处于active模式, REG_SR设置为休眠唤醒状态。 

上面3个寄存器可以通过sysfs这样设置: 
#cd sys/devices/platform/i2c-adapter/i2c-0/0-001d/input/ 
#echo "setinit 127" > mma7450_ctl   // 打开所有中断 11111111 
#echo "setmod 1" > mma7450_ctl  // 配置为active mode 00000001 
#echo "setsr 12" > mma7450_ctl    // 配置为休眠唤醒模式 00001100 

执行完以上命令,板子还是无反应,测量中断引脚的确无信号,由于现在还没有排除第二个原因,所以命令行无反应不等于没有中断,所以还是需要示波器实测。 

经过核对,发现datasheet上的mode寄存器位看反了。。。 
#echo "setmod 4" > mma7450_ctl  // 配置为active mode 00000100 

命令行出现源源不断的: 
#xyz motion detected 
#xyz motion detected 
#xyz motion detected 
#xyz motion detected 
………….. 
示波器测量中断引脚出现了中断脉冲,周期大概在几十ms。 

关闭中断屏蔽寄存器REG_INIT的除了xyz震动探测外的所有中断: 
#echo "setinit 3" > mma7450_ctl  // shake detection 00000011 
这样,就只有在每敲击一次板子时才会产生一个中断。 

中断是产生了,但是桌面还是没有任何反应。 
#logcat 
提示MODULE: sensors.freescale.so not found. 

进入myandroid/hardware/libhardware/modules/ ,有lights, sensors, overlay三个子 文件 夹,把sensors/ 目录拷贝到lights/modules/目录下,进入顶层目录myandroid/, 执行make sensors.freescale, 在myandroid_r3/out/target/product/generic/symbols/system/lib/ 下生成sensors.freescale.so, 把它拷贝到rootfs下的system/lib/目录下,重新启动,窗口终于旋转了。 

要使自己写的android应用程序能够通过gsensor旋转屏幕,可以在AndroidManifest.xml中选择Application选项 卡,在Application Notes里选中你的项目后,在右边出现的Attributes窗口里的Screen Orietation一栏右边 的下拉菜单里选择sensor, 选择之后,AndroidManifest.xml代码里会自动添加类似代码: 
android:label="@string/app_name" android:screenOrientation="sensor">。 

以前听说intel的家伙是用脚本灌寄存器来启动一块芯片的,这次有点体会到了其中的含义,当要测试一块寄存器配置很复杂的新芯片时,可以直接用cat一 个脚本到sysfs的方法来配置其寄存器,这样就不用重新编译kernel了,不知道他们的灌寄存器是不是这个意思。。。。

这篇关于freescale的MMA7660-gsensor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android Gsensor 移植

本文记录在某芯片平台上移植Gsensor 驱动和适配hal层的过程。 开发环境: android12 版本 Gsensor 总体框架Gsensor驱动移植和调试Gsensor hal 层的移植和调试 一. Gsensor总体框架 传感器 Multi-HAL  |  Android Open Source Project (google.cn)   Sensors Multi-HAL

freescale IMX6DL android4.4.3 git 获取源码

一、uboot下载:          git clone git://git.freescale.com/imx/uboot-imx.git 二、          却换到uboot根目录,即:uboot-imx/ 执行 git branch -a  可以查看freescale维护的uboot的各个分支,我们checkout的分支是“remotes/origin/imx_v2013.0

freescale IMX6Q git 获取源码

版权声明:本文为博主原创文章,未经博主允许不得转载。    https://blog.csdn.net/dddxxxx/article/details/52373490 一、          git clone git://git.freescale.com/imx/uboot-imx.git 二、          却换到uboot根目录,即:uboot-imx/ 执行 git br

Freescale KV3064PM100SFARM芯片 ADC模块配置 驱动开发

ADC模块驱动开发,这里只教ADC驱动开发技术小白或者第一次做ADC驱动开发的,入不了大佬就法眼。 因为我也是第一次做ADC驱动开发配置,自己摸索,找文档,看各种大佬经验之谈,后面才发现有些内容都是雷同,不过看多了,也能学到很多,比如知道A模块可以软件启动,B模块不支持软件启动,只支持硬件启动,所以下面我在开发ADC模块的时候,我选择A模块软件启动。由于用了半个月的时间才使ADC模块可以工作,这

远嫁NXP后,Freescale不仅改姓,连名字都没了!

今年三月份,NXP宣布用118亿美元收购飞思卡尔,这件事本身就已经令半导体行业的人震惊不已。更让人想不到的是,NXP会停用飞思卡尔这个品牌。过去的终将过去,这个时刻我们也只能缅 怀了。 飞思卡尔的前身——摩托罗拉半导体 今天的人们大多以为英特尔是当代半导体产业的开创者,这是因为半导体工业的真正鼻祖摩托罗拉在PC大规模进入家庭时已经败给了英特尔。 1955年,摩托罗拉推出车载收音机用锗晶体管

在ubuntu12.04.1LTS上搭建freescale iMX6开发板sabresd_6dq编译环境

作者: 大桥++ 2013年9月6日, 若需转载,请注明出处。      并不像ubuntu10.04LTS 或 11.04那样符合google或freescale的编译环境好配置,在ubuntu12.04.1LTS 64位版本上需要多费些时间和精力。因此记下安装过程,便于以后参考。      我们的目标是配置freescale开发板sabresd_6dq的android 4.2.2

IM6Q yocto开发平台搭建,学习FREESCALE官方手册笔记

本文文档是freescale手册fsl-yocto-3.14.28-1.0.0.tar.gz的学习笔记,资源以上传到csdn上了,免积分下载. 1.主机环境搭建,各种安装, (1)安装主机环境,以下部分安装步骤直接摘抄官方<Freescale_Yocto_Project_User's_Guide.pdf>我试过,没有遇到问题,就是耗点时间 You can go to Yocto Proje

对Freescale i.mx53 ADC驱动程序的透彻分析

对Freescale i.mx53 ADC驱动程序的透彻分析 应该说是freescalebsp提供了N多的东东,但是相对于三星提供的来说要复杂一些,感觉三星的简单,飞思将这些东东弄得复杂了。当然,这只是我个人见解,也有可能当初在学校接触的是s3c2410,所以现在才这样说。哈哈。见笑了。 飞思将ADC的驱动程序放在drivers/mxc/adc目录下,这个目录下有以下几个文件: Imx_ad

基于freescale i.Mx6(ARM)的阿里云oss调试记录

交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.11186623.6.558.n2g1UA   1.2 SDK安装 在ubuntu下安装,安装步骤如下: 安装CMake 执行以下命令安装CMake。 sudo apt-get install cmak

TPMS方案 传感器 freescale篇

TPMS方案 传感器 freescale篇 硬件原理图 使用f87xx11系列芯片参考,此原理图为433.92m fsk调制 软件说明: 协议 调制方式:FSK 频率: 433.920 MHz 频偏: 20.0 kHz 编码: Manchester 曼彻斯特类型: 10=One, 01=Zero 传输速率: 9.6 kbps 负载字节位起始: msb 前导码长度: 12(可根据需求调整长度,减