SENSORS 设备驱动
1.1 Device tree 配置
在msm8909平台上,根据硬件原理图设计得知sensors 是挂载在BLSP1 QUP1 上,所以需要在 i2c1 的节点下配置,以磁传感器mmc3416 为例;
mpu6050@68 {
compatible = "invn,mpu6050";
reg = <0x68>;
pinctrl-names = "mpu_default","mpu_sleep";
pinctrl-0 = <&mpu6050_default>;
pinctrl-1 = <&mpu6050_sleep>;
interrupt-parent = <&msm_gpio>;
interrupts = <96 0x1>;
vdd-supply = <&pm8909_l17>;
vlogic-supply = <&pm8909_l6>;
invn,gpio-int = <&msm_gpio 96 0x1>;
invn,place = "Portrait Down";
};
mmc3416x@30 { /* Magnetic field sensor */
compatible = "memsic,mmc3416x";
reg = <0x30>;
vdd-supply = <&pm8909_l17>;
vio-supply = <&pm8909_l6>;
memsic,dir = "obverse-x-axis-forward";
memsic,auto-report;
};
从以上两个设备树的信息可知 在sensors device tree 的配置中主要是配置,ic 的供电,i2c 从设备地址, 中断gpio 脚,以及特有的sensor 属性等,具体的作用,待解析设备驱动再做简要的说明。
1.2 设备驱动编译
在msm8909平台上,sensors 存放的目录一般是选择如下路径下: msm8909/code/kernel/drivers/input/misc/ 以mpu6050 和 mmc3416 为例,需要在 msm8909/code/kernel/arch/arm/configs/msm8909-1gb_defconfig 中将编译的宏控打开,如下配置:
CONFIG_SENSORS_MPU6050=y
CONFIG_SENSORS_MMC3416X=y
编译完成后,查看out 目录是否生成对应的.o 文件。
1.3 设备驱动解析
以mmc3416 为例解析驱动的逻辑
1.3.1 设备驱动注册
static struct of_device_id mmc3416x_match_table[] = {
{ .compatible = "memsic,mmc3416x", },
{ },
};
static struct i2c_driver mmc3416x_driver = {
.probe = mmc3416x_probe,
.remove = mmc3416x_remove,
.id_table = mmc3416x_id,
.driver = {
.owner = THIS_MODULE,
.name = MMC3416X_I2C_NAME,
.of_match_table = mmc3416x_match_table,
.pm = &mmc3416x_pm_ops,
},
};
module_i2c_driver(mmc3416x_driver);
在mmc3416x.c的驱动中,首先是使用module_i2c_driver将其注册i2c设备总线上, 这个接口是moudle_init 和 i2c_add_d