511 lines
12 KiB
C
Executable File
511 lines
12 KiB
C
Executable File
/*
|
||
System Usb Callback
|
||
|
||
System Callback for USb Module.
|
||
|
||
@file SysUsb_Exe.c
|
||
@ingroup mIPRJSYS
|
||
|
||
@note
|
||
|
||
Copyright Novatek Microelectronics Corp. 2010. All rights reserved.
|
||
*/
|
||
|
||
#include "PrjInc.h"
|
||
#include "GxUSB.h"
|
||
#include "UsbDevDef.h"
|
||
#include "usb2dev.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
#if HUNTING_CAMERA_MCU == ENABLE
|
||
#include <sf_led.h>
|
||
#include <sf_common.h>
|
||
#endif
|
||
|
||
#define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
#define __MODULE__ SysUsbExe
|
||
#define __DBGLVL__ ((THIS_DBGLVL>=PRJ_DBG_LVL)?THIS_DBGLVL:PRJ_DBG_LVL)
|
||
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
|
||
#include <kwrap/debug.h>
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
static char driver_path_prefix[64] = "/lib/modules/4.19.91";
|
||
static char* usb_host_drivers[] = {
|
||
"kernel/drivers/usb/common/usb-common.ko",
|
||
"kernel/drivers/usb/core/usbcore.ko",
|
||
"kernel/drivers/usb/host/ehci-hcd.ko",
|
||
"kernel/drivers/net/mii.ko",
|
||
"kernel/drivers/net/usb/usbnet.ko",
|
||
"extra/net/GobiNet/drv_gobi_net.ko",
|
||
"kernel/drivers/net/usb/cdc_ether.ko",
|
||
"kernel/drivers/net/usb/rndis_host.ko",
|
||
"kernel/drivers/usb/serial/usbserial.ko",
|
||
"kernel/drivers/usb/serial/usb_wwan.ko",
|
||
"kernel/drivers/usb/serial/option.ko",
|
||
"kernel/drivers/usb/class/cdc-wdm.ko",
|
||
"kernel/drivers/net/usb/qmi_wwan.ko",
|
||
NULL
|
||
};
|
||
|
||
static char* usb_dev_drivers[] = {
|
||
"hdal/comm/usb2dev/nvt_usb2dev.ko",
|
||
"hdal/comm/uvcp/nvt_uvcp.ko",
|
||
NULL
|
||
};
|
||
|
||
static BOOL is_usb_host_driver_inserted = FALSE;
|
||
static BOOL is_usb_dev_driver_inserted = FALSE;
|
||
|
||
|
||
static BOOL System_WaitUsbDev(void)
|
||
{
|
||
int exit_code = -1;
|
||
BOOL ret;
|
||
UINT8 cnt = 0;
|
||
UINT8 timeout = 100;
|
||
|
||
do{
|
||
exit_code = system("ls /dev/nvt_usb2dev0");
|
||
if(exit_code == 0)
|
||
break;
|
||
|
||
vos_util_delay_ms(10);
|
||
} while(cnt < timeout);
|
||
|
||
if(exit_code == 0)
|
||
ret = TRUE;
|
||
else
|
||
ret = FALSE;
|
||
|
||
usb2dev_state_change();
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
|
||
|
||
static BOOL System_check_usb_host(void)
|
||
{
|
||
char command[26] = "lsmod | grep usbcore";
|
||
FILE *fp = popen(command, "r");
|
||
char result[256];
|
||
fgets(result, sizeof(result), fp);
|
||
pclose(fp);
|
||
if (result[0] == '\0') {
|
||
printf("usbcore module is not loaded.\n");
|
||
return FALSE;
|
||
} else {
|
||
printf("usbcore module is loaded.\n");
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
static BOOL System_InsmodUsb(BOOL isHost)
|
||
{
|
||
char** usb_drivers = NULL;
|
||
char* driver_path = NULL;
|
||
UINT8 cnt = 0;
|
||
char cmd[256] = {'\0'};
|
||
|
||
if(isHost){
|
||
|
||
if(is_usb_host_driver_inserted == TRUE)
|
||
return TRUE;
|
||
if(System_check_usb_host() == TRUE)
|
||
{
|
||
is_usb_host_driver_inserted = TRUE;
|
||
return TRUE;
|
||
}
|
||
usb_drivers = usb_host_drivers;
|
||
}
|
||
else{
|
||
|
||
if(is_usb_dev_driver_inserted == TRUE)
|
||
return TRUE;
|
||
|
||
usb_drivers = usb_dev_drivers;
|
||
}
|
||
|
||
while(usb_drivers[cnt++])
|
||
{
|
||
}
|
||
|
||
DBG_DUMP("cnt = %lu\n", cnt);
|
||
|
||
for(int i = 0 ; i < cnt ; i++)
|
||
{
|
||
driver_path = usb_drivers[i];
|
||
|
||
if(driver_path){
|
||
memset(cmd, '\0', sizeof(cmd));
|
||
snprintf(cmd, sizeof(cmd), "insmod %s/%s", driver_path_prefix, driver_path);
|
||
//DBG_DUMP("%s\n", cmd);
|
||
printf("[%s:%d] %s\n", __FUNCTION__, __LINE__, cmd);
|
||
system(cmd);
|
||
}
|
||
}
|
||
|
||
if(isHost == FALSE){
|
||
#if HUNTING_CAMERA_MCU == ENABLE
|
||
sf_usb_mux_s(0);
|
||
vos_util_delay_ms(200);
|
||
#endif
|
||
|
||
is_usb_dev_driver_inserted = TRUE;
|
||
return System_WaitUsbDev();
|
||
}
|
||
else{
|
||
#if HUNTING_CAMERA_MCU == ENABLE
|
||
sf_usb_mux_s(1);
|
||
#endif
|
||
|
||
is_usb_host_driver_inserted = TRUE;
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
static BOOL System_RmmodUsb(BOOL isHost)
|
||
{
|
||
char** usb_drivers = NULL;
|
||
char* driver_path = NULL;
|
||
UINT8 cnt = 0;
|
||
char cmd[256] = {'\0'};
|
||
|
||
if(isHost){
|
||
|
||
if(is_usb_host_driver_inserted == FALSE)
|
||
return TRUE;
|
||
|
||
usb_drivers = usb_host_drivers;
|
||
}
|
||
else{
|
||
if(is_usb_dev_driver_inserted == FALSE)
|
||
return TRUE;
|
||
|
||
usb_drivers = usb_dev_drivers;
|
||
}
|
||
|
||
while(usb_drivers[cnt++])
|
||
{
|
||
}
|
||
|
||
DBG_DUMP("cnt = %lu\n", cnt);
|
||
|
||
for(int i = cnt - 1 ; i >= 0 ; i--)
|
||
{
|
||
driver_path = usb_drivers[i];
|
||
|
||
if(driver_path){
|
||
snprintf(cmd, sizeof(cmd), "rmmod %s/%s", driver_path_prefix, driver_path);
|
||
DBG_DUMP("%s\n", cmd);
|
||
system(cmd);
|
||
}
|
||
}
|
||
|
||
if(isHost == FALSE){
|
||
is_usb_dev_driver_inserted = FALSE;
|
||
}
|
||
else{
|
||
is_usb_host_driver_inserted = FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
#if (USB_MODE == ENABLE)
|
||
|
||
//Using USB Plug-In + DOWN Key to enter to Msdc Vendor Spy Mode
|
||
#if (MSDCVENDOR_UPDFW==ENABLE)
|
||
static BOOL m_bForceMsdcNvt = TRUE;
|
||
#else
|
||
static BOOL m_bForceMsdcNvt = FALSE;
|
||
#endif
|
||
|
||
int SX_TIMER_DET_USB_ID = -1;
|
||
#if (USB_MODE==ENABLE)
|
||
static BOOL m_bVendorConnected = FALSE;
|
||
#endif
|
||
UINT32 gUsbSrc = USB_SRC_NONE;
|
||
|
||
void USB_CB(UINT32 event, UINT32 param1, UINT32 param2);
|
||
void UI_DetUSB(void);
|
||
|
||
#if (USBINSERT_FUNCTION == ENABLE)
|
||
SX_TIMER_ITEM(USB_Det, UI_DetUSB, 5, FALSE)
|
||
#endif
|
||
|
||
void System_OnUsbPreInit(void)
|
||
{
|
||
#if 0
|
||
if (GxSystem_GetPowerOnSource() == GX_PWRON_SRC_PWR_VBUS) {
|
||
GxUSB_Init((UINT32)Dx_GetObject(DX_CLASS_USB_EXT), TRUE);
|
||
} else {
|
||
GxUSB_Init((UINT32)Dx_GetObject(DX_CLASS_USB_EXT), FALSE);
|
||
}
|
||
#else
|
||
GxUSB_Init((UINT32)Dx_GetObject(DX_CLASS_USB_EXT), FALSE);
|
||
#endif
|
||
//Charger type setting should be invoked once prior to GxUSB_GetIsUSBPlug() which
|
||
//has been called in System_OnPowerPreInit() at the earliest time.
|
||
// GxUSB_SetChargerType(FALSE);
|
||
}
|
||
|
||
void System_OnUsbInit(void)
|
||
{
|
||
TM_BOOT_BEGIN("usb", "init");
|
||
//PHASE-1 : Init & Open Drv or DrvExt
|
||
{
|
||
//init GxUSB module
|
||
GxUSB_RegCB(USB_CB); //Register CB function of GxUSB
|
||
#if (USBINSERT_FUNCTION == ENABLE)
|
||
SX_TIMER_DET_USB_ID = SxTimer_AddItem(&Timer_USB_Det);
|
||
#endif
|
||
}
|
||
//PHASE-2 : Init & Open Lib or LibExt
|
||
{
|
||
#if (USBINSERT_FUNCTION == ENABLE)
|
||
SxTimer_SetFuncActive(SX_TIMER_DET_USB_ID, TRUE);
|
||
#endif
|
||
}
|
||
|
||
//force check USB connect type
|
||
if (GxUSB_GetIsUSBPlug()) {
|
||
|
||
#if (HW_S530 == ENABLE) && (HUNTING_CAMERA_MCU == ENABLE)
|
||
sf_sys_status_led_set(SF_LED_SYS_STATE_USB_IN);
|
||
#endif
|
||
|
||
System_InsmodUsb(FALSE); /* insmod usb dev ko */
|
||
GxUSB_UpdateConnectType();
|
||
GxUSB_SetChargerType(FALSE);
|
||
}
|
||
else{
|
||
System_InsmodUsb(TRUE); /* insmod usb host ko */
|
||
}
|
||
TM_BOOT_END("usb", "init");
|
||
}
|
||
|
||
void System_OnUsbExit(void)
|
||
{
|
||
//PHASE-2 : Close Lib or LibExt
|
||
{
|
||
}
|
||
//PHASE-1 : Close Drv or DrvExt
|
||
{
|
||
}
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
void UI_DetUSB(void)
|
||
{
|
||
if (!UI_IsForceLock()) {
|
||
GxUSB_DetConnect();
|
||
}
|
||
}
|
||
//---------------------SysUSB Public API ----------------------------------
|
||
void USB_UpdateSource(void)
|
||
{
|
||
#if (USB_CHARGE_FUNCTION == ENABLE)
|
||
UINT32 ctype = GxUSB_GetConnectType();
|
||
if (ctype == USB_CONNECT_NONE) { //<2F>S<EFBFBD><53>USB
|
||
DBG_MSG(" USB Src = (None)\r\n");
|
||
gUsbSrc = USB_SRC_NONE;
|
||
} else if (ctype == USB_CONNECT_PC) { //USB<53><42><EFBFBD><EFBFBD>PC
|
||
DBG_MSG(" USB Src = PC\r\n");
|
||
gUsbSrc = USB_SRC_USB_PC;
|
||
} else if (ctype == USB_CONNECT_CHARGER) { //USB<53><42><EFBFBD>ۥR<DBA5>q<EFBFBD><71>
|
||
DBG_MSG(" USB Src = Adapter\r\n");
|
||
gUsbSrc = USB_SRC_USB_ADAPTER;
|
||
} else if (ctype == USB_CONNECT_CHARGING_PC) { //USB<53><42><EFBFBD>ۦ<EFBFBD><DBA6>j<EFBFBD>q<EFBFBD>yport<72><74>PC
|
||
DBG_MSG(" USB Src = Charging PC\r\n");
|
||
gUsbSrc = USB_SRC_USB_CHARGING_PC;
|
||
} else { //USB<53><42><EFBFBD>ۥ<EFBFBD><DBA5><EFBFBD> (<28>w<EFBFBD>g<EFBFBD>ް<EFBFBD><DEB0>L<EFBFBD>k<EFBFBD>P<EFBFBD>_)
|
||
DBG_ERR(" USB Src = Unknown?\r\n");
|
||
gUsbSrc = USB_SRC_UNKNOWN;
|
||
}
|
||
#else
|
||
BOOL bInsert = GxUSB_GetIsUSBPlug();
|
||
if (!bInsert) { //<2F>S<EFBFBD><53>USB
|
||
DBG_MSG(" USB Src = (None)\r\n");
|
||
gUsbSrc = USB_SRC_NONE;
|
||
} else { //USB<53><42><EFBFBD><EFBFBD>PC
|
||
DBG_MSG(" USB Src = PC\r\n");
|
||
gUsbSrc = USB_SRC_USB_PC;
|
||
}
|
||
#endif
|
||
}
|
||
UINT32 USB_GetSource(void)
|
||
{
|
||
return gUsbSrc;
|
||
}
|
||
///////////////////////////////////////////////////////////////////////
|
||
//Device flow event
|
||
#if (USB_MODE==ENABLE)
|
||
static BOOL m_bACPlug = FALSE;
|
||
#endif
|
||
INT32 System_OnUsbInsert(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
|
||
{
|
||
//usb plug in
|
||
DBG_IND("USB plug - begin\r\n");
|
||
#if (HW_S530 == ENABLE) && (HUNTING_CAMERA_MCU == ENABLE)
|
||
sf_sys_status_led_set(SF_LED_SYS_STATE_USB_IN);
|
||
sf_4g_usb_remove();
|
||
#endif
|
||
System_RmmodUsb(TRUE); /* rmmod usb host ko */
|
||
System_InsmodUsb(FALSE); /* insmod usb dev ko */
|
||
//vos_util_delay_ms(1000);
|
||
GxUSB_SetChargerType(FALSE);
|
||
|
||
USB_UpdateSource();
|
||
Ux_PostEvent(NVTEVT_BATTERY, 0, 0);
|
||
#if (USB_MODE == ENABLE)
|
||
if (!USB_GetIsMsdcNvt()) {
|
||
DBG_DUMP("USBConnectType=%d\r\n", GxUSB_GetConnectType());
|
||
if ((GxUSB_GetConnectType() == USB_CONNECT_PC) || (GxUSB_GetConnectType() == USB_CONNECT_CHARGING_PC)) {
|
||
#if (MOVIE_UVAC_FUNC == ENABLE)
|
||
// temporarily do nothing for Movie + UVC
|
||
#else
|
||
|
||
#if HUNTING_CAMERA_MCU == ENABLE //temporally support MSDC only
|
||
//vos_util_delay_ms(1000);
|
||
Ux_SendEvent(0, NVTEVT_SYSTEM_MODE, 1, PRIMARY_MODE_USBMSDC);
|
||
#else
|
||
Ux_SendEvent(0, NVTEVT_SYSTEM_MODE, 1, PRIMARY_MODE_USBMENU);
|
||
#endif
|
||
USB_PlugInSetFunc();
|
||
#endif
|
||
} else if (GxUSB_GetConnectType() == USB_CONNECT_CHARGER) {
|
||
if (System_GetState(SYS_STATE_CURRMODE) == PRIMARY_MODE_MOVIE) {
|
||
m_bACPlug = TRUE;
|
||
Ux_PostEvent(NVTEVT_AC_Plug, 0, 0);
|
||
}
|
||
}
|
||
m_bVendorConnected = FALSE;
|
||
} else {
|
||
#if (MSDCVENDOR_NVT == ENABLE)
|
||
MSDCNVTCB_OPEN Open = {0};
|
||
Open.fpUSBMakerInit = USBMakerInit_UMSD;
|
||
msdcnvt_open(&Open);
|
||
m_bVendorConnected = TRUE;
|
||
#endif
|
||
}
|
||
#elif (IPCAM_UVC_FUNC==ENABLE)
|
||
//do nothing
|
||
#else
|
||
{
|
||
#if (MSDCVENDOR_NVT == ENABLE)
|
||
MSDCNVTCB_OPEN Open = {0};
|
||
Open.fpUSBMakerInit = NULL;
|
||
msdcnvt_open(&Open);
|
||
#endif
|
||
}
|
||
#endif
|
||
DBG_IND("USB plug - end\r\n");
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
|
||
INT32 System_OnUsbRemove(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
|
||
{
|
||
//usb unplug
|
||
|
||
DBG_IND("USB unplug - begin\r\n");
|
||
#if (USB_MODE==ENABLE)
|
||
|
||
if (m_bVendorConnected == FALSE) {
|
||
if (System_GetState(SYS_STATE_CURRMODE) == PRIMARY_MODE_MOVIE) {
|
||
if (m_bACPlug == TRUE) {
|
||
m_bACPlug = FALSE;
|
||
Ux_PostEvent(NVTEVT_AC_UnPlug, 0, 0);
|
||
}
|
||
}
|
||
FlowMode_OnUsbUnplug();
|
||
} else {
|
||
#if (MSDCVENDOR_NVT == ENABLE)
|
||
msdcnvt_close();
|
||
#endif
|
||
m_bVendorConnected = FALSE;
|
||
}
|
||
#elif (IPCAM_UVC_FUNC==ENABLE)
|
||
//do nothing
|
||
#else
|
||
{
|
||
#if (MSDCVENDOR_NVT == ENABLE)
|
||
msdcnvt_close();
|
||
#endif
|
||
}
|
||
#endif
|
||
USB_UpdateSource();
|
||
Ux_PostEvent(NVTEVT_BATTERY, 0, 0);
|
||
|
||
System_RmmodUsb(FALSE); /* rmmod usb device ko */
|
||
System_InsmodUsb(TRUE); /* insmod usb host ko */
|
||
|
||
DBG_IND("USB unplug - end\r\n");
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
|
||
INT32 System_OnUsbChargeCurrent(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
|
||
{
|
||
UINT32 uiChargeCurrent;
|
||
DBG_IND("USB charging current(%d)\r\n", paramArray[0]);
|
||
uiChargeCurrent = paramArray[0];
|
||
switch (uiChargeCurrent) {
|
||
case USB_CHARGE_CURRENT_2P5MA:
|
||
#if (USB_CHARGE_FUNCTION == ENABLE)
|
||
Power_StopUSBCharge();
|
||
#endif
|
||
break;
|
||
case USB_CHARGE_CURRENT_100MA:
|
||
break;
|
||
case USB_CHARGE_CURRENT_500MA:
|
||
case USB_CHARGE_CURRENT_1500MA:
|
||
#if (USB_CHARGE_FUNCTION == ENABLE)
|
||
Power_StartUSBCharge();
|
||
#endif
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
|
||
void USB_PlugInSetFunc(void)
|
||
{
|
||
//GxPower_SetControl(GXPWR_CTRL_AUTOPOWEROFF_RESET, 0);
|
||
//GxPower_SetControl(GXPWR_CTRL_SLEEP_RESET, 0);
|
||
SxTimer_SetFuncActive(SX_TIMER_DET_SLEEP_ID, FALSE);
|
||
SxTimer_SetFuncActive(SX_TIMER_DET_AUTOPOWEROFF_ID, FALSE);
|
||
SxTimer_SetFuncActive(SX_TIMER_DET_MODE_ID, FALSE);
|
||
}
|
||
|
||
void USB_SetForceMsdcNvt(BOOL bEn)
|
||
{
|
||
m_bForceMsdcNvt = bEn;
|
||
}
|
||
|
||
BOOL USB_GetIsMsdcNvt(void)
|
||
{
|
||
//#NT#2016/06/03#Niven Cho -begin
|
||
//#NT#open MsdcNvt with detecting specific file
|
||
#if defined(MSDCVENDOR_IDENTITY_FILE)
|
||
BOOL bMsdcNvt = FALSE;
|
||
if (System_GetState(SYS_STATE_CARD) == CARD_INSERTED) {
|
||
FST_FILE filehdl = FileSys_OpenFile(MSDCVENDOR_IDENTITY_FILE, FST_OPEN_READ);
|
||
if (filehdl != NULL) {
|
||
FileSys_CloseFile(filehdl);
|
||
bMsdcNvt = TRUE;
|
||
}
|
||
}
|
||
return (m_bForceMsdcNvt || GxKey_GetData(GXKEY_NORMAL_KEY) == FLGKEY_DOWN || bMsdcNvt);
|
||
#else
|
||
return (m_bForceMsdcNvt || GxKey_GetData(GXKEY_NORMAL_KEY) == FLGKEY_DOWN);
|
||
#endif
|
||
//#NT#2016/06/03#Niven Cho -end
|
||
}
|
||
|
||
#endif
|