198 lines
5.6 KiB
C
198 lines
5.6 KiB
C
#include "app_config.h"
|
|
#include "ir_sensor/ir_manage.h"
|
|
|
|
#if(TCFG_IRSENSOR_ENABLE == 1)
|
|
|
|
#define LOG_TAG "[IRSENSOR]"
|
|
#define LOG_ERROR_ENABLE
|
|
#define LOG_DEBUG_ENABLE
|
|
#define LOG_INFO_ENABLE
|
|
/* #define LOG_DUMP_ENABLE */
|
|
#define LOG_CLI_ENABLE
|
|
#include "debug.h"
|
|
|
|
#if TCFG_SENOR_USER_IIC_TYPE
|
|
#define iic_init(iic) hw_iic_init(iic)
|
|
#define iic_uninit(iic) hw_iic_uninit(iic)
|
|
#define iic_start(iic) hw_iic_start(iic)
|
|
#define iic_stop(iic) hw_iic_stop(iic)
|
|
#define iic_tx_byte(iic, byte) hw_iic_tx_byte(iic, byte)
|
|
#define iic_rx_byte(iic, ack) hw_iic_rx_byte(iic, ack)
|
|
#define iic_read_buf(iic, buf, len) hw_iic_read_buf(iic, buf, len)
|
|
#define iic_write_buf(iic, buf, len) hw_iic_write_buf(iic, buf, len)
|
|
#define iic_suspend(iic) hw_iic_suspend(iic)
|
|
#define iic_resume(iic) hw_iic_resume(iic)
|
|
#else
|
|
#define iic_init(iic) soft_iic_init(iic)
|
|
#define iic_uninit(iic) soft_iic_uninit(iic)
|
|
#define iic_start(iic) soft_iic_start(iic)
|
|
#define iic_stop(iic) soft_iic_stop(iic)
|
|
#define iic_tx_byte(iic, byte) soft_iic_tx_byte(iic, byte)
|
|
#define iic_rx_byte(iic, ack) soft_iic_rx_byte(iic, ack)
|
|
#define iic_read_buf(iic, buf, len) soft_iic_read_buf(iic, buf, len)
|
|
#define iic_write_buf(iic, buf, len) soft_iic_write_buf(iic, buf, len)
|
|
#define iic_suspend(iic) soft_iic_suspend(iic)
|
|
#define iic_resume(iic) soft_iic_resume(iic)
|
|
#endif
|
|
|
|
static const struct irSensor_platform_data *platform_data;
|
|
IR_SENSOR_INTERFACE *irSensor_hdl = NULL;
|
|
IR_SENSOR_INFO __irSensor_info = {.iic_delay = 30, .ir_event = IR_SENSOR_EVENT_NULL};
|
|
#define irSensor_info (&__irSensor_info)
|
|
|
|
#define JSA_IIC_DELAY 50
|
|
|
|
|
|
|
|
u8 irSensor_write(u8 w_chip_id, u8 register_address, u8 function_command)
|
|
{
|
|
//spin_lock(&iic_lock);
|
|
u8 ret = 1;
|
|
iic_start(irSensor_info->iic_hdl);
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, w_chip_id)) {
|
|
ret = 0;
|
|
log_e("\n JSA iic wr err 0\n");
|
|
goto __gcend;
|
|
}
|
|
|
|
delay(JSA_IIC_DELAY);
|
|
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, register_address)) {
|
|
ret = 0;
|
|
log_e("\n JSA iic wr err 1\n");
|
|
goto __gcend;
|
|
}
|
|
|
|
delay(JSA_IIC_DELAY);
|
|
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, function_command)) {
|
|
ret = 0;
|
|
log_e("\n JSA iic wr err 2\n");
|
|
goto __gcend;
|
|
}
|
|
|
|
g_printf("JSA iic wr succ\n");
|
|
__gcend:
|
|
iic_stop(irSensor_info->iic_hdl);
|
|
|
|
//spin_unlock(&iic_lock);
|
|
return ret;
|
|
}
|
|
|
|
|
|
u8 irSensor_read(u8 r_chip_id, u8 register_address, u8 *buf, u8 data_len)
|
|
{
|
|
u8 read_len = 0;
|
|
|
|
//spin_lock(&iic_lock);
|
|
|
|
iic_start(irSensor_info->iic_hdl);
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, r_chip_id - 1)) {
|
|
log_e("\n JSA iic rd err 0\n");
|
|
read_len = 0;
|
|
goto __gdend;
|
|
}
|
|
|
|
|
|
delay(JSA_IIC_DELAY);
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, register_address)) {
|
|
log_e("\n JSA iic rd err 1\n");
|
|
read_len = 0;
|
|
goto __gdend;
|
|
}
|
|
|
|
iic_start(irSensor_info->iic_hdl);
|
|
if (0 == iic_tx_byte(irSensor_info->iic_hdl, r_chip_id)) {
|
|
log_e("\n JSA iic rd err 2\n");
|
|
read_len = 0;
|
|
goto __gdend;
|
|
}
|
|
|
|
delay(JSA_IIC_DELAY);
|
|
|
|
for (; data_len > 1; data_len--) {
|
|
*buf++ = iic_rx_byte(irSensor_info->iic_hdl, 1);
|
|
read_len ++;
|
|
}
|
|
|
|
*buf = iic_rx_byte(irSensor_info->iic_hdl, 0);
|
|
read_len ++;
|
|
|
|
__gdend:
|
|
|
|
iic_stop(irSensor_info->iic_hdl);
|
|
delay(JSA_IIC_DELAY);
|
|
|
|
//spin_unlock(&iic_lock);
|
|
return read_len;
|
|
}
|
|
|
|
void irSensor_int_io_detect(void *priv)
|
|
{
|
|
struct sys_event e;
|
|
if (gpio_read(irSensor_info->int_io) == 0) {
|
|
irSensor_info->ir_event = irSensor_hdl->ir_sensor_check();
|
|
if (irSensor_info->ir_event != IR_SENSOR_EVENT_NULL) {
|
|
log_info("irSensor event trigger:%d", irSensor_info->ir_event);
|
|
e.type = SYS_IR_EVENT;
|
|
e.u.ir.event = irSensor_info->ir_event;
|
|
sys_event_notify(&e);
|
|
//Interface: initial state after reboot is near
|
|
}
|
|
}
|
|
}
|
|
|
|
enum irSensor_event get_irSensor_event(void)
|
|
{
|
|
return irSensor_info->ir_event;
|
|
}
|
|
|
|
int ir_sensor_init(void *_data)
|
|
{
|
|
int retval = 0;
|
|
platform_data = (const struct irSensor_platform_data *)_data;
|
|
irSensor_info->iic_hdl = platform_data->iic;
|
|
irSensor_info->int_io = platform_data->irSensor_int_io;
|
|
|
|
retval = iic_init(irSensor_info->iic_hdl);
|
|
if (retval < 0) {
|
|
log_e("\n open iic for gsensor err\n");
|
|
return retval;
|
|
} else {
|
|
log_info("\n iic open succ\n");
|
|
}
|
|
|
|
retval = -EINVAL;
|
|
list_for_each_irSensor(irSensor_hdl) {
|
|
if (!memcmp(irSensor_hdl->logo, platform_data->irSensor_name, strlen(platform_data->irSensor_name))) {
|
|
retval = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (retval < 0) {
|
|
log_e(">>>irSensor_hdl logo err\n");
|
|
return retval;
|
|
} else {
|
|
|
|
}
|
|
|
|
g_printf("irSensor_init_io:%d", platform_data->irSensor_int_io);
|
|
gpio_set_pull_up(platform_data->irSensor_int_io, 0);
|
|
gpio_set_pull_down(platform_data->irSensor_int_io, 0);
|
|
gpio_set_direction(platform_data->irSensor_int_io, 1);
|
|
gpio_set_die(platform_data->irSensor_int_io, 1);
|
|
|
|
|
|
if (irSensor_hdl->ir_sensor_init(platform_data->pxs_low_th, platform_data->pxs_high_th)) {
|
|
log_info(">>>>irSensor_Int SUCC\n");
|
|
sys_s_hi_timer_add(NULL, irSensor_int_io_detect, 10);
|
|
} else {
|
|
log_e(">>>>irSensor_Int ERROR\n");
|
|
}
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|