Files
AC707N/SDK/apps/watch/mode/common/dev_status.c
T
2025-12-03 11:12:34 +08:00

256 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 1sd1
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 1sd1
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;
}