Files
BLE-USB_Dongle/apps/common/device/ir_sensor/ir_manage.c
T

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