KT24-1110_65E-HA-651B/apps/soundbox/common/dev_status.c
2024-11-10 18:44:17 +08:00

215 lines
6.7 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.

#include "common/dev_status.h"
#include "dev_manager.h"
#include "dev_update.h"
#include "app_config.h"
#include "dev_multiplex_api.h"
#include "app_task.h"
#include "smartbox/smartbox.h"
#include "music/music.h"
usb_dev g_usb_id = (usb_dev) - 1;
//*----------------------------------------------------------------------------*/
/**@brief 设备上线预处理
@param
event设备事件
@return
@note 根据特殊情景这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_add_prepare(struct sys_event *event)
{
int ret = 0;
switch ((u32)event->arg) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
//传入0 sd0 1sd1
vddiom_set_dynamic(TCFG_VDDIO_DEV_MOUNT_LEVEL);
mult_sd_online_mount_before(!!((int)event->arg - DRIVER_EVENT_FROM_SD0), g_usb_id);
break;
#if TCFG_UDISK_ENABLE || TCFG_HOST_AUDIO_ENABLE
case DEVICE_EVENT_FROM_OTG:
///host mount
vddiom_set_dynamic(TCFG_VDDIO_DEV_MOUNT_LEVEL);
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(struct sys_event *event, int err)
{
int ret = 0;
switch ((u32)event->arg) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
//传入0 sd0 1sd1
mult_sd_online_mount_after(!!((int)event->arg - 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
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备下线预处理
@param
event设备事件
@return
@note 根据特殊情景这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_del_prepare(struct sys_event *event)
{
int ret = 0;
switch ((u32)event->arg) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
mult_sd_offline_before((char *)event->u.dev.value, 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(struct sys_event *event, int err)
{
int ret = 0;
switch ((u32)event->arg) {
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
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 设备事件响应处理
@param
event设备事件
@return
@note 设备上线和下线会动态添加到设备管理链表中,
通过dev_manager系列接口可以进行设备操作例如例如查找、检查在线等
*/
/*----------------------------------------------------------------------------*/
int dev_status_event_filter(struct sys_event *event)
{
int ret = true;
int err = 0;
char *add = NULL;
char *del = NULL;
switch ((u32)event->arg) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
printf("DEVICE_EVENT_FROM_SD%d\n", (u32)event->arg - DRIVER_EVENT_FROM_SD0);
if (event->u.dev.event == DEVICE_EVENT_IN) {
///上线处理, 设备管理挂载
printf("DEVICE_EVENT_IN\n");
add = (char *)event->u.dev.value;
} else {
///下线处理,设备管理卸载
printf("DEVICE_EVENT_OUT\n");
del = (char *)event->u.dev.value;
}
break;
#if TCFG_UDISK_ENABLE || TCFG_HOST_AUDIO_ENABLE
case DEVICE_EVENT_FROM_OTG:
printf("DEVICE_EVENT_FROM_OTG %d", event->u.dev.event);
g_usb_id = ((char *)event->u.dev.value)[2] - '0';
if (((char *)event->u.dev.value)[0] == 'h') {
///是host, 准备挂载设备, usb host mount/umout
if (event->u.dev.event == DEVICE_EVENT_IN) {
///加入到设备管理列表
printf("DEVICE_EVENT_IN\n");
add = (char *)"udisk0";
} else {
printf("DEVICE_EVENT_OUT\n");
del = (char *)"udisk0";
}
}
break;
case DEVICE_EVENT_FROM_USB_HOST:
printf("DEVICE_EVENT_FROM_USB_HOST %s", (const char *)event->u.dev.value);
break;
#endif
default:
ret = false;
break;
}
////dev manager add/del操作
if (add) {
err = dev_manager_add_prepare(event);
if (!err) {
err = dev_manager_add(add);
if (!err) {
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN)
music_task_dev_online_start();
#endif
#if (TCFG_DEV_UPDATE_IF_NOFILE_ENABLE == 0)
if (app_check_curr_task(APP_PC_TASK) == false) {
///检查设备升级
dev_update_check(add);
}
#endif/*TCFG_DEV_UPDATE_IF_NOFILE_ENABLE*/
} else {
if (app_get_curr_task() != APP_MUSIC_TASK) {
vddiom_set_dynamic(TCFG_LOWPOWER_VDDIOM_LEVEL);
}
ret = false;
}
} else {
ret = false;
}
dev_manager_add_after(event, err);
}
if (del) {
dev_manager_del_prepare(event);
dev_manager_del(del);
dev_manager_del_after(event, 0);
}
SMARTBOX_UPDATE(COMMON_FUNCTION, BIT(COMMON_FUNCTION_ATTR_TYPE_DEV_INFO));
return ret;
}