📄 common.cpp
字号:
SetEvent(pData->hEvent);
break;
case CE_REGISTRATION_COMPLETE:
pData->uCardReqStatus = pParms->Parm1; //@comm contains the registered handle
if (pParms->Parm1 == 0) { //Parm1=Client hClient
DEBUGMSG(ZONE_VERBOSE, (TEXT("Failed: %s: CallBackFn: CE_REGISTRATION_COMPLETE: pParm->Parm1=NULL\r\n"),
(LPTSTR)lpClient, pParms->Parm1));
}
pData->fEventGot |= CE_REGISTRATION_COMPLETE; //for wintst
if (pData->hEvent)
SetEvent(pData->hEvent);
break;
case CE_CARD_INSERTION:
//request exclusive access immediately
if(CardRequestExclusive(pData->hClient, hSocket) != CERR_SUCCESS){
g_pKato->Log(LOG_DETAIL,TEXT("FAILed: %s: CallBackFn: CE_CARD_INSERTION: Request exclusive access failed\r\n"),
(LPTSTR)lpClient);
}
if (pParms->Parm1 == 0) { // expect: Parm1 == PNP device id string
g_pKato->Log(LOG_DETAIL,TEXT("FAILed: %s: CallBackFn: CE_CARD_INSERTION: pParm->Parm1 = NULL\r\n"),
(LPTSTR)lpClient);
}
pData->uEventGot += CE_CARD_INSERTION;
pData->fEventGot |= CE_CARD_INSERTION;
g_pKato->Log(LOG_DETAIL,TEXT("%s: CE_CARD_INSERTION: pData->uEvent=0x%lx: pData->hClient=0x%lX\r\n"),
(LPTSTR)lpClient, pData->uEventGot, pData->hClient );
// Determine if this is an artificial insertion notice
CardStatus.hSocket = hSocket;
uRet = CardGetStatus(&CardStatus);
if (uRet){
g_pKato->Log(LOG_DETAIL,TEXT("FAIL %s: CallBackFn: CE_CARD_INSERTION: CardGetStatus returned 0x%lx\r\n"),
(LPTSTR)lpClient, uRet);
}
break;
case CE_CARD_REMOVAL:
pData->uEventGot += CE_CARD_REMOVAL;
g_pKato->Log(LOG_DETAIL,TEXT("%s: CE_CARD_REMOVAL: pData->uEvent=0x%lx\r\n"), (LPTSTR)lpClient, pData->uEventGot );
break;
case CE_EXCLUSIVE_REQUEST:
CardStatus.hSocket = hSocket;
uRet = CardGetStatus(&CardStatus);
if (uRet){
g_pKato->Log(LOG_DETAIL,TEXT("FAIL: %s:CallBackFn: CE_EXCLUSIVE_REQUEST: CardGetStatus returned 0x%lx\r\n"),
(LPTSTR)lpClient, uRet);
}
pData->uEventGot += CE_EXCLUSIVE_REQUEST;
g_pKato->Log(LOG_DETAIL,TEXT("%s: CE_EXCLUSIVE_REQUEST: pData->uEvent=0x%lx: return 0x%lX\r\n"),
(LPTSTR)lpClient, pData->uEventGot, pData->uReqReturn );
break;
case CE_RESET_COMPLETE:
pData->uCardReqStatus = pParms->Parm1; // Reset Status
if(pData->hEvent)
SetEvent(pData->hEvent);
break;
//no action on the following events
case CE_CARD_UNLOCK:
case CE_EJECTION_COMPLETE:
case CE_INSERTION_COMPLETE:
case CE_EJECTION_REQUEST:
case CE_INSERTION_REQUEST:
case CE_RESET_REQUEST:
case CE_BATTERY_DEAD:
case CE_BATTERY_LOW:
case CE_CARD_LOCK:
case CE_CARD_READY:
case CE_PM_RESUME:
case CE_PM_SUSPEND:
case CE_RESET_PHYSICAL:
case CE_CARD_RESET:
case CE_WRITE_PROTECT:
break;
}
CBF_END:
return status;
} // CallBackFn
LPTSTR
FindEventName( CARD_EVENT EventCode)
{
PEVENT_NAME_TBL pEvent = v_EventNames;
while (pEvent->EventCode != LAST_EVENT_CODE) {
if (pEvent->EventCode == EventCode) {
return pEvent->pEventName;
}
pEvent++;
}
return pEvent->pEventName;
}
LPTSTR
FindStatusName( STATUS StatusCode)
{
if(StatusCode < 0 || StatusCode > 0x23) //invalid code
return NULL;
return RtnCodes[StatusCode];
}
// --------------------- update error code -----------
void updateError (UINT n)
{ // n arbitrary
if (n > 5) return ; // 0 <= n <= 5
if (n == TST_NO_ERROR) {return ;} // 1 <= n <= 5
if (LastError == TST_NO_ERROR) {LastError = n ; return ;} // First error
if (n < LastError) {LastError = n ; return ;} // n no worse
}
BOOL
NormalRequestConfig(CARD_CLIENT_HANDLE hClient, UINT8 uSock, UINT8 uFunc){
if(hClient == NULL)
return FALSE;
CARD_CONFIG_INFO confInfo = {0};
STATUS status = CERR_SUCCESS;
CARD_SOCKET_HANDLE hSocket = {uSock, uFunc};
UINT32 uParsedItems = 0;
UINT32 uParsedSize = 0;
PVOID parsedBuf;
if(CardGetParsedTuple(hSocket, CISTPL_CFTABLE_ENTRY, 0, &uParsedItems) != CERR_SUCCESS){
DEBUGMSG(ZONE_ERROR, (TEXT("CardGetParsedTuple call failed")));
return FALSE;
}
uParsedSize = uParsedItems * sizeof (PARSED_CFTABLE) ;
if (uParsedSize){
parsedBuf = new UCHAR [uParsedSize] ;
if (parsedBuf){
CardGetParsedTuple(hSocket, CISTPL_CFTABLE_ENTRY, parsedBuf, &uParsedItems);
}
else{
return FALSE;
}
}
else{
DEBUGMSG(ZONE_ERROR, (TEXT("no config table entry found")));
return FALSE;
}
PVOID pCur = parsedBuf;
PARSED_CFTABLE* pTable = NULL;
BOOL fConfigured = FALSE;
for(UINT i = 0; i < uParsedItems; i++){
pTable = (PARSED_CFTABLE *)pCur;
if(pTable->IFaceType != 1){// not I/O config
pCur = (PBYTE)pCur + sizeof(PARSED_CFTABLE);
continue;
}
//calling CardRequestCOnfiguration using normal parameters
confInfo.hSocket.uFunction = uFunc;
confInfo.hSocket.uSocket = uSock;
confInfo.fInterfaceType = CFG_IFACE_MEMORY_IO;
confInfo.fAttributes = CFG_ATTR_IRQ_STEERING;
confInfo.fRegisters = 0xFF;
confInfo.fExtRegisters = 0xFF;
//don't change power-related parameters
confInfo.uVcc = (UINT8)(pTable->VccDescr.NominalV);
confInfo.uVpp1 = (UINT8)(pTable->Vpp1Descr.NominalV);
confInfo.uVpp2 = (UINT8)(pTable->Vpp2Descr.NominalV);
//retrieve current registry values
if(RetrieveRegisterValues(&confInfo, hSocket) == FALSE){
g_pKato->Log(LOG_FAIL,TEXT("Socket %u: Function %u: can not retreive configuration register values.\r\n"),
uSock, uFunc);
delete[] parsedBuf;
return FALSE;
}
//now request configuration
status = CardRequestConfiguration(hClient, &confInfo);
if(status != CERR_SUCCESS){//if it failed, try the next configuation table
g_pKato->Log(LOG_FAIL,TEXT("Socket %u: Function %u: Request config on No. %u config table failed\r\n"),
uSock, uFunc, i);
g_pKato->Log(LOG_FAIL,TEXT("uVcc = %u, uVpp1 = %u, uVpp2 = %u\r\n"),
confInfo.uVcc, confInfo.uVpp1, confInfo.uVpp2);
}
else{
g_pKato->Log(LOG_DETAIL,TEXT("Socket %u: Function %u: RequestConfig on No. %u config table succeed!\r\n"),
uSock, uFunc, i);
g_pKato->Log(LOG_DETAIL,TEXT("uVcc = %u, uVpp1 = %u, uVpp2 = %u\r\n"),
confInfo.uVcc, confInfo.uVpp1, confInfo.uVpp2);
fConfigured = TRUE;
break;
}
pCur = (PBYTE)pCur + sizeof(PARSED_CFTABLE);
}
delete[] parsedBuf;
return fConfigured;
}
BOOL RetrieveRegisterValues(PCARD_CONFIG_INFO pConfInfo, CARD_SOCKET_HANDLE hSocket){
STATUS status = CERR_SUCCESS;
if(pConfInfo == NULL)
return FALSE;
//read ConfigReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 0, &(pConfInfo->uConfigReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access ConfigReg\r\n")));
}
//read StatusReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 1, &(pConfInfo->uStatusReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access StatusReg\r\n")));
}
//read PinReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 2, &(pConfInfo->uPinReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access PinReg\r\n")));
}
//read uCopyReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 3, &(pConfInfo->uCopyReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access CopyReg\r\n")));
}
//read uExtendedStatusReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 4, &(pConfInfo->uExtendedStatus));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access ExtendedStatusReg\r\n")));
}
//read IOBases
for(int i = 0; i < NUM_EXT_REGISTERS; i++){
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, NUM_REGISTERS+i, &(pConfInfo->IOBase[i]));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access IOBase no. %d\r\n"), i));
}
}
//read IOLimit
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 9, &(pConfInfo->IOLimit));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access IOLimit\r\n")));
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -