215 lines
6.7 KiB
C
215 lines
6.7 KiB
C
#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 1:sd1
|
||
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 1:sd1
|
||
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;
|
||
}
|
||
|