1、gsensor+陀螺仪:调试这个要有个清晰的思路。大概分为三层:A、底层驱动;B、中间层; C、上层。
要判断问题,首先得快速的定位的问题出在哪层,但是这三层又是相互关联的,所以还是得都熟悉。
一般调试过程:1、底层接口有没有通;2、底层数据有没有出来,是hal层没有去读取,还是驱动本身有问题,这点很关键。网上有很多资料判断底层驱动有没有通用getevent,但是hal层没有调用ioctl接口是,getevent也是没有数据出来的,而且打印printk log也没有。(不过这个得分情况,有些驱动只有ioctl的user接口,像rk。有些驱动有两套接口,开机自动上报。)3、hal层有没有数据出来。4、上层有没有数据出来。
总的来说,调试方法很重要。
学会自己写简单的接口:
例如:mpu6500_test.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#define L3G4200D_IOCTL_BASE 77
#define L3G4200D_IOCTL_SET_DELAY _IOW(L3G4200D_IOCTL_BASE, 0, int)
#define L3G4200D_IOCTL_GET_DELAY _IOR(L3G4200D_IOCTL_BASE, 1, int)
#define L3G4200D_IOCTL_SET_ENABLE _IOW(L3G4200D_IOCTL_BASE, 2, int)
#define L3G4200D_IOCTL_GET_ENABLE _IOR(L3G4200D_IOCTL_BASE, 3, int)
int main(void)
{
int fd = 0;
printf("mpu6500 test!!!\n");
fd = open("/dev/mma8452_daemon", O_RDWR, 0);
if(fd<0){
printf("no fd found.\n");
}
/*if (ioctl(fd, L3G4200D_IOCTL_SET_ENABLE, 0) -1){
printf("error close fb");
}
if (ioctl(fd, L3G4200D_IOCTL_SET_ENABLE, 1) -1){
printf("error open fb");
}*/
return 0;
}
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= mpu6500_test.c
LOCAL_MODULE_TAGS := eng optional
LOCAL_MODULE:= mpu6500_test
include $(BUILD_EXECUTABLE)
2、LCD调试问题:
机器进入睡眠后,唤醒花屏,如图:
看到现象,很多人第一反应就是height设置不对,只设了1/3,这确实是一个常犯的错误。
但是我这个问题不是这个原因,认真分析一下:屏的接口其实就三类:A、同步信号。如de hs vs B、时钟信号。dclk C、数据信号。mipi。
一个个排除,c的可能性很小,A的可能性最大。当时我们的项目de脚没有配置,有点怀疑这个,其实现在很多平台都不用te脚了,用mipi信号的vfp hfp等配置来代替te脚消除无效数据。
但是有些资料又说要用te,这里没搞太明白。反正最近调rk mtk的mipi屏都没有用到te脚。
剩下就是时钟信号,出现三个界面,clock太快了?屏的刷新跟不上?修改,果然ok了。