706N-LE_AUDIO-100-patch5在添加各项补丁程序后,处理SD卡和U盘复用挂载失败
📎 原始文档:https://www.kdocs.cn/l/ctvDYkHnt3VC 706N-LE_AUDIO-100-patch5在添加各项补丁程序后,处理SD卡和U盘复用挂载失败
1-usb_host.c
usb_driver_event_to_user(DEVICE_EVENT_FROM_USB_HOST, event, itf_set[id].subdev[i]);
//os_taskq_post_msg(USB_TASK_NAME, 3, USBSTACK_HOST_MSG, event, itf_set[id].subdev[i]);

2-driver.c
void usb_driver_event_from_otg(u32 from, u32 event, void *arg)
{
#if !TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
os_taskq_post_msg("usb_stack", 4, USBSTACK_OTG_MSG, from, event, arg);
#else
if (strncmp((const char *)arg, "s:", 2) == 0) {
os_taskq_post_msg("usb_stack", 4, USBSTACK_OTG_MSG, from, event, arg);
} else {
usb_driver_event_to_user(from, event, arg);
}
#endif
}

3-app_default_msg_handler.c
4-dev_multiplex_api.c
//int msg[2];
//msg[0] = id;
//msg[1] = (int)&err;
//usb_message_to_stack(USBSTACK_HOST_REMOUNT, msg, 1);
if (usb_host_remount(id, TCFG_USB_HOST_MOUNT_RETRY, TCFG_USB_HOST_MOUNT_RESET, TCFG_USB_HOST_MOUNT_TIMEOUT, 0)/*err*/) {
5-dev_status.c【整个文件替换】
#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".dev_status.data.bss")
#pragma data_seg(".dev_status.data")
#pragma const_seg(".dev_status.text.const")
#pragma code_seg(".dev_status.text")
#endif
#include "app_main.h"
#include "app_default_msg_handler.h"
#include "dev_status.h"
#include "dev_update.h"
#include "dev_multiplex_api.h"
#include "dev_manager.h"
#include "usb/host/usb_host.h"
#include "usb/usb_task.h"
#include "undef_func.h"
#include "app_config.h"
#if RCSP_MODE
#include "rcsp.h"
#endif
usb_dev g_usb_id = (usb_dev) - 1;
//*----------------------------------------------------------------------------*/
/**@brief 设备上线预处理
@param
event:设备事件
@return
@note 根据特殊情景,这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_add_prepare(int *msg)
{
int ret = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
//传入0 sd0 1:sd1
mult_sd_online_mount_before(!!(msg[0] - DRIVER_EVENT_FROM_SD0), g_usb_id);
break;
#if TCFG_UDISK_ENABLE || TCFG_HOST_AUDIO_ENABLE
case DEVICE_EVENT_FROM_OTG:
///host mount
mult_usb_mount_before(g_usb_id, 1);
ret = usb_host_mount(g_usb_id,
TCFG_USB_HOST_MOUNT_RETRY,
TCFG_USB_HOST_MOUNT_RESET,
TCFG_USB_HOST_MOUNT_TIMEOUT);
mult_usb_online_mount_after(g_usb_id, ret, 0);
break;
#endif
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备上线后处理
@param
event:设备事件
err:设备上线错误码
@return
@note 根据特殊情景,这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_add_after(int *msg, int err)
{
int ret = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
//传入0 sd0 1:sd1
mult_sd_online_mount_after(!!(msg[0] - DRIVER_EVENT_FROM_SD0), g_usb_id, err);
#if TCFG_COMMON_CASE_EN && (TCFG_COMMON_CASE_NAME == 0x1)
static u8 first_in = 1;
if (dev_manager_online_check_by_logo("udisk0", 1) && first_in) {
printf("-----usb_online------ \n");
first_in = 0;
dev_manager_set_active_by_logo("udisk0");
}
#endif
break;
#if TCFG_UDISK_ENABLE
case DEVICE_EVENT_FROM_OTG:
mult_usb_online_mount_after(g_usb_id, err, 1);
break;
#endif
// #if TCFG_UDISK_ENABLE
// #if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
// case DEVICE_EVENT_FROM_USB_HOST:
// int msg2[4];
// msg2[0] = g_usb_id;
// msg2[1] = err;
// usb_message_to_stack(USBSTACK_HOST_MOUNT_AFTER, msg2, 1);
// break;
// #endif
// #endif
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备下线预处理
@param
event:设备事件
@return
@note 根据特殊情景,这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_del_prepare(int *msg)
{
int ret = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
mult_sd_offline_before((char *)msg[2], g_usb_id);
break;
#if TCFG_UDISK_ENABLE || TCFG_HOST_AUDIO_ENABLE
case DEVICE_EVENT_FROM_OTG:
///host umount
usb_host_unmount(g_usb_id);
break;
#endif
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备下线后处理
@param
event:设备事件
err:设备下线错误码
@return
@note 根据特殊情景,这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_del_after(int *msg, int err)
{
int ret = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
break;
#if TCFG_UDISK_ENABLE
case DEVICE_EVENT_FROM_OTG:
mult_usb_mount_offline(g_usb_id);
g_usb_id = (usb_dev) - 1;
break;
#endif
// #if TCFG_UDISK_ENABLE
// #if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
// case DEVICE_EVENT_FROM_USB_HOST:
// int msg2[4];
// msg2[0] = g_usb_id;
// msg2[1] = err;
// usb_message_to_stack(USBSTACK_HOST_UNMOUNT_AFTER, msg2, 1);
// break;
// #endif
// #endif
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备事件响应处理
@param
event:设备事件
@return
@note 设备上线和下线会动态添加到设备管理链表中,
通过dev_manager系列接口可以进行设备操作,例如:例如查找、检查在线等
*/
/*----------------------------------------------------------------------------*/
int dev_status_event_filter(int *msg)
{
int ret = true;
int err = 0;
char *add = NULL;
char *del = NULL;
static u32 sdx_mount_err_cnt = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
printf("DEVICE_EVENT_FROM_SD%d\n", msg[0] - DRIVER_EVENT_FROM_SD0);
if (msg[1] == DEVICE_EVENT_IN) {
///上线处理, 设备管理挂载
printf("DEVICE_EVENT_IN\n");
add = (char *)msg[2];
} else {
///下线处理,设备管理卸载
printf("DEVICE_EVENT_OUT\n");
del = (char *)msg[2];
}
break;
#if TCFG_UDISK_ENABLE
//case DEVICE_EVENT_FROM_USB_HOST:
case DEVICE_EVENT_FROM_OTG:
char *usb_msg = (char *)msg[2];
//printf("DEVICE_EVENT_FROM_USB_HOST %s\n", usb_msg);
printf("DEVICE_EVENT_FROM_OTG %s\n", usb_msg);
g_usb_id = usb_msg[strlen(usb_msg) - 1] - '0';
//if (!strncmp(usb_msg, "udisk", 5)) {
if (!strncmp(usb_msg, "h:", 2)) {
///是host, 准备挂载设备, usb host mount/umout
if (msg[1] == DEVICE_EVENT_IN) {
///加入到设备管理列表
printf("DEVICE_EVENT_IN\n");
//add = usb_msg;
add = "udisk0";
} else {
printf("DEVICE_EVENT_OUT\n");
//del = usb_msg;
del = "udisk0";
}
}
break;
#endif
default:
ret = false;
break;
}
////dev manager add/del操作
if (add) {
err = dev_manager_add_prepare(msg);
if (!err) {
err = dev_manager_add(add);
if (!err) {
sdx_mount_err_cnt = 0;
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN)
music_task_dev_online_start(add);
#endif
#if (TCFG_DEV_UPDATE_IF_NOFILE_ENABLE == 0)
if (app_in_mode(APP_MODE_PC) == false) {
///检查设备升级
dev_update_check(add);
}
#endif/* TCFG_DEV_UPDATE_IF_NOFILE_ENABLE*/
} else {
#if (defined(TCFG_SD_ALWAY_ONLINE_ENABLE) && (TCFG_SD_ALWAY_ONLINE_ENABLE == DISABLE))
sdx_mount_err_cnt++;
if (sdx_mount_err_cnt < 3) { // 挂载失败会重试 3 次。由于重新挂载的问题,SD IN/OUT 的消息不成对
if (((!strncmp(add, "sd0", strlen("sd0"))) || (!strncmp(add, "sd1", strlen("sd1"))))) {
dev_manager_del(add); // 添加设备失败,删除
sd_dev_ops.ioctl(NULL, IOCTL_RESET_DET_STATUS, (u32)event->arg - DRIVER_EVENT_FROM_SD0); // 复位 sd 的检测状态
printf("mount sd err, try mount again %d \n", sdx_mount_err_cnt);
}
}
#endif
ret = false;
}
} else {
ret = false;
}
dev_manager_add_after(msg, err);
}
if (del) {
dev_manager_del_prepare(msg);
dev_manager_del(del);
dev_manager_del_after(msg, 0);
}
#if RCSP_MODE
RCSP_UPDATE(COMMON_FUNCTION, BIT(COMMON_FUNCTION_ATTR_TYPE_DEV_INFO));
#endif
return ret;
}
6-music.c
// case DEVICE_EVENT_FROM_USB_HOST:
// if (!strncmp((char *)msg[3], "udisk", 5)) {
// evt_logo = (char *)msg[3];
// }
case DEVICE_EVENT_FROM_OTG:
if (!strncmp((char *)msg[2], "h:", 2)) {
evt_logo = "udisk0";
}

//case DEVICE_EVENT_FROM_USB_HOST:
// if (!strncmp((char *)msg[2], "udisk", 5)) {
// evt_logo = (char *)msg[2];
// }
case DEVICE_EVENT_FROM_OTG:
if (!strncmp((char *)msg[2], "h:", 2)) {
evt_logo = "udisk0";
}
