本文转载自:http://www.voidcn.com/blog/u012296694/article/p-1669831.html

前言

8926平台的sensor架构与之前的平台完全不同,实际上已经脱离了linux。此平台所有的sensor由adsp芯片控制,代码在modem端,编译和烧录也完全不同,下面以TSL2581为例进行说明。

一、 驱动 
集成光传感器TSL2581 
    1. 驱动程序结构可以参考高通默认的光感驱动文件sns_dd_als_bh1721.c或sns_dd_als_max44009.c或sns_dd_alsprx_tmd277x.c,主要是填充结构体 sns_ddf_driver_if_s;其成员: 
         init, 
         reset, 
         get_data, 
         set_attrib, 
         get_attrib, 
         必须填充,因为sns_smgr_dd_init()对这它们进行检查; 
     另外probe成员也要填充,因为sns_smgr_parse_reg_devinfo_resp()中代码逻辑有问题,当probe为NULL时,只会填充第一个此类型的sensor的配置。

2. 寄存器配置,电路参考设计要查看 TSL2581的数据手册;

3. TSL2581 和 TMD277X都是TAOS公司的,参考它写最好。如果可以从fae获取驱动代码更好,基本不需要修改,改正编译错误之后就可以使用。
       由于芯片在电路板的方向不同,G-sensor,gyro和compass需要调换x、y、z轴的映射,只需在sensor_def_qcomdev.conf文件中修改。

二、 移植 
   参考高通文档“80-N7635-1_E_Snapdragon_Sensors_Core_New_Sensor_Driver_Integration_LA.pdf” 
1. Add the entry function for the new driver in adsp_proc\sensors\dd\qcom\inc\sns_dd.h: 
     extern sns_ddf_driver_if_s sns_als_tsl2581_driver_fn_list;

2. Add the new driver files in adsp_proc\sensors\dd\qcom\src in the ADSP build 
    sns_dd_als_tsl2581.h 
    sns_dd_als_tsl2581.c

3. update the adsp_proc\sensors\dd\qcom\build\dd_qcom.scons file;

"${BUILDPATH}/sns_dd_als_tsl2581.c",

4. Configure Sensors.scons to compile the new files. To include the driver, in adsp_proc\sensors\build\Sensors.scons, add:

env.Append(CPPDEFINES = ["CONFIG_SUPPORT_TSL2581"])

5.Update the sns_reg_common.h files on both the ADSP and APSS builds to add UUID:

UUID可以使用在终端使用命令生成:uuidgen 
    ADSP – adsp_proc\Sensors\common\inc\sns_reg_common.h 
    APSS – android\vendor\qcom\proprietary\sensors\dsps\sensordaemon\common\inc\ sns_reg_common.h 
    #define SNS_REG_UUID_TSL2581 \

{0x84,0x2a,0xad,0xa7,0xc5,0x9b,0x4c,0x07,0xa2,0xf9,0xc8,0x2a,0xe4,0x03,0x43,0xa6}

APSS端主要是为了调试使用,实际的驱动中不加也可以。 
6. Update the SMGR function pointer map so that the SMGR can associate the new UUID with the new DD function pointer. 
   In adsp_proc/Sensors/smgr/src/common/sns_smgr_init.c,update smgr_sensor_fn_ptr_map[]: 
    #ifdef CONFIG_SUPPORT_TSL2581 
    { SNS_REG_UUID_TSL2581, &sns_als_tsl2581_driver_fn_list},

#endif

7. Update the configuration file "sensor_def_qcomdev.conf":

在对应的硬件、平台后面修改,1966,1967是ALS/PROX sensor的UUID,1976是从设备地址,一般添加新sensor只修改这三项,其它项使用默认值。 
    1967 0xa64303e42ac8f9a2   0x00010001 
    1966 0x074c9bc5a7ad2a84  0x00010001 
    1976 0x39               0x00010001

例如:sensor_def_qcomdev.conf的内容形如:

########################################################################

:hardware 8974 
:platform 
:property 
:soc_id

1903 0x8d79ae42524820ad 0x00010001 
1902 0xcc4575757b462d60 0x00010001 
1906 12 0x00010001

:hardware 8226 
:platform

1903 0x8d79ae42524820ad 0x00010001 
1902 0xcc4575757b462d60 0x00010001 
1906 12 0x00010001 
:platform SKUG

1903 0x8d79ae42524820ad 0x00010001 
1902 0xcc4575757b462d60 0x00010001 
1906 12 0x00010001

########################################################################

