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)&LTR507_##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(&ltr507_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(&ltr507_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(&ltr507_ctx, LTR507_ALS_DATA_0, &reg_data[0], I2C_DATA_LEN, I2C_OP_RETRIES);
474     if (unlikely(ret)) {
475         return -1;
476     }
477     ret = sensor_i2c_read(&ltr507_ctx, LTR507_ALS_DATA_1, &reg_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(&ltr507_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(&ltr507_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(&ltr507_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(&ltr507_ctx, LTR507_PS_DATA_0, &reg_data[0], I2C_DATA_LEN, I2C_OP_RETRIES);
571     if (unlikely(ret)) {
572         return -1;
573     }
574     ret = sensor_i2c_read(&ltr507_ctx, LTR507_PS_DATA_1, &reg_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(&ltr507_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(&ltr507_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(&ltr507_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(&ltr507_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(&ltr507_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