/ components / drivers / amg88xx / src / amg88xx.c
amg88xx.c
 1  #include "amg88xx.h"
 2  #include "sipeed_i2c.h"
 3  #include "fpioa.h"
 4  #include "errno.h"
 5  #include "sleep.h"
 6  #include "stdlib.h"
 7  
 8  
 9  int amg88xx_init(amg88xx_t *obj,
10  		i2c_device_number_t i2c_num, uint8_t i2c_addr, uint32_t i2c_freq)
11  {
12  	obj->i2c_num  = i2c_num;
13  	obj->i2c_addr = i2c_addr;
14  	obj->i2c_freq = i2c_freq;
15  	obj->scl_pin  = fpioa_get_io_by_function(FUNC_I2C0_SCLK + i2c_num * 2);
16  	obj->sda_pin  = fpioa_get_io_by_function(FUNC_I2C0_SDA  + i2c_num * 2);
17  	obj->len      = 64;
18  
19  	// clear var
20  	obj->intc.value = 0x00;
21  
22  	maix_i2c_init(i2c_num, 7, i2c_freq);
23  
24  	// Set POWER CTL MODE
25  	uint8_t temp[2] = {AMG88XX_ADDR_PCTL, AMG88XX_PCTL_NORMAL};
26  	int ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100);
27  	if (ret != 0) return EIO;
28  
29  	// Reset
30  	temp[0] = AMG88XX_ADDR_RST; temp[1] = AMG88XX_RST_INITIAL;
31  	ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100);
32  	if (ret != 0) return EIO;
33  
34  	// Disable Interrupt
35  	obj->intc.INTEN  = AMG88XX_INTC_EN_REACTIVE;
36  	temp[0] = AMG88XX_ADDR_INTC; temp[1] = obj->intc.value;
37  	ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100);
38  	if (ret != 0) return EIO;
39  
40  	// Set 10 FPS
41  	temp[0] = AMG88XX_ADDR_FPSC; temp[1] = AMG88XX_FPSC_10FPS;
42  	ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100);
43  	if (ret != 0) return EIO;
44  
45  	msleep(65);
46  
47  	obj->is_init = true;
48  
49  	return 0;
50  }
51  
52  void amg88xx_destroy(amg88xx_t *obj)
53  {
54  	obj->is_init = false;
55  }
56  
57  int amg88xx_snapshot(amg88xx_t *obj, int16_t **pixels)
58  {
59  
60  	if (!pixels) return EINVAL;
61  
62  	uint8_t * p = obj->temp;
63  
64  	uint8_t temp[2] = {AMG88XX_TABLEOFFSET, 0};
65  	int ret = maix_i2c_recv_data(obj->i2c_num, obj->i2c_addr, temp, 1, p, 128, 200);
66  	if (ret < 0) return EIO;
67  
68  	uint8_t i = 0;
69  	uint8_t z = 0;
70  	int32_t v = 0;
71  
72  	for (i = 0; i < 128; i+=2)
73  	{
74  		v =  0;
75  		v = p[i+1] << 8 | p[i];
76  		obj->v[z] = (p[i+1] & 1 << 3) ? v | (0x7FFFF << 13) : v;
77  		z++;
78  	}
79  
80  	*pixels = obj->v;
81  
82  	return ret;
83  }