我的hardware 属于8226,platform属于 SKUG,我就要在最下面添加。 
关于sensor_def_qcomdev.conf中每一项代表的内容定义在vendor/qcom/proprietary/sensors/dsps/api/sns_reg_api_v02.h中。 
下面列举常用项: 
700,701,702 G-sensor的轴映射 
800,801,802 gyro的轴映射 
900,901,902 compass的轴映射 
3801 是否使用高通compass校准库,1表示使用,0表示不使用 
1900 是否支持兼容,0表示支持,1表示不支持 
不支持兼容时的配置起始地址: 
1902 Accelerometer             
1918 Gyroscope                 
1934 Magnetometer              
1950 Pressure                  
1966 Proximity/Ambient Light 
兼容时的配置起始地址: 
以ALS/PROX为例: 
2300 1 //这一项配置为1,表示支持距离光感兼容功能 
2301 2 //这一项配置为2,表示支持两种距离光感芯片 
2302-2312 这是第一种芯片的配置 
2313-2323 这是第二种芯片的配置   
注意:这里的选项顺序和只支持一个芯片的顺序的不同 
可以参看vendor/qcom/proprietary/sensors/dsps/api/sns_reg_api_v02.h,里面的代码比较易懂。

三、编译下载 
0. 只需要在modem端编译,先编译adsp_proc,再编译NON-HLOS。 
1. Push the updated sensor_def_qcomdev.conf file to the /etc/ directory of the hardware: 
    >>adb push sensor_def_qcomdev.conf /etc/ 
    >>adb shell chmod 644 /etc/sensor_def_qcomdev.conf

2. remove the existing registry file "sns.reg" from the /data/misc/sensors/ directory 
    >>adb shell rm /data/misc/sensors/sns.reg 
    >>adb shell sync 
    >>adb reboot

3. compilation completes successfully, 
    (1)To load the ADSP image(adsp.b00...adsp.mdt) to the /firmware/image/ directory of the hardware 
       >>adb root 
       >>adb remount 
       >>adb shell mount -o remount rw /firmware 
       >>adb push adsp.b00 firmware/image

:

:

>>adb push adsp.mdt firmware/image 
      开始我按照高通文档下载到/etc/frimware/,也起作用,后来高通工程师告诉我应该下载到firmware/image/ 
      需要强制修改权限: 
    >>adb shell mount -o remount rw /firmware

(2)第一种下载方法太麻烦,直接下载NON-HLOS.bin: 
       >>adb reboot bootloader 
       >>fastboot flash modem NON-HLOS.bin 
       >>fastboot reboot

四、调试 
 1.调试主要依靠QXDM抓取log,由于init函数和probe函数是在手机与QXDM建立连接之前完成的,QXDM无法打印里面的log,所以我们一般加入全局变量,然后在其他已确定肯定会执行的函数中打印出来,比如其它已正常工作的sensor的get data函数,记得打开打印log的宏。

2.    编译下载完成后开机,先导出sns.reg, 
     >>adb pull data/misc/sensors/sns.reg 
       然后使用 Ultraedit 打开sns.reg查看是否将sensor_def_qcomdev.conf中添加的UUID解析成功。

对应关系如下: 
       sensor     sensor_def_qcomdev.conf              sns.reg            
       accel          1903 1902                         1710h 
       gyro           1918 1919                         1740h 
       Magnetometer   1934 1935                         1770h 
       Pressure       1951 1950                         17a0h 
       als+prox       1967 1966                         17d0h

没成功的原因: 
       1. sensor_def_qcomdev.conf的权限没有修改。 请重新执行步骤三的2和3 
       2. 在移植第7步中添加位置错误,请确认硬件,平台

3.   使用sns_cm_test工具测试:

>>adb shell 
      >>cd /system/bin/ 
      >>sns_cm_test -r 20 -d 1 -s 40 -t 1 
  
      参数说明: -r代表rate, 
      其它sensor测试命令: 
      sns_cm_test -r 20 -d 1 -s 40 -t 0 测试prox 
      sns_cm_test -r 20 -d 1 -s 0  测试G-sensor 
      sns_cm_test -r 20 -d 1 -s 10 测试GYRO 
      sns_cm_test -r 20 -d 1 -s 20 测试MAG 
      sns_cm_test -r 20 -d 1 -s 30 测试PRESS

(1) 如果提示没有sns_cm_test命令,可能是被你们公司去掉默认编译了,可以手动编译,然后倒入手机的/system/bin/ 
      执行如下命令: 
       >>. build/envsetup.sh  
       >>choosecombo 1 1 2 
       >>make sns_cm_test -j4 
       其中第二条命令是我们公司这个项目的选项,没有可以不执行

(2) 如果提示参数不正确,那就需要修改vendor/qcom/proprietary/sensors/dsps/test/src/sns_cm_test.c 文件,将光感的测试添加进去,按下面修改,重新编译即可,然后执行(1)

int main( int argc, char * const argv[]) 

sensor1_handle_s *hndl1; 
int rate = 30; 
int duration = 1; 
int sensor_id = SNS_SMGR_ID_ACCEL_V01; 
int data_type = SNS_SMGR_DATA_TYPE_PRIMARY_V01; 
int opt;

// socketpair( AF_UNIX, SOCK_SEQPACKET, 0, socket_pair );

