mtk 9.0上调试型号为 st3x3x 光距感传感器
1 查看原理图以及gpio映射表可以知道st3x3x 光距感传感器 使用i2c1通道进行通讯,中断引脚为gpio12,由此可以配置st3x3x 光距感传感器 的dts
根据上面的原理图和gpio映射表EINT12_ALPS—>AE12---->gpio12可以得知,st3x3x 光距感传感器中断引脚EINT12_ALPS对应的引脚是gpio12
dts文件配置如下:
dts文件路径为:\kernel-4.4\arch\arm\boot\dts\aiot8362am3_bsp.dts
调试中遇到i2c速率400k时,光距感i2c无法正常通讯的,需要把速率降低到100k,光距感i2c才正常通讯
&pio {
alsps_intpin_cfg: alspspincfg {
pins_cmd_dat {
pins = <MT8167_PIN_12_EINT12__FUNC_GPIO12>;
slew-rate = <0>;
bias-pull-up = <00>;
};
};
alsps_intpin_default: alspsdefaultcfg {
};
};
&alsps{
pinctrl-names = "pin_default", "pin_cfg";
pinctrl-0 = <&alsps_intpin_default>;
pinctrl-1 = <&alsps_intpin_cfg>;
status = "okay";
};
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins_a>;
status = "okay";
// clock-frequency = <400000>;//调试中遇到i2c速率400k时,光距感i2c无法正常通讯的,需要把速率降低到100k,光距感i2c才正常通讯
clock-frequency = <100000>;
stk3x3x@47{
compatible = "mediatek,stk3x3x";
reg = <0x47>;
interrupt-parent = <&pio>;
interrupts = <12 IRQ_TYPE_LEVEL_LOW 12 0>;
debounce = <22 0>;
i2c_num = <1>;
i2c_addr = <0x47 0 0 0>;
power_id = <0xffff>;
power_vol = <0>;
als_level = <5 9 36 59 82 132 205 273 500 845 1136 1545 2364 4655 6982>;
als_value = <30 40 80 130 180 290 450 600 1100 1860 2500 3400 5200 10240 10240 10240>;
polling_mode_ps = <0>;
polling_mode_als = <1>;
ps_threshold_high = <1700>;
ps_threshold_low = <1500>;
is_batch_supported_ps = <0>;
is_batch_supported_als = <0>;
is_batch_supported = <0>;
firlen = <16>;
status = "okay";
};
}
**2 配置aiot8362am3_bsp_defconfig和aiot8362am3_bsp_debug_defconfig文件以及配置相关的Makefile和Kconfig **
2.1 配置aiot8362am3_bsp_defconfig和aiot8362am3_bsp_debug_defconfig文件
文件路径为:\kernel-4.4\arch\arm\configs\aiot8362am3_bsp_debug_defconfig和\kernel-4.4\arch\arm\configs\aiot8362am3_bsp_defconfig
#alsps
CONFIG_CUSTOM_KERNEL_ALSPS=y
CONFIG_MTK_STK3X3X=y
配置ProjectConfig.mk文件
路径为:\device\mediateksample\aiot8362am3_bsp\ProjectConfig.mk
# alsps sensor
CUSTOM_KERNEL_ALSPS = stk3x3x
**2.2 配置相关的Makefile和Kconfig **
\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\Makefile
obj-$(CONFIG_MTK_STK3X3X) += stk3x3x/
\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\Kconfig
source "drivers/misc/mediatek/sensors-1.0/alsps/stk3x3x/Kconfig"
\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\stk3x3x\Makefile
ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/alsps/inc
ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
obj-y := stk3x3x.o
\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\stk3x3x\Kconfig
config MTK_STK3X3X
bool "STK3X3X for MediaTek package"
default n
\device\mediateksample\aiot8362am3_bsp\ProjectConfig.mk
# alsps sensor
CUSTOM_KERNEL_ALSPS = stk3x3x
3 把 stk3x3x.c放进去编译查看log发现 st3x3x 光距感传感器 i2c是能够通讯成功的,同时相关节点也产生了,由此可以验证st3x3x 光距感传感器 移植成功
光距感驱动相关函数介绍:
static int stk3x3x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
----->驱动加载函数,读取dts配置,对ic进行初始化设置
static int stk3x3x_enable_ps(struct i2c_client *client, int enable, int validate_reg)
ps启动函数,enable = 1 为启动,0为关闭
static int stk3x3x_enable_als(struct i2c_client *client, int enable)
als启动函数 enable = 1 为启动,0为关闭
static int stk3x3x_i2c_suspend(struct device *dev)
i2c睡眠函数
static int stk3x3x_i2c_resume(struct device *dev)
i2c唤醒函数
int stk3x3x_read_ps(struct i2c_client *client, u16 *data)
从0x02读取PS值
int stk3x3x_read_als(struct i2c_client *client, u16 *data)
从0x02读取PS值
static int stk3x3x_get_ps_value_only(struct stk3x3x_priv *obj, u16 ps)
读取ps是接近还是远离,0接近,1远离
static int stk3x3x_get_als_value(struct stk3x3x_priv *obj, u16 als)
根据als_level得到als_value
als_level = <5 9 36 59 82 132 205 273 500 845 1136 1545 2364 4655 6982>;
als_value = <30 40 80 130 180 290 450 600 1100 1860 2500 3400 5200 10240 10240 10240>;
atomic_read(&obj->ps_high_thd_val)
读取ps高门限值
atomic_read(&obj->ps_low_thd_val)
读取ps低门限值
int stk3x3x_write_ps_high_thd(struct i2c_client *client, u16 thd)
把ps高门限值写入0x06高8bit
把ps高门限值写入0x07低8bit
int stk3x3x_write_ps_low_thd(struct i2c_client *client, u16 thd)
把ps低门限值写入0x08高8bit
把ps低门限值写入0x09低8bit
int ps_report_interrupt_data(int value)
上报ps的状态给软件上层,0为接近,1为远离
mtk节点路径
65xx系列:/sys/devices/platform/als_ps/driver/*
67xx系列:/sys/bus/devices/platform/als_ps.xx/driver/*
节点:
allreg 所有寄存器的值
Config
ps/als
Alslv/alsval
firlen
3.1 修改如下文件:
目录:
device/pskyed/project/overlay/frameworks/base/core/res/res/values/config.xml
修改如下:
true
改为 true之后在界面上就会有自动背光的选项。
此时点开自动背光,程序才会调用到驱动中的enable函数,从而开启背光的定时器线程。
调试小技巧:
遇到的问题是驱动probe成功了,节点也有了,但是不知道是否初始化OK了。
解决办法:1.adb连上机器,
切到目录:/sys/bus/platform/drivers/als_ps
查看 所以的寄存器:cat allreg
cat allreg
第一个寄存器是sensor的开关,默认自动感光是关闭的。
敲入命令: echo 00 03 > allreg
会打开感光sensor,
此时读取 als的值会发现变化,表示驱动已经正常工作。