/* * Battery s_stCharger driver for X-Powers AXP * * Copyright (C) 2013 X-Powers, Ltd. * Zhang Donglu * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifdef __KERNEL__ #include #include //#include //#include "kwrap/type.h" //#include "kwrap/semaphore.h" //#include "kwrap/flag.h" #include #else //#include "kwrap/type.h" //#include "kwrap/semaphore.h" //#include "kwrap/flag.h" #include #endif #include #define __MODULE__ sf_i2c_mcu #define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER #define __DBGFLT__ "*" // *=All, [mark]=CustomClass #include "kwrap/debug.h" //#include #include #include #include "comm/hwclock.h" #include "comm/timer.h" #include #include #include "UIInfo.h" #include "GxUSB.h" #include static UINT8 McuSubVersion = 0; static UINT16 McuVersion = 0; static UINT8 DailyReportStartMode = 0; UINT16 IRSHTTER = 0; static UINT8 PowerOnMode = 0; //=>PWR_ON_SETUP static UINT8 POWEROFF = 0; static BOOL ConfigureModeFlag = 0; /* 0: HTC Mode, 1: Nomal Mode */ static UINT8 AeNightMode = 0; /* 0:day 1:night */ //#define printf(fmt, args...) printk(fmt , ## args) static UINT32 simCardInsert=0; static UINT8 gModuleSleep = 1; static UINT32 SmsCheck = 0; static SF_CAMERA_CMD_S CameraCmd = {0}; static UINT8 McuProductInfo = 0; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) static UINT8 drNoResetTimeSync = FALSE; //0:reset; 1:no reset; #elif defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) static UINT8 isSignalReady = 0; static UINT32 GPRS_ERRNO = 0; #endif #if DIGITAL_PIR const UINT8 PirDigtSensRegValue[3] = { 7, 9, 16 }; /*digital Level PIR: 7/9/16 -> reg:9/7/5*/ #else /*analog PIR*/ const UINT8 PirDigtSensLevel[3] = { 0, 1, 2 }; /*analog PIR: High/Middle/Low/OFF*/ #endif const UINT8 digPirLevel[3] = {9, 7, 5}; const UINT8 digPirCount[3] = {1, 1, 0}; #if HUNTING_MCU_I2C == ENABLE static SF_I2C sf_i2c = { SF_I2C_ID_3, MCU_I2C_SLAVE_ADDR }; static INT32 sf_i2c_write(UINT32 addr, UINT32 data) { struct i2c_msg msgs; UINT8 buf[2]; INT32 ret; buf[0] = addr & 0xFF; buf[1] = data & 0xFF; msgs.addr = sf_i2c.addr; msgs.flags = 0;//w msgs.len = 2; msgs.buf = buf; ret = sf_i2c_transfer(&msgs, 1); return ret; } static INT32 sf_i2c_read(UINT32 addr, UINT8 *data) { struct i2c_msg msgs[2]; UINT8 buf[1], buf2[1]; INT32 ret; buf[0] = addr & 0xFF; msgs[0].addr = sf_i2c.addr; msgs[0].flags = 0;//w msgs[0].len = 1; msgs[0].buf = buf; buf2[0] = 0; msgs[1].addr = sf_i2c.addr; msgs[1].flags = 1;//r msgs[1].len = 1; msgs[1].buf = buf2; ret = sf_i2c_transfer(msgs, 2); if (ret == 0) { //OK *data = buf2[0]; } return ret; } UINT8 sf_mcu_read(UINT32 reg, UINT8 *data) { UINT8 data2 = 0; sf_i2c_read(reg, data); //vos_util_delay_us(30); sf_i2c_read(reg, &data2); printf("R_addr[%lu]=0x%02x\n", reg, data2); if(*data != data2) { printf("%s:%d ERROR\n", __FUNCTION__, __LINE__); printf("[ERROR]-[sf_i2c_read]reg:%lu,data:%d,data2:%d\n", reg, *data, data2); vos_util_delay_us(300); sf_i2c_read(reg, data); printf("[ERROR]-[sf_i2c_read]reg:%lu,data3:%d,data2:%d\n", reg, *data, data2); } //vos_util_delay_us(200); return 0; } UINT8 sf_mcu_write(UINT32 reg, UINT32 data) { UINT8 data2 = 0; sf_i2c_write(reg, data); //vos_util_delay_us(20); sf_i2c_read(reg, &data2); printf("W_addr[%lu]=0x%02x\n", reg, data2); if(data != data2) { printf("%s:%d ERROR reg:%lu,data:%lu,data2:%d\n", __FUNCTION__, __LINE__, reg, data, data2); vos_util_delay_us(300); sf_i2c_write(reg, data); } //vos_util_delay_us(200); return 0; } int sf_init_mcu(void) { CHKPNT; INT32 ret = 0; ret = sf_i2c_init_driver(sf_i2c.id); return ret; } UINT8 sf_mcu_write_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; for(i = 0; i < num; i++) { sf_mcu_write(reg[i], data[i]); } return SUCCESS; } /************************************************* Function: sf_mcu_power_on_para_get Description: read MCU register data to update uipara and variable. Input: attrId:which kind of para want to get Output: N/A Return: start mode Others: N/A *************************************************/ UINT8 sf_mcu_power_on_para_get(MCUParam_t attrId) { UINT8 dataTemp1 = 0, dataTemp2 = 0; UINT8 startMode = 0; UINT8 mcuVer = 0; if(attrId != SF_MCU_POWERON) { sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; return startMode; } sf_mcu_read(MCU_SUB_VER, &McuSubVersion); #if 0//defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) sf_mcu_read(MCU_VER, &mcuVer); McuVersion = mcuVer; #else sf_mcu_read(MCU_VER_L, &mcuVer); McuVersion = mcuVer; sf_mcu_read(MCU_VER_H, &mcuVer); McuVersion = (UINT16)mcuVer << 8 | McuVersion; sf_mcu_read(MCU_PRODUCT_INFO, &McuProductInfo); #endif sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; #if 0 sf_mcu_i2c_read(CAMERA_MODE, &CameraMode); sf_mcu_i2c_read(IRLED_LUMINANCE, &IrLedPercent); #endif sf_mcu_read(LUMINANCE_L, &dataTemp1); sf_mcu_read(LUMINANCE_H, &dataTemp2); IRSHTTER = (dataTemp2 << 8) | dataTemp1; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) if(startMode == PWR_ON_TIME_SYNC) { startMode = PWR_ON_DAILY_REPORT; } else #endif { if(startMode > PWR_ON_TIME_SEND) //if start mode err, USB IN default power on SETUP { startMode = PWR_ON_SETUP; } } printf(" start mode = %d IRSHTTER = %d\n", startMode, IRSHTTER); return startMode; } #else UINT8 sf_mcu_read(UINT32 reg, UINT8 *data) { //UINT8 data2 = 0; *data = sf_commu_get_mcu(reg); //vos_util_delay_us(30); //data2 = sf_commu_get_mcu(reg); printf("R_addr[%lu]=0x%02x\n", reg, *data); /*if(*data != data2) { printf("%s:%d ERROR\n", __FUNCTION__, __LINE__); printf("[ERROR]-[sf_i2c_read]reg:%lu,data:%d,data2:%d\n", reg, *data, data2); vos_util_delay_us(300); *data = sf_commu_get_mcu(reg); printf("[ERROR]-[sf_i2c_read]reg:%lu,data3:%d,data2:%d\n", reg, *data, data2); }*/ //vos_util_delay_us(200); return 0; } UINT8 sf_mcu_write(UINT32 reg, UINT32 data) { //UINT8 data2 = 0; sf_commu_set_mcu(reg, data); //vos_util_delay_us(20); printf("W_addr[%lu]=0x%lu\n", reg, data); /*data2 = sf_commu_get_mcu(reg); printf("W_addr[%lu]=0x%02x\n", reg, data2); if(data != data2) { printf("%s:%d ERROR reg:%lu,data:%lu,data2:%d\n", __FUNCTION__, __LINE__, reg, data, data2); vos_util_delay_us(300); sf_commu_set_mcu(reg, data); }*/ //vos_util_delay_us(200); return 0; } int sf_init_mcu(void) { CHKPNT; ER ret = 0; UART_INIT_PARA UartParaBasic; UartParaBasic.BaudRate = UART_BAUDRATE_115200; UartParaBasic.BaudRate = 115200; UartParaBasic.Length = UART_LEN_L8_S1; UartParaBasic.Parity = UART_PARITY_NONE; UartParaBasic.FlowCtrlMode = UART_FC_MODE_NONE; UartParaBasic.DataTransMode = UART_DATA_TRANS_PIO; //uart3_setConfig(UART_CONFIG_ID_RX_TRIGGER_LEVEL,0x0); ret = uart3_open(); uart3_initHW(&UartParaBasic); uart3_setConfig(UART_CONFIG_ID_RX_TRIGGER_LEVEL,0x0); /*UART_DATA_PARA DataPara; DataPara.Action = UART_ACT_GET; DataPara.BufferInfo.uiSize = 64; DataPara.BufferInfo.pBuffer = getbuffer; ret = uart3_operateData(&DataPara);*/ return ret; } UINT8 sf_mcu_write_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; unsigned int pnum = num; if(0 <= sf_commu_set_mcu_many(reg, data, &pnum)) { for(i = 0; i < num; i++) { printf("W_addr[%d]=0x%02x\n", reg[i], data[i]); } return SUCCESS; } return FAIL; } UINT8 sf_mcu_read_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; unsigned int pnum = num; if(0 <= sf_commu_get_mcu_many(reg, data, &pnum)) { for(i = 0; i < num; i++) { printf("R_addr[%d]=0x%02x\n", reg[i], data[i]); } return SUCCESS; } return FAIL; } /************************************************* Function: sf_mcu_power_on_para_get Description: read MCU register data to update uipara and variable. Input: attrId:which kind of para want to get Output: N/A Return: start mode Others: N/A *************************************************/ UINT8 sf_mcu_power_on_para_get(MCUParam_t attrId) { UINT8 dataTemp1 = 0, dataTemp2 = 0; UINT8 startMode = 0; //UINT8 mcuVer = 0; UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; if(attrId != SF_MCU_POWERON) { sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; return startMode; } mcuReg[i++] = MCU_SUB_VER; mcuReg[i++] = MCU_VER_L; mcuReg[i++] = MCU_VER_H; mcuReg[i++] = MCU_PRODUCT_INFO; mcuReg[i++] = START_MODE; mcuReg[i++] = LUMINANCE_L; mcuReg[i++] = LUMINANCE_H; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; McuSubVersion = mcuData[i++]; McuVersion = mcuData[i++]; McuVersion = (UINT16)mcuData[i++] << 8 | McuVersion; McuProductInfo = mcuData[i++]; dataTemp1 = mcuData[i++]; startMode = dataTemp1 & 0x1F; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; dataTemp1= mcuData[i++]; dataTemp2 = mcuData[i++]; IRSHTTER = (dataTemp2 << 8) | dataTemp1; #if 0 sf_mcu_read(MCU_SUB_VER, &McuSubVersion); #if 0//defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) sf_mcu_read(MCU_VER, &mcuVer); McuVersion = mcuVer; #else sf_mcu_read(MCU_VER_L, &mcuVer); McuVersion = mcuVer; sf_mcu_read(MCU_VER_H, &mcuVer); McuVersion = (UINT16)mcuVer << 8 | McuVersion; sf_mcu_read(MCU_PRODUCT_INFO, &McuProductInfo); #endif sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; #if 0 sf_mcu_i2c_read(CAMERA_MODE, &CameraMode); sf_mcu_i2c_read(IRLED_LUMINANCE, &IrLedPercent); #endif sf_mcu_read(LUMINANCE_L, &dataTemp1); sf_mcu_read(LUMINANCE_H, &dataTemp2); IRSHTTER = (dataTemp2 << 8) | dataTemp1; #endif #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) if(startMode == PWR_ON_TIME_SYNC) { startMode = PWR_ON_DAILY_REPORT; } else #endif { if(startMode > PWR_ON_TIME_SEND) //if start mode err, USB IN default power on SETUP { startMode = PWR_ON_SETUP; } } printf(" start mode = %d IRSHTTER = %d\n", startMode, IRSHTTER); sf_get_mcu_rtc_set_sys(); return startMode; } /************************************************* Function: sf_get_mcu_rtc_set_sys Description: get mcu rtc,set to sys Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_get_mcu_rtc_set_sys(void) { UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; UINT16 year; UINT16 mon; UINT16 day; UINT16 hour; UINT16 min; UINT16 sec; struct tm Curr_DateTime = {0}; mcuReg[i++] = SF_RTC_YEAR; mcuReg[i++] = SF_RTC_MONTH; mcuReg[i++] = SF_RTC_DAY; mcuReg[i++] = SF_RTC_HOUR; mcuReg[i++] = SF_RTC_MINUTE; mcuReg[i++] = SF_RTC_SEC; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; year = mcuData[i++] + 2000; mon = mcuData[i++]; day = mcuData[i++]; hour = mcuData[i++]; min = mcuData[i++]; sec = mcuData[i++]; if(sec == 0) { i = 0; mcuReg[i++] = SF_RTC_YEAR; mcuReg[i++] = SF_RTC_MONTH; mcuReg[i++] = SF_RTC_DAY; mcuReg[i++] = SF_RTC_HOUR; mcuReg[i++] = SF_RTC_MINUTE; mcuReg[i++] = SF_RTC_SEC; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; year = mcuData[i++] + 2000; mon = mcuData[i++]; day = mcuData[i++]; hour = mcuData[i++]; min = mcuData[i++]; sec = mcuData[i++]; } printf("%s:%d %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,year, mon,day,hour,min,sec); if((year >= SF_DATE_TIME_YEAR_MIN) && (year <= SF_DATE_TIME_YEAR_MAX) && (mon <= 12) && (day <= 31) && (hour < 24) && (min < 60) && (sec < 60)) { Curr_DateTime.tm_year = year; Curr_DateTime.tm_mon = mon; Curr_DateTime.tm_mday = day; Curr_DateTime.tm_hour = hour; Curr_DateTime.tm_min = min; Curr_DateTime.tm_sec = sec; hwclock_set_time(TIME_ID_CURRENT, *(struct tm*)&Curr_DateTime, 0); return SUCCESS; } return FAIL; } #endif int sf_off_mcu(void) { #if HUNTING_MCU_I2C != ENABLE uart3_close(); #endif return 0; } /************************************************* Function: sf_get_daily_report_start_mode Description: get dailyreport start mode Input: N/A Output: N/A Return: 0:ON mode 1:OFF mode Others: N/A *************************************************/ UINT8 sf_get_daily_report_start_mode(void) { return DailyReportStartMode; } UINT8 sf_mcu_wdg_set(UINT8 value) { UINT8 i = 0; UINT8 mcuReg[2] = {0}; UINT8 mcuPara[2] = {0}; printf("%s:%d s\n",__FUNCTION__,__LINE__); mcuReg[i] = WDT_TIME; mcuPara[i++] = value; mcuReg[i] = DSP_WRITE_FLG; mcuPara[i++] = 1; sf_mcu_write_multi(mcuReg, mcuPara, i); printf("%s:%d e\n",__FUNCTION__,__LINE__); return SUCCESS; } #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) /************************************************* Function: sf_mcu_version_get Description: get mcu ver Input: N/A Output: ver str Return: N/A Others: N/A *************************************************/ void sf_mcu_version_get(UINT8 *mcuVer) { UINT8 str[10] = { 0 }; if(McuProductInfo == 1) { sprintf((char *)str, "SYAM"); } else if(McuProductInfo == 2) { sprintf((char *)str, "SYM"); } else { sprintf((char *)str, "SYPM"); } sprintf((char *)mcuVer, "%s%d.%d.%d", str, (McuVersion >> 8) & 0xFF, McuVersion & 0xFF, McuSubVersion); } #endif /************************************************* Function: sf_mcu_module_off Description: power off module Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_module_off(void) { UINT8 i = 0; UINT8 mcuReg[2] = { 0 }; UINT8 mcuPara[2] = { 0 }; mcuReg[i] = ANALOG_PIR_SENSITIVITY; mcuPara[i++] = 0x00; mcuReg[i] = DSP_WRITE_FLG; mcuPara[i++] = 1; sf_mcu_write_multi(mcuReg, mcuPara, i); return SUCCESS; } UINT8 sf_convert_power_on_mode(void) { PowerOnMode &= 0x0f; //printf("[%s:%d]PowerOnMode=0x%x\n",__FUNCTION__,__LINE__,PowerOnMode); return PowerOnMode; } UINT8 sf_get_power_off_flag(void) { //printf("[%s:%d]POWEROFF=0x%x\n", __FUNCTION__, __LINE__, POWEROFF); return POWEROFF; } void sf_set_power_off_flag(UINT8 flag) { POWEROFF = flag; } /************************************************* Function: sf_get_power_on_mode Description: get power start mode Input: N/A Output: N/A Return: 0:ON mode 1:OFF mode Others: N/A *************************************************/ UINT8 sf_get_power_on_mode(void) { static int ModeFlag = 1; if(ModeFlag) { ModeFlag = 0; PowerOnMode = sf_mcu_power_on_para_get(SF_MCU_POWERON); PowerOnMode &= 0x0f; sf_is_night_mode(1); if(1 == PowerOnMode) { ConfigureModeFlag = 1; } } return PowerOnMode; } /************************************************* Function: sf_is_night_mode Description: whether or not night mode Input: isRefresh: 1:refresh 0:unrefresh Output: N/A Return: TRUE:night mode; FALSE:day mode Others: N/A *************************************************/ BOOL sf_is_night_mode(BOOL isRefresh) { static BOOL nightMode = FALSE; if(sf_get_mode_flag()) //setup always use new status { return AeNightMode; } else if(isRefresh) { if(IRSHTTER < SF_MCU_NIGHT_MODE_LUMINANCE) { nightMode = TRUE; } else { nightMode = FALSE; } } printf("[%s:%d]nightMode=%d\n",__FUNCTION__,__LINE__,nightMode); return nightMode; } UINT32 sf_gpio_get_status(UINT32 ipin) { //printf("%s(%d) ipin:%d\n", __FUNCTION__, __LINE__,ipin); gpio_direction_input(ipin); return (UINT32) ((gpio_get_value(ipin) == 1) ? 1 : 0 ); } /************************************************* Function: sf_mcu_dataready_get Description: Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ void sf_mcu_dataready_get(void) { #if 0 UINT8 startMode = 0; startMode = sf_mcu_power_on_para_get(SF_MCU_STARTMODE); printf("startMode=%d\n", startMode); if(GxUSB_GetIsUSBPlug())//sf_gpio_get_status(GPIO_INT_USBPLUGIN)) { return; } if(sf_get_mode_flag()) { if(startMode == 0) //OFF { sf_set_power_off_flag(1); gModuleSleep = 0; //LCD_BACKLIGHT_OFF; //profLogPrintf(0,"[sf_mcu_dataready_get],APP_POWER_OFF_NORMAL"); printf("[power off] %s(%d)\n", __FUNCTION__, __LINE__); Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } else if(startMode == 1) //SETUP { /*exit pir mode*/ } else if(startMode == 3) //ON { sf_set_auto_off_time(0); sf_set_pir_statu_flag(1); printf("%s:%d-------PIR Key Pressed.------\n", __FUNCTION__, __LINE__); //Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } } else { if((startMode == 0) || (startMode == 1)) //PIR MODE: ON->OFF/ ON->SETUP { gModuleSleep = 0; //power off 4G module sf_set_power_off_flag(1); printf("[power off] %s(%d)\n", __FUNCTION__, __LINE__); Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } } #endif } #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) /************************************************* Function: sf_mcu_reg_set Description: set data to MCU Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_reg_set(MCUParam_t attrId, UINT8 val) { UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; //UINT8 j = 0; UINT8 temp = 0; UINT8 paraSyncFlag = 0; UINT8 gpsAlwaysFlag = 0; UINT8 PowerOnMode = 0; UINT8 DailyHour = 0; UINT8 DailyMin = 0; printf("Firmware compile time:%s %s VER:%s\n", __DATE__, __TIME__,SF_BASE_VERSION); UIMenuStoreInfo *puiPara = sf_ui_para_get(); PowerOnMode = sf_get_power_on_mode(); gpsAlwaysFlag = gpsAlwaysFlag; if(attrId > SF_MCU_PARAM_MAX) { printf("%s:%d attrId ERROR!\n", __FUNCTION__, __LINE__); return FAIL; } printf("%s:%d attrId=%d val=%d\n", __FUNCTION__, __LINE__, attrId, val); //4G if((simCardInsert) && (1 == SysGetFlag(NeedTimeSyncStartUp))) { paraSyncFlag = 1; } if(attrId == SF_MCU_POWEROFF) { struct tm ctv = {0}; ctv = hwclock_get_time(TIME_ID_CURRENT); /*if(ctv.tm_year < DEFAULT_YEAR) { ctv.tm_year = DEFAULT_YEAR; ctv.tm_mon = DEFAULT_MON; ctv.tm_mday = DEFAULT_DAY; ctv.tm_hour = DEFAULT_HOUR; ctv.tm_min = DEFAULT_MIN; ctv.tm_sec = DEFAULT_SEC; hwclock_set_time(TIME_ID_CURRENT, ctv, 0); }*/ mcuReg[i] = SF_RTC_YEAR; mcuData[i++] = ctv.tm_year - 2000; mcuReg[i] = SF_RTC_MONTH; mcuData[i++] = ctv.tm_mon; mcuReg[i] = SF_RTC_DAY; mcuData[i++] = ctv.tm_mday; mcuReg[i] = SF_RTC_HOUR; mcuData[i++] = ctv.tm_hour; mcuReg[i] = SF_RTC_MINUTE; mcuData[i++] = ctv.tm_min; mcuReg[i] = SF_RTC_SEC; mcuData[i++] = ctv.tm_sec; gpsAlwaysFlag = 0; if(1 == SysGetFlag(PirSwitch)) { temp = 0x01; } else { temp = 0x00; } if(1 == SysGetFlag(TimelapseSwitch)) { temp |= 0x02; } if(1 == SysGetFlag(PirDelaySwitch)) { temp |= 0x04; } printf("[%s:%d]paraSyncFlag=%d\n", __FUNCTION__, __LINE__, paraSyncFlag); if(paraSyncFlag) { temp |= 0x08; } if(((simCardInsert) && (1 == SysGetFlag(GprsMode))) || (1 == SysGetFlag(DailyReportSwitch))) //dailyreport open { temp |= 0x10; } else { temp &= ~0x10; } mcuReg[i] = FUNCTION_SWTICH0; mcuData[i++] = temp; temp = 0; if((1 == SysGetFlag(GpsSwitch)) && (sf_get_mode_flag() || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } printf("PirSensitivity:%lu\n", SysGetFlag(PirSensitivity)); mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); printf("[%s:%d] GprsMode=%lu,gModuleSleep=%d,NetWorkNeedSearch=%lu\n", __FUNCTION__, __LINE__, SysGetFlag(GprsMode), gModuleSleep, SysGetFlag(NetWorkNeedSearch)); if(simCardInsert && (SysGetFlag(NetWorkNeedSearch))) { //4.0PCG, first to PIR mode, will power on in A,search net. so 4G mode should power down //instant mode ,dp power on, 4G mode should power down temp &= ~0x60; /*bit5&bit6=0,daily mode*/ } else if(simCardInsert && (1 == SysGetFlag(GprsMode)) && gModuleSleep) { temp |= 0x40; /*bit6=1,instant mode*/ } else if(simCardInsert && (0 == SysGetFlag(GprsMode)) && gModuleSleep) { temp |= 0x20; /*bit5=1,hybrid mode*/ } printf("[%s:%d]drNoResetTimeSync=%d\n", __FUNCTION__, __LINE__, drNoResetTimeSync); if((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_GPRS_INIT) || ((PowerOnMode == PWR_ON_DAILY_REPORT) && (drNoResetTimeSync != TRUE))) { temp |= 0x10; /*bit4 rest*/ } if(SysGetFlag(GprsSwitch) && (simCardInsert)) { temp |= 0x80; } mcuData[i++] = temp; #if DIGITAL_PIR mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (0 << 4)| (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); #endif //DSP busy/idle mcuReg[i] = DSP_BUSY_STATUS; mcuData[i++] = 0; mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; temp = 0; if(simCardInsert && (SysGetFlag(NetWorkNeedSearch)) && ((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_DAILY_REPORT)))/* SET->ON, OFF->ON*/ { temp = 1; } /*else if(simCardInsert && (TRUE == sf_get_net_reboot()))//reboot net { temp = 1; }*/ else if(SmsCheck) { temp = 2; } mcuReg[i] = POWEROFF_TYPE; mcuData[i++] = (0) << 7 | (val == APP_POWER_OFF_BATT_EMPTY) << 6 | (val == APP_POWER_OFF_APO) << 6 | temp; //battery recovery mcuReg[i] = VBAT_RECOVER_VAL; if(SF_BATT_LI == SysGetFlag(BatteryType)) { mcuData[i++] = SF_LI_BATT_RECOVERY; } else { mcuData[i++] = SF_OTHER_BATT_RECOVERY; } if(SysGetFlag(TimelapseSwitch)) { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = puiPara->TimelapseTime.Hour; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = puiPara->TimelapseTime.Min; mcuReg[i] = TIMELAPSE_SEC; if((SysGetFlag(TimelapseSwitch)) && (puiPara->TimelapseTime.Hour == 0) && (puiPara->TimelapseTime.Min == 0) && (puiPara->TimelapseTime.Sec == 0)) { mcuData[i++] = 5; } else { mcuData[i++] = puiPara->TimelapseTime.Sec; } } else { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_SEC; mcuData[i++] = 0; } if(SysGetFlag(PirDelaySwitch)) { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = puiPara->PirDelayTime.Hour; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = puiPara->PirDelayTime.Min; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = puiPara->PirDelayTime.Sec; } else { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = 0; } if(paraSyncFlag) { mcuReg[i] = TIME_SYNC_HOUR; mcuData[i++] = 0; mcuReg[i] = TIME_SYNC_MINUTE; mcuData[i++] = 1; mcuReg[i] = TIME_SYNC_SEC; mcuData[i++] = 30; } printf("end dailyHour:%d,dailyMin:%d\n", puiPara->DailyReportTime.Hour, puiPara->DailyReportTime.Min); //set dr time. sf_calculate_daily_report(&DailyHour, &DailyMin); printf("end dailyHour:%d,dailyMin:%d\n",DailyHour,DailyMin); //rtcTime mcuReg[i] = DAILY_REPORT_HOUR; if(SF_REMOTE_CONTROL_DEALY_24H == SysGetFlag(GprsMode)) { if((ctv.tm_min + DailyMin) == 0) { if((ctv.tm_hour + DailyHour) == 0) { mcuData[i++] = (ctv.tm_hour + DailyHour + 24 - 1)%24; } else { mcuData[i++] = (ctv.tm_hour + DailyHour - 1)%24; } } else { mcuData[i++] = (ctv.tm_hour + DailyHour)%24; } } else { if((ctv.tm_min + DailyMin) >= 60) { mcuData[i++] = (ctv.tm_hour + DailyHour+1)%24; } else { mcuData[i++] = (ctv.tm_hour + DailyHour)%24; } } mcuReg[i] = DAILY_REPORT_MINUTE; if(SF_REMOTE_CONTROL_DEALY_24H == SysGetFlag(GprsMode)) { if((ctv.tm_min + DailyMin) == 0) { mcuData[i++] = (ctv.tm_min + DailyMin + 60 - 1)%60; } else { mcuData[i++] = (ctv.tm_min + DailyMin - 1)%60; } } else { mcuData[i++] = (ctv.tm_min + DailyMin)%60; } if(SysGetFlag(WorkTime1Switch)) { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = puiPara->WorkTime[0].StartTime.Hour; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StartTime.Min; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[0].StopTime.Hour; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StopTime.Min; } else { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = 0; } if(SysGetFlag(WorkTime2Switch)) { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = puiPara->WorkTime[1].StartTime.Hour; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StartTime.Min; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[1].StopTime.Hour; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StopTime.Min; } else { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = 0; } } else if(attrId == SF_MCU_CTRL_MODULE_PIR) { if((SysGetFlag(GpsSwitch))&& (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); //sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if(SF_REMOTE_CONTROL_REAL_TIME == SysGetFlag(GprsMode)) //hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsSwitch)) && (val == 1)) { temp |= 0x80; } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%lu simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, SysGetFlag(GprsSwitch), simCardInsert); if(ConfigureModeFlag) { mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = digPirLevel[SysGetFlag(PirSensitivity)];//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (/*SysGetFlag(DigitPirWindowTime)*/0 << 4) | (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); } } else if(attrId == SF_MCU_PARA) { if((SysGetFlag(GpsSwitch)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); //sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if((SF_REMOTE_CONTROL_REAL_TIME == SysGetFlag(GprsMode)) && (gModuleSleep == 1)) //hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsSwitch)) && (simCardInsert)) { temp |= 0x80; } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%lu simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, SysGetFlag(GprsSwitch), simCardInsert); mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = digPirLevel[SysGetFlag(PirSensitivity)];//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (0 << 4) | (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; } else if(attrId == SF_MCU_RESET_MODULE) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x10; } else if(attrId == SF_MCU_SOFT_UPDATE) { mcuReg[i] = SF_SYS_STATUS; if(val == 1) { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x08; } else { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; } } else if(attrId == SF_MCU_POWER_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x20; } else if(attrId == SF_MCU_PIR_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x80; } mcuReg[i] = DSP_WRITE_FLG; //MCU set end mcuData[i++] = 1; printf("[%s:%d] mcuData[%d]0x%02x\n", __FUNCTION__, __LINE__, (i - 1), mcuData[(i - 1)]); #if 0 if((attrId == SF_MCU_POWEROFF) /*&& puiPara->DebugSwitch && IS_CARD_EXIST*/) { for(j = 0; j < i; j++) { printf("W_addr[%2d]=0x%02x\n", mcuReg[j], mcuData[j]); } //sf_debug_save_log(); } #endif sf_mcu_write_multi(mcuReg, mcuData, i); return SUCCESS; } //#if 1 #elif defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) /************************************************* Function: sf_mcu_analog_pir_sen_convert Description: Analog PIR Sensitivity Convert Input: digPir sensitivity Output: N/A Return: Analog PIR Sensitivity Others: N/A *************************************************/ UINT8 sf_mcu_analog_pir_sen_convert(UINT8 pirs) { UINT8 pirlevel = 0; if(pirs > 6) pirlevel = 0; else if(pirs > 3) pirlevel = 1; else pirlevel = 2; return pirlevel; } /************************************************* Function: sf_mcu_power_on_para_get Description: set data to MCU Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_reg_set(MCUParam_t attrId, UINT8 val) { UINT8 mcuReg[REG_SIZE] = {0}; UINT8 mcuData[REG_SIZE] = {0}; UINT8 i = 0; //UINT8 j = 0; UINT8 temp = 0; UINT8 paraSyncFlag = 0; UINT8 gpsAlwaysFlag = 0; UINT8 PowerOnMode = 0; printf("Firmware compile time:%s %s VER:%s\n", __DATE__, __TIME__,SF_BASE_VERSION); UIMenuStoreInfo *puiPara = sf_ui_para_get(); PowerOnMode = sf_get_power_on_mode(); if (attrId > SF_MCU_PARAM_MAX) { printf("attrId ERROR!\n"); return FAIL; } printf("sf_mcu_reg_set attrId=%d val=%d\n", attrId, val); if((simCardInsert) && (1 == SysGetFlag(NeedTimeSyncStartUp))) { paraSyncFlag = 1; } if(attrId == SF_MCU_POWEROFF) { struct tm ctv = {0}; ctv = hwclock_get_time(TIME_ID_CURRENT); printf("%s:%d %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,ctv.tm_year, ctv.tm_mon,ctv.tm_mday,ctv.tm_hour,ctv.tm_min,ctv.tm_sec); mcuReg[i] = SF_RTC_YEAR; mcuData[i++] = ctv.tm_year - 2000; mcuReg[i] = SF_RTC_MONTH; mcuData[i++] = ctv.tm_mon; mcuReg[i] = SF_RTC_DAY; mcuData[i++] = ctv.tm_mday; mcuReg[i] = SF_RTC_HOUR; mcuData[i++] = ctv.tm_hour; mcuReg[i] = SF_RTC_MINUTE; mcuData[i++] = ctv.tm_min; mcuReg[i] = SF_RTC_SEC; mcuData[i++] = ctv.tm_sec; gpsAlwaysFlag = 0; if((SysGetFlag(GpsSwitch) == 1) && (SysGetFlag(GpsNumber))) { gpsAlwaysFlag=1; } else { gpsAlwaysFlag=0; } if(SysGetFlag(PirSensitivity)) temp = 0x01; else temp = 0x00; if(1 == SysGetFlag(TimelapseSwitch)) { temp |= 0x02; } if(1 == SysGetFlag(PirDelaySwitch)) { temp |= 0x04; } printf("[%s:%d]paraSyncFlag=%d\n", __FUNCTION__, __LINE__, paraSyncFlag); if(paraSyncFlag) { temp |= 0x08; } //if(puiPara->dailyReport) if(/*(puiPara->GpsSwitch) && */(paraSyncFlag == 1)) { temp &= ~0x10; } else if(simCardInsert) //dailyreport alway open { temp |= 0x10; } if(SysGetFlag(TimeSend1Switch) == 1) temp |= 0x20; if(SysGetFlag(TimeSend2Switch) == 1) temp |= 0x40; if(gpsAlwaysFlag && simCardInsert) temp |= 0x80; mcuReg[i] = FUNCTION_SWTICH0; mcuData[i++] = temp; if(SysGetFlag(TimelapseSwitch)) { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = puiPara->TimelapseTime.Hour; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = puiPara->TimelapseTime.Min; mcuReg[i] = TIMELAPSE_SEC; if((SysGetFlag(TimelapseSwitch)) && (puiPara->TimelapseTime.Hour == 0) && (puiPara->TimelapseTime.Min == 0) && (puiPara->TimelapseTime.Sec == 0)) mcuData[i++] = 5; else mcuData[i++] = puiPara->TimelapseTime.Sec; } else { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_SEC; mcuData[i++] = 0; } if(SysGetFlag(PirDelaySwitch)) { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = puiPara->PirDelayTime.Hour; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = puiPara->PirDelayTime.Min; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = puiPara->PirDelayTime.Sec; } else { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = 0; } if(paraSyncFlag) { mcuReg[i] = TIME_SYNC_HOUR; mcuData[i++] = 0; mcuReg[i] = TIME_SYNC_MINUTE; mcuData[i++] = 0; mcuReg[i] = TIME_SYNC_SEC; mcuData[i++] = 1; } if(SysGetFlag(DailyReportSwitch)) { mcuReg[i] = DAILY_REPORT_HOUR; mcuData[i++] = puiPara->DailyReportTime2.Hour; mcuReg[i] = DAILY_REPORT_MINUTE; mcuData[i++] = puiPara->DailyReportTime2.Min; } else { mcuReg[i] = DAILY_REPORT_HOUR; mcuData[i++] =0; mcuReg[i] = DAILY_REPORT_MINUTE; mcuData[i++] =0; } mcuReg[i] = DAILY_SEND1_HOUR; mcuData[i++] = puiPara->TimeSend1.Hour; mcuReg[i] = DAILY_SEND1_MINUTE; mcuData[i++] = puiPara->TimeSend1.Min; mcuReg[i] = DAILY_SEND2_HOUR; mcuData[i++] = puiPara->TimeSend2.Hour; mcuReg[i] = DAILY_SEND2_MINUTE; mcuData[i++] = puiPara->TimeSend2.Min; mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = sf_mcu_analog_pir_sen_convert(SysGetFlag(PirSensitivity)); //hybrid mode 4G module keep sleep if((SysGetFlag(NetWorkNeedSearch) != 3) && simCardInsert && gModuleSleep) { //bit 5-bit 6, daily mode 0, hybrid mode 1, instant mode 2 if((SysGetFlag(GprsMode) == 1) || (paraSyncFlag)) { temp |= 0x40; } else { if ((SysGetFlag(GprsMode) == 2) && isSignalReady && (GPRS_ERRNO == 0)) temp |= 0x20; //sf_pdp_flg_set(0); } } if(((SysGetFlag(GprsSwitch)) && (simCardInsert) && (SysGetFlag(SendType) == 0)) || (paraSyncFlag)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } mcuData[i++] = temp; mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = SysGetFlag(DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (SysGetFlag(DigitPirWindowTime) << 4) | SysGetFlag(DigitPirCnt); //mcuData[i++] = (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); //DSP busy/idle mcuReg[i] = DSP_BUSY_STATUS; mcuData[i++] = 0; mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; mcuReg[i] = POWEROFF_TYPE; temp = 0; if(simCardInsert && (SysGetFlag(NetWorkNeedSearch)) && ((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_DAILY_REPORT)))/* SET->ON, OFF->ON*/ temp = 1; else if(SmsCheck) temp = 2; mcuData[i++] = (0) << 7 | (val == APP_POWER_OFF_BATT_EMPTY) << 6 | (val == APP_POWER_OFF_APO) << 6 | temp; //battery recovery mcuReg[i] = VBAT_RECOVER_VAL; mcuData[i++] = SF_BATT_RECOVERY; if(SysGetFlag(WorkTime1Switch)) { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = puiPara->WorkTime[0].StartTime.Hour; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StartTime.Min; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[0].StopTime.Hour; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StopTime.Min; } else { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = 0; } if((SysGetFlag(GpsSwitch) || SysGetFlag(FristSendDailyAndGps)) && (sf_get_mode_flag() || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } temp = 0; if(SysGetFlag(TimeSend3Switch) == 1) temp |= 0x01; if(SysGetFlag(TimeSend4Switch) == 1) temp |= 0x02; mcuReg[i] = FUNCTION_SWTICH1; mcuData[i++] = temp; mcuReg[i] = DAILY_SEND3_HOUR; mcuData[i++] = puiPara->TimeSend3.Hour; mcuReg[i] = DAILY_SEND3_MINUTE; mcuData[i++] = puiPara->TimeSend3.Min; mcuReg[i] = DAILY_SEND4_HOUR; mcuData[i++] = puiPara->TimeSend4.Hour; mcuReg[i] = DAILY_SEND4_MINUTE; mcuData[i++] = puiPara->TimeSend4.Min; } else if(attrId == SF_MCU_CTRL_MODULE_PIR) { mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity);//sf_mcu_analog_pir_sen_convert(SysGetFlag(DigPirSensitivity)); if(SysGetFlag(GprsMode))//hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsMode)) && (val == 1)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } mcuData[i++] = temp; if(ConfigureModeFlag) { mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = SysGetFlag(DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (SysGetFlag(DigitPirWindowTime) << 4) | SysGetFlag(DigitPirCnt); } if((SysGetFlag(GpsSwitch) || SysGetFlag(FristSendDailyAndGps)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } } else if(attrId == SF_MCU_PARA) { mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity);//sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if((SysGetFlag(GprsMode)) && (gModuleSleep == 1))//hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsMode)) && (simCardInsert)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%lu simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, SysGetFlag(GprsSwitch), simCardInsert); mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = SysGetFlag(DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (SysGetFlag(DigitPirWindowTime) << 4) | SysGetFlag(DigitPirCnt); mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; if((SysGetFlag(GpsSwitch) || SysGetFlag(FristSendDailyAndGps)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } } else if(attrId == SF_MCU_RESET_MODULE) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x10; //sf_pdp_flg_set(0); } else if(attrId == SF_MCU_SOFT_UPDATE) { mcuReg[i] = SF_SYS_STATUS; if(val == 1) { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x08; } else { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; } } else if(attrId == SF_MCU_POWER_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x20; } else if(attrId == SF_MCU_PIR_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x80; } mcuReg[i] = DSP_WRITE_FLG; //MCU set end mcuData[i++] = 1; printf("[%s:%d] mcuData[%d]0x%02x\n", __FUNCTION__, __LINE__, (i - 1), mcuData[(i - 1)]); #if 0 if((attrId == SF_MCU_POWEROFF) && puiPara->DebugMode && IS_CARD_EXIST) { for(j = 0; j < i; j++) { printf("W_addr[%2d]=0x%02x\n",mcuReg[j],mcuData[j]); } sf_debug_save_log(); } #endif sf_mcu_write_multi(mcuReg, mcuData, i); return SUCCESS; } #endif BOOL sf_get_mode_flag(void) { //printf("[%s:%d] ConfigureModeFlag:%d\n",__FUNCTION__,__LINE__,ConfigureModeFlag); return ConfigureModeFlag; } BOOL sf_is_usb_flag(void) { return gpio_getIntStatus(GPIO_INT_USBPLUGIN); } void sf_cmd_camera_restart(UINT8 cameraRestart) { CameraCmd.cameraRestart = cameraRestart; printf("[%s:%d] e cameraRestart:%d\n",__FUNCTION__,__LINE__,CameraCmd.cameraRestart); } UINT8 sf_get_camera_restart(void) { printf("[%s:%d] s cameraRestart:%d\n",__FUNCTION__,__LINE__,CameraCmd.cameraRestart); return CameraCmd.cameraRestart; } void sf_calculate_daily_report(UINT8*dailyHour, UINT8*dailyMin) { UIMenuStoreInfo *puiPara = sf_ui_para_get(); UINT16 daily_sum_min = 0; UINT16 timelapse_sum_min = 0; struct tm mcuTime = {0}; //Daily report is always ON if(SysGetFlag(ReDailyReport)) { mcuTime = hwclock_get_time(TIME_ID_CURRENT); if(puiPara->DailyReportTime2.Hour >= mcuTime.tm_hour) { daily_sum_min = (puiPara->DailyReportTime2.Hour * 60 + puiPara->DailyReportTime2.Min) - (mcuTime.tm_hour * 60 + mcuTime.tm_min); *dailyHour = daily_sum_min / 60; *dailyMin = daily_sum_min % 60; } else { daily_sum_min = (puiPara->DailyReportTime2.Hour * 60 + puiPara->DailyReportTime2.Min + (24*60)) - (mcuTime.tm_hour * 60 + mcuTime.tm_min); *dailyHour = daily_sum_min / 60; *dailyMin = daily_sum_min % 60; } printf("mcuTime.hour:%d,mcuTime.min:%d\n",mcuTime.tm_hour,mcuTime.tm_min); printf("ReDailyHour:%d,ReDailyMinute:%d\n",puiPara->DailyReportTime2.Hour,puiPara->DailyReportTime2.Min); printf("daily_sum_min:%d\n",daily_sum_min); } else if(SysGetFlag(GprsMode) == SF_REMOTE_CONTROL_REAL_TIME) { if((!sf_get_mode_flag()) && (sf_get_camera_restart() == 1)) { // PIR mode,if remote control is setted real time,need reboot to connect ACM,use DailyReport. *dailyHour = 0; *dailyMin = 1; } else { // if remote control set real time,check the socket every two hour ,to keep alive *dailyHour = 2; *dailyMin = 0; } } else if(SysGetFlag(GpsAntiTheftSwitch) == 1) { if((!sf_get_mode_flag()) && (sf_get_camera_restart() == 1)) { // PIR mode,if gpsTheftPrevention ON, have not update gps in 24H,need to reseach gps then update to acm,use DailyReport. *dailyHour = 0; *dailyMin = 1; } else { *dailyHour = puiPara->DailyReportTime.Hour; *dailyMin = puiPara->DailyReportTime.Min; } } else { *dailyHour = puiPara->DailyReportTime.Hour; *dailyMin = puiPara->DailyReportTime.Min; } printf("%s:%d dailyHour:%d,dailyMin:%d\n", __FUNCTION__, __LINE__,*dailyHour,*dailyMin); printf("%s:%d TimerHstartT:%d,TimerMstartT:%d,TimerSstartT:%d\n", __FUNCTION__, __LINE__,puiPara->TimelapseTime.Hour,puiPara->TimelapseTime.Min,puiPara->TimelapseTime.Sec); //need check dailyReport & timelapse ? if((sf_convert_power_on_mode() == PWR_ON_TIMELAPSE)/* || (sf_get_timelapse_change())*/ || (sf_get_mode_flag())) { //dailyHour = dailyHour + 60; daily_sum_min = (*dailyHour) * 60 + (*dailyMin);// + 60 + dailyMin if(puiPara->TimelapseTime.Sec) { timelapse_sum_min = (puiPara->TimelapseTime.Hour) * 60 + puiPara->TimelapseTime.Min + 1; } else { timelapse_sum_min = (puiPara->TimelapseTime.Hour) * 60 + puiPara->TimelapseTime.Min; } if(timelapse_sum_min >= daily_sum_min) { if((timelapse_sum_min - daily_sum_min) <= 5) { if((SysGetFlag(ReDailyReport) == 1) && (timelapse_sum_min < 5)) { SysSetFlag(ReDailyReport, 2); puiPara->DailyReportTime2.Hour = 0; puiPara->DailyReportTime2.Min = 0; } else { *dailyMin = *dailyMin + 5; } } } // only timelapse < dailyReport+5,daily report = daily report + 5 } printf("%s:%d Calculated:dailyHour:%d,dailyMin:%d\n", __FUNCTION__, __LINE__,*dailyHour,*dailyMin); } int sf_while_flag(void) { if((!sf_is_usb_flag()) && (POWEROFF != 1)) { return 1; } else { return 0; } } #if defined __FREERTOS int sf_mod_init(void) { int rt = 0; static int InitFlag = 1; if(InitFlag) { InitFlag = 0; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) rt = sf_init_mcu(); #elif defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) #if HUNTING_MCU_I2C == ENABLE rt = sf_init_mcu(); #else rt = sf_commu_mcu_task_start(); #endif #endif } return rt; } void sf_mod_exit(void) { sf_off_mcu(); #if HUNTING_MCU_I2C == ENABLE sf_i2c_remove_driver(sf_i2c.id); #endif } #elif defined __KERNEL__ static int __init sf_init(void) { int rt; rt = sf_init_mcu(); return rt; } static void __exit sf_exit(void) { sf_i2c_remove_driver(sf_i2c.id); } module_init(sf_init); module_exit(sf_exit); MODULE_DESCRIPTION("SIFAR MCU"); MODULE_AUTHOR("SiFar."); MODULE_LICENSE("GPL"); #endif