/************************************************* File name : hal_interface_nv.c Module : hal floodlight library interface typedefs Author : Version : Created on : 2020-10-20 Description : Data structure and function definitions required by the floodlight interface Modify History: 1. Date: Author: Modification: 2020-10-20 amir.liang create *************************************************/ #include #include "hal_product_config.h" #include "hal_interface_spotlight.h" #include "pwm.h" #include #include "product_bsp_config.h" #include "hal_gpio.h" #if HAL_CFG_MCU_ENABLE == HAL_TRUE #include "mcu_interface.h" #endif //#define SPLIGHT_PWM_PERIOD 1000000 // ns, 1K Hz #define SPLIGHT_PWM_PERIOD 50000 // ns, 20K Hz static int32_t pwm_init_state = 0; static int8_t pwm_power_state = 0; static int8_t pwm_control_called = 0; static int popen_call(char *args, int size, char *result, int max_size) { int nReadLen = 0; if (args != NULL) { FILE *pFile = NULL; pFile = popen(args, "r"); if (pFile != NULL) { nReadLen = fread(result, 1, max_size, pFile); pclose(pFile); } else { HAL_SPL_LOG_ERROR("popen error:%s\n", args); return -1; } } return nReadLen; } static int call_system_cmd(char *fmt, ...) { int ret = -1; va_list ap; char cmd[256] = {0}; char out[256] = {0}; va_start(ap, fmt); vsprintf(cmd, fmt, ap); va_end(ap); ret = popen_call(cmd, 255, out, 255); HAL_SPL_LOG_INFO("popen_call: %s, return=%d, out=%s", cmd, ret, out); return ret; } static int32_t HAL_SPL_Init(int32_t channel) { int32_t ret = ZFAILED; SUPWMChnAttr attr = {0}; if (pwm_init_state == 1 ) { HAL_SPL_LOG_ERROR("pwm has inited !"); return 0; } HAL_SPL_LOG_INFO("pwm init !"); ret = SU_PWM_Init(); if (ret < 0) { HAL_SPL_LOG_ERROR("pwm init error !"); return ZFAILED; } attr.period = SPLIGHT_PWM_PERIOD; attr.duty = 0; attr.polarity = 1; // PWM0 ret = SU_PWM_CreateChn(PWM0_CHN, &attr); if (ret < 0) { HAL_SPL_LOG_ERROR("SU_PWM_CreateChn pwm0 error !"); SU_PWM_Exit(); return ZFAILED; } // PWM1 ret = SU_PWM_CreateChn(PWM1_CHN, &attr); if (ret < 0) { HAL_SPL_LOG_ERROR("SU_PWM_CreateChn pwm1 error !"); SU_PWM_DestroyChn(PWM0_CHN); SU_PWM_Exit(); return ZFAILED; } #ifdef PRODUCT_IRLED_POWER_PIN hal_gpio_export(PRODUCT_IRLED_POWER_PIN); hal_gpio_set_dir(PRODUCT_IRLED_POWER_PIN, 1); #endif #ifdef PRODUCT_IRLED_ENABLE_PIN hal_gpio_export(PRODUCT_IRLED_ENABLE_PIN); hal_gpio_set_dir(PRODUCT_IRLED_ENABLE_PIN, 1); #endif pwm_init_state = 1; return 0; } static int32_t HAL_SPL_Deinit(int32_t channel) { if (pwm_init_state == 1) { SU_PWM_DisableChn(PWM0_CHN); SU_PWM_DestroyChn(PWM0_CHN); SU_PWM_DisableChn(PWM1_CHN); SU_PWM_DestroyChn(PWM1_CHN); SU_PWM_Exit(); pwm_init_state = 0; pwm_control_called = 0; } return 0; } static int32_t HAL_SPL_TurnOn(int32_t channel, int32_t colortemp, int32_t brightness) { int ret = -1; int duty; int bright_value_ch0 = 50; int bright_value_ch1 = 50; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } HAL_SPL_LOG_ERROR("HAL_SPL_TurnOn colortemp %d, brightness %d",colortemp, brightness); switch(colortemp) { case 5: { bright_value_ch0 = 0; bright_value_ch1 = (((brightness * 79) / 100) + 21); } break; case 4: { bright_value_ch0 = (((brightness * 14) / 100) + 6); bright_value_ch1 = (((brightness * 55) / 100) + 15); } break; case 3: { bright_value_ch0 = (((brightness * 35) / 78) + 10); bright_value_ch1 = (((brightness * 35) / 78) + 10); } break; case 2: { bright_value_ch0 = (((brightness * 55) / 78) + 15); bright_value_ch1 = (((brightness * 14) / 78) + 6); } break; case 1: { bright_value_ch0 = (((brightness * 79) / 100) + 21); bright_value_ch1 = 0; } break; default: { return ZFAILED; } break; } //if (brightness > 0) { ret = SU_PWM_EnableChn(PWM0_CHN); if (ret < 0) { HAL_SPL_LOG_ERROR("chn0 pwm enable error !"); return ZFAILED; } ret = SU_PWM_EnableChn(PWM1_CHN); if (ret < 0) { HAL_SPL_LOG_ERROR("chn0 pwm enable error !"); return ZFAILED; } } duty = bright_value_ch0 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PWM0_CHN, duty); if (ret < 0) { HAL_SPL_LOG_ERROR("Failed to modify duty(%d) !",duty); return ZFAILED; } duty = bright_value_ch1 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PWM1_CHN, duty); if (ret < 0) { HAL_SPL_LOG_ERROR("Failed to modify duty(%d) !",duty); return ZFAILED; } HAL_SPL_LOG_ERROR("HAL_SPL_TurnOn bright_value_ch0=%d, bright_value_ch1 = %d,ret=%d,duty=%d", bright_value_ch0,bright_value_ch1, ret,duty); /* if (pwm_init_state) { HAL_SPL_LOG_ERROR("pwm has inited !"); return 0; } call_system_cmd("devmem 0x10011048 32 0x00040000"); pwm_init_state = 1;*/ pwm_control_called = 1; pwm_power_state = SPL_POWER_ON; return 0; } static int32_t HAL_SPL_TurnOff(int32_t channel) { int ret = -1; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } ret = SU_PWM_DisableChn(PWM0_CHN); ret = SU_PWM_DisableChn(PWM1_CHN); if (ret < 0) { HAL_SPL_LOG_ERROR("pwm disable error !"); return ZFAILED; } HAL_SPL_LOG_INFO("HAL_SPL_TurnOff called!"); /* if (pwm_init_state == 1) { call_system_cmd("devmem 0x10011044 32 0x00040000"); } pwm_init_state = 0; */ pwm_control_called = 1; pwm_power_state = SPL_POWER_OFF; return 0; } static int32_t HAL_SPL_SlightSet(int32_t channel, int32_t colortemp, int32_t brightness) { int ret = -1; int duty; int bright_value_ch0 = 50; int bright_value_ch1 = 50; char tmpbuf[32] = {0}; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } HAL_SPL_LOG_ERROR("HAL_SPL_SlightSet colortemp %d, brightness %d", colortemp, brightness); switch(colortemp) { case 5: { bright_value_ch0 = 0; bright_value_ch1 = (((brightness * 79) / 100) + 21); } break; case 4: { bright_value_ch0 = (((brightness * 14) / 100) + 6); bright_value_ch1 = (((brightness * 55) / 100) + 15); } break; case 3: { bright_value_ch0 = (((brightness * 35) / 78) + 10); bright_value_ch1 = (((brightness * 35) / 78) + 10); } break; case 2: { bright_value_ch0 = (((brightness * 55) / 78) + 15); bright_value_ch1 = (((brightness * 14) / 78) + 6); } break; case 1: { bright_value_ch0 = (((brightness * 79) / 100) + 21); bright_value_ch1 = 0; } break; default: { return ZFAILED; } break; } //if (bright_value > 0) { ret = SU_PWM_EnableChn(PWM0_CHN); if (ret < 0) { HAL_SPL_LOG_ERROR("chn2 pwm0 enable error !"); return ZFAILED; } ret = SU_PWM_EnableChn(PWM1_CHN); if (ret < 0) { HAL_SPL_LOG_ERROR("chn2 pwm1 enable error !"); return ZFAILED; } } duty = bright_value_ch0 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PWM0_CHN, duty); if (ret) { HAL_SPL_LOG_ERROR("Failed to modify pwm0 duty(%d) !",duty); duty = 0; } duty = bright_value_ch1 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PWM1_CHN, duty); if (ret) { HAL_SPL_LOG_ERROR("Failed to modify pwm1 duty(%d) !",duty); duty = 0; } HAL_SPL_LOG_ERROR("set slight light pwm bright_value_chn0 %d, bright_value_chn1 %d, ret=%d", bright_value_ch0, bright_value_ch1, ret); //call_system_cmd("tag_env_info --set HW pwm0_duty %d",bright_value_chn0); //call_system_cmd("tag_env_info --set HW pwm1_duty %d",bright_value_chn1); sprintf(tmpbuf, "pwm0_duty=%d", bright_value_ch0); _IMP_Tag_SetParameter(tmpbuf, 0, 0); HAL_SPL_LOG_ERROR("set slight light pwm bright_value_chn0 %s", tmpbuf); memset(tmpbuf,0,sizeof(tmpbuf)); sprintf(tmpbuf, "pwm1_duty=%d", bright_value_ch1); _IMP_Tag_SetParameter(tmpbuf, 0, 0); HAL_SPL_LOG_ERROR("set slight light pwm bright_value_chn1 %s", tmpbuf); return 0; } static int32_t HAL_SPL_GetStatus(int32_t channel,int32_t *value) { int8_t cmd_res[16] = {0}; if (pwm_control_called == 0) { popen_call("cat /proc/ir_status",strlen("cat /proc/ir_status"),cmd_res,16); if (strcmp(cmd_res,"led") == 0) { pwm_power_state = SPL_POWER_ON; }else{ pwm_power_state = SPL_POWER_OFF; } } if (value == NULL) { return ZFAILED; } *value = pwm_power_state; HAL_SPL_LOG_ERROR("HAL_SPL_GetStatus status : %s,pwm_power_state : %d,pwm_control_called : %d", cmd_res,pwm_power_state,pwm_control_called); return 0; } static int32_t HAL_SPL_ModeSet(int32_t channel,int32_t mode) { char modes[5][16] = {"ir_mode=auto","ir_mode=on","ir_mode=off","ir_mode=off","ir_mode=pwm"}; int ret = 0; HAL_SPL_LOG_ERROR("HAL_SPL_ModeSet mode %d--modes : %s", mode, modes[mode]); ret = _IMP_Tag_SetParameter(modes[mode], 0,0); HAL_SPL_LOG_ERROR("HAL_SPL_ModeSetIMP_Sync_Client_Proc return : %d", ret); return 0; } #ifdef PRODUCT_SPOTLIGHT_ONE_PWM //白光灯电源控制 int32_t spotlight_Power_SetSwitch(bool enable) { #if HAL_CFG_MCU_ENABLE == HAL_TRUE UN_MCU_WRITE_CMD_ID_VALUE value; EN_MCU_MSG_RESULT ret = EN_MCU_MSG_RESULT_FAIL; value.data = enable; ret = mcu_interface_type1_process(EN_MCU_CMD_SPOTLIGHT_POWER_CTRL,&value,NULL); if (EN_MCU_MSG_RESULT_SUCCESS == ret) { HAL_SPL_LOG_ERROR("spotlight_Power_SetSwitch = %d suc",enable); return 0; } HAL_SPL_LOG_ERROR("spotlight_Power_SetSwitch = %d fail, ret:%d",enable,ret); #else #ifdef PRODUCT_SPOTLIGHT_POWER_PIN hal_gpio_set_value(PRODUCT_SPOTLIGHT_POWER_PIN, enable?1:0); #endif #ifdef PRODUCT_SPOTLIGHT_ENABLE_PIN hal_gpio_set_value(PRODUCT_SPOTLIGHT_ENABLE_PIN, enable?1:0); #endif #endif return ZFAILED; } int32_t HAL_SPL_Init_One_Pwm(int32_t channel) { int32_t ret = ZFAILED; SUPWMChnAttr attr = {0}; if (pwm_init_state == 1 ) { HAL_SPL_LOG_ERROR("pwm has inited !"); return 0; } HAL_SPL_LOG_INFO("pwm init !"); ret = SU_PWM_Init(); if (ret < 0) { HAL_SPL_LOG_ERROR("pwm init error !"); return ZFAILED; } attr.period = SPLIGHT_PWM_PERIOD; attr.duty = 0; attr.polarity = 1; // PWM0 ret = SU_PWM_CreateChn(PRODUCT_SPOTLIGHT_PWM_CH, &attr); if (ret < 0) { HAL_SPL_LOG_ERROR("SU_PWM_CreateChn pwm0 error !"); SU_PWM_Exit(); return ZFAILED; } #ifdef PRODUCT_SPOTLIGHT_POWER_PIN hal_gpio_export(PRODUCT_SPOTLIGHT_POWER_PIN); hal_gpio_set_dir(PRODUCT_SPOTLIGHT_POWER_PIN, 1); #endif #ifdef PRODUCT_SPOTLIGHT_ENABLE_PIN hal_gpio_export(PRODUCT_SPOTLIGHT_ENABLE_PIN); hal_gpio_set_dir(PRODUCT_SPOTLIGHT_ENABLE_PIN, 1); #endif pwm_init_state = 1; return 0; } static int32_t HAL_SPL_Deinit_One_Pwm(int32_t channel) { if (pwm_init_state == 1) { SU_PWM_DisableChn(PRODUCT_SPOTLIGHT_PWM_CH); SU_PWM_DestroyChn(PRODUCT_SPOTLIGHT_PWM_CH); SU_PWM_Exit(); pwm_init_state = 0; pwm_control_called = 0; } return 0; } int32_t HAL_SPL_TurnOn_One_Pwm(int32_t channel, int32_t colortemp, int32_t brightness) { int ret = -1; int duty; int bright_value_ch0 = 50; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } HAL_SPL_LOG_INFO("HAL_SPL_TurnOn colortemp %d, brightness %d",colortemp, brightness); bright_value_ch0 = (((brightness * 79) / 100) + 21); ret = SU_PWM_EnableChn(PRODUCT_SPOTLIGHT_PWM_CH); if (ret < 0) { HAL_SPL_LOG_ERROR("chn0 pwm enable error !"); return ZFAILED; } //开启白光灯灯源 spotlight_Power_SetSwitch(true); duty = bright_value_ch0 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PRODUCT_SPOTLIGHT_PWM_CH, duty); if (ret < 0) { HAL_SPL_LOG_ERROR("Failed to modify duty(%d) !",duty); return ZFAILED; } HAL_SPL_LOG_INFO("HAL_SPL_TurnOn bright_value_ch0=%d,ret=%d,duty=%d", bright_value_ch0,ret,duty); pwm_control_called = 1; pwm_power_state = SPL_POWER_ON; return 0; } int32_t HAL_SPL_TurnOff_One_Pwm(int32_t channel) { int ret = -1; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } ret = SU_PWM_DisableChn(PRODUCT_SPOTLIGHT_PWM_CH); if (ret < 0) { HAL_SPL_LOG_ERROR("pwm disable error !"); return ZFAILED; } //关闭白光灯灯源 spotlight_Power_SetSwitch(false); HAL_SPL_LOG_INFO("HAL_SPL_TurnOff called!"); pwm_control_called = 1; pwm_power_state = SPL_POWER_OFF; return 0; } int32_t HAL_SPL_SlightSet_One_Pwm(int32_t channel, int32_t colortemp, int32_t brightness) { int ret = -1; int duty; int bright_value_ch0 = 50; char tmpbuf[32] = {0}; if (pwm_init_state == 0) { HAL_SPL_LOG_ERROR("pwm not inited !"); return ZFAILED; } HAL_SPL_LOG_INFO("HAL_SPL_SlightSet colortemp %d, brightness %d", colortemp, brightness); //开启白光灯灯源 spotlight_Power_SetSwitch(true); bright_value_ch0 = (((brightness * 79) / 100) + 21); ret = SU_PWM_EnableChn(PRODUCT_SPOTLIGHT_PWM_CH); if (ret < 0) { HAL_SPL_LOG_ERROR("chn pwm0 enable error !"); return ZFAILED; } duty = bright_value_ch0 * SPLIGHT_PWM_PERIOD / 100; ret = SU_PWM_ModifyChnDuty(PRODUCT_SPOTLIGHT_PWM_CH, duty); if (ret) { HAL_SPL_LOG_ERROR("Failed to modify pwm0 duty(%d) !",duty); duty = 0; } HAL_SPL_LOG_INFO("set slight light pwm bright_value_chn0 %d, ret=%d", bright_value_ch0, ret); //call_system_cmd("tag_env_info --set HW pwm0_duty %d",bright_value_chn0); sprintf(tmpbuf, "pwm0_duty=%d", bright_value_ch0); _IMP_Tag_SetParameter(tmpbuf, 0, 0); HAL_SPL_LOG_INFO("set slight light pwm bright_value_chn0 %s", tmpbuf); return 0; } #endif #if defined(PRODUCT_SPOTLIGHT) static ST_HAL_SPOTLIGHT_INTERFACE gHalSpotlightInterface[] = { #ifdef PRODUCT_SPOTLIGHT_ONE_PWM { .pfnInit = HAL_SPL_Init_One_Pwm, .pfnDeinit = HAL_SPL_Deinit_One_Pwm, .pfnTurnOn = HAL_SPL_TurnOn_One_Pwm, .pfnTurnOff = HAL_SPL_TurnOff_One_Pwm, .pfnGetLightStatus = HAL_SPL_GetStatus, .pfnSlightSet = HAL_SPL_SlightSet_One_Pwm, .pfnModeSet = HAL_SPL_ModeSet, }, #else { .pfnInit = HAL_SPL_Init, .pfnDeinit = HAL_SPL_Deinit, .pfnTurnOn = HAL_SPL_TurnOn, .pfnTurnOff = HAL_SPL_TurnOff, .pfnGetLightStatus = HAL_SPL_GetStatus, .pfnSlightSet = HAL_SPL_SlightSet, .pfnModeSet = HAL_SPL_ModeSet, }, #endif }; #endif ST_HAL_SPOTLIGHT_INTERFACE *HAL_Spotlight_GetInterface(int32_t channel) { #if defined(PRODUCT_SPOTLIGHT) return &gHalSpotlightInterface[0]; #else return NULL; #endif }