?? hcicommand.cpp
字號:
//--------------------------------------------------------------- %FILH_BEG% --
//-----------------------------------------------------------------------------
//
// Project: $$ProjectName
//
// File name: HCICommand.cpp
// Author: Ebrahim Khorasani
// Description:
//
// Revision History:
// $Log: $
//
// Rev 1.00 15 July 2000 Initial release
//
//
// Copyright (c) TelenComm Corporation 2000 - All rights reserved
//--------------------------------------------------------------- %FILH_END%
//------------------------------------------------------------------------------
//
// Includes
//
//------------------------------------------------------------------------------
#include "..\..\..\stdafx.h"
#include "..\..\..\BTHost.h"
#include "process.h"
#include "..\Inc\HCICommandProc.h"
#include "..\Inc\HCICmdPacket.h"
#include "..\Inc\HCICmdTables.h"
//------------------------------------------------------------------------------
//
// Code
//
//------------------------------------------------------------------------------
CHCICommandProcessor::CHCICommandProcessor(void)
:CHCILinkControlCmdProcessor(),
CHCILinkPolicyCmdProcessor(),
CHCIHC_BaseBandCmdProcessor(),
CHCIInfoParmProcessor(),
CHCIStatusParmProcessor(),
CHCITestingCmdProcessor(),
CHCIVendSpecCmdProcessor()
{
if(!ValidateHCICommandTables())
{
printf("Function DB or Table is corrupted");
abort();
}
}
bool CHCICommandProcessor::ValidateHCICommandTables(void)
{
FOR_LOOP(CmdType,(sint32)eFIRST_CMD_TYPE,(sint32)eLAST_CMD_TYPE + 1)
{
if(!ValidateTableType((CHCIBaseCmdProcessor::eHCICmdType)CmdType))
return false;
}
return true;
}
bool CHCICommandProcessor::ValidateTableType(eHCICmdType CmdType)
{
#ifdef BT_DEBUG
tHCICommandTableItem* HCICommandTable = CmdTypeTable[CmdType].CmdTable;
int NoOfCmds = CmdTypeTable[CmdType].NoOfCmds;
int i;
uint8 PrevOGF;
uint16 PrevOCF;
uint16 PrevOpCode;
assert(NoOfCmds > 0);
PrevOGF = HCICommandTable[0].OpCodeGroupField;
PrevOCF = HCICommandTable[0].OpCodeCommandField;
PrevOpCode = HCICommandTable[0].OpCode;
PrevOpCode = MAKE_OPCODE(PrevOGF, PrevOCF);
for (i = 1; i < NoOfCmds; i++)
{
if (HCICommandTable[i].OpCodeGroupField == PrevOGF)
assert(HCICommandTable[i].OpCodeCommandField > PrevOCF);
else
assert(HCICommandTable[i].OpCodeGroupField > PrevOGF);
assert(HCICommandTable[i].OpCode > PrevOpCode);
PrevOGF = HCICommandTable[i].OpCodeGroupField;
PrevOCF = HCICommandTable[i].OpCodeCommandField;;
PrevOpCode = HCICommandTable[i].OpCode;
}
for (i = 0; i < NoOfCmds; i++)
{
assert(HCICommandTable[i].OpCode ==
MAKE_OPCODE(HCICommandTable[i].OpCodeGroupField,
HCICommandTable[i].OpCodeCommandField));
assert(HCICommandTable[i].OpCodeGroupField ==
GET_OGF(HCICommandTable[i].OpCode));
assert(HCICommandTable[i].OpCodeCommandField ==
GET_OCF(HCICommandTable[i].OpCode));
assert(HCICommandTable[i].CommandFunction != NULL);
assert(HCICommandTable[i].SpecSection != NULL);
assert(HCICommandTable[i].Name != NULL);
}
#endif BT_DEBUG
return true;
}
//------------------------------------------------------------------------------
void CHCICommandProcessor::PrintHCICommandTable(eHCICmdType CmdType)
{
tHCICommandTableItem* HCICommandTable = CmdTypeTable[CmdType].CmdTable;
int NoOfCmds = CmdTypeTable[CmdType].NoOfCmds;
int i;
printf("\n");
printf("HCICommandTable\n");
printf("===============\n\n");
for (i = 0; i < NoOfCmds; i++)
{
printf("Entry[%0i] -----------\n");
printf("----------------------\n");
printf("OpCode: %x\n", HCICommandTable[i].OpCode);
printf("OpCodeGroupField: %x\n", HCICommandTable[i].OpCodeGroupField);
printf("OpCodeCommandField: %x\n", HCICommandTable[i].OpCodeCommandField);
printf("ParameterTotalLength: %x\n", HCICommandTable[i].ParameterTotalLength);
printf("CommandFunction: %x\n", HCICommandTable[i].CommandFunction);
printf("SpecSection: %s\n", HCICommandTable[i].SpecSection);
printf("Name: %s\n", HCICommandTable[i].Name);
}
printf("----------------------\n\n");
}
//------------------------------------------------------------------------------
int CHCICommandProcessor::FindHCICommandType(uint16 OpCode)
{
int Lower,Upper,Current;
int FindIdx = -1;
int CmdType = GET_OGF(OpCode);
if (CmdType == 0x3F)
CmdType = eVEND_SPEC_CMD; // EK Vendor Specific Command
if(CmdType >=1 && CmdType <= 7)
{
tHCICommandTableItem* HCICommandTable = CmdTypeTable[CmdType].CmdTable;
int MaxIdx = CmdTypeTable[CmdType].NoOfCmds -1;
Lower = 0;
Upper = MaxIdx;
FOR_LOOP(i,0,1000) // to avoid infinite loop
{
Current = (Upper + Lower) / 2;
if (HCICommandTable[Current].OpCode > OpCode)
{
Upper = Current;
}
else if (HCICommandTable[Current].OpCode < OpCode)
{
Lower = Current+1;
}
else
{
FindIdx = Current;
break;
}
if (Upper == Lower)
{
if(OpCode == HCICommandTable[MaxIdx].OpCode)
FindIdx = MaxIdx;
break; // not found
}
}
}
return FindIdx;
}
//------------------------------------------------------------------------------
CHCICommandProcessor::tCmdParseStatus CHCICommandProcessor::ParseHCICmdType(CHCI_CmdPacket& HCI_CmdPacket)
{
ASSERT(0);
/* update as per ParseHCIEventType function*/
int Index;
int OpCode = HCI_CmdPacket.GetOpCode();
int CmdType = GET_OGF(OpCode);
if (CmdType == 0x3F)
CmdType = eVEND_SPEC_CMD; // EK Vendor Specific Command
if(CmdType >=1 && CmdType <= 7)
{
if ( (Index = FindHCICommandType(OpCode) )!= -1 )
{
tHCICommandTableItem* HCICommandTable = CmdTypeTable[CmdType].CmdTable;
int NoOfCmds = CmdTypeTable[CmdType].NoOfCmds;
if ((HCICommandTable[Index].ParameterTotalLength != NO_PAR) &&
(HCICommandTable[Index].ParameterTotalLength !=
HCI_CmdPacket.GetParmLen()))
{
MessageBox(NULL,"Wrong parameter total length in command packet","Error",MB_OK|MB_ICONWARNING);
return CHCIBaseCmdProcessor::ePARAMETER_SIZE_MISMATCH;
}
else
{
// Dispatch to HCI Command Function
HCICommandTable[Index].CommandFunction(HCI_CmdPacket);
return CHCIBaseCmdProcessor::ePARSING_OK;
}
}
}
MessageBox(NULL,"Wrong command code in Command Complete Event packet","Error",MB_OK|MB_ICONWARNING);
return CHCIBaseCmdProcessor::eUNKNOWN_CMD;
}
CHCICommandProcessor::tCmdParseStatus CHCICommandProcessor::ParseHCICommand(CHCI_CmdPacket& HCI_CmdPacket, sint32 PacketLen)
{
//tCmdParseStatus retsts;
//FOR_LOOP(CmdType,(sint32)eFIRST_CMD_TYPE,(sint32)eLAST_CMD_TYPE)
//{
//retsts=ParseHCICmdType(HCI_CmdPacket);
//if( retsts==ePARSING_OK)
//break;
//}
//return retsts;
return ParseHCICmdType(HCI_CmdPacket);
}
//------------------------------------------------------------------------------
// End of HCICommand.cpp
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -