1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "aos/kernel.h"
5 #include "sensor_drv_api.h"
6 #include "sensor_hal.h"
7
8 #define LTR507_I2C_SLAVE_ADDR 0x23
9
10 #define LTR507_ALS_CONTR 0x80 /* ALS operation mode, SW reset */
11 #define LTR507_PS_CONTR 0x81 /* PS operation mode */
12 #define LTR507_PS_LED 0x82 /* LED pulse freq, current duty, peak current */
13 #define LTR507_PS_N_PULSES 0x83 /* PS number of pulses */
14 #define LTR507_PS_MEAS_RATE 0x84 /* measurement rate*/
15 #define LTR507_ALS_MEAS_RATE 0x85 /* ALS integ time, measurement rate*/
16 #define LTR507_PART_ID 0x86
17 #define LTR507_MANUFAC_ID 0x87
18 #define LTR507_ALS_DATA_0 0x88
19 #define LTR507_ALS_DATA_1 0x89
20 #define LTR507_ALS_PS_STATUS 0x8A
21 #define LTR507_PS_DATA_0 0x8B
22 #define LTR507_PS_DATA_1 0x8C
23 #define LTR507_ALS_DATA_CH1_0 0x8D
24 #define LTR507_ALS_DATA_CH1_1 0x8E
25 #define LTR507_ALS_DATA_CH1_2 0x8F
26 #define LTR507_ALS_DATA_CH2_0 0x90
27 #define LTR507_ALS_DATA_CH2_1 0x91
28 #define LTR507_ALS_DATA_CH2_2 0x92
29 #define LTR507_ALS_COEFF1_DATA_0 0x93
30 #define LTR507_ALS_COEFF1_DATA_1 0x94
31 #define LTR507_ALS_COEFF2_DATA_0 0x95
32 #define LTR507_ALS_COEFF2_DATA_1 0x96
33 #define LTR507_ALS_IRF_CUT_OFF 0x97
34 #define LTR507_INTERRUPT 0x98
35 #define LTR507_PS_THRES_UP_0 0x99 /* ps interrupt upper threshold, lower byte */
36 #define LTR507_PS_THRES_UP_1 0x9A /* ps interrupt upper threshold, upper byte */
37 #define LTR507_PS_THRES_LOW_0 0x9B /* ps interrupt lower threshold, lower byte */
38 #define LTR507_PS_THRES_LOW_1 0x9C /* ps interrupt lower threshold, upper byte */
39 #define LTR507_ALS_THRES_UP_0 0x9E /* ALS interrupt upper threshold, lower byte */
40 #define LTR507_ALS_THRES_UP_1 0x9F /* ALS interrupt upper threshold, upper byte */
41 #define LTR507_ALS_THRES_LOW_0 0xA0 /* ALS interrupt lower threshold, lower byte */
42 #define LTR507_ALS_THRES_LOW_1 0xA1 /* ALS interrupt lower threshold, upper byte */
43 #define LTR507_INTR_PRST 0xA4 /* ALS/PS interrupt persist setting */
44 #define LTR507_MAX_REG 0xA5
45
46 #define LTR507_ADDR_TRANS(n) ((n) << 1)
47 #define LTR507_I2C_ADDR LTR507_ADDR_TRANS(LTR507_I2C_SLAVE_ADDR)
48 #define LTR507_PART_ID_VAL 0x91
49 #define LTR507_MANUFAC_ID_VAL 0x05
50
51 #define LTR507_ALS_CONTR_REG_ALS_GAIN__POS (3)
52 #define LTR507_ALS_CONTR_REG_ALS_GAIN__MSK (0x18)
53 #define LTR507_ALS_CONTR_REG_ALS_GAIN__REG (LTR507_ALS_CONTR)
54
55 #define LTR507_ALS_CONTR_REG_ALS_SW_RESET__POS (2)
56 #define LTR507_ALS_CONTR_REG_ALS_SW_RESET__MSK (0x04)
57 #define LTR507_ALS_CONTR_REG_ALS_SW_RESET__REG (LTR507_ALS_CONTR)
58
59 #define LTR507_ALS_CONTR_REG_ALS_MODE__POS (1)
60 #define LTR507_ALS_CONTR_REG_ALS_MODE__MSK (0x02)
61 #define LTR507_ALS_CONTR_REG_ALS_MODE__REG (LTR507_ALS_CONTR)
62
63 #define LTR507_PS_CONTR_REG_PS_GAIN__POS (2)
64 #define LTR507_PS_CONTR_REG_PS_GAIN__MSK (0x0C)
65 #define LTR507_PS_CONTR_REG_PS_GAIN__REG (LTR507_PS_CONTR)
66
67 #define LTR507_PS_CONTR_REG_PS_MODE__POS (1)
68 #define LTR507_PS_CONTR_REG_PS_MODE__MSK (0x02)
69 #define LTR507_PS_CONTR_REG_PS_MODE__REG (LTR507_PS_CONTR)
70
71 #define LTR507_PS_LED_REG_PEAK_CURR__POS (0)
72 #define LTR507_PS_LED_REG_PEAK_CURR__MSK (0x07)
73 #define LTR507_PS_LED_REG_PEAK_CURR__REG (LTR507_PS_LED)
74
75 #define LTR507_PS_LED_REG_DUTY_CYCLE__POS (3)
76 #define LTR507_PS_LED_REG_DUTY_CYCLE__MSK (0x18)
77 #define LTR507_PS_LED_REG_DUTY_CYCLE__REG (LTR507_PS_LED)
78
79 #define LTR507_PS_LED_REG_PULSE_FREQ__POS (5)
80 #define LTR507_PS_LED_REG_PULSE_FREQ__MSK (0xE0)
81 #define LTR507_PS_LED_REG_PULSE_FREQ__REG (LTR507_PS_LED)
82
83 #define LTR507_PS_MEAS_RATE_REG_MEAS_RATE__POS (0)
84 #define LTR507_PS_MEAS_RATE_REG_MEAS_RATE__MSK (0x07)
85 #define LTR507_PS_MEAS_RATE_REG_MEAS_RATE__REG (LTR507_PS_MEAS_RATE)
86
87 #define LTR507_ALS_MEAS_RATE_REG_ADC_RES__POS (5)
88 #define LTR507_ALS_MEAS_RATE_REG_ADC_RES__MSK (0xE0)
89 #define LTR507_ALS_MEAS_RATE_REG_ADC_RES__REG (LTR507_ALS_MEAS_RATE)
90
91 #define LTR507_ALS_MEAS_RATE_REG_MEAS_RATE__POS (0)
92 #define LTR507_ALS_MEAS_RATE_REG_MEAS_RATE__MSK (0x07)
93 #define LTR507_ALS_MEAS_RATE_REG_MEAS_RATE__REG (LTR507_ALS_MEAS_RATE)
94
95 #define LTR507_ALS_PS_STATUS_REG_INT_SOURCE__POS (4)
96 #define LTR507_ALS_PS_STATUS_REG_INT_SOURCE__MSK (0x30)
97 #define LTR507_ALS_PS_STATUS_REG_INT_SOURCE__REG (LTR507_ALS_PS_STATUS)
98
99 #define LTR507_ALS_PS_STATUS_REG_ALS_INT_STATUS__POS (3)
100 #define LTR507_ALS_PS_STATUS_REG_ALS_INT_STATUS__MSK (0x08)
101 #define LTR507_ALS_PS_STATUS_REG_ALS_INT_STATUS__REG (LTR507_ALS_PS_STATUS)
102
103 #define LTR507_ALS_PS_STATUS_REG_ALS_DATA_STATUS__POS (2)
104 #define LTR507_ALS_PS_STATUS_REG_ALS_DATA_STATUS__MSK (0x04)
105 #define LTR507_ALS_PS_STATUS_REG_ALS_DATA_STATUS__REG (LTR507_ALS_PS_STATUS)
106
107 #define LTR507_ALS_PS_STATUS_REG_PS_INT_STATUS__POS (1)
108 #define LTR507_ALS_PS_STATUS_REG_PS_INT_STATUS__MSK (0x02)
109 #define LTR507_ALS_PS_STATUS_REG_PS_INT_STATUS__REG (LTR507_ALS_PS_STATUS)
110
111 #define LTR507_ALS_PS_STATUS_REG_PS_DATA_STATUS__POS (0)
112 #define LTR507_ALS_PS_STATUS_REG_PS_DATA_STATUS__MSK (0x01)
113 #define LTR507_ALS_PS_STATUS_REG_PS_DATA_STATUS__REG (LTR507_ALS_PS_STATUS)
114
115 #define LTR507_GET_BITSLICE(regvar, bitname) ((regvar & LTR507_##bitname##__MSK) >> LTR507_##bitname##__POS)
116 #define LTR507_SET_BITSLICE(regvar, bitname, val) ((regvar & ~LTR507_##bitname##__MSK) | ((val<<LTR507_##bitname##__POS)<R507_##bitname##__MSK))
117
118 #define LTR507_WAIT_TIME_PER_CHECK (10)
119 #define LTR507_WAIT_TIME_TOTAL (100)
120
121 typedef enum {
122 LTR507_ALS_GAIN_1 = 0x00, /* 1 lux to 64k lux (default) */
123 LTR507_ALS_GAIN_2 = 0x01, /* 0.5 lux to 32k lux */
124 LTR507_ALS_GAIN_3 = 0x02, /* 0.02 lux to 640 lux */
125 LTR507_ALS_GAIN_4 = 0x03, /* 0.01 lux to 320 lux */
126 } LTR507_CFG_ALS_Gain;
127
128 typedef enum {
129 LTR507_SW_RESET_NEG = 0x00,
130 LTR507_SW_RESET = 0x01,
131 } LTR507_CFG_SW_RESET;
132
133 typedef enum {
134 LTR507_ALS_STANDBY = 0x00,
135 LTR507_ALS_ACTIVE = 0x01,
136 } LTR507_CFG_ALS_MODE;
137
138 typedef enum {
139 LTR507_PS_GAIN = 0x03,
140 } LTR507_CFG_PS_GAIN;
141
142 typedef enum {
143 LTR507_PS_STANDBY = 0x00,
144 LTR507_PS_ACTIVE = 0x01,
145 } LTR507_CFG_PS_MODE;
146
147 typedef enum {
148 LTR507_PS_PULSE_FREQ_30K = 0x00, /* LED pulse period = 30kHz */
149 LTR507_PS_PULSE_FREQ_40K = 0x01, /* LED pulse period = 40kHz */
150 LTR507_PS_PULSE_FREQ_50K = 0x02, /* LED pulse period = 50kHz */
151 LTR507_PS_PULSE_FREQ_60K = 0x03, /* LED pulse period = 60kHz (default) */
152 LTR507_PS_PULSE_FREQ_70K = 0x04, /* LED pulse period = 70kHz */
153 LTR507_PS_PULSE_FREQ_80K = 0x05, /* LED pulse period = 80kHz */
154 LTR507_PS_PULSE_FREQ_90K = 0x06, /* LED pulse period = 90kHz */
155 LTR507_PS_PULSE_FREQ_100K = 0x07, /* LED pulse period = 100kHz */
156 } LTR507_CFG_PS_LED_PULSE_FREQ;
157
158 typedef enum {
159 LTR507_PS_DUTY_CYCLE = 0x01,
160 } LTR507_CFG_PS_LED_DUTY_CYCLE;
161
162 typedef enum {
163 LTR507_PS_PEAK_CURRENT_5 = 0x00, /* LED pulse current level = 5mA */
164 LTR507_PS_PEAK_CURRENT_10 = 0x01, /* LED pulse current level = 10mA */
165 LTR507_PS_PEAK_CURRENT_20 = 0x02, /* LED pulse current level = 20mA */
166 LTR507_PS_PEAK_CURRENT_50 = 0x03, /* LED pulse current level = 50mA (default) */
167 LTR507_PS_PEAK_CURRENT_100 = 0x04, /* LED pulse current level = 100mA */
168 } LTR507_CFG_PS_LED_PEAK_CURRENT;
169
170 typedef enum {
171 LTR507_PS_MEAS_RATE_12_5 = 0x00, /* PS Measurement Repeat Rate = 12.5ms */
172 LTR507_PS_MEAS_RATE_50 = 0x01, /* PS Measurement Repeat Rate = 50ms */
173 LTR507_PS_MEAS_RATE_70 = 0x02, /* PS Measurement Repeat Rate = 70ms */
174 LTR507_PS_MEAS_RATE_100 = 0x03, /* PS Measurement Repeat Rate = 100ms (default) */
175 LTR507_PS_MEAS_RATE_200 = 0x04, /* PS Measurement Repeat Rate = 200ms */
176 LTR507_PS_MEAS_RATE_500 = 0x05, /* PS Measurement Repeat Rate = 500ms */
177 LTR507_PS_MEAS_RATE_1000 = 0x06, /* PS Measurement Repeat Rate = 1000ms */
178 LTR507_PS_MEAS_RATE_2000 = 0x07, /* PS Measurement Repeat Rate = 2000ms */
179 } LTR507_CFG_PS_MEAS_RATE;
180
181 typedef enum {
182 LTR507_ALS_ADC_RES_20BIT = 0x00, /* 20 bit, integration time - 1200ms */
183 LTR507_ALS_ADC_RES_19BIT = 0x01, /* 19 bit, integration time - 600ms */
184 LTR507_ALS_ADC_RES_18BIT = 0x02, /* 18 bit, integration time - 300ms */
185 LTR507_ALS_ADC_RES_17BIT = 0x03, /* 17 bit, integration time - 150ms */
186 LTR507_ALS_ADC_RES_16BIT = 0x04, /* 16 bit, integration time - 75ms (default) */
187 LTR507_ALS_ADC_RES_12BIT = 0x05, /* 12 bit, integration time - 4.685ms */
188 LTR507_ALS_ADC_RES_8BIT = 0x06, /* 8 bit, integration time - 292us */
189 LTR507_ALS_ADC_RES_4BIT = 0x07, /* 4 bit, integration time - 18us */
190 } LTR507_CFG_ALS_ADC_RESOLUTION;
191
192 typedef enum {
193 LTR507_ALS_MEAS_RATE_100 = 0x00, /* ALS Measurement Repeat Rate = 100ms (default) */
194 LTR507_ALS_MEAS_RATE_200 = 0x01, /* ALS Measurement Repeat Rate = 200ms */
195 LTR507_ALS_MEAS_RATE_500 = 0x02, /* ALS Measurement Repeat Rate = 500ms */
196 LTR507_ALS_MEAS_RATE_1000 = 0x03, /* ALS Measurement Repeat Rate = 1000ms */
197 LTR507_ALS_MEAS_RATE_2000 = 0x04, /* ALS Measurement Repeat Rate = 2000ms */
198 } LTR507_CFG_ALS_MEAS_RATE;
199
200 typedef enum {
201 LTR507_INT_NEG = 0x00,
202 LTR507_INT_PS = 0x01,
203 LTR507_INT_ALS = 0x02,
204 } LTR507_CFG_INT_SOURCE;
205
206 typedef enum {
207 LTR507_ALS_INT_CLEAR = 0x00,
208 LTR507_ALS_INT_TRIG = 0x01,
209 } LTR507_CFG_ALS_INT_STATUS;
210
211 typedef enum {
212 LTR507_ALS_DATA_STATUS_OLD = 0x00,
213 LTR507_ALS_DATA_STATUS_NEW = 0x01,
214 } LTR507_CFG_ALS_DATA_STATUS;
215
216 typedef enum {
217 LTR507_PS_INT_CLEAR = 0x00,
218 LTR507_PS_INT_TRIG = 0x01,
219 } LTR507_CFG_PS_INT_STATUS;
220
221 typedef enum {
222 LTR507_PS_DATA_STATUS_OLD = 0x00,
223 LTR507_PS_DATA_STATUS_NEW = 0x01,
224 } LTR507_CFG_PS_DATA_STATUS;
225
226 typedef enum {
227 LTR507_FLAG_INIT_ALS = 0,
228 LTR507_FLAG_INIT_PS,
229 } LTR507_FLAG_INIT_BIT;
230
231 i2c_dev_t ltr507_ctx = {
232 .port = 3,
233 .config.address_width = 8,
234 .config.freq = 100000,
235 .config.dev_addr = LTR507_I2C_ADDR,
236 };
237
238 static uint8_t g_init_bitwise = 0;
239
drv_als_ps_liteon_ltr507_validate_id(i2c_dev_t * drv,uint8_t part_id,uint8_t manufac_id)240 static int drv_als_ps_liteon_ltr507_validate_id(i2c_dev_t* drv, uint8_t part_id, uint8_t manufac_id)
241 {
242 int ret = 0;
243 uint8_t part_id_value = 0;
244 uint8_t manufac_id_value = 0;
245
246 if (drv == NULL) {
247 return -1;
248 }
249
250 ret = sensor_i2c_read(drv, LTR507_PART_ID, &part_id_value, I2C_DATA_LEN, I2C_OP_RETRIES);
251 if (unlikely(ret)) {
252 return ret;
253 }
254
255 ret = sensor_i2c_read(drv, LTR507_MANUFAC_ID, &manufac_id_value, I2C_DATA_LEN, I2C_OP_RETRIES);
256 if (unlikely(ret)) {
257 return ret;
258 }
259
260 if (part_id_value != part_id || manufac_id_value != manufac_id) {
261 return -1;
262 }
263
264 return 0;
265 }
266
drv_als_liteon_ltr507_set_power_mode(i2c_dev_t * drv,dev_power_mode_e mode)267 static int drv_als_liteon_ltr507_set_power_mode(i2c_dev_t* drv, dev_power_mode_e mode)
268 {
269 int ret = 0;
270 uint8_t dev_mode = 0;
271 uint8_t value = 0;
272
273 ret = sensor_i2c_read(drv, LTR507_ALS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
274 if (unlikely(ret)) {
275 return ret;
276 }
277
278 switch (mode) {
279 case DEV_POWER_OFF:
280 case DEV_SLEEP:
281 dev_mode = LTR507_SET_BITSLICE(value, ALS_CONTR_REG_ALS_MODE, LTR507_ALS_STANDBY);
282 break;
283 case DEV_POWER_ON:
284 dev_mode = LTR507_SET_BITSLICE(value, ALS_CONTR_REG_ALS_MODE, LTR507_ALS_ACTIVE);
285 break;
286 default:
287 return -1;
288 }
289
290 ret = sensor_i2c_write(drv, LTR507_ALS_CONTR, &dev_mode, I2C_DATA_LEN, I2C_OP_RETRIES);
291 if (unlikely(ret)) {
292 return ret;
293 }
294
295 return 0;
296 }
297
drv_ps_liteon_ltr507_set_power_mode(i2c_dev_t * drv,dev_power_mode_e mode)298 static int drv_ps_liteon_ltr507_set_power_mode(i2c_dev_t* drv, dev_power_mode_e mode)
299 {
300 int ret = 0;
301 uint8_t dev_mode = 0;
302 uint8_t value = 0;
303
304 ret = sensor_i2c_read(drv, LTR507_PS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
305 if (unlikely(ret)) {
306 return ret;
307 }
308
309 switch (mode) {
310 case DEV_POWER_OFF:
311 case DEV_SLEEP:
312 dev_mode = LTR507_SET_BITSLICE(value, PS_CONTR_REG_PS_MODE, LTR507_PS_STANDBY);
313 break;
314 case DEV_POWER_ON:
315 dev_mode = LTR507_SET_BITSLICE(value, PS_CONTR_REG_PS_MODE, LTR507_PS_ACTIVE);
316 break;
317 default:
318 return -1;
319 }
320
321 ret = sensor_i2c_write(drv, LTR507_PS_CONTR, &dev_mode, I2C_DATA_LEN, I2C_OP_RETRIES);
322 if (unlikely(ret)) {
323 return ret;
324 }
325
326 return 0;
327 }
328
drv_als_liteon_ltr507_is_ready(i2c_dev_t * drv)329 UNUSED static int drv_als_liteon_ltr507_is_ready(i2c_dev_t* drv)
330 {
331 int ret = 0;
332 uint8_t value = 0;
333
334 ret = sensor_i2c_read(drv, LTR507_ALS_PS_STATUS, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
335 if (unlikely(ret)) {
336 return 0;
337 }
338
339 ret = (LTR507_GET_BITSLICE(value, ALS_PS_STATUS_REG_ALS_DATA_STATUS) == LTR507_ALS_DATA_STATUS_NEW) ? 1 : 0;
340
341 return ret;
342 }
343
drv_ps_liteon_ltr507_is_ready(i2c_dev_t * drv)344 UNUSED static int drv_ps_liteon_ltr507_is_ready(i2c_dev_t* drv)
345 {
346 int ret = 0;
347 uint8_t value = 0;
348
349 ret = sensor_i2c_read(drv, LTR507_ALS_PS_STATUS, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
350 if (unlikely(ret)) {
351 return 0;
352 }
353
354 ret = (LTR507_GET_BITSLICE(value, ALS_PS_STATUS_REG_PS_DATA_STATUS) == LTR507_PS_DATA_STATUS_NEW) ? 1 : 0;
355
356 return ret;
357 }
358
drv_als_liteon_ltr507_set_default_config(i2c_dev_t * drv)359 static int drv_als_liteon_ltr507_set_default_config(i2c_dev_t* drv)
360 {
361 int ret = 0;
362 uint8_t value = 0;
363
364 ret = sensor_i2c_read(drv, LTR507_ALS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
365 if (unlikely(ret)) {
366 return ret;
367 }
368 value = LTR507_SET_BITSLICE(value, ALS_CONTR_REG_ALS_GAIN, LTR507_ALS_GAIN_1);
369 ret = sensor_i2c_write(drv, LTR507_ALS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
370 if (unlikely(ret)) {
371 return ret;
372 }
373
374 value = 0;
375 value = LTR507_SET_BITSLICE(value, ALS_MEAS_RATE_REG_MEAS_RATE, LTR507_ALS_MEAS_RATE_500);
376 value = LTR507_SET_BITSLICE(value, ALS_MEAS_RATE_REG_ADC_RES, LTR507_ALS_ADC_RES_16BIT);
377 ret = sensor_i2c_write(drv, LTR507_ALS_MEAS_RATE, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
378 if (unlikely(ret)) {
379 return ret;
380 }
381
382 return 0;
383 }
384
drv_ps_liteon_ltr507_set_default_config(i2c_dev_t * drv)385 static int drv_ps_liteon_ltr507_set_default_config(i2c_dev_t* drv)
386 {
387 int ret = 0;
388 uint8_t value = 0;
389
390 ret = sensor_i2c_read(drv, LTR507_PS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
391 if (unlikely(ret)) {
392 return ret;
393 }
394 value = LTR507_SET_BITSLICE(value, PS_CONTR_REG_PS_GAIN, LTR507_PS_GAIN);
395 ret = sensor_i2c_write(drv, LTR507_PS_CONTR, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
396 if (unlikely(ret)) {
397 return ret;
398 }
399
400 value = 0;
401 value = LTR507_SET_BITSLICE(value, PS_LED_REG_PEAK_CURR, LTR507_PS_PEAK_CURRENT_50);
402 value = LTR507_SET_BITSLICE(value, PS_LED_REG_DUTY_CYCLE, LTR507_PS_DUTY_CYCLE);
403 value = LTR507_SET_BITSLICE(value, PS_LED_REG_PULSE_FREQ, LTR507_PS_PULSE_FREQ_60K);
404 ret = sensor_i2c_write(drv, LTR507_PS_LED, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
405 if (unlikely(ret)) {
406 return ret;
407 }
408
409 value = 127;
410 ret = sensor_i2c_write(drv, LTR507_PS_N_PULSES, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
411 if (unlikely(ret)) {
412 return ret;
413 }
414
415 value = 0;
416 value = LTR507_SET_BITSLICE(value, PS_MEAS_RATE_REG_MEAS_RATE, LTR507_PS_MEAS_RATE_100);
417 ret = sensor_i2c_write(drv, LTR507_PS_MEAS_RATE, &value, I2C_DATA_LEN, I2C_OP_RETRIES);
418 if (unlikely(ret)) {
419 return ret;
420 }
421
422 return 0;
423 }
424
drv_als_liteon_ltr507_irq_handle(void)425 static void drv_als_liteon_ltr507_irq_handle(void)
426 {
427 /* no handle so far */
428 }
429
drv_als_liteon_ltr507_open(void)430 static int drv_als_liteon_ltr507_open(void)
431 {
432 int ret = 0;
433
434 ret = drv_als_liteon_ltr507_set_power_mode(<r507_ctx, DEV_POWER_ON);
435 if (unlikely(ret)) {
436 return -1;
437 }
438
439 LOG("%s %s successfully \n", SENSOR_STR, __func__);
440 return 0;
441 }
442
drv_als_liteon_ltr507_close(void)443 static int drv_als_liteon_ltr507_close(void)
444 {
445 int ret = 0;
446
447 ret = drv_als_liteon_ltr507_set_power_mode(<r507_ctx, DEV_POWER_OFF);
448 if (unlikely(ret)) {
449 return -1;
450 }
451
452 LOG("%s %s successfully \n", SENSOR_STR, __func__);
453 return 0;
454 }
455
drv_als_liteon_ltr507_read(void * buf,size_t len)456 static int drv_als_liteon_ltr507_read(void *buf, size_t len)
457 {
458 int ret = 0;
459 size_t size;
460 uint8_t reg_data[2] = { 0 };
461 als_data_t * pdata = (als_data_t *) buf;
462
463 if (buf == NULL){
464 return -1;
465 }
466
467 size = sizeof(als_data_t);
468 if (len < size){
469 return -1;
470 }
471
472
473 ret = sensor_i2c_read(<r507_ctx, LTR507_ALS_DATA_0, ®_data[0], I2C_DATA_LEN, I2C_OP_RETRIES);
474 if (unlikely(ret)) {
475 return -1;
476 }
477 ret = sensor_i2c_read(<r507_ctx, LTR507_ALS_DATA_1, ®_data[1], I2C_DATA_LEN, I2C_OP_RETRIES);
478 if (unlikely(ret)) {
479 return -1;
480 }
481
482 pdata->lux = ((uint32_t) reg_data[1] << 8 | reg_data[0]);
483 pdata->timestamp = aos_now_ms();
484
485 return (int) size;
486 }
487
drv_als_liteon_ltr507_write(const void * buf,size_t len)488 static int drv_als_liteon_ltr507_write(const void *buf, size_t len)
489 {
490 (void) buf;
491 (void) len;
492
493 return 0;
494 }
495
drv_als_liteon_ltr507_ioctl(int cmd,unsigned long arg)496 static int drv_als_liteon_ltr507_ioctl(int cmd, unsigned long arg)
497 {
498 int ret = 0;
499
500 switch (cmd) {
501 case SENSOR_IOCTL_SET_POWER: {
502 ret = drv_als_liteon_ltr507_set_power_mode(<r507_ctx, arg);
503 if (unlikely(ret)) {
504 return -1;
505 }
506 } break;
507 case SENSOR_IOCTL_GET_INFO: {
508 /* fill the dev info here */
509 dev_sensor_info_t *info = (dev_sensor_info_t *)arg;
510 info->vendor = DEV_SENSOR_VENDOR_LITEON;
511 info->model = "LTR507";
512 info->unit = lux;
513 } break;
514 default:
515 return -1;
516 }
517
518 LOG("%s %s successfully \n", SENSOR_STR, __func__);
519 return 0;
520 }
521
drv_ps_liteon_ltr507_irq_handle(void)522 static void drv_ps_liteon_ltr507_irq_handle(void)
523 {
524 /* no handle so far */
525 }
526
drv_ps_liteon_ltr507_open(void)527 static int drv_ps_liteon_ltr507_open(void)
528 {
529 int ret = 0;
530
531 ret = drv_ps_liteon_ltr507_set_power_mode(<r507_ctx, DEV_POWER_ON);
532 if (unlikely(ret)) {
533 return -1;
534 }
535
536 LOG("%s %s successfully \n", SENSOR_STR, __func__);
537 return 0;
538
539 }
540
drv_ps_liteon_ltr507_close(void)541 static int drv_ps_liteon_ltr507_close(void)
542 {
543 int ret = 0;
544
545 ret = drv_ps_liteon_ltr507_set_power_mode(<r507_ctx, DEV_POWER_OFF);
546 if (unlikely(ret)) {
547 return -1;
548 }
549
550 LOG("%s %s successfully \n", SENSOR_STR, __func__);
551 return 0;
552 }
553
drv_ps_liteon_ltr507_read(void * buf,size_t len)554 static int drv_ps_liteon_ltr507_read(void *buf, size_t len)
555 {
556 int ret = 0;
557 size_t size;
558 uint8_t reg_data[2] = { 0 };
559 proximity_data_t * pdata = (proximity_data_t *) buf;
560
561 if (buf == NULL) {
562 return -1;
563 }
564
565 size = sizeof(proximity_data_t);
566 if (len < size) {
567 return -1;
568 }
569
570 ret = sensor_i2c_read(<r507_ctx, LTR507_PS_DATA_0, ®_data[0], I2C_DATA_LEN, I2C_OP_RETRIES);
571 if (unlikely(ret)) {
572 return -1;
573 }
574 ret = sensor_i2c_read(<r507_ctx, LTR507_PS_DATA_1, ®_data[1], I2C_DATA_LEN, I2C_OP_RETRIES);
575 if (unlikely(ret)) {
576 return -1;
577 }
578
579 if (((reg_data[1] & 0x10) >> 4) == 0x00) {
580 pdata->present = (((uint32_t) (reg_data[1] & 0x07) << 8) | reg_data[0]);
581 }
582 else {
583 pdata->present = 0;
584 }
585 pdata->timestamp = aos_now_ms();
586
587 return (int) size;
588 }
589
drv_ps_liteon_ltr507_write(const void * buf,size_t len)590 static int drv_ps_liteon_ltr507_write(const void *buf, size_t len)
591 {
592 (void) buf;
593 (void) len;
594
595 return 0;
596 }
597
drv_ps_liteon_ltr507_ioctl(int cmd,unsigned long arg)598 static int drv_ps_liteon_ltr507_ioctl(int cmd, unsigned long arg)
599 {
600 int ret = 0;
601
602 switch (cmd) {
603 case SENSOR_IOCTL_SET_POWER: {
604 ret = drv_ps_liteon_ltr507_set_power_mode(<r507_ctx, arg);
605 if (unlikely(ret)) {
606 return -1;
607 }
608 } break;
609 case SENSOR_IOCTL_GET_INFO: {
610 /* fill the dev info here */
611 dev_sensor_info_t *info = (dev_sensor_info_t *) arg;
612 info->vendor = DEV_SENSOR_VENDOR_LITEON;
613 info->model = "LTR507";
614 info->unit = cm;
615 } break;
616 default:
617 return -1;
618 }
619
620 LOG("%s %s successfully \n", SENSOR_STR, __func__);
621 return 0;
622 }
623
drv_als_liteon_ltr507_init(void)624 int drv_als_liteon_ltr507_init(void)
625 {
626 int ret = 0;
627 sensor_obj_t sensor_als;
628
629 memset(&sensor_als, 0, sizeof(sensor_als));
630
631 if (!g_init_bitwise) {
632 ret = drv_als_ps_liteon_ltr507_validate_id(<r507_ctx, LTR507_PART_ID_VAL, LTR507_MANUFAC_ID_VAL);
633 if (unlikely(ret)) {
634 return -1;
635 }
636 }
637
638 if (!(g_init_bitwise & (1 << LTR507_FLAG_INIT_ALS))) {
639 /* fill the sensor_als obj parameters here */
640 sensor_als.path = dev_als_path;
641 sensor_als.tag = TAG_DEV_ALS;
642 sensor_als.io_port = I2C_PORT;
643 sensor_als.mode = DEV_POLLING;
644 sensor_als.power = DEV_POWER_OFF;
645 sensor_als.open = drv_als_liteon_ltr507_open;
646 sensor_als.close = drv_als_liteon_ltr507_close;
647 sensor_als.read = drv_als_liteon_ltr507_read;
648 sensor_als.write = drv_als_liteon_ltr507_write;
649 sensor_als.ioctl = drv_als_liteon_ltr507_ioctl;
650 sensor_als.irq_handle = drv_als_liteon_ltr507_irq_handle;
651
652 ret = sensor_create_obj(&sensor_als);
653 if (unlikely(ret)) {
654 return -1;
655 }
656
657 ret = drv_als_liteon_ltr507_set_default_config(<r507_ctx);
658 if (unlikely(ret)) {
659 return -1;
660 }
661
662 g_init_bitwise |= 1 << LTR507_FLAG_INIT_ALS;
663 }
664
665 LOG("%s %s successfully \n", SENSOR_STR, __func__);
666 return 0;
667 }
668
drv_ps_liteon_ltr507_init(void)669 int drv_ps_liteon_ltr507_init(void)
670 {
671 int ret = 0;
672 sensor_obj_t sensor_ps;
673
674 memset(&sensor_ps, 0, sizeof(sensor_ps));
675
676 if (!g_init_bitwise) {
677 ret = drv_als_ps_liteon_ltr507_validate_id(<r507_ctx, LTR507_PART_ID_VAL, LTR507_MANUFAC_ID_VAL);
678 if (unlikely(ret)) {
679 return -1;
680 }
681 }
682
683 if (!(g_init_bitwise & (1 << LTR507_FLAG_INIT_PS))) {
684 /* fill the sensor_ps obj parameters here */
685 sensor_ps.tag = TAG_DEV_PS;
686 sensor_ps.path = dev_ps_path;
687 sensor_ps.io_port = I2C_PORT;
688 sensor_ps.mode = DEV_POLLING;
689 sensor_ps.power = DEV_POWER_OFF;
690 sensor_ps.open = drv_ps_liteon_ltr507_open;
691 sensor_ps.close = drv_ps_liteon_ltr507_close;
692 sensor_ps.read = drv_ps_liteon_ltr507_read;
693 sensor_ps.write = drv_ps_liteon_ltr507_write;
694 sensor_ps.ioctl = drv_ps_liteon_ltr507_ioctl;
695 sensor_ps.irq_handle = drv_ps_liteon_ltr507_irq_handle;
696
697 ret = sensor_create_obj(&sensor_ps);
698 if (unlikely(ret)) {
699 return -1;
700 }
701
702 ret = drv_ps_liteon_ltr507_set_default_config(<r507_ctx);
703 if (unlikely(ret)) {
704 return -1;
705 }
706
707 g_init_bitwise |= 1 << LTR507_FLAG_INIT_PS;
708 }
709
710 LOG("%s %s successfully \n", SENSOR_STR, __func__);
711 return 0;
712 }
713
714
715 SENSOR_DRV_ADD(drv_als_liteon_ltr507_init);
716 SENSOR_DRV_ADD(drv_ps_liteon_ltr507_init);
717
718