701 151SDK,USBDP口复用UART,WIN7电脑不识别处理方法
📎 原始文档:https://www.kdocs.cn/l/cbS9c9X1ygPx 701 151SDK,USBDP口复用UART,WIN7电脑不识别处理方法
- WIN7不识别出现异常的时候有时候会出现中间会起DP的中断唤醒,otg检测前关闭中断唤醒口(DP口),关闭UART,otg检测后如果是PC模式,打开唤醒,重启UART,进PC模式关闭唤醒 (task_pc.c pc.c)
static void otg_sof_check_before_hook()//OTG检测前
{
log_debug("sof_check_before");
power_wakeup_index_enable(3, 0);//关闭中断唤醒
chargestore_api_stop();//关闭串口
}
static void otg_sof_check_after_hook()//OTG检测后
{
log_debug("sof_check_after");
struct application *app;
app = get_current_app();
if (app && strcmp(app->name, APP_NAME_PC)) {
power_wakeup_index_enable(3, 1);//打开中断唤醒
chargestore_api_restart();//重启串口
}
}
static int state_machine(struct application *app, enum app_state state,
struct intent *it)
{
switch (state) {
case APP_STA_CREATE:
log_info("APP_STA_CREATE");
power_wakeup_index_enable(3, 0);//进入PC时关闭中断唤醒
STATUS *p_tone = get_tone_config();
tone_play(TONE_PC_MODE, 1);
break;
- DP脚做串口通信的话,串口初始化和中断的上拉或者下拉要开的,不然通信会有问题,进SNIFF时要关闭串口,上电时关闭串口脚唤醒(board_jl701n_demo.c)
/************************** chargestore config****************************/
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
CHARGESTORE_PLATFORM_DATA_BEGIN(chargestore_data)
.io_port = TCFG_CHARGESTORE_PORT,
CHARGESTORE_PLATFORM_DATA_END()
#endif
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
struct port_wakeup port1 = {
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能,此处做串口通信要使能
#if (TCFG_TEST_BOX_ANY_IO_UPDATE)
.edge = RISING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
#else
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
#endif
.filter = PORT_FLT_1ms,
.iomap = TCFG_CHARGESTORE_PORT, //唤醒口选择
};
#endif
const struct wakeup_param wk_param = {
#if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN))
.port[1] = &port0,
#endif
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
.port[3] = &port1,
#endif
#if TCFG_CHARGE_ENABLE
.aport[0] = &charge_port,
.aport[1] = &vbat_port,
.aport[2] = &ldoin_port,
#endif
};
static void board_devices_init(void)//板级设备初始化加入串口初始化
{
#if TCFG_PWMLED_ENABLE
pwm_led_init(&pwm_led_data);
#endif
#if (TCFG_IOKEY_ENABLE || TCFG_ADKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_TOUCH_KEY_ENABLE)
key_driver_init();
#endif
#if TCFG_UART_KEY_ENABLE
extern int uart_key_init(void);
uart_key_init();
#endif /* #if TCFG_UART_KEY_ENABLE */
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
extern void imu_sensor_power_ctl(u32 gpio,u8 value);
extern void imu_sensor_ad0_selete(u32 gpio, u8 value);
imu_sensor_power_ctl(TCFG_IMU_SENSOR_PWR_PORT,1);
os_time_dly(1);
#if TCFG_MPU6050_EN
gravity_sensor_init(&motion_sensor_data);
#endif /*TCFG_MPU6050_EN*/
#if TCFG_MPU6887P_ENABLE
imu_sensor_ad0_selete(TCFG_MPU6887P_AD0_SELETE_IO, MPU6887P_SA0_IIC_ADDR);
#endif /*TCFG_MPU6887P_ENABLE*/
#if TCFG_QMI8658_ENABLE
imu_sensor_ad0_selete(TCFG_QMI8658_AD0_SELETE_IO, QMI8658_SD0_IIC_ADDR);
#endif /*TCFG_QMI8658_ENABLE*/
#if TCFG_LSM6DSL_ENABLE
imu_sensor_ad0_selete(TCFG_LSM6DSL_AD0_SELETE_IO, LSM6DSL_SD0_IIC_ADDR);
#endif /*TCFG_LSM6DSL_ENABLE*/
#if TCFG_ICM42670P_ENABLE
imu_sensor_ad0_selete(TCFG_ICM42670P_AD0_SELETE_IO, ICM42670P_SA0_IIC_ADDR);
#endif /*TCFG_ICM42670P_ENABLE*/
#if TCFG_IMUSENSOR_ENABLE
imu_sensor_init(imu_sensor_data,sizeof(imu_sensor_data));
#endif /*TCFG_IMUSENSOR_ENABLE*/
/* //MPU进入睡眠 */
#if TCFG_MPU6887P_ENABLE
imu_sensor_io_ctl("mpu6887p", IMU_SENSOR_SLEEP, NULL);
#endif /*TCFG_MPU6887P_ENABLE*/
#if TCFG_QMI8658_ENABLE
imu_sensor_io_ctl("qmi8658", IMU_SENSOR_SLEEP, NULL);
#endif /*TCFG_QMI8658_ENABLE*/
#if TCFG_LSM6DSL_ENABLE
imu_sensor_io_ctl("lsm6dsl", IMU_SENSOR_SLEEP, NULL);
#endif /*TCFG_LSM6DSL_ENABLE*/
#if TCFG_ICM42670P_ENABLE
imu_sensor_io_ctl("icm42670p", IMU_SENSOR_SLEEP, NULL);
#endif /*TCFG_ICM42670P_ENABLE*/
#endif/*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
#if TCFG_LP_TOUCH_KEY_ENABLE
lp_touch_key_init(&lp_touch_key_config);
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
#if (!TCFG_CHARGE_ENABLE)
CHARGE_EN(0);
CHGGO_EN(0);
#endif
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
chargestore_api_init(&chargestore_data);//添加串口初始化
#endif
}
/*进软关机之前默认将IO口都设置成高阻状态,需要保留原来状态的请修改该函数*/
extern void dac_power_off(void);
void board_set_soft_poweroff(void)
{
//power按键
#if TCFG_IOKEY_ENABLE
soff_gpio_protect(TCFG_IOKEY_POWER_ONE_PORT);
#endif
#if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN))
//默认唤醒io
soff_gpio_protect(IO_PORTB_01);
#endif
board_set_soft_poweroff_common(NULL);
power_wakeup_index_enable(3, 0);//此处添加关闭中断唤醒口
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
#if (TCFG_CHARGESTORE_PORT != IO_PORTP_00)
gpio_set_pull_up(TCFG_CHARGESTORE_PORT, 0);
gpio_set_pull_down(TCFG_CHARGESTORE_PORT, 1);
gpio_set_die(TCFG_CHARGESTORE_PORT, 1);
gpio_set_dieh(TCFG_CHARGESTORE_PORT, 1);
gpio_set_direction(TCFG_CHARGESTORE_PORT, 1);
#else
power_wakeup_index_enable(2, 0);
#endif
#endif
dac_power_off();
}
void sleep_enter_callback(u8 step)
{
/* 此函数禁止添加打印 */
if (step == 1) {
putchar('<');
} else {
// y_printf("%s\n",__func__);
//SNIFF下关闭串口输出
// gpio_set_pull_up(TCFG_CHARGESTORE_PORT, 0);
// gpio_set_pull_down(TCFG_CHARGESTORE_PORT, 0);
// gpio_set_die(TCFG_CHARGESTORE_PORT, 1);
// gpio_set_dieh(TCFG_CHARGESTORE_PORT, 1);
// gpio_set_direction(TCFG_CHARGESTORE_PORT, 1);
sleep_enter_callback_common(NULL);
}
}
static void port_wakeup_callback(u8 index, u8 gpio)
{
// log_info("%s:%d,%d",__FUNCTION__,index,gpio);
#if TCFG_UMIDIGI_BOX_ENABLE
if (index == 2) {
ldo_port_wakeup_to_cmessage();
}
#endif
switch (index) {
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE)
case 3://同步修改唤醒口ID
extern void chargestore_ldo5v_fall_deal(void);
chargestore_ldo5v_fall_deal();
break;
#endif
}
}
串口中断函数加上中断保护,串口初始化开启下拉(chaegestore.c)
3. 硬件部分要注意的点,DP DM上不要串电阻,接入的线长也有影响,如果客户耳机线长有2-3m,要加长延时检测时间,需要找珠海协助修改检测时长的cpu.a