211 lines
4.9 KiB
C
Executable File
211 lines
4.9 KiB
C
Executable File
/**
|
||
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);
|
||
}
|