我使用的是vl的psensor,給的驅動是基於Linux的,先調試通,調過cta得到數據,把數據調試正常,但是這樣是在android陳煤化工不會通,找不到sensor,需要走android的框架
1.我是首先不管框架,調試通snesor
2.然后按照一個例子,我使用ps_ap321xx.c,驅動中讓他去匹配這個,然后配置proximity_ap321xx_ops結構體里面的成員,按照寄存器,寫對應的值,后面讀取的時候
struct sensor_operate proximity_ap321xx_ops = { .name = "ps_ap321xx", .type = SENSOR_TYPE_PROXIMITY, //sensor type and it should be correct .id_i2c = PROXIMITY_ID_AP321XX, //i2c id number .read_reg = 0x14, //read data //there are two regs, we fix them in code. .read_len = 1, //data length .id_reg = 0xc0, //read device id from this register //there are 3 regs, we fix them in code. .id_data = 0xee, //device id ------- .precision = 8, //8 bits .ctrl_reg = AP3212B_MODE_COMMAND, //enable or disable .int_status_reg = 0x13, //intterupt status register .range = {0,256}, //range .brightness ={10,255}, // brightness .trig = IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_SHARED, .active = sensor_active, .init = sensor_init, .report = sensor_report_value, };
rk的框架在 drivers/input/sensors/psensor/ 里面整體的按照那個框架來寫 就可以,
會根據這個Id寄存器 讀取,然后校驗id,我的0xc0寄存器讀取的是oxee,所以就會根據這個判斷是否正確,才能下面的匹配,這里走完了,正常識別id,就可以上層找到sensor了,至於數據,下面的才做,但是rk要使用框架,還需要配置一下,驅動做完Inpt節點就會有了
1.input event 節點生成說明驅動加載成功了。
add device 1: /dev/input/event5 name: "proximity"
2.psensor 需要正常用起來,BoardConfig.mk 中需要將 BOARD_PROXIMITY_SENSOR_SUPPORT 打開,並且看下你們sdk的 device/rockchip/common 目錄是否這個提交,沒有的話需要打上附件補丁。
diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index 0c5830a2..4b186c1f 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -22,6 +22,11 @@ /dev/mma8452_daemon u:object_r:sensor_device:s0 /dev/compass u:object_r:sensor_dev:s0 /dev/gyrosensor u:object_r:sensor_dev:s0 +/dev/lightsensor u:object_r:sensor_dev:s0 +/dev/psensor u:object_r:sensor_dev:s0 +/dev/temperature u:object_r:sensor_dev:s0 +/dev/pressure u:object_r:sensor_dev:s0 +/dev/angle u:object_r:sensor_dev:s0 /dev/stune(/.*)? u:object_r:cgroup:s0 /dev/akm8963_dev u:object_r:akmd_device:s0
這里正確了,就能找到sensor了,網上隨便找一個sensor的app,就可以測試,我下載了sensortest_yxdown.com.apk
dts配置
vl53l0x@29 { compatible = "ps_ap321xx"; i2c_num = <1>; i2c_addr = <0x29 0 0 0>; reg = <0x29>; pinctrl-names = "default"; pinctrl-0 = <&vl53l0_irq>; //---這里是走rk標准框架 type = <SENSOR_TYPE_PROXIMITY>; irq_enable = <0>; //0輪詢 -- > 1中斷 reprobe_en = <1>; irq-gpio = <&gpio3 19 GPIO_ACTIVE_HIGH>; power-gpio = <&gpio3 18 GPIO_ACTIVE_HIGH>; poll_delay_ms = <200>; //20ms讀取一次 //---- ////// interrupt-parent = <&vl53l0_irq>; status = "okay" ; //interrupts = <14 IRQ_TYPE_LEVEL_LOW 14 0>; }
dts可以配置為使用中斷或者輪詢方式查詢,如果是中斷,就是在中斷的時候調用sensor_report_value,如果是輪詢,會做一個工作隊列,輪詢調用sensor_report_value
主要框架在drivers/input/sensors/sensor-dev.c中
sensor_active:
-->ready_to_start_config(vl53l0x_data) ;
--> stmvl53l0x_start(vl53l0x_data, 3, 0)
sensor_init:
-->stmvl53l0x_setup(vl53l0x_data);
-->2c_object->power_up = 1 ;
上報函數就是獲取得到數據以后,上報就行了,其他sensor 差不多就這樣了,如果是在rk列表里面的 那就更簡單了