256 lines
7.8 KiB
C
256 lines
7.8 KiB
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 "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);
|
||
//
|
||
// ret = usb_host_mount(g_usb_id,
|
||
// MOUNT_RETRY,
|
||
// MOUNT_RESET,
|
||
// MOUNT_TIMEOUT);
|
||
// 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);
|
||
break;
|
||
//#if TCFG_UDISK_ENABLE
|
||
// case DEVICE_EVENT_FROM_OTG:
|
||
// mult_usb_online_mount_after(g_usb_id, err);
|
||
// 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:
|
||
char *usb_msg = (char *)msg[2];
|
||
printf("DEVICE_EVENT_FROM_USB_HOST %s\n", usb_msg);
|
||
g_usb_id = usb_msg[strlen(usb_msg) - 1] - '0';
|
||
if (!strncmp(usb_msg, "udisk", 5)) {
|
||
///是host, 准备挂载设备, usb host mount/umout
|
||
if (msg[1] == DEVICE_EVENT_IN) {
|
||
///加入到设备管理列表
|
||
printf("DEVICE_EVENT_IN\n");
|
||
add = usb_msg;
|
||
} else {
|
||
printf("DEVICE_EVENT_OUT\n");
|
||
del = usb_msg;
|
||
}
|
||
}
|
||
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 0//(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(RCSP_DEVICE_STATUS_ATTR_TYPE_DEV_INFO));
|
||
#endif
|
||
return ret;
|
||
}
|
||
|
||
|