收藏 分销(赏)

gsensorMMA7660调试总结.doc

上传人:xrp****65 文档编号:7687058 上传时间:2025-01-12 格式:DOC 页数:4 大小:27.50KB 下载积分:10 金币
下载 相关 举报
gsensorMMA7660调试总结.doc_第1页
第1页 / 共4页
gsensorMMA7660调试总结.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
MMA7660是MMA7455的简化,有10个寄存器可供设置其工作模式,采样速率,中断使能等。 我们是深圳本土最受客户青睐、成长最快、最关注增值服务的MID电子元件提供商之一。我们深圳的长期大量现货型号有:MMA7660, MMA7455, MMA8452QR1, MXC6225XU, MMC3140MS, TS1003,MPU-3050, ALC5621, ALC5625, WM8988, ES8388,联系热线:13714686590,杨先生 输入:mma7455.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">。 我们是深圳本土最受客户青睐、成长最快、最关注增值服务的MID电子元件提供商之一。我们深圳的长期大量现货型号有:MMA7660, MMA7455, MMA8452QR1, MXC6225XU, MMC3140MS, TS1003,MPU-3050, ALC5621, ALC5625, WM8988, ES8388,联系热线:13714686590,杨先生 以前听说intel的家伙是用脚本灌寄存器来启动一块芯片的,这次有点体会到了其中的含义,当要测试一块寄存器配置很复杂的新芯片时,可以直接用cat一个脚本到sysfs的方法来配置其寄存器,这样就不用重新编译kernel了,不知道他们的灌寄存器是不是这个意思。。。。 链接地址:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服