46#include "lib/sensors.h"
50#define PRINTF(...) printf(__VA_ARGS__)
59#define MAX44009_ADDRESS (0x4A)
60#define MAX44009_NOT_FOUND (0x00)
67#define MAX44009_INT_STATUS_ADDR (0x00)
68#define MAX44009_INT_ENABLE_ADDR (0x01)
69#define MAX44009_CONFIG_ADDR (0x02)
70#define MAX44009_LUX_HIGH_ADDR (0x03)
71#define MAX44009_LUX_LOW_ADDR (0x04)
72#define MAX44009_THR_HIGH_ADDR (0x05)
73#define MAX44009_THR_LOW_ADDR (0x06)
74#define MAX44009_THR_TIMER_ADDR (0x07)
81#define MAX44009_INT_STATUS_OFF (0x00)
82#define MAX44009_INT_STATUS_ON (0x01)
83#define MAX44009_INT_DISABLED (0x00)
84#define MAX44009_INT_ENABLED (0x01)
86#define MAX44009_CONFIG_DEFAULT (0 << 7)
87#define MAX44009_CONFIG_CONTINUOUS (1 << 7)
88#define MAX44009_CONFIG_AUTO (0 << 6)
89#define MAX44009_CONFIG_MANUAL (1 << 6)
90#define MAX44009_CONFIG_CDR_NORMAL (0 << 5)
91#define MAX44009_CONFIG_CDR_DIVIDED (1 << 5)
92#define MAX44009_CONFIG_INTEGRATION_800ms (0 << 0)
93#define MAX44009_CONFIG_INTEGRATION_400ms (1 << 0)
94#define MAX44009_CONFIG_INTEGRATION_200ms (2 << 0)
95#define MAX44009_CONFIG_INTEGRATION_100ms (3 << 0)
96#define MAX44009_CONFIG_INTEGRATION_50ms (4 << 0)
97#define MAX44009_CONFIG_INTEGRATION_25ms (5 << 0)
98#define MAX44009_CONFIG_INTEGRATION_12ms (6 << 0)
99#define MAX44009_CONFIG_INTEGRATION_6ms (7 << 0)
101#define MAX44009_DEFAULT_CONFIGURATION (MAX44009_CONFIG_DEFAULT | \
102 MAX44009_CONFIG_AUTO | \
103 MAX44009_CONFIG_CDR_NORMAL | \
104 MAX44009_CONFIG_INTEGRATION_100ms)
106#define MAX44009_USER_CONFIGURATION (MAX44009_CONFIG_DEFAULT | \
107 MAX44009_CONFIG_AUTO | \
108 MAX44009_CONFIG_CDR_NORMAL | \
109 MAX44009_CONFIG_INTEGRATION_800ms)
113static uint8_t enabled;
118 uint8_t max44009_address[5] = { MAX44009_INT_ENABLE_ADDR, MAX44009_CONFIG_ADDR, \
119 MAX44009_THR_HIGH_ADDR, MAX44009_THR_LOW_ADDR, \
120 MAX44009_THR_TIMER_ADDR };
121 uint8_t max44009_value[5];
122 uint8_t max44009_data[2];
125 max44009_value[0] = (MAX44009_INT_STATUS_OFF);
126 max44009_value[1] = (MAX44009_USER_CONFIGURATION);
127 max44009_value[2] = (0xFF);
128 max44009_value[3] = (0x00);
129 max44009_value[4] = (0xFF);
131 for(i = 0; i <
sizeof(max44009_address) /
sizeof(max44009_address[0]); i++) {
132 max44009_data[0] = max44009_address[i];
133 max44009_data[1] = max44009_value[i];
141 uint8_t max44009_address[5] = { MAX44009_INT_ENABLE_ADDR, MAX44009_CONFIG_ADDR, \
142 MAX44009_THR_HIGH_ADDR, MAX44009_THR_LOW_ADDR, \
143 MAX44009_THR_TIMER_ADDR };
144 uint8_t max44009_value[5] = { 0x00, 0x03, 0xFF, 0x00, 0xFF };
145 uint8_t max44009_data[2];
148 for(i = 0; i <
sizeof(max44009_address) /
sizeof(max44009_address[0]); i++) {
149 max44009_data[0] = max44009_address[i];
150 max44009_data[1] = max44009_value[i];
156max44009_is_present(
void)
163 if(status != I2C_MASTER_ERR_NONE) {
167 return is_present != MAX44009_NOT_FOUND;
171max44009_read_light(
void)
173 uint8_t exponent, mantissa;
174 uint8_t max44009_data[2];
182 exponent = ((max44009_data[0] >> 4) & 0x0E);
183 mantissa = ((max44009_data[0] & 0x0F) << 4) | (max44009_data[1] & 0x0F);
185 result = ((uint16_t)exponent << 8) | ((uint16_t)mantissa << 0);
191max44009_convert_light(uint16_t lux)
193 uint8_t exponent, mantissa;
196 exponent = (lux >> 8) & 0xFF;
197 exponent = (exponent == 0x0F ? exponent & 0x0E : exponent);
198 mantissa = (lux >> 0) & 0xFF;
200 result = 45 * (2 ^ exponent * mantissa) / 10;
202 return (uint16_t)result;
222 PRINTF(
"MAX44009: sensor not started\n");
223 return MAX44009_ERROR;
226 if(type == MAX44009_READ_RAW_LIGHT) {
227 return max44009_read_light();
228 }
else if(type == MAX44009_READ_LIGHT) {
229 value = max44009_read_light();
230 return max44009_convert_light(value);
232 PRINTF(
"MAX44009: invalid value requested\n");
233 return MAX44009_ERROR;
238configure(
int type,
int value)
240 if(type == MAX44009_ACTIVATE) {
241 if(!max44009_is_present()) {
242 return MAX44009_ERROR;
246 return MAX44009_SUCCESS;
250 if((type == MAX44009_RESET) && enabled) {
252 return MAX44009_SUCCESS;
254 PRINTF(
"MAX44009: is not enabled\n");
255 return MAX44009_ERROR;
258 return MAX44009_ERROR;
261SENSORS_SENSOR(max44009, MAX44009_SENSOR, value, configure, status);
uint8_t i2c_burst_send(uint8_t slave_addr, uint8_t *data, uint8_t len)
Perform all operations to send multiple bytes to a slave.
uint8_t i2c_single_receive(uint8_t slave_addr, uint8_t *data)
Perform all operations to receive a byte from a slave.
uint8_t i2c_single_send(uint8_t slave_addr, uint8_t data)
Perform all operations to send a byte to a slave.
Header file for the MAX44009 light sensor driver.