nt9856x/code/application/source/cardv/SrcCode/Gx/GxUSB/GxUSB.c
2023-03-28 15:07:53 +08:00

211 lines
4.9 KiB
C
Executable File
Raw Blame History

/**
Copyright Novatek Microelectronics Corp. 2009. All rights reserved.
@file GxUSB.c
@ingroup mIPRJAPKeyIO
@brief Detect USB is plugging in or unplugged
Detect USB is plugging in or unplugged
@note Nothing.
@date 2005/12/15
*/
/** \addtogroup mIPRJAPKeyIO */
//@{
#include "kwrap/type.h"
#include "GxUSB.h"
#include "usb2dev.h"
#include "DxUSB.h"
#include "DxApi.h"
//#include "FileSysTsk.h" //abnormal
#define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
///////////////////////////////////////////////////////////////////////////////
#define __MODULE__ GxUsb
#define __DBGLVL__ THIS_DBGLVL
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
#include <kwrap/debug.h>
GX_CALLBACK_PTR g_fpUSBCB = NULL;
static BOOL bLastUSBDet = FALSE;
static BOOL bLastUSBStatus = FALSE;
static UINT32 uiUSBCurrType = 0;
static UINT32 g_uiUSBDevID = 0;
static void xUsbChargeCB(UINT32 uiEvent)
{
UINT32 uiChargeCurrent = USB_CHARGE_CURRENT_2P5MA;
switch (uiEvent) {
case USB_CHARGE_EVENT_2P5MA:
DBG_DUMP("^YUSB 2.5mA\r\n");
break;
case USB_CHARGE_EVENT_100MA:
DBG_DUMP("^YUSB 100mA\r\n");
uiChargeCurrent = USB_CHARGE_CURRENT_100MA;
break;
case USB_CHARGE_EVENT_500MA:
DBG_DUMP("^YUSB 500mA\r\n");
uiChargeCurrent = USB_CHARGE_CURRENT_500MA;
break;
case USB_CHARGE_EVENT_1P5A:
DBG_DUMP("^YUSB 1.5A\r\n");
uiChargeCurrent = USB_CHARGE_CURRENT_1500MA;
break;
default:
break;
}
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_CHARGE, uiChargeCurrent, 0);
}
}
void GxUSB_Init(UINT32 DevID, BOOL bPowerOnSrc)
{
g_uiUSBDevID = DevID;
if (bPowerOnSrc) {
bLastUSBDet = TRUE;
bLastUSBStatus = FALSE;
} else {
bLastUSBDet = FALSE;
bLastUSBStatus = FALSE;
}
usb2dev_set_callback(USB_CALLBACK_CHARGING_EVENT, xUsbChargeCB);
}
void GxUSB_Exit(void)
{
}
/**
Detect USB is plugging in or unplugged
Detect USB is plugging in or unplugged and change corresponding mode
[KeyScan internal API]
@param void
@return void
*/
void GxUSB_DetConnect(void)
{
BOOL bCurUSBDet, bCurUSBStatus;
bCurUSBDet = GxUSB_GetIsUSBPlug();
DBG_MSG("^BUSB DetPlug > lastDet = %d, currDet = %d\r\n", bLastUSBDet, bCurUSBDet);
bCurUSBStatus = (BOOL)(bCurUSBDet & bLastUSBDet);
if (bCurUSBStatus != bLastUSBStatus) {
DBG_MSG("^BUSB DetPlug > last = %d, curr = %d\r\n", bLastUSBStatus, bCurUSBStatus);
GxUSB_UpdateConnectType();
//debounce: <20><EFBFBD><E2A6B8><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>~<7E><><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>J
if (bCurUSBStatus == TRUE) {
#if 0
uiUSBCurrType = GxUSB_GetConnectType();
if (uiUSBCurrType != USB_CONNECT_UNKNOWN) {
DBG_DUMP("^BUSB Plug\r\n");
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_PLUG, uiUSBCurrType, 0);
}
} else {
//USB already unplugged while call GxUSB_UpdateConnectType()
DBG_DUMP("^BUSB Fast Unplug\r\n");
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_UNPLUG, uiUSBCurrType, 0);
}
bCurUSBDet = FALSE;
bCurUSBStatus = (BOOL)(bCurUSBDet & bLastUSBDet);
}
#else
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_PLUG, uiUSBCurrType, 0);
}
#endif
}
//debounce: <20><EFBFBD><E2A6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else {
//uiUSBCurrType = USB_CONNECT_NONE;
if (1) {
DBG_DUMP("^BUSB Unplug\r\n");
//Need feedback from callback
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_UNPLUG, 0, 0);
}
}
}
}
//debounce: <20>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if ((bLastUSBDet == TRUE) && (bCurUSBDet == FALSE)) {
//USB already unplugged
DBG_MSG("^BUSB Fast Unplug 2\r\n");
if (g_fpUSBCB) {
g_fpUSBCB(USB_CB_UNPLUG, 0, 0);
}
bCurUSBDet = FALSE;
bCurUSBStatus = (BOOL)(bCurUSBDet & bLastUSBDet);
}
bLastUSBDet = bCurUSBDet;
bLastUSBStatus = bCurUSBStatus;
}
/**
Get if usb is plug / unplug.
It cab be used before DetectSrvTsk starts.
@param void
@return TRUE : plug in FALSE : unplug
*/
BOOL GxUSB_GetIsUSBPlug(void)
{
if (g_uiUSBDevID == 0) {
DBG_ERR("GxUSB_Init should be invoked before any other GxUSB APIs.\r\n");
return FALSE;
}
if (Dx_Getcaps((DX_HANDLE)g_uiUSBDevID, DETUSB_CAPS_BASE, 0) & DETUSB_BF_DETPLUG) {
return Dx_Getcaps((DX_HANDLE)g_uiUSBDevID, DETUSB_CAPS_PLUG, 0); //detect current plug status
} else {
return FALSE;
}
}
void GxUSB_RegCB(GX_CALLBACK_PTR fpUSBCB)
{
g_fpUSBCB = fpUSBCB;
}
void GxUSB_UpdateConnectType(void)
{
if (g_uiUSBDevID == 0) {
DBG_ERR("GxUSB_Init should be invoked before any other GxUSB APIs.\r\n");
return;
}
if (Dx_Getcaps((DX_HANDLE)g_uiUSBDevID, DETUSB_CAPS_BASE, 0) & DETUSB_BF_CONNTYPE) {
uiUSBCurrType = Dx_Getcaps((DX_HANDLE)g_uiUSBDevID, DETUSB_CAPS_CONN_TYPE, 0);
}
}
UINT32 GxUSB_GetConnectType(void)
{
return uiUSBCurrType;
}
void GxUSB_SetChargerType(BOOL bIsStandardCharger)
{
if (g_uiUSBDevID == 0) {
DBG_ERR("GxUSB_Init should be invoked before any other GxUSB APIs.\r\n");
return;
}
Dx_Setconfig((DX_HANDLE)g_uiUSBDevID, DETUSB_CFG_STANDARD_CHARGER, bIsStandardCharger);
}