1.配置I2C_client结构体的从机地址和名字
非设备树配置:
a.在arch/arm/mach-exynos/ 下打开mach-tiny4412.c
b.在其中仿照其他结构体添加设备名字与从机地址:如下图,代表我的设备名字是mma7660,从机地址为:0X4C。
static struct i2c_board_info smdk4x12_i2c_devs3[] __initdata = {
{
I2C_BOARD_INFO("mma7660", 0x4c),
},
};
c.然后继续在这个mach-tiny4412.c文件下找到 smdk4x12_machine_init 这个函数,仿照原有的其他设备在其中添加:
i2c_register_board_info(2, smdk4x12_i2c_devs3,
ARRAY_SIZE(smdk4x12_i2c_devs3));
//其中i2c_register_board_info这个函数为向I2c_adapter构建的I2C_client添加从机地址与名字,
名字用来和之后的I2C_driver中的做匹配,
第一个参数为上一步骤所填写的结构体数组名字,第二个参数为该对象的大小
d.编译内核:make zImage -j8
MMA7660所需寄存器以及配置
MMA7660的寄存器可以参考其数据手册,我是仿照开发板商在内核中提供的mma7660.c里面的寄存器配置实现的寄存器和功能配置如下:
#define MMA7660_XOUT 0x00 // 6位输出值X,从该寄存器中读取X值
#define MMA7660_YOUT 0x01 // 6位输出值Y, Y值
#define MMA7660_ZOUT 0x02 // 6位输出值Z,Z值
#define MMA7660_TILT 0x03 //倾斜状态
#define MMA7660_SRST 0x04 //采样率状态
#define MMA7660_SPCNT 0x05 //睡眠计数
#define MMA7660_INTSU 0x06 //中断设置
#define MMA7660_MODE 0x07 //模式
#define MMA7660_SR 0x08 //自动唤醒/睡眠并去除过滤器
#define MMA7660_PDET 0x09 // 清敲检测
#define MMA7660_PD 0x0a // 利用防反跳计数
一些配置的典型值:
struct register_info_data reg[7] = {
{MMA7660_MODE, 0x00},
{MMA7660_SR, ((2<<5) | (1<<3) | 1)},
{MMA7660_SPCNT, 0xA0},
{MMA7660_PDET, 4},
{MMA7660_PD, 15},
{MMA7660_INTSU, 0xe7},
{MMA7660_MODE, 0x59}
};
按照上述寄存器配置可完成等待态的寄存器读取,可参考内核中的mma7660.c和mma7660.h文件查看具体信息。
代码如下:
mma7660驱动代码:mma7660_drv.c
#include <linux/module.h>
#include <