nt9856x/code/application/source/cardv/SrcCode/System/SysUsb_Exe.c

511 lines
12 KiB
C
Executable File
Raw Blame History

/*
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