1428 lines
		
	
	
		
			43 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			1428 lines
		
	
	
		
			43 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | |||
|  | 
 | |||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | |||
|  | 
 | |||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | |||
|  | be copied by any method or incorporated into another program without | |||
|  | the express written consent of Aerospace C.Power. This Information or any portion | |||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | |||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | |||
|  | liability for its use in any way and conveys no license or title under | |||
|  | any patent or copyright and makes no representation or warranty that this | |||
|  | Information is free from patent or copyright infringement. | |||
|  | 
 | |||
|  | ****************************************************************************/ | |||
|  | 
 | |||
|  | #include "app_common.h"
 | |||
|  | #include "app_config.h"
 | |||
|  | #include "app_main.h"
 | |||
|  | #include "app_gpio.h"
 | |||
|  | 
 | |||
|  | #if (TARGET_VERSION == TARGET_KUNLUN)
 | |||
|  | #define PWM_ID_MAX          4  /* KL1 has 4 pwm channels */
 | |||
|  | #elif (TARGET_VERSION == TARGET_KUNLUN2)
 | |||
|  | #define PWM_ID_MAX          6  /* KL2 has 6 pwm channels */
 | |||
|  | #elif (TARGET_VERSION == TARGET_KUNLUN3)
 | |||
|  | #define PWM_ID_MAX          6  /* kl3 has 6 pwm channels */
 | |||
|  | #endif
 | |||
|  | 
 | |||
|  | 
 | |||
|  | static app_io_state g_hwio[APP_IO_PIN_MAX_NUM]; | |||
|  | static uint16_t g_pwm_logar[101] = { | |||
|  |     0,1,1,1,1,2,2,2,2,2,3 | |||
|  |     ,3,3,3,4,4,4,5,5,6,6 | |||
|  |     ,7,8,8,9,10,11,12,13,14,16 | |||
|  |     ,17,19,21,23,25,28,30,33,36,40 | |||
|  |     ,44,48,52,58,63,69,76,83,91,100 | |||
|  |     ,110,120,132,145,158,174,191,209,229,251 | |||
|  |     ,275,302,331,363,398,437,479,525,575,631 | |||
|  |     ,692,759,832,912,1000,1096,1202,1318,1445,1585 | |||
|  |     ,1738,1905,2089,2291,2512,2754,3020,3311,3631,3981 | |||
|  |     ,4365,4786,5248,5754,6310,6918,7586,8318,9120,10000 | |||
|  | }; | |||
|  | 
 | |||
|  | static timer_id_t g_pwm_timer[PWM_ID_MAX]; | |||
|  | static pwm_adjust_state g_pwm_adjust[PWM_ID_MAX] = {0}; | |||
|  | 
 | |||
|  | #define IO_HTZD_CCO_3_PHASE_NUM     0
 | |||
|  | #define IO_HTZD_STA_1_PHASE_NUM     3
 | |||
|  | #define IO_LEDC_NUM                 3
 | |||
|  | #define IO_Q111N_H_NUM              3
 | |||
|  | #define IO_Q111N_HS_NUM             3
 | |||
|  | #define IO_Q111N_ISC_NUM            5
 | |||
|  | #define IO_Q111N_ISF_NUM            12
 | |||
|  | #define IO_Q111N_ISG_NUM            5
 | |||
|  | #define IO_IPL_YY01_NUM             12
 | |||
|  | 
 | |||
|  | static uint8_t default_io_HTZD_STA_1_PHASE(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_HTZD_STA_1_PHASE_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_28, 50, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_36, 50, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_LEDC(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_LEDC_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_28, 50, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_36, 50, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_H(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_H_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_HS(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_HS_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_ISC(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_ISC_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_28, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_ISF(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_ISF_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_28, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_33, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 5: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 6: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_37, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 7: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_38, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 8: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_39, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 9: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_40, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 10: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_41, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 11: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_42, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_ISF03(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_ISF_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_0, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_7, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_4, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_26, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_31, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 5: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_39, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 6: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_37, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 7: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_34, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 8: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_35, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 9: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 10: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_38, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 11: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_8, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_Q111N_ISG(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state || idx >= IO_Q111N_ISG_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx){ | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM,  HI_GPIO_IDX_28, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_2, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_36, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_3, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_IPL_YY01(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state ||idx >= IO_IPL_YY01_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_10, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_22, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_23, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_28, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_32, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 5: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_33, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 6: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 7: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_37, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 8: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_38, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 9: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_39, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 10: | |||
|  |         *io_state = (app_io_state) {APP_PIN_GPIO, HI_GPIO_IDX_40, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 11: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_41, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint8_t default_io_IPL_YY03(app_io_state *io_state, uint8_t idx) | |||
|  | { | |||
|  |     if (NULL == io_state ||idx >= IO_IPL_YY01_NUM) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch(idx) { | |||
|  |     case 0: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_26, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_0, 0}; | |||
|  |         break; | |||
|  |     case 1: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_39, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 2: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_38, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 3: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_37, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 4: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_36, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 5: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_35, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 6: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_31, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 7: | |||
|  |         *io_state = (app_io_state){APP_PIN_PWM, HI_GPIO_IDX_8, 0, 5, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_1, 0}; | |||
|  |         break; | |||
|  |     case 8: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_7, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 9: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_4, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 10: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_1, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     case 11: | |||
|  |         *io_state = (app_io_state){APP_PIN_GPIO, HI_GPIO_IDX_0, 0, 0, 0, 0, | |||
|  |             IOT_PWM_CHANNEL_INVAL, 0}; | |||
|  |         break; | |||
|  |     default: | |||
|  |         break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint16_t app_get_io_param_from_nv(app_io_state *io_state) | |||
|  | { | |||
|  |     nv_ftm_hwio_id nv_value = {0}; | |||
|  |     uint16_t ret; | |||
|  |     uint32_t offset; | |||
|  | 
 | |||
|  |     if (NULL == io_state) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     os_mem_set(&nv_value, 0, sizeof(nv_value)); | |||
|  |     offset = NV_FTM_HWIO_ID * APP_NV_FTM_SIZE; | |||
|  | 
 | |||
|  |     ret = app_flash_read(offset, (uint8_t*)&nv_value, sizeof(nv_value)); | |||
|  |     if (ret != ERR_OK) { | |||
|  |         APP_PRINTF("[ERR] %s Read HWIO Failed !!", __FUNCTION__); | |||
|  |         return ret; | |||
|  |     } | |||
|  | 
 | |||
|  |     os_mem_cpy(io_state, nv_value.io_type, sizeof(nv_value.io_type)); | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | static uint16_t app_save_io_param_to_nv(void) | |||
|  | { | |||
|  |     nv_ftm_hwio_id nv_value = {0}; | |||
|  |     uint16_t ret; | |||
|  |     uint32_t offset; | |||
|  | 
 | |||
|  |     os_mem_cpy(nv_value.io_type, g_hwio, sizeof(nv_value.io_type)); | |||
|  | 
 | |||
|  |     offset = NV_FTM_HWIO_ID * APP_NV_FTM_SIZE; | |||
|  |     ret = app_flash_write(offset, (uint8_t*)&nv_value, sizeof(nv_value)); | |||
|  |     if (ret != ERR_OK) { | |||
|  |         APP_PRINTF("[ERR] %s Write HWIO Failed !!", __FUNCTION__); | |||
|  |         return ret; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | void app_restore_hwio(void) | |||
|  | { | |||
|  |     uint8_t i, ret; | |||
|  | 
 | |||
|  |     os_mem_set(g_hwio, 0, APP_IO_PIN_MAX_NUM * sizeof(app_io_state)); | |||
|  |     switch (app_get_hw_ver()) { | |||
|  |         case APP_HW_IPL_YY01: | |||
|  |             for(i = 0; i < IO_IPL_YY01_NUM; i++) { | |||
|  |                 default_io_IPL_YY01(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_IPL_YY03: | |||
|  |             for(i = 0; i < IO_IPL_YY01_NUM; i++) { | |||
|  |                 default_io_IPL_YY03(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_H: | |||
|  |             for(i = 0; i < IO_Q111N_H_NUM; i++) { | |||
|  |                 default_io_Q111N_H(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_HS: | |||
|  |             for(i = 0; i < IO_Q111N_HS_NUM; i++) { | |||
|  |                 default_io_Q111N_HS(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISC: | |||
|  |             for(i = 0; i < IO_Q111N_ISC_NUM; i++) { | |||
|  |                 default_io_Q111N_ISC(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF: | |||
|  |             for(i = 0; i < IO_Q111N_ISF_NUM; i++) { | |||
|  |                 default_io_Q111N_ISF(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF03: | |||
|  |             for(i = 0; i < IO_Q111N_ISF_NUM; i++) { | |||
|  |                 default_io_Q111N_ISF03(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISG: | |||
|  |             for(i = 0; i < IO_Q111N_ISG_NUM; i++) { | |||
|  |                 default_io_Q111N_ISG(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_LEDC_P: | |||
|  |         case APP_HW_LEDC: | |||
|  |             for(i = 0; i < IO_LEDC_NUM; i++) { | |||
|  |                 default_io_LEDC(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_HTZD_STA_1_PHASE: | |||
|  |             for(i = 0; i < IO_HTZD_STA_1_PHASE_NUM; i++) { | |||
|  |                 default_io_HTZD_STA_1_PHASE(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_HTZD_CCO_3_PHASE: | |||
|  |             break; | |||
|  | 
 | |||
|  |         default: | |||
|  |             for(i = 0; i < IO_LEDC_NUM; i++) { | |||
|  |                 default_io_LEDC(&g_hwio[i], i); | |||
|  |             } | |||
|  |             break; | |||
|  |     } | |||
|  | 
 | |||
|  |     ret = app_save_io_param_to_nv(); | |||
|  |     if (ret != ERR_OK) { | |||
|  |         APP_PRINTF("[ERR] %s Save HWIO Failed !!", __FUNCTION__); | |||
|  |         return; | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | uint8_t app_get_hw_io_array_size(void) | |||
|  | { | |||
|  |     uint8_t size = 0; | |||
|  |     uint32_t ver; | |||
|  |     app_entity_t *app_entry = NULL; | |||
|  | 
 | |||
|  |     app_entry = app_get_main_entry(); | |||
|  | 
 | |||
|  |     ver = app_entry->app_cfg.factory.hw_ver; | |||
|  | 
 | |||
|  |     switch (ver) { | |||
|  |         case APP_HW_IPL_YY01: | |||
|  |         case APP_HW_IPL_YY03: | |||
|  |             size = IO_IPL_YY01_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_Q111N_H: | |||
|  |             size = IO_Q111N_H_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_Q111N_HS: | |||
|  |             size = IO_Q111N_HS_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_Q111N_ISC: | |||
|  |             size = IO_Q111N_ISC_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_Q111N_ISF: | |||
|  |         case APP_HW_Q111N_ISF03: | |||
|  |             size = IO_Q111N_ISF_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_Q111N_ISG: | |||
|  |             size = IO_Q111N_ISG_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_LEDC_P: | |||
|  |         case APP_HW_LEDC: | |||
|  |             size = IO_LEDC_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_HTZD_STA_1_PHASE: | |||
|  |             size = IO_HTZD_STA_1_PHASE_NUM; | |||
|  |             break; | |||
|  |         case APP_HW_HTZD_CCO_3_PHASE: | |||
|  |             size = IO_HTZD_CCO_3_PHASE_NUM; | |||
|  |             break; | |||
|  |         default: | |||
|  |             break; | |||
|  |     } | |||
|  |     return size; | |||
|  | } | |||
|  | 
 | |||
|  | uint8_t app_get_io_num(uint8_t pin[], uint8_t size) | |||
|  | { | |||
|  |     uint8_t cnt = 0; | |||
|  |     app_entity_t *app_entry = NULL; | |||
|  | 
 | |||
|  |     if(size < APP_IO_PIN_MAX_NUM) { | |||
|  |         return cnt; | |||
|  |     } | |||
|  | 
 | |||
|  |     app_entry = app_get_main_entry(); | |||
|  | 
 | |||
|  |     switch (app_entry->app_cfg.factory.hw_ver) { | |||
|  |         case APP_HW_IPL_YY01: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_32; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_33; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_37; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_38; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_39; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_40; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_41; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_IPL_YY03: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_26; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_39; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_38; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_37; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_35; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_31; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_8; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_7; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_4; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_1; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_0; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_H: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_HS: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISC: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_33; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_37; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_38; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_39; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_40; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_41; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_42; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF03: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_0; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_7; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_4; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_26; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_31; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_39; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_37; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_34; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_35; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_38; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_8; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISG: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_22; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_23; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_LEDC_P: | |||
|  |         case APP_HW_LEDC: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_HTZD_STA_1_PHASE: | |||
|  |             pin[cnt++] = HI_GPIO_IDX_10; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_28; | |||
|  |             pin[cnt++] = HI_GPIO_IDX_36; | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_HTZD_CCO_3_PHASE: | |||
|  |             break; | |||
|  | 
 | |||
|  |         default: | |||
|  |             break; | |||
|  |     } | |||
|  | 
 | |||
|  |     return cnt; | |||
|  | } | |||
|  | 
 | |||
|  | bool_t app_check_io_state_param(app_io_state *io_state) | |||
|  | { | |||
|  |     app_entity_t *app_entry = NULL; | |||
|  | 
 | |||
|  |     app_entry = app_get_main_entry(); | |||
|  | 
 | |||
|  |     switch (app_entry->app_cfg.factory.hw_ver) { | |||
|  |         case APP_HW_IPL_YY01: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_32: | |||
|  |                 case HI_GPIO_IDX_33: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                 case HI_GPIO_IDX_37: | |||
|  |                 case HI_GPIO_IDX_38: | |||
|  |                 case HI_GPIO_IDX_39: | |||
|  |                 case HI_GPIO_IDX_40: | |||
|  |                 case HI_GPIO_IDX_41: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |                 } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_IPL_YY03: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_26: | |||
|  |                 case HI_GPIO_IDX_39: | |||
|  |                 case HI_GPIO_IDX_38: | |||
|  |                 case HI_GPIO_IDX_37: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                 case HI_GPIO_IDX_35: | |||
|  |                 case HI_GPIO_IDX_31: | |||
|  |                 case HI_GPIO_IDX_8: | |||
|  |                 case HI_GPIO_IDX_7: | |||
|  |                 case HI_GPIO_IDX_4: | |||
|  |                 case HI_GPIO_IDX_1: | |||
|  |                 case HI_GPIO_IDX_0: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |                 } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_H: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_HS: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISC: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_33: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                 case HI_GPIO_IDX_37: | |||
|  |                 case HI_GPIO_IDX_38: | |||
|  |                 case HI_GPIO_IDX_39: | |||
|  |                 case HI_GPIO_IDX_40: | |||
|  |                 case HI_GPIO_IDX_41: | |||
|  |                 case HI_GPIO_IDX_42: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISF03: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_0: | |||
|  |                 case HI_GPIO_IDX_7: | |||
|  |                 case HI_GPIO_IDX_4: | |||
|  |                 case HI_GPIO_IDX_26: | |||
|  |                 case HI_GPIO_IDX_31: | |||
|  |                 case HI_GPIO_IDX_39: | |||
|  |                 case HI_GPIO_IDX_37: | |||
|  |                 case HI_GPIO_IDX_34: | |||
|  |                 case HI_GPIO_IDX_35: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                 case HI_GPIO_IDX_38: | |||
|  |                 case HI_GPIO_IDX_8: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_Q111N_ISG: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_22: | |||
|  |                 case HI_GPIO_IDX_23: | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_LEDC_P: | |||
|  |         case APP_HW_LEDC: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_HW_HTZD_STA_1_PHASE: | |||
|  |             switch (io_state->pin_num) { | |||
|  |                 case HI_GPIO_IDX_10: | |||
|  |                 case HI_GPIO_IDX_28: | |||
|  |                 case HI_GPIO_IDX_36: | |||
|  |                     break; | |||
|  |                 default: | |||
|  |                     return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         default: | |||
|  |             return false; | |||
|  |     } | |||
|  | 
 | |||
|  |     switch (io_state->type) { | |||
|  |         case APP_PIN_GPIO_IN: | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_PIN_GPIO: | |||
|  |             if (io_state->state > APP_GPIO_STATE_MAX_VALUE) { | |||
|  |                 return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         case APP_PIN_PWM: | |||
|  |             if (io_state->state > APP_PWM_DUTY_CYCLE_MAX_VALUE) { | |||
|  |                 return false; | |||
|  |             } else if (io_state->pwm_freq < APP_PWM_FREQ_MIN_VALUE || | |||
|  |                 io_state->pwm_freq > APP_PWM_FREQ_MAX_VALUE) { | |||
|  |                 return false; | |||
|  |             } else if (io_state->pwm_ctl_mode > APP_PWM_MODE_MAX_VALUE) { | |||
|  |                 return false; | |||
|  |             } else if (io_state->pwm_adjust_time > APP_PWM_ADJUST_TIME_MAX_VALUE) { | |||
|  |                 return false; | |||
|  |             } | |||
|  |             break; | |||
|  | 
 | |||
|  |         default: | |||
|  |            return false; | |||
|  |     } | |||
|  | 
 | |||
|  |     return true; | |||
|  | } | |||
|  | 
 | |||
|  | static app_io_state * get_io_state(uint8_t pin_num) | |||
|  | { | |||
|  |     uint16_t i = 0; | |||
|  | 
 | |||
|  |     for (i = 0; i < app_get_hw_io_array_size(); i++) { | |||
|  |         if ((pin_num == g_hwio[i].pin_num) && (g_hwio[i].type > 0)) { | |||
|  |             return &g_hwio[i]; | |||
|  |         } | |||
|  |     } | |||
|  |     return NULL; | |||
|  | } | |||
|  | 
 | |||
|  | static void set_pwm_state(app_io_state *io_state,  uint8_t duty, | |||
|  |     uint8_t freq) | |||
|  | { | |||
|  |     uint32_t pwm_duty = 0; | |||
|  |     uint32_t pwm_freq = 0; | |||
|  | 
 | |||
|  |     if (NULL == io_state) { | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     if (duty > APP_PWM_DUTY_CYCLE_MAX_VALUE) { | |||
|  |         duty = APP_PWM_DUTY_CYCLE_MAX_VALUE; | |||
|  |     } | |||
|  |     if (freq < APP_PWM_FREQ_MIN_VALUE || freq > APP_PWM_FREQ_MAX_VALUE) { | |||
|  |         freq = PWM_FREQ_DEF_VAL; | |||
|  |     } | |||
|  | 
 | |||
|  |     /* default clock rate: 25MHz,support: KL1\KL2\KL3 */ | |||
|  |     pwm_freq = freq * 1000; | |||
|  |     if (APP_PWM_CTL_REALTIME == io_state->pwm_ctl_mode) { | |||
|  |         pwm_duty = duty * 100; | |||
|  |     } | |||
|  |     else if (APP_PWM_CTL_LINAR == io_state->pwm_ctl_mode) { | |||
|  |         pwm_duty = duty * 100; | |||
|  |     } | |||
|  |     else if (APP_PWM_CTL_LOGAR == io_state->pwm_ctl_mode) { | |||
|  |         pwm_duty = g_pwm_logar[duty]; | |||
|  |     } | |||
|  |     else { | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     app_pwm_config(io_state->pwm_channel, io_state->pin_num, pwm_freq, pwm_duty); | |||
|  |     io_state->state = duty; | |||
|  |     io_state->pwm_freq = freq; | |||
|  |     APP_PRINTF("[INF] %s GPIO%d state:%d freq:%d pwm_duty:%d\n", | |||
|  |         __FUNCTION__, io_state->pin_num, duty, freq, pwm_duty); | |||
|  | } | |||
|  | 
 | |||
|  | static void pwm_timer_callback(timer_id_t tid, void *arg) | |||
|  | { | |||
|  |     app_io_state *p =(app_io_state *)arg; | |||
|  |     pwm_adjust_state *adjust_st = (pwm_adjust_state *)&g_pwm_adjust[p->pwm_channel]; | |||
|  | 
 | |||
|  |     if (adjust_st->end_val == adjust_st->current_val) { | |||
|  |         os_stop_timer(g_pwm_timer[p->pwm_channel]); | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     if (0 == adjust_st->times) { | |||
|  |         adjust_st->current_val = adjust_st->end_val; | |||
|  |     } else { | |||
|  |         adjust_st->times--; | |||
|  |         if (adjust_st->end_val > adjust_st->current_val) { | |||
|  |             /* step up */ | |||
|  |             adjust_st->current_val += ADJUST_PWM_STEPS; | |||
|  |         } else if (adjust_st->end_val < adjust_st->current_val) { | |||
|  |             /* step down */ | |||
|  |             adjust_st->current_val -= ADJUST_PWM_STEPS; | |||
|  |         } | |||
|  |     } | |||
|  |     /* update pwm duty */ | |||
|  |     set_pwm_state(p, adjust_st->current_val, p->pwm_freq); | |||
|  | 
 | |||
|  |     return; | |||
|  | } | |||
|  | 
 | |||
|  | static void pwm_smooth_adjust(app_io_state *p, pwm_adjust_state *state) | |||
|  | { | |||
|  |     uint8_t value = 0; | |||
|  |     uint16_t period = 0; | |||
|  | 
 | |||
|  |     if (NULL == p || NULL == state) { | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     APP_PRINTF("[INF] set PWM pin_num:%d state from:%d to:%d\n", | |||
|  |         p->pin_num, state->current_val, state->end_val); | |||
|  |     if (p->pwm_channel >= PWM_ID_MAX) { | |||
|  |         APP_PRINTF("[INF] invalid pwm channel\n"); | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     if (state->current_val == state->end_val) { | |||
|  |         set_pwm_state(p, p->state, p->pwm_freq); | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     if (state->current_val > state->end_val) { | |||
|  |         value = state->current_val - state->end_val; | |||
|  |     } else { | |||
|  |         value = state->end_val - state->current_val; | |||
|  |     } | |||
|  | 
 | |||
|  |     g_pwm_adjust[p->pwm_channel].duration = state->duration; | |||
|  |     g_pwm_adjust[p->pwm_channel].times = value; | |||
|  |     g_pwm_adjust[p->pwm_channel].end_val = state->end_val; | |||
|  |     g_pwm_adjust[p->pwm_channel].current_val = state->current_val; | |||
|  |     period = g_pwm_adjust[p->pwm_channel].duration * 10; | |||
|  | 
 | |||
|  |     /* Create a timer */ | |||
|  |     if (g_pwm_adjust[p->pwm_channel].timer_init == 0) { | |||
|  |         g_pwm_timer[p->pwm_channel] = os_create_timer(IOT_APP_DEMO_MID, 1, | |||
|  |             (os_timer_func_t)pwm_timer_callback, (void *)p); | |||
|  |         g_pwm_adjust[p->pwm_channel].timer_init = 1; | |||
|  |         if (0 == g_pwm_timer[p->pwm_channel]) { | |||
|  |             APP_PRINTF("[ERR] %s Create Timer Failed !!", __FUNCTION__); | |||
|  |             return; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /* Start the timer */ | |||
|  |     os_start_timer(g_pwm_timer[p->pwm_channel], period); | |||
|  | } | |||
|  | 
 | |||
|  | void app_pwm_config(uint8_t ch, uint8_t gpio_p, uint32_t pwm_freq, | |||
|  |     uint32_t pwm_duty) | |||
|  | { | |||
|  |     iot_epwm_global_config_t epwm_glb_cfg = IOT_EPWM_GLOBAL_CONFIG_DEFAULT; | |||
|  |     iot_epwm_ch_config_t epwm_ch_cfg = IOT_EPWM_CHANNEL_CONFIG_DEFAULT; | |||
|  | 
 | |||
|  |     iot_pwm_api_mode_select(IOT_API_MODE_EPWM); | |||
|  |     iot_epwm_global_config_set(&epwm_glb_cfg); | |||
|  |     iot_epwm_global_stop(); | |||
|  |     epwm_ch_cfg.ch_usage = IOT_EPWM_CH_USEAGE_COMMON; | |||
|  |     epwm_ch_cfg.ch_clk_div = 1; | |||
|  |     epwm_ch_cfg.ch_common_cfg.freq = pwm_freq; | |||
|  |     epwm_ch_cfg.ch_common_cfg.duty = pwm_duty; | |||
|  |     epwm_ch_cfg.ch_pin_outa = gpio_p; | |||
|  |     if(0 != iot_epwm_ch_config_set(ch, &epwm_ch_cfg)) { | |||
|  |         APP_PRINTF("[INFO] %s epwm config failed!!", __FUNCTION__); | |||
|  |         return; | |||
|  |     } | |||
|  |     iot_epwm_ch_start(ch); | |||
|  |     iot_epwm_global_start(); | |||
|  | } | |||
|  | 
 | |||
|  | uint16_t app_get_io_map(app_io_state *io_state) | |||
|  | { | |||
|  |     uint16_t i = 0; | |||
|  | 
 | |||
|  |     for (i = 0; i < app_get_hw_io_array_size(); i++) { | |||
|  |         if ((io_state->pin_num == g_hwio[i].pin_num) | |||
|  |             && (g_hwio[i].type > 0)) { | |||
|  |             os_mem_cpy(io_state, &g_hwio[i], sizeof(app_io_state)); | |||
|  |             return ERR_OK; | |||
|  |         } | |||
|  |     } | |||
|  |     return ERR_FAIL; | |||
|  | } | |||
|  | 
 | |||
|  | uint8_t app_pwm_get_usable_channel(void) | |||
|  | { | |||
|  |     uint16_t i = 0; | |||
|  |     uint8_t flag_pwm_chl = 0; | |||
|  | 
 | |||
|  |     for (i = 0; i < app_get_hw_io_array_size(); i++) { | |||
|  |         if (APP_PIN_PWM == g_hwio[i].type) { | |||
|  |             uint8_t chl = g_hwio[i].pwm_channel; | |||
|  |             if (chl >= IOT_PWM_CHANNEL_0 && chl <= PWM_ID_MAX) { | |||
|  |                 flag_pwm_chl |= (1 << chl); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     for (i = IOT_PWM_CHANNEL_0; i <= PWM_ID_MAX; i++) { | |||
|  |         if ((flag_pwm_chl & (1 << i)) == 0) { | |||
|  |             APP_PRINTF("[INF] %s Got unused pwm channel:%d\n", __FUNCTION__, i); | |||
|  |             return i; | |||
|  |         } | |||
|  |     } | |||
|  |     APP_PRINTF("[INF] %s Got no unused pwm channel !!\n", __FUNCTION__); | |||
|  |     return IOT_PWM_CHANNEL_INVAL; | |||
|  | } | |||
|  | 
 | |||
|  | uint16_t app_get_gpio_state(app_io_state *io_state) | |||
|  | { | |||
|  |     app_io_state * p = NULL; | |||
|  |     int value; | |||
|  | 
 | |||
|  |     if (NULL == io_state) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     p = get_io_state(io_state->pin_num); | |||
|  |     if (NULL == p) { | |||
|  |         APP_PRINTF("[ERR] %s Invalid pin num %d !!", __FUNCTION__, io_state->pin_num); | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     io_state->type = p->type; | |||
|  |     if (APP_PIN_PWM == p->type) { | |||
|  |         io_state->state = p->state; | |||
|  |         io_state->pwm_channel = p->pwm_channel; | |||
|  |         io_state->pwm_freq = p->pwm_freq; | |||
|  |         io_state->pwm_ctl_mode = p->pwm_ctl_mode; | |||
|  |         io_state->pwm_adjust_time = p->pwm_adjust_time; | |||
|  |         APP_PRINTF("[INF] get PWM pin_num:%d state:%d freq:%d mode:%d adjust: %d\n", | |||
|  |             io_state->pin_num, io_state->state, io_state->pwm_freq, | |||
|  |             io_state->pwm_ctl_mode, io_state->pwm_adjust_time); | |||
|  |     } else if (APP_PIN_GPIO == p->type || APP_PIN_GPIO_IN == p->type) { | |||
|  |         if (APP_PIN_GPIO_IN == p->type) { | |||
|  |             value = iot_gpio_value_get(io_state->pin_num); | |||
|  |         } else if (ERR_OK != iot_gpio_output_value_get(io_state->pin_num, &value)) { | |||
|  |             APP_PRINTF("[ERR] %s Get GPIO:%d Failed !!", __FUNCTION__, | |||
|  |                 io_state->pin_num); | |||
|  |             return ERR_FAIL; | |||
|  |         } | |||
|  |         io_state->state = (uint8_t)value; | |||
|  |         io_state->pwm_channel = IOT_PWM_CHANNEL_INVAL; | |||
|  |         io_state->pwm_freq = 0; | |||
|  |         io_state->pwm_ctl_mode = 0; | |||
|  |         io_state->pwm_adjust_time = 0; | |||
|  |         APP_PRINTF("[INF] get GPIO pin_num:%d state:%d\n", io_state->pin_num, | |||
|  |             io_state->state); | |||
|  |     } else { | |||
|  |         APP_PRINTF("[ERR] %s Invalid pin type %d !!", __FUNCTION__, p->type); | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | uint16_t app_set_gpio_state(app_io_state *new_state, uint8_t save_flash) | |||
|  | { | |||
|  |     app_io_state *p = NULL; | |||
|  | #if (TARGET_VERSION == TARGET_KUNLUN)
 | |||
|  |     app_io_state *temp_io = NULL; | |||
|  |     uint8_t io_pin[APP_IO_PIN_MAX_NUM] = {0}, i, num = 0, freq = 0, cnt = 0; | |||
|  | #endif
 | |||
|  | 
 | |||
|  |     if (NULL == new_state) { | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  | 
 | |||
|  |     p = get_io_state(new_state->pin_num); | |||
|  |     if (NULL == p) { | |||
|  |         APP_PRINTF("[ERR] %s Invalid pin num %d !!", | |||
|  |             __FUNCTION__, new_state->pin_num); | |||
|  |         return ERR_FAIL; | |||
|  |     } | |||
|  |     /* handle gpio type. */ | |||
|  |     if (new_state->init_state == 0) { | |||
|  |         /* Stop PWM, and set channel free. */ | |||
|  |         if (APP_PIN_PWM == p->type && p->pwm_channel < PWM_ID_MAX) { | |||
|  |             if (g_pwm_adjust[p->pwm_channel].timer_init == 1) { | |||
|  |                 if (os_is_timer_active(g_pwm_timer[p->pwm_channel])) { | |||
|  |                     os_stop_timer(g_pwm_timer[p->pwm_channel]); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /* when in kl1 chip,the pwm which is more than one channel
 | |||
|  |         in use can't change freq, otherwise The pwm mode of more than one | |||
|  |         channel needs to be switched to gpio mode */ | |||
|  | #if (TARGET_VERSION == TARGET_KUNLUN)
 | |||
|  |         if ((APP_PIN_PWM != p->type) && (APP_PIN_PWM != new_state->type)) { | |||
|  |             iot_gpio_close(p->pin_num); | |||
|  |         } else if (APP_PIN_PWM == p->type && | |||
|  |             (APP_PIN_GPIO == new_state->type || | |||
|  |             APP_PIN_GPIO_IN == new_state->type)) { | |||
|  |             /* if one pwm channel close when in kl1 chip,
 | |||
|  |             all pwm can't output wave shape */ | |||
|  |             if (p->pwm_channel != IOT_PWM_CHANNEL_INVAL) { | |||
|  |                 iot_epwm_ch_close(p->pwm_channel); | |||
|  |             } | |||
|  |         } else if (APP_PIN_PWM == new_state->type) { | |||
|  |             num = app_get_io_num(io_pin, sizeof(io_pin)); | |||
|  |             for (i = 0; i < num; i++) { | |||
|  |                 temp_io = get_io_state(io_pin[i]); | |||
|  |                 if (temp_io->type == APP_PIN_PWM) { | |||
|  |                     freq = temp_io->pwm_freq; | |||
|  |                     cnt++; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             if (APP_PIN_PWM == p->type && APP_PIN_PWM == new_state->type) { | |||
|  |                 if (cnt > 1 && new_state->pwm_freq != p->pwm_freq) { | |||
|  |                     APP_PRINTF("[ERR] %s pwm can't change freq !!", __FUNCTION__); | |||
|  |                     return ERR_FAIL; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             if ((APP_PIN_GPIO == p->type || APP_PIN_GPIO_IN == p->type) && | |||
|  |                 APP_PIN_PWM == new_state->type) { | |||
|  |                 if (cnt == 0 || freq == new_state->pwm_freq) { | |||
|  |                     iot_gpio_close(p->pin_num); | |||
|  |                 } else { | |||
|  |                     APP_PRINTF("[ERR] %s pwm freq isn't equal to other pwm freq !!", | |||
|  |                         __FUNCTION__); | |||
|  |                     return ERR_FAIL; | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | #elif (TARGET_VERSION == TARGET_KUNLUN3)
 | |||
|  |         if ((APP_PIN_GPIO == new_state->type || | |||
|  |             APP_PIN_GPIO_IN == new_state->type) && | |||
|  |             APP_PIN_PWM == p->type) { | |||
|  |             iot_epwm_ch_close(p->pwm_channel); | |||
|  |         } else if (APP_PIN_GPIO == p->type || APP_PIN_GPIO_IN == p->type) { | |||
|  |             iot_gpio_close(p->pin_num); | |||
|  |         } | |||
|  | #endif
 | |||
|  |         if (APP_PIN_GPIO == p->type || APP_PIN_GPIO == new_state->type) { | |||
|  |             p->pwm_channel = IOT_PWM_CHANNEL_INVAL; | |||
|  |         } | |||
|  |         p->init_state = 0; | |||
|  |     } | |||
|  |     /* set new state. */ | |||
|  |     if (APP_PIN_GPIO == new_state->type) { | |||
|  |         if (0 == p->init_state) { | |||
|  |             if (ERR_OK != iot_gpio_open_as_output(p->pin_num)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set GPIO:%d as output Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 return ERR_FAIL; | |||
|  |             } | |||
|  |             if (ERR_OK != iot_gpio_value_set(p->pin_num , new_state->state)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set GPIO:%d value Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 return ERR_FAIL; | |||
|  |             } | |||
|  |             p->init_state = 1; | |||
|  |         } | |||
|  |     } else if (APP_PIN_GPIO_IN == new_state->type) { | |||
|  |         if (0 == p->init_state) { | |||
|  |             if (ERR_OK != iot_gpio_open_as_input(p->pin_num)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set GPIO:%d as input Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 return ERR_FAIL; | |||
|  |             } | |||
|  |             if (ERR_OK != iot_gpio_set_pull_mode(p->pin_num, GPIO_PULL_DOWN)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set GPIO:%d input pull mode Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 return ERR_FAIL; | |||
|  |             } | |||
|  |             p->init_state = 1; | |||
|  |         } | |||
|  |     } else if (APP_PIN_PWM == new_state->type) { | |||
|  |         if (0 == p->init_state) { | |||
|  |             if (IOT_PWM_CHANNEL_INVAL ==  p->pwm_channel) { | |||
|  |                 uint8_t chl = app_pwm_get_usable_channel(); | |||
|  |                 if (IOT_PWM_CHANNEL_INVAL == chl ) { | |||
|  |                     APP_PRINTF("[ERR] %s Get usable pwm channel Failed !!", | |||
|  |                         __FUNCTION__); | |||
|  |                     return ERR_FAIL; | |||
|  |                 } | |||
|  |                 p->pwm_channel = chl; | |||
|  |             } | |||
|  |             p->pwm_ctl_mode = new_state->pwm_ctl_mode; | |||
|  |             p->pwm_adjust_time = new_state->pwm_adjust_time; | |||
|  |             p->init_state = 1; | |||
|  |         } | |||
|  |         if (APP_PWM_CTL_REALTIME == p->pwm_ctl_mode) { | |||
|  |             if(p->pwm_freq != new_state->pwm_freq) { | |||
|  |                 p->pwm_freq = new_state->pwm_freq; | |||
|  |             } | |||
|  |             set_pwm_state(p, new_state->state, p->pwm_freq); | |||
|  |         } else { | |||
|  |             pwm_adjust_state pwm_state; | |||
|  |             p->pwm_freq = PWM_FREQ_DEF_VAL; | |||
|  |             pwm_state.duration = p->pwm_adjust_time; | |||
|  |             pwm_state.current_val = p->state; | |||
|  |             pwm_state.end_val = new_state->state; | |||
|  |             pwm_smooth_adjust(p, &pwm_state); | |||
|  |         } | |||
|  |     } | |||
|  |     p->type = new_state->type; | |||
|  |     p->state = new_state->state; | |||
|  |     APP_PRINTF("[INF] %s Set GPIO pin_num:%d type:%d state:%d save:%d\n", | |||
|  |         __FUNCTION__, p->pin_num, p->type, p->state, save_flash); | |||
|  | 
 | |||
|  |     /* Save new state to flash */ | |||
|  |     if (save_flash  == STATE_SAVE_FLASH) { | |||
|  |         if (ERR_OK != app_save_io_param_to_nv()) { | |||
|  |             return ERR_FAIL; | |||
|  |         } | |||
|  |     } | |||
|  |     return ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | void app_io_init(void) | |||
|  | { | |||
|  |     uint8_t i = 0, ch, ret; | |||
|  | 
 | |||
|  |     ret = app_get_io_param_from_nv(g_hwio); | |||
|  |     if (ret != ERR_OK) { | |||
|  |         APP_PRINTF("%s read io param error\n", __FUNCTION__); | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     for (i = 0; i < app_get_hw_io_array_size(); i++) { | |||
|  |         app_io_state * p = &g_hwio[i]; | |||
|  |         if (APP_PIN_GPIO == p->type) { | |||
|  |             p->init_state = 0; | |||
|  |             if (ERR_OK != iot_gpio_open_as_output(p->pin_num)) { | |||
|  |                 APP_PRINTF("[ERR] %s Open Gpio %d as output Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 continue; | |||
|  |             } | |||
|  |             p->init_state = 1; | |||
|  |             if (ERR_OK != iot_gpio_value_set(p->pin_num, p->state)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set Gpio %d value Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 continue; | |||
|  |             } | |||
|  |         } else if (APP_PIN_GPIO_IN == p->type) { | |||
|  |             p->init_state = 0; | |||
|  |             if (ERR_OK != iot_gpio_open_as_input(p->pin_num)) { | |||
|  |                 APP_PRINTF("[ERR] %s Open Gpio %d as input Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 continue; | |||
|  |             } | |||
|  |             if (ERR_OK != iot_gpio_set_pull_mode(p->pin_num, GPIO_PULL_DOWN)) { | |||
|  |                 APP_PRINTF("[ERR] %s Set GPIO:%d input pull mode Failed !!", | |||
|  |                     __FUNCTION__, p->pin_num); | |||
|  |                 continue; | |||
|  |             } | |||
|  |             p->init_state = 1; | |||
|  |         } else if (APP_PIN_PWM == p->type) { | |||
|  |             p->init_state = 0; | |||
|  |             if (IOT_PWM_CHANNEL_INVAL == p->pwm_channel) { | |||
|  |                 ch = app_pwm_get_usable_channel(); | |||
|  |                 if (IOT_PWM_CHANNEL_INVAL != ch) { | |||
|  |                     p->pwm_channel = ch; | |||
|  | 
 | |||
|  |                 } else { | |||
|  |                     APP_PRINTF("[ERR] %s Get usable pwm channel Failed !!", | |||
|  |                         __FUNCTION__); | |||
|  |                     p->init_state = 0; | |||
|  |                     continue; | |||
|  |                 } | |||
|  |             } | |||
|  |             if (APP_PWM_CTL_REALTIME == p->pwm_ctl_mode) { | |||
|  |                 set_pwm_state(p, p->state, p->pwm_freq); | |||
|  |             } else { | |||
|  |                 pwm_adjust_state pwm_state; | |||
|  |                 pwm_state.duration = p->pwm_adjust_time; | |||
|  |                 pwm_state.current_val = p->state; | |||
|  |                 pwm_state.end_val = p->state; | |||
|  |                 pwm_smooth_adjust(p, &pwm_state); | |||
|  |                 set_pwm_state(p, p->state, p->pwm_freq); | |||
|  |             } | |||
|  |             p->init_state = 1; | |||
|  |         } else { | |||
|  |             continue; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     return; | |||
|  | } | |||
|  | 
 |