/* 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 #include #if HUNTING_CAMERA_MCU == ENABLE #include #include #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 /////////////////////////////////////////////////////////////////////////////// static char driver_path_prefix[64] = "/etc/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; memset(driver_path_prefix, '\0', sizeof(driver_path_prefix)); snprintf(driver_path_prefix, sizeof(driver_path_prefix), "/lib/modules/4.19.91"); 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_set_msdc_clk(); 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) { //�S��USB DBG_MSG(" USB Src = (None)\r\n"); gUsbSrc = USB_SRC_NONE; } else if (ctype == USB_CONNECT_PC) { //USB����PC DBG_MSG(" USB Src = PC\r\n"); gUsbSrc = USB_SRC_USB_PC; } else if (ctype == USB_CONNECT_CHARGER) { //USB���ۥR�q�� DBG_MSG(" USB Src = Adapter\r\n"); gUsbSrc = USB_SRC_USB_ADAPTER; } else if (ctype == USB_CONNECT_CHARGING_PC) { //USB���ۦ��j�q�yport��PC DBG_MSG(" USB Src = Charging PC\r\n"); gUsbSrc = USB_SRC_USB_CHARGING_PC; } else { //USB���ۥ��� (�w�g�ް��L�k�P�_) DBG_ERR(" USB Src = Unknown?\r\n"); gUsbSrc = USB_SRC_UNKNOWN; } #else BOOL bInsert = GxUSB_GetIsUSBPlug(); if (!bInsert) { //�S��USB DBG_MSG(" USB Src = (None)\r\n"); gUsbSrc = USB_SRC_NONE; } else { //USB����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