1、MMA7660 是 MMA7455 的简化,有 10 个寄存器可供设置其工作模式,采样速率,中断使能等。我们是深圳本土最受客户青睐、成长最快、最关注增值服务的 MID 电子元件提供商之一。我们深圳的长期大量现货型号有:MMA7660, MMA7455, MMA8452QR1, MXC6225XU, MMC3140MS, TS1003,MPU-3050, ALC5621, ALC5625, WM8988, ES8388,联系热线:13714686590,杨先生输入:mma7455.c 驱动一个,MMA7660 datasheet 一份,i800 原理图一份。输出:mma7660.c 驱动一个。辅
2、助设备:示波器一个。1. 把 drivers/hwmon/mxc_mma7450.c 复制为 mxc_mma7660.c,并修改drivers/hwmon/Kconfig 和 Makefile,使 MXC_MMA7660 出现在 menuconfig 中并可编译进内核。Kconfig 中加入:config MXC_MMA7660tristate “MMA7660 device driver“depends on MACH_MX51_3DSdefault nMakefile 中加入:obj-$(CONFIG_MXC_MMA7660) += mxc_mma7660.o2. 在 mx51_3stac
3、k.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
4、, 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 的代码移植就完成了。接下来是开机调试,上
5、电后,kernel 正常启动,没有崩溃,说明成功了一半。查看 kernel 启动 log,add mma i2c driverinput: mma7450 as /devices/platform/i2c-adapter/i2c-0/0-001d/input/input1mma7450 0-001d: mma7450 device is probed successfully.说明驱动已经加载。进入 rootfs 后,抖动板子,屏幕没有任何反应,进入命令行查看,中断函数中的 log 没有打印出来,说明无中断产生(probe 函数里已经通过 I2C 打开了所有中断屏蔽位)。无中断产生无外乎 3
6、个原因:1.芯片供电不正常2.中断引脚 GPIO 配置不正确3.芯片模式设置不对使用示波器检测各管脚,发现 DVDD 和 AVDD 都供电正常,中断引脚一直为高,则排除第一个原因。第二个原因概率较小,先看看第三个原因。由于芯片 datasheet 上没有说明如何初始化,对于不知道如何初始化的芯片,可以用“灌寄存器”的方法来尝试。所谓灌寄存器,就是在向 sysfs 注册 driver 的时候提供这样一个结构体:static struct device_attribute mma7660_dev_attr = .attr = .name = “mma7660_ctl“,.mode = S_IRUS
7、R | S_IWUSR,.show = mma7660_show,.store = mma7660_store,;这个结构体向用户层暴露此芯片的所有寄存器。show 函数用于读取某个寄存器值,store 函数用于设置某个寄存器的值。设备属性结构体配置完后,用这个函数向 sysfs 注册这个设备属性:device_create_file(这样在 sys/devices/platform/i2c-adapter/i2c-0/0-001d/input/ 下会产生一个”mma7660_ctl”设备,通过 echo 和 cat 命令就可以实时读取和设置各寄存器的值。由于寄存器较多,排列组合情况很多,最后
8、锁定了 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
9、“ 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
10、#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/ ,
11、有 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 旋转屏幕,可以在AndroidManifes
12、t.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 了,不知道他们的灌寄存器是不是这个意思。 链接地址:http:/