while( (opt = getopt(argc, argv, "r:h:d:s:t:" ))!= -1 ) { 
switch(opt) { 
... 
case 's': 
sensor_id = atoi(optarg); 
break; 
case 't': 
data_type = atoi(optarg); 
break; 
case '?': 
fprintf(stderr, usage_fmt, argv[0]); 
exit(0); 
default: 
break; 


... 
smgr_req->Item[0].SensorId = sensor_id; 
printf("Asking sensor data with type %d",data_type); 
smgr_req->Item[0].DataType = data_type; 
...

(3)此命令 会测试光sensor,打印出ID,TYPE和数值等,如果没有说明集成失败。可能原因,硬件或驱动代码问题。 
  (4)软件检查: 
       a.初始化是否成功; 
       b.i2c地址冲突; 
       c.读写寄存器是否成功,数值是否正确; 
       d.相关函数是否调用,执行; 
  (5)硬件检查,根据datasheet检查电路图,测量相应引脚电压,测量I2C引脚波形,光和距离传感器的探头是否因为装机不适被遮挡。 
       实例: 
       调试GYRO mpu3050时,初始化成功,读写寄存器也全部返回成功,但是读取的测量数据全是0。最后发现硬件供电电压偏低,原因是缺少上拉电阻。 
   
五、其它        
1. snesor_def_qcomdev.conf解析可以查看ap端代码 sns_reg_la.c 
2. compass使用供应商提供的校准库,conf文件中3801置0,然后把供应商提供的校准库(形如libAKM8975.so)放到手机/system/vendor/lib/ 
3. 开启CIT菜单中gyro,compass测试项: 
   修改: device/qcom/br01/overlay/packages/odm/apps/Tools/res/values/config_cit.xml 
   编译: make clean-Tools;  make Tools; 
   push: adb push Tools.apk  /system/app 
4. 使用AndroSensor测试sensor: 
   安装:>>adb install AndroSensor_com.fivasim.androsensor_45.apk 
5. 没有屏幕时,使用神器调试 
   打开神器:>>python arobot3.1.py

高通 8x26 andorid light sensor(TSL258x) 开发【转】的更多相关文章

  1. 高通qxdm抓取sensor的log【学习笔记】

    高通qxdm抓取sensor的log 打开qxdm,打开设置界面,去掉其他无关的log,打开Log packets .Message packets的SNS的log 之后需要把端口打开,把端口打开之后 ...

  2. 高通HAL层之Sensor HAL

    高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...

  3. 高通adsp架构下sensor

    一.高通sensor架构: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...

  4. 高通(QCOM)sensor bring up

    高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...

  5. 高通sensor理解

    .1.高通为什么引入adsp? 2.adsp sensor 是如何工作起来的? 3.adsp 和ap 是如何通信的? 4.adsp 架构组成 解答: 1.高通在msm8960之前sensor 是挂在p ...

  6. 高通非adsp 架构下的sensor的bug调试

    高通 sensor 从native到HAL 高通HAL层之Sensor HAL 高通HAL层之bmp18x.cpp 问题现象: 当休眠后,再次打开preesure sensor的时候,会出现隔一段时候 ...

  7. 高通QMI协议

    QMI(Qualcomm MSM Interface,官方名称应该是Qualcomm Message Interface)是高通用来替代OneRPC/DM的协议,用来与modem通信. QMI协议定义 ...

  8. 高通camera基本代码架构【转】

    本文转载自:http://blog.sina.com.cn/s/blog_c0de2be70102vyn1.html 1  camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循 ...

  9. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

随机推荐

  1. 使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑

    通过CyclicBarrier+线程池的方式,同步的方式分页分批次并发高效处理逻辑,将总页数分成多个批次并发执行每页逻辑,每个批次处理DO_MAX_SIZE个页,每个批次等待DO_MAX_SIZE个页 ...

  2. C++中的析构顺序和cosnt对象

    1,当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 2,单个对象创建时构造函数的调用顺序(工程经验总结): 1,调用父类的构造过程: 2,调用成员变量的构造函数(调用顺序与声明顺序相同): ...

  3. int快读

    昨天偶然间看到CJ_tony的快读,所以便决定学习一下. 这个快读的原理就是:读入单个字符要比读入读入数字快,先读入字符,然后再转化成数字.(原理的话大学再研究) 代码: #include<io ...

  4. 遍历文件夹下的csv,把数据读进一张表

    import pandas as pd import os if __name__ == '__main__': Path = 'c:\checklog' dfs = [] for dir_path, ...

  5. python中输入三个整数x,y,z,请把这三个数由小到大输出。

    输入三个整数x,y,z,请把这三个数由小到大排序,再把数组由大到小排序,再输出最大值和最小值! #定义一个空数组 numbers = [] #循环遍历,下面的4是控制循环次数 for i in ran ...

  6. zprofiler工具

    转自:zprofiler三板斧解决cpu占用率过高问题 此工具为阿里自产的profiler工具,在其他文章中看到有用此工具进行性能问题定位的.在此转载文章学习一下. 上周五碰到了一个线上机器cpu占用 ...

  7. oracle数据的导入导出(两种方法三种方式)

    大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1. ...

  8. Pure播放器

    我是的本地应用,并不会拿你的隐私数据.

  9. 39. Combination Sum (Java)

    Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), fin ...

  10. UIDynamic物理引擎

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...