145 lines
4.2 KiB
C
145 lines
4.2 KiB
C
|
|
#include "basic_include.h"
|
||
|
|
#include "rtthread.h"
|
||
|
|
#include "sysevt_usb/sysevt_usb.h"
|
||
|
|
|
||
|
|
|
||
|
|
#define SYSEVT_USB_MALLOC os_malloc
|
||
|
|
#define SYSEVT_USB_ZALLOC os_zalloc
|
||
|
|
#define SYSEVT_USB_FREE os_free
|
||
|
|
|
||
|
|
/* ------------ SYSTEM EVENT USB VIDEO CLASS ------------ */
|
||
|
|
|
||
|
|
#include "usbh_video.h"
|
||
|
|
static struct sysevt_usbh_video_priv_data *g_sysevt_usbh_video_data = NULL;
|
||
|
|
|
||
|
|
int system_event_usbh_video_init()
|
||
|
|
{
|
||
|
|
if (!g_sysevt_usbh_video_data) {
|
||
|
|
g_sysevt_usbh_video_data = SYSEVT_USB_ZALLOC(sizeof(struct sysevt_usbh_video_priv_data) * CONFIG_SYSEVT_USB_VIDEO_MAX_NUM);
|
||
|
|
if (g_sysevt_usbh_video_data) {
|
||
|
|
// 初始化默认值
|
||
|
|
os_strcpy(g_sysevt_usbh_video_data[0].video_dev_name, "/dev/video0");
|
||
|
|
g_sysevt_usbh_video_data[0].status = SYSEVT_USB_STATUS_DISCONNECT;
|
||
|
|
|
||
|
|
os_strcpy(g_sysevt_usbh_video_data[1].video_dev_name, "/dev/video1");
|
||
|
|
g_sysevt_usbh_video_data[1].status = SYSEVT_USB_STATUS_DISCONNECT;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
os_printf("sysevt_usbh_video_data malloc failed\n");
|
||
|
|
return RET_ERR;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
int system_event_usbh_video_deinit()
|
||
|
|
{
|
||
|
|
if (g_sysevt_usbh_video_data) {
|
||
|
|
SYSEVT_USB_FREE(g_sysevt_usbh_video_data);
|
||
|
|
g_sysevt_usbh_video_data = NULL;
|
||
|
|
}
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
int system_event_usbh_video_update_info(int dev_num, const char* dev_name, uint32_t uvc_format, uint32_t width, uint32_t height)
|
||
|
|
{
|
||
|
|
if (dev_num < 0 || dev_num >= CONFIG_SYSEVT_USB_VIDEO_MAX_NUM) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!g_sysevt_usbh_video_data) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (dev_name) {
|
||
|
|
os_strncpy(g_sysevt_usbh_video_data[dev_num].video_dev_name, dev_name, sizeof(g_sysevt_usbh_video_data[dev_num].video_dev_name) - 1);
|
||
|
|
}
|
||
|
|
g_sysevt_usbh_video_data[dev_num].uvc_format = uvc_format;
|
||
|
|
g_sysevt_usbh_video_data[dev_num].width = width;
|
||
|
|
g_sysevt_usbh_video_data[dev_num].height = height;
|
||
|
|
|
||
|
|
return RET_OK;
|
||
|
|
|
||
|
|
__exit_err:
|
||
|
|
return RET_ERR;
|
||
|
|
}
|
||
|
|
|
||
|
|
int system_event_usbh_video_get_info(int dev_num, struct sysevt_usbh_video_priv_data *info)
|
||
|
|
{
|
||
|
|
if (dev_num < 0 || dev_num >= CONFIG_SYSEVT_USB_VIDEO_MAX_NUM) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!g_sysevt_usbh_video_data) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
os_memcpy(info, &g_sysevt_usbh_video_data[dev_num], sizeof(struct sysevt_usbh_video_priv_data));
|
||
|
|
return RET_OK;
|
||
|
|
|
||
|
|
__exit_err:
|
||
|
|
return RET_ERR;
|
||
|
|
}
|
||
|
|
|
||
|
|
int system_event_usbh_video_new_event(int dev_num, enum SYSEVT_USB_SUBEVT subevt)
|
||
|
|
{
|
||
|
|
if (dev_num < 0 || dev_num >= CONFIG_SYSEVT_USB_VIDEO_MAX_NUM) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!g_sysevt_usbh_video_data) {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (subevt == SYSEVT_USB_DEVICE_CONNECT) {
|
||
|
|
g_sysevt_usbh_video_data[dev_num].status = SYSEVT_USB_STATUS_CONNECT;
|
||
|
|
}
|
||
|
|
else if (subevt == SYSEVT_USB_DEVICE_DISCONNECT) {
|
||
|
|
g_sysevt_usbh_video_data[dev_num].status = SYSEVT_USB_STATUS_DISCONNECT;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
goto __exit_err;
|
||
|
|
}
|
||
|
|
|
||
|
|
sys_event_new(SYS_EVENT(SYS_EVENT_USB, subevt), (uint32)&g_sysevt_usbh_video_data[dev_num]);
|
||
|
|
|
||
|
|
return RET_OK;
|
||
|
|
|
||
|
|
__exit_err:
|
||
|
|
return RET_ERR;
|
||
|
|
}
|
||
|
|
|
||
|
|
void system_event_usbh_video_hdl(uint32 event_id, uint32 data, uint32 priv)
|
||
|
|
{
|
||
|
|
switch (event_id) {
|
||
|
|
case SYS_EVENT(SYS_EVENT_USB, SYSEVT_USB_DEVICE_CONNECT):
|
||
|
|
{
|
||
|
|
struct sysevt_usbh_video_priv_data *video_data = (struct sysevt_usbh_video_priv_data *)data;
|
||
|
|
os_printf("----- SYSEVT_USB_DEVICE_CONNECT: dev_name=%s, format=0x%X, %u x %u ----- \n",
|
||
|
|
video_data->video_dev_name,
|
||
|
|
video_data->uvc_format,
|
||
|
|
video_data->width,
|
||
|
|
video_data->height);
|
||
|
|
extern void usb_event_connect_hdl(void);
|
||
|
|
usb_event_connect_hdl();
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
|
||
|
|
case SYS_EVENT(SYS_EVENT_USB, SYSEVT_USB_DEVICE_DISCONNECT):
|
||
|
|
{
|
||
|
|
struct sysevt_usbh_video_priv_data *video_data = (struct sysevt_usbh_video_priv_data *)data;
|
||
|
|
os_printf("----- SYSEVT_USB_DEVICE_DISCONNECT: dev_name=%s ----- \n",
|
||
|
|
video_data->video_dev_name);
|
||
|
|
extern void usb_event_disconnect_hdl(void);
|
||
|
|
usb_event_disconnect_hdl();
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|