#define DP_H_PIN 13 //GPIO13, ADC2_CH4, 10k #define DP_L_PIN 16 //GPIO16, 2.2k #define DM_H_PIN 26 //GPIO26, DAC_2, ADC2_CH9, 10k #define DM_L_PIN 17 //GPIO17, 2.2k Setting the voltage applied to D+ (Same for D-) void set_DP(uint8_t state){ if(state == QC_HIZ){ pinMode(DP_H, INPUT); pinMode(DP_L, INPUT); }else{ pinMode(DP_H, OUTPUT); pinMode(DP_L, OUTPUT); if(state == QC_0V){ digitalWrite(DP_H, LOW); digitalWrite(DP_L, LOW); }else if(state == QC_600mV){ digitalWrite(DP_H, HIGH); digitalWrite(DP_L, LOW); }else if(state == QC_3300mV){ digitalWrite(DP_H, HIGH); digitalWrite(DP_L, HIGH); }else{ digitalWrite(DP_H, LOW); digitalWrite(DP_L, LOW); } } } Host port type detection uint8_t detect_Charger(){ set_DP(QC_HIZ); set_DM(QC_HIZ); /*** stage 1: Check BC1.2 DCP ***/ set_DM(QC_0V); DP_VAL = readVoltage(analogRead(DP_H)) * 1000; if(DP_VAL >= 325){ set_DM(QC_HIZ); return BC_NA; }else{ /*** stage 2: set host to QC3 ***/ set_DM(QC_HIZ); set_DP(QC_600mV); delay(1500); /*** stage 3: set devide to QC3 ***/ DM_VAL = readVoltage(analogRead(DM_H)) * 1000; int timeout = 20000; while(true){ DM_VAL = readVoltage(analogRead(DM_H)) * 1000; if(DM_VAL < 325){ break; } delayMicroseconds(100); timeout--; if(timeout <= 0){ return BC_DCP; break; } } } return QC3; }