转载自: http://hi.baidu.com/dunwin/item/581dd96c905e2530ac3e83a7

mma7660

在tablet中event3 是mma7660 goolge了下  发现一篇文章  转载

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了,不知道他们的灌寄存器是不是这个意思。。。。

mma7660(重力感应传感器)相关推荐

  1. HTC 重力感应传感器编程资料总结

    HTC 重力感应传感器编程资料总结 与硬件结合的软件编程总是比纯软件多出很多乐趣,比如给智能车单片机编程,比如能利用到重力传感器(gsensor)的手机编程.不过能做到更多事情的同时,也会面对更多麻烦 ...

  2. 使用重力感应传感器和Arduino的手机控制机器人车

    原文地址:https://circuitdigest.com/microcontroller-projects/g-sensor-controlled-robot-car-arduino 使用G传感器 ...

  3. 安卓开发中的重力感应传感器

    2019独角兽企业重金招聘Python工程师标准>>> 安卓开发中拥有多种传感器,google提供了11种传感器供应用层使用:加速度.磁力.方向.陀螺仪.光线.压力(返回当前压强). ...

  4. android系统重力感应传感器 方向控制与方向切换,android sensor orientation 方向传感器 重力感应...

    首先,获取方向传感器(参照http://developer.android.com/reference/android/hardware/SensorManager.html): publicclas ...

  5. python如何控制传感器_[TPYBoard - Micropython之会python就能做硬件 5] 学习使用重力传感器及PWM...

    一.实验器材 1.TPYboard V102板 一块 2.LED灯 一个 3.1602屏 一块 二.重力传感器 TPYboard与pyboard一样,本身带一个重力传感器.该传感器能够感知到加速力的变 ...

  6. 通过模拟器看Windows Phone 7

    2010年7月9日,微软释放出了Windows Phone 7 Series 的SDK beta版.这让我们有了进一步了解还未上市的Windows Phone 7 Series 手机的机会,这个SDK ...

  7. MangoTrainingCourse课程hands-on lab-1

    概述 由于所有Windows Phone设备都要符合一个最低功能的硬件规格,所以设备之间会有一些略微的不同,因为硬件厂商会超过最低硬件规格来定义自己的设备硬件.所以,在Windows Phone 7 ...

  8. android自适应屏幕翻转,Android中正确自适应屏幕翻转

    大家都知道,很多Android手机带有重力感应传感器,能够对手机的翻转做出响应.比如应用在屏幕的自动翻转.重力感应游戏等方面. 只要在androidmanifest.xml中对应的Activity中加 ...

  9. 整车智能-浅谈“车内生命体征检测方案”

    车内生命体征检测 前言 出于对生命的尊重,减少人员/宠物在车内由于热射病/缺氧引起的事故,车内生命检测技术被越来越多的企业所重视. 整车制造商企业,依托智能感知.车内算力等软硬从而实现了生命体征监测方 ...

  10. Android三种姿势带你玩转360度全景图功能

    简介 大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生.最近微博上的全景图火了,所以决定实现一下.工程里面图片资源来自网络,如有侵权请联系我,马上删 ...

最新文章

  1. WCF系列(三) -- WCF配置文件注释 【转】
  2. 闰年的判断方法_C语言100题 判断这一天是一年中的第几天 壁纸 火影
  3. WIFI-MESH + 蓝牙MESH在智能家居领域有着广泛的应用场景,他们的区别到底在哪里呢
  4. 文章采集伪原创工具_卓尔博通|如何把伪原创文章变成原创
  5. 计算机网络 | 网络基础 :网络协议,协议分层,数据封装与分用,地址管理,字节序
  6. 你研究过单例么?这样写单例效率最高.
  7. linux恢复终端默认配置,以gnome-terminal为例,修改gnome3 的默认配置,
  8. 只有单杀技能的飞鸽传书
  9. ios 内存管理的理解(三)ARC下 对象内存管理
  10. 使用 Lagrange Multiplier解决带有一个条件限制的最优解问题
  11. 标准模板库(STL)之 priority_queue 列传
  12. 分享一个狂雨小说采集规则 - 顶点小说采集
  13. [知了堂学习笔记]_Ajax之解析Json
  14. Windows XP虚拟机到期无法使用的解决方案(救急版)
  15. asp毕业设计——基于asp+access的工资管理系统设计与实现(毕业论文+程序源码)——工资管理系统
  16. 工作时间管理之番茄工作法
  17. AMOS分析技术:斜交验证性因子分析;介绍如何整理出能够放入论文的模型信效度结果
  18. element ui 排课_vue怎么去写一个学校排课系统
  19. 鸿图之下服务器维护10月25,更新公告丨《鸿图之下》12月30日维护更新预告
  20. 各种常用电子元器件符号

热门文章

  1. 腾讯云账户注销操作教程
  2. Android Studio中AndroidManifest.xml文件中application标签
  3. (VUM验证学习11) 使用ahb vip对GPIO进行验证框架搭建,寄存器模型集成和测试点拆解编写
  4. Word如何在表格里面插入行或者列
  5. 致前行者 | 他们,只用了两公里地铁的钱,就实现了中国探月
  6. 服务器重装系统之DELL
  7. NewLand手持设备上条码扫描
  8. 算法篇----求两数的最大公约数和最小公倍数
  9. python图像色彩分析_Python——图像手绘效果
  10. excel--text(双坐标图表)