optimize GPIO operation

master
ThinkPad-T460P 2021-03-19 11:34:15 +08:00
parent 3b616b2033
commit 5067c94911
2 changed files with 68 additions and 63 deletions

View File

@ -93,6 +93,7 @@ enum Device_t{USB2_Port1=0x00,USB2_Port2,USB2_Port3,USB2_Port4,USB2_Port5,USB2_P
SYS_FAN1=0x20,SYS_FAN2,SYS_FAN3, //Fan on Board SYS_FAN1=0x20,SYS_FAN2,SYS_FAN3, //Fan on Board
SYS_RUN_LED,SYS_PWR_LED, //LED on Board SYS_RUN_LED,SYS_PWR_LED, //LED on Board
SYS_SRC_BUZZ, //Oscillation source internal buzzer
SOM_PWR_EN=0x30,SOM_DFU,SOM_RESET,SOM_SLEEP, //SOM Control SOM_PWR_EN=0x30,SOM_DFU,SOM_RESET,SOM_SLEEP, //SOM Control
@ -107,10 +108,10 @@ void NaviKit_var_init();
//power state machine switch function //power state machine switch function
void enter_standby_state(uint16_t delay); void enter_standby_state(uint16_t delay);
void enter_isp_state(); void enter_isp_state();
void enter_run_state(uint16_t delay); void enter_run_state(uint16_t interval);
void enter_idle_state(uint16_t delay); void enter_idle_state(uint16_t interval);
void enter_sleep_state(uint16_t delay); void enter_sleep_state(uint16_t interval);
void enter_dfu_state(uint16_t delay); void enter_dfu_state(uint16_t interval);
void som_reboot(uint16_t delay); void som_reboot(uint16_t delay);
//non-blocking beep function with os delay //non-blocking beep function with os delay
void TaskBeep(uint32_t time_ms, uint8_t n); void TaskBeep(uint32_t time_ms, uint8_t n);

View File

@ -29,10 +29,12 @@ void NaviKit_var_init()
void TaskBeep(uint32_t time_ms , uint8_t n) void TaskBeep(uint32_t time_ms , uint8_t n)
{ {
for(uint8_t i=0;i<n;i++){ for(uint8_t i=0;i<n;i++){
HAL_GPIO_WritePin(SYS_BUZZ_CTL_GPIO_Port,SYS_BUZZ_CTL_Pin, GPIO_PIN_RESET); PWR_Enable_IRQ(SYS_SRC_BUZZ, true, time_ms>>1);//equal "time divided by 2"
osDelay(time_ms>>1);//equal "time divided by 2" PWR_Enable_IRQ(SYS_SRC_BUZZ, false, time_ms>>1);//equal "time divided by 2"
HAL_GPIO_WritePin(SYS_BUZZ_CTL_GPIO_Port,SYS_BUZZ_CTL_Pin, GPIO_PIN_SET); // HAL_GPIO_WritePin(SYS_BUZZ_CTL_GPIO_Port,SYS_BUZZ_CTL_Pin, GPIO_PIN_RESET);
osDelay(time_ms>>1);//equal "time divided by 2" // osDelay(time_ms>>1);//equal "time divided by 2"
// HAL_GPIO_WritePin(SYS_BUZZ_CTL_GPIO_Port,SYS_BUZZ_CTL_Pin, GPIO_PIN_SET);
// osDelay(time_ms>>1);//equal "time divided by 2"
} }
} }
@ -75,103 +77,103 @@ void enter_isp_state()
} }
//timeout:the time of wait //timeout:the time of wait
void enter_idle_state(uint16_t delay){ void enter_idle_state(uint16_t interval){
log_i("Enter to idle state."); log_i("Enter to idle state.");
TaskBeep(50,1); TaskBeep(50,1);
PWR_Enable(SOM_SLEEP,true,delay); PWR_Enable(SOM_SLEEP,true,interval);
PWR_Enable(USB3_Port4,false, delay); PWR_Enable(USB3_Port4,false, interval);
PWR_Enable(USB3_Port3,false, delay); PWR_Enable(USB3_Port3,false, interval);
PWR_Enable(USB3_Port2,false, delay); PWR_Enable(USB3_Port2,false, interval);
PWR_Enable(USB3_Port1,false, delay); PWR_Enable(USB3_Port1,false, interval);
PWR_Enable(USB3_Port6,false, delay); PWR_Enable(USB3_Port6,false, interval);
PWR_Enable(USB3_Port5,false, delay); PWR_Enable(USB3_Port5,false, interval);
PWR_Enable(USB2_Port6,false, delay); PWR_Enable(USB2_Port6,false, interval);
PWR_Enable(USB2_Port5,false, delay); PWR_Enable(USB2_Port5,false, interval);
PWR_Enable(USB2_Port4,false, delay); PWR_Enable(USB2_Port4,false, interval);
PWR_Enable(USB2_Port3,false, delay); PWR_Enable(USB2_Port3,false, interval);
PWR_Enable(USB2_Port2,false, delay); PWR_Enable(USB2_Port2,false, interval);
PWR_Enable(USB2_Port1,false, delay); PWR_Enable(USB2_Port1,false, interval);
PWR_Enable(SOC_USB3_HUB ,false, delay); PWR_Enable(SOC_USB3_HUB ,false, interval);
PWR_Enable(SOC_USB2_HUB ,false, delay); PWR_Enable(SOC_USB2_HUB ,false, interval);
PWR_Enable(SOC_USB3_HOST,false, delay); PWR_Enable(SOC_USB3_HOST,false, interval);
PWR_Enable(SOC_USB3_GEC ,false, delay); PWR_Enable(SOC_USB3_GEC ,false, interval);
PWR_Enable(SOC_GE_SW ,false, delay); PWR_Enable(SOC_GE_SW ,false, interval);
PWR_Enable(SYS_FAN1 ,false , delay); PWR_Enable(SYS_FAN1 ,false , interval);
PWR_Enable(SYS_FAN2 ,false , delay); PWR_Enable(SYS_FAN2 ,false , interval);
PWR_Enable(SYS_FAN3 ,false , delay); PWR_Enable(SYS_FAN3 ,false , interval);
PWR_Enable(SOM_PWR_EN ,false, delay); PWR_Enable(SOM_PWR_EN ,false, interval);
PWR_Enable(PMB_PS_ON ,false , 0); PWR_Enable(PMB_PS_ON ,false , 0);
} }
void enter_run_state(uint16_t delay) void enter_run_state(uint16_t interval)
{ {
log_i("Enter to run state"); log_i("Enter to run state");
TaskBeep(200,1); TaskBeep(200,1);
PWR_Enable(PMB_PS_ON ,true, delay); PWR_Enable(PMB_PS_ON ,true, interval);
PWR_Enable(SOM_DFU ,false, 0); //disable dfu pin PWR_Enable(SOM_DFU ,false, 0); //disable dfu pin
PWR_Enable(SOM_RESET , false , 0); //disable reset pin PWR_Enable(SOM_RESET , false , 0); //disable reset pin
PWR_Enable(SYS_FAN1 ,true , delay); PWR_Enable(SYS_FAN1 ,true , interval);
PWR_Enable(SYS_FAN2 ,true , delay); PWR_Enable(SYS_FAN2 ,true , interval);
PWR_Enable(SYS_FAN3 ,true , delay); PWR_Enable(SYS_FAN3 ,true , interval);
PWR_Enable(SOM_PWR_EN , true , delay); PWR_Enable(SOM_PWR_EN , true , interval);
PWR_Enable(SOC_USB3_HUB ,true , delay); PWR_Enable(SOC_USB3_HUB ,true , interval);
PWR_Enable(SOC_USB2_HUB ,true , delay); PWR_Enable(SOC_USB2_HUB ,true , interval);
PWR_Enable(SOC_USB3_HOST,true , delay); PWR_Enable(SOC_USB3_HOST,true , interval);
PWR_Enable(SOC_USB3_GEC ,true , delay); PWR_Enable(SOC_USB3_GEC ,true , interval);
PWR_Enable(SOC_GE_SW ,true , delay); PWR_Enable(SOC_GE_SW ,true , interval);
PWR_Enable(USB2_Port1,true , delay); PWR_Enable(USB2_Port1,true , interval);
PWR_Enable(USB2_Port2,true , delay); PWR_Enable(USB2_Port2,true , interval);
PWR_Enable(USB2_Port3,true , delay); PWR_Enable(USB2_Port3,true , interval);
PWR_Enable(USB2_Port4,true , delay); PWR_Enable(USB2_Port4,true , interval);
PWR_Enable(USB2_Port5,true , delay); PWR_Enable(USB2_Port5,true , interval);
PWR_Enable(USB2_Port6,true , delay); PWR_Enable(USB2_Port6,true , interval);
PWR_Enable(USB3_Port5,true , delay); PWR_Enable(USB3_Port5,true , interval);
PWR_Enable(USB3_Port6,true , delay); PWR_Enable(USB3_Port6,true , interval);
PWR_Enable(USB3_Port1,true , delay); PWR_Enable(USB3_Port1,true , interval);
PWR_Enable(USB3_Port2,true , delay); PWR_Enable(USB3_Port2,true , interval);
PWR_Enable(USB3_Port3,true , delay); PWR_Enable(USB3_Port3,true , interval);
PWR_Enable(USB3_Port4,true , delay); PWR_Enable(USB3_Port4,true , interval);
} }
void enter_sleep_state(uint16_t delay) void enter_sleep_state(uint16_t interval)
{ {
log_i("Enter to sleep state."); log_i("Enter to sleep state.");
TaskBeep(50,1); TaskBeep(50,1);
} }
void enter_dfu_state(uint16_t delay) void enter_dfu_state(uint16_t interval)
{ {
log_i("Enter to DFU state."); log_i("Enter to DFU state.");
TaskBeep(500,3); TaskBeep(500,3);
PWR_Enable(PMB_PS_ON , true , delay); PWR_Enable(PMB_PS_ON , true , interval);
PWR_Enable(SOM_DFU , true , 0); PWR_Enable(SOM_DFU , true , 0);
PWR_Enable(SOM_RESET , false , 0); //disable reset pin PWR_Enable(SOM_RESET , false , 0); //disable reset pin
PWR_Enable(SYS_FAN1 , true , delay); PWR_Enable(SYS_FAN1 , true , interval);
PWR_Enable(SYS_FAN2 , true , delay); PWR_Enable(SYS_FAN2 , true , interval);
PWR_Enable(SYS_FAN3 , true , delay); PWR_Enable(SYS_FAN3 , true , interval);
PWR_Enable(SOM_PWR_EN , true , delay); PWR_Enable(SOM_PWR_EN , true , interval);
} }
//para, delayreset low level signal duration (ms) //para, intervalreset low level signal duration (ms)
void som_reboot(uint16_t delay){ void som_reboot(uint16_t interval){
log_i("Jetson Nano rebooting..."); log_i("Jetson Nano rebooting...");
PWR_Enable(SOM_RESET,true,0); PWR_Enable(SOM_RESET,true,0);
TaskBeep(100,1); TaskBeep(100,1);
@ -219,6 +221,7 @@ bool PWR_Enable_IRQ(enum Device_t device,bool en,uint16_t delay){
case SYS_FAN3: {HAL_GPIO_WritePin(SYS_FAN_CTL_3_GPIO_Port, SYS_FAN_CTL_3_Pin, en); }break; case SYS_FAN3: {HAL_GPIO_WritePin(SYS_FAN_CTL_3_GPIO_Port, SYS_FAN_CTL_3_Pin, en); }break;
case SYS_RUN_LED: {HAL_GPIO_WritePin(SYS_RUN_LED_CTL_GPIO_Port, SYS_RUN_LED_CTL_Pin, !en); }break; case SYS_RUN_LED: {HAL_GPIO_WritePin(SYS_RUN_LED_CTL_GPIO_Port, SYS_RUN_LED_CTL_Pin, !en); }break;
case SYS_PWR_LED: {HAL_GPIO_WritePin(SYS_POWER_LED_CTL_GPIO_Port, SYS_POWER_LED_CTL_Pin, !en); }break; case SYS_PWR_LED: {HAL_GPIO_WritePin(SYS_POWER_LED_CTL_GPIO_Port, SYS_POWER_LED_CTL_Pin, !en); }break;
case SYS_SRC_BUZZ: {HAL_GPIO_WritePin(SYS_BUZZ_CTL_GPIO_Port, SYS_BUZZ_CTL_Pin, !en); }break;
case SOM_PWR_EN: {HAL_GPIO_WritePin(SOM_POWER_EN_GPIO_Port, SOM_POWER_EN_Pin, en); }break; case SOM_PWR_EN: {HAL_GPIO_WritePin(SOM_POWER_EN_GPIO_Port, SOM_POWER_EN_Pin, en); }break;
case SOM_DFU: {HAL_GPIO_WritePin(SOM_FORCE_RECOVERY_GPIO_Port,SOM_FORCE_RECOVERY_Pin, !en); }break; case SOM_DFU: {HAL_GPIO_WritePin(SOM_FORCE_RECOVERY_GPIO_Port,SOM_FORCE_RECOVERY_Pin, !en); }break;
case SOM_RESET: {HAL_GPIO_WritePin(SOM_SYS_RESET_GPIO_Port, SOM_SYS_RESET_Pin, !en); }break; case SOM_RESET: {HAL_GPIO_WritePin(SOM_SYS_RESET_GPIO_Port, SOM_SYS_RESET_Pin, !en); }break;
@ -256,6 +259,7 @@ bool PWR_Status(enum Device_t device){
case SYS_FAN3: {sta = HAL_GPIO_ReadPin(SYS_FAN_CTL_3_GPIO_Port,SYS_FAN_CTL_3_Pin); }break; case SYS_FAN3: {sta = HAL_GPIO_ReadPin(SYS_FAN_CTL_3_GPIO_Port,SYS_FAN_CTL_3_Pin); }break;
case SYS_RUN_LED: {sta = !HAL_GPIO_ReadPin(SYS_RUN_LED_CTL_GPIO_Port,SYS_RUN_LED_CTL_Pin); }break; case SYS_RUN_LED: {sta = !HAL_GPIO_ReadPin(SYS_RUN_LED_CTL_GPIO_Port,SYS_RUN_LED_CTL_Pin); }break;
case SYS_PWR_LED: {sta = !HAL_GPIO_ReadPin(SYS_POWER_LED_CTL_GPIO_Port,SYS_POWER_LED_CTL_Pin); }break; case SYS_PWR_LED: {sta = !HAL_GPIO_ReadPin(SYS_POWER_LED_CTL_GPIO_Port,SYS_POWER_LED_CTL_Pin); }break;
case SYS_SRC_BUZZ :{sta = !HAL_GPIO_ReadPin(SYS_BUZZ_CTL_GPIO_Port,SYS_BUZZ_CTL_Pin); }break;
case SOM_PWR_EN: {sta = HAL_GPIO_ReadPin(SOM_POWER_EN_GPIO_Port,SOM_POWER_EN_Pin); }break; case SOM_PWR_EN: {sta = HAL_GPIO_ReadPin(SOM_POWER_EN_GPIO_Port,SOM_POWER_EN_Pin); }break;
case SOM_DFU: {sta = !HAL_GPIO_ReadPin(SOM_FORCE_RECOVERY_GPIO_Port,SOM_FORCE_RECOVERY_Pin); }break; case SOM_DFU: {sta = !HAL_GPIO_ReadPin(SOM_FORCE_RECOVERY_GPIO_Port,SOM_FORCE_RECOVERY_Pin); }break;
case SOM_RESET: {sta = !HAL_GPIO_ReadPin(SOM_SYS_RESET_GPIO_Port,SOM_SYS_RESET_Pin); }break; case SOM_RESET: {sta = !HAL_GPIO_ReadPin(SOM_SYS_RESET_GPIO_Port,SOM_SYS_RESET_Pin); }break;