diff options
Diffstat (limited to 'software/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.c')
-rw-r--r-- | software/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.c | 2033 |
1 files changed, 2033 insertions, 0 deletions
diff --git a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.c b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.c new file mode 100644 index 0000000..759fc7d --- /dev/null +++ b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.c @@ -0,0 +1,2033 @@ +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +File: oct6100_tlv.c + + Copyright (c) 2001-2005 Octasic Inc. + +Description: + + This file contains the functions used to read information allowing the + API to know where all the features supported by this API version are + located in the chip's external memory. + +This file is part of the Octasic OCT6100 GPL API . The OCT6100 GPL API is +free software; you can redistribute it and/or modify it under the terms of +the GNU General Public License as published by the Free Software Foundation; +either version 2 of the License, or (at your option) any later version. + +The OCT6100 GPL API is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with the OCT6100 GPL API; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + +$Octasic_Release: OCT612xAPI-01.00-PR38 $ + +$Octasic_Revision: 109 $ + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + +/***************************** INCLUDE FILES *******************************/ + +#include "octdef.h" + +#include "oct6100api/oct6100_defines.h" +#include "oct6100api/oct6100_errors.h" + +#include "oct6100api/oct6100_apiud.h" +#include "oct6100api/oct6100_tlv_inst.h" +#include "oct6100api/oct6100_chip_open_inst.h" +#include "oct6100api/oct6100_chip_stats_inst.h" +#include "oct6100api/oct6100_interrupts_inst.h" +#include "oct6100api/oct6100_remote_debug_inst.h" +#include "oct6100api/oct6100_debug_inst.h" +#include "oct6100api/oct6100_api_inst.h" + +#include "oct6100api/oct6100_interrupts_pub.h" + +#include "oct6100api/oct6100_channel_pub.h" +#include "oct6100api/oct6100_chip_open_pub.h" + +#include "oct6100_chip_open_priv.h" +#include "oct6100_miscellaneous_priv.h" +#include "oct6100_tlv_priv.h" + +/**************************** PRIVATE FUNCTIONS ****************************/ + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiProcessTlvRegion + +Description: This function will read and interpret the TLV memory of the chip + to obtain memory offsets and features available of the image + loaded into the chip. + + The API will read this region until it finds a TLV type of 0 with + a length of 0. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiProcessTlvRegion( + tPOCT6100_INSTANCE_API f_pApiInstance ) +{ + tOCT6100_READ_PARAMS ReadParams; + UINT16 usReadData; + UINT32 ulResult; + + UINT32 ulTlvTypeField; + UINT32 ulTlvLengthField; + UINT32 ulTlvWritingTimeoutCount = 0; + UINT32 ulConditionFlag = TRUE; + + ReadParams.pProcessContext = f_pApiInstance->pProcessContext; + + ReadParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId; + ReadParams.pusReadData = &usReadData; + + /* Set the address of the first TLV type. */ + ReadParams.ulReadAddress = cOCT6100_TLV_BASE; + ReadParams.ulReadAddress += 2; + + /* Wait for the TLV configuration to be configured in memory. */ + while ( ulConditionFlag ) + { + /* Read the TLV write done flag. */ + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + if ( usReadData & 0x1 ) + break; + + ulTlvWritingTimeoutCount++; + if ( ulTlvWritingTimeoutCount == 0x100000 ) + return cOCT6100_ERR_TLV_TIMEOUT; + } + + /*======================================================================*/ + /* Read the first 16 bits of the TLV type. */ + + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvTypeField = usReadData << 16; + + /* Read the last word of the TLV type. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvTypeField |= usReadData; + + /*======================================================================*/ + + + /*======================================================================*/ + /* Now, read the TLV field length. */ + + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvLengthField = usReadData << 16; + + /* Read the last word of the TLV length. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvLengthField |= usReadData; + + /* Modify the address to point at the TLV value field. */ + ReadParams.ulReadAddress += 2; + + /*======================================================================*/ + + /* Read the TLV value until the end of TLV region is reached. */ + while( !((ulTlvTypeField == 0) && (ulTlvLengthField == 0)) ) + { + ulResult = Oct6100ApiInterpretTlvEntry( f_pApiInstance, + ulTlvTypeField, + ulTlvLengthField, + ReadParams.ulReadAddress ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Set the address to after the TLV value. */ + ReadParams.ulReadAddress += ulTlvLengthField; + + /*======================================================================*/ + /* Read the first 16 bits of the TLV type. */ + + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvTypeField = usReadData << 16; + + /* Read the last word of the TLV type. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvTypeField |= usReadData; + + /*======================================================================*/ + + + /*======================================================================*/ + /* Now, read the TLV field length. */ + + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvLengthField = usReadData << 16; + + /* Read the last word of the TLV length. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulTlvLengthField |= usReadData; + + ReadParams.ulReadAddress += 2; + + /*======================================================================*/ + } + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiInterpretTlvEntry + +Description: This function will interpret a TLV entry from the chip. All + known TLV types by the API are exhaustively listed here. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +f_ulTlvFieldType Type of the TLV field to interpret. +f_ulTlvFieldLength Byte length of the TLV field. +f_ulTlvValueAddress Address where the data of the TLV block starts. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiInterpretTlvEntry( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN UINT32 f_ulTlvFieldType, + IN UINT32 f_ulTlvFieldLength, + IN UINT32 f_ulTlvValueAddress ) +{ + tOCT6100_READ_PARAMS ReadParams; + UINT32 ulResult = cOCT6100_ERR_OK; + UINT16 usReadData; + UINT32 i; + UINT32 ulTempValue = 0; + + ReadParams.pProcessContext = f_pApiInstance->pProcessContext; + + ReadParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId; + ReadParams.pusReadData = &usReadData; + + /* Find out how to interpret the TLV value according to the TLV type. */ + switch( f_ulTlvFieldType ) + { + case cOCT6100_TLV_TYPE_VERSION_NUMBER: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_VERSION_NUMBER, + cOCT6100_TLV_MAX_LENGTH_VERSION_NUMBER ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ReadParams.ulReadAddress = f_ulTlvValueAddress; + + for( i = 0; i < (f_ulTlvFieldLength/2); i++ ) + { + /* Perform the actual read. */ + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + f_pApiInstance->pSharedInfo->ImageInfo.szVersionNumber[ (i * 2) ] = (UINT8)((usReadData >> 8) & 0xFF); + f_pApiInstance->pSharedInfo->ImageInfo.szVersionNumber[ (i * 2) + 1 ] = (UINT8)((usReadData >> 0) & 0xFF); + + /* Modify the address. */ + ReadParams.ulReadAddress += 2; + } + } + break; + + case cOCT6100_TLV_TYPE_CUSTOMER_PROJECT_ID: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CUSTOMER_PROJECT_ID, + cOCT6100_TLV_MAX_LENGTH_CUSTOMER_PROJECT_ID ); + if ( ulResult == cOCT6100_ERR_OK ) + { + /* Perform the actual read. */ + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->ImageInfo.ulBuildId ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH0_MAIN_BASE_ADDRESS: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH0_MAIN_BASE_ADDRESS, + cOCT6100_TLV_MAX_LENGTH_CH0_MAIN_BASE_ADDRESS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainMemBase ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainMemBase &= 0x0FFFFFFF; + + /* Modify the base address to incorporate the external memory offset. */ + f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainMemBase += cOCT6100_EXTERNAL_MEM_BASE_ADDRESS; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_SIZE, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainMemSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_IO_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_IO_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_IO_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainIoMemOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_ZCB_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_ZCB_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_ZCB_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainRinCBMemOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_ZCB_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_ZCB_SIZE, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_ZCB_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainRinCBMemSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_XCB_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_XCB_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_XCB_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSinCBMemOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_XCB_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_XCB_SIZE, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_XCB_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSinCBMemSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_YCB_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_YCB_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_YCB_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSoutCBMemOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_MAIN_YCB_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_MAIN_YCB_SIZE, + cOCT6100_TLV_MAX_LENGTH_CH_MAIN_YCB_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSoutCBMemSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_FREE_MEM_BASE_ADDRESS: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_FREE_MEM_BASE_ADDRESS, + cOCT6100_TLV_MAX_LENGTH_FREE_MEM_BASE_ADDRESS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulFreeMemBaseAddress ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + f_pApiInstance->pSharedInfo->MemoryMap.ulFreeMemBaseAddress &= 0x0FFFFFFF; + + } + break; + + case cOCT6100_TLV_TYPE_CHAN_MAIN_IO_STATS_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CHAN_MAIN_IO_STATS_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CHAN_MAIN_IO_STATS_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainIoStatsOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CHAN_MAIN_IO_STATS_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CHAN_MAIN_IO_STATS_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CHAN_MAIN_IO_STATS_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainIoStatsSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_CH_ROOT_CONF_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CH_ROOT_CONF_OFFSET, + cOCT6100_TLV_MAX_LENGTH_CH_ROOT_CONF_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanRootConfOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + + case cOCT6100_TLV_TYPE_POA_CH_MAIN_ZPO_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_CH_MAIN_ZPO_OFFSET, + cOCT6100_TLV_MAX_LENGTH_POA_CH_MAIN_ZPO_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainRinPlayoutMemOfst ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_POA_CH_MAIN_ZPO_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_CH_MAIN_ZPO_SIZE, + cOCT6100_TLV_MAX_LENGTH_POA_CH_MAIN_ZPO_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainRinPlayoutMemSize ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + break; + + case cOCT6100_TLV_TYPE_POA_CH_MAIN_YPO_OFFSET: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_CH_MAIN_YPO_OFFSET, + cOCT6100_TLV_MAX_LENGTH_POA_CH_MAIN_YPO_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSoutPlayoutMemOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_CH_MAIN_YPO_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_CH_MAIN_YPO_SIZE, + cOCT6100_TLV_MAX_LENGTH_POA_CH_MAIN_YPO_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ulChanMainSoutPlayoutMemSize ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_ZWP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_ZWP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_ZWP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutRinWritePtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_ZIS: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_ZIS, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_ZIS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutRinIgnoreSkipCleanOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_ZSP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_ZSP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_ZSP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutRinSkipPtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_YWP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_YWP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_YWP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutSoutWritePtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_YIS: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_YIS, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_YIS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutSoutIgnoreSkipCleanOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RW_YSP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RW_YSP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RW_YSP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutSoutSkipPtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RO_ZRP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RO_ZRP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RO_ZRP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutRinReadPtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_POA_BOFF_RO_YRP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POA_BOFF_RO_YRP, + cOCT6100_TLV_MAX_LENGTH_POA_BOFF_RO_YRP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutSoutReadPtrOfst ); + } + break; + + case cOCT6100_TLV_TYPE_CNR_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CNR_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_CNR_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ConferencingNoiseReductionOfst ); + } + break; + + case cOCT6100_TLV_TYPE_ANR_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ANR_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_ANR_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AdaptiveNoiseReductionOfst ); + } + break; + + case cOCT6100_TLV_TYPE_HZ_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_HZ_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_HZ_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinDcOffsetRemovalOfst ); + } + /* Set flag indicating that the feature is present.*/ + f_pApiInstance->pSharedInfo->ImageInfo.fRinDcOffsetRemoval = TRUE; + break; + + case cOCT6100_TLV_TYPE_HX_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_HX_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_HX_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SinDcOffsetRemovalOfst ); + } + /* Set flag indicating that the feature is present.*/ + f_pApiInstance->pSharedInfo->ImageInfo.fSinDcOffsetRemoval = TRUE; + break; + + case cOCT6100_TLV_TYPE_LCA_Z_CONF_BOFF_RW_GAIN: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_LCA_Z_CONF_BOFF_RW_GAIN, + cOCT6100_TLV_MAX_LENGTH_LCA_Z_CONF_BOFF_RW_GAIN ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinLevelControlOfst ); + } + break; + + case cOCT6100_TLV_TYPE_LCA_Y_CONF_BOFF_RW_GAIN: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_LCA_Y_CONF_BOFF_RW_GAIN, + cOCT6100_TLV_MAX_LENGTH_LCA_Y_CONF_BOFF_RW_GAIN ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SoutLevelControlOfst ); + } + break; + + case cOCT6100_TLV_TYPE_CNA_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CNA_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_CNA_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ComfortNoiseModeOfst ); + } + /* Set flag indicating that the feature is present.*/ + f_pApiInstance->pSharedInfo->ImageInfo.fComfortNoise = TRUE; + break; + + case cOCT6100_TLV_TYPE_NOA_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_NOA_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_NOA_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.NlpControlFieldOfst ); + } + /* Set flag indicating that the feature is present.*/ + f_pApiInstance->pSharedInfo->ImageInfo.fNlpControl = TRUE; + break; + + case cOCT6100_TLV_TYPE_VFA_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_VFA_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_VFA_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.VadControlFieldOfst ); + } + /* Set flag indicating that the feature is present.*/ + f_pApiInstance->pSharedInfo->ImageInfo.fSilenceSuppression = TRUE; + break; + + case cOCT6100_TLV_TYPE_TLA_MAIN_IO_BOFF_RW_TAIL_DISP: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TLA_MAIN_IO_BOFF_RW_TAIL_DISP, + cOCT6100_TLV_MAX_LENGTH_TLA_MAIN_IO_BOFF_RW_TAIL_DISP ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PouchTailDisplOfst ); + } + break; + + case cOCT6100_TLV_TYPE_BOOTA_POUCH_BOFF_RW_BOOT_INST: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_BOOTA_POUCH_BOFF_RW_BOOT_INST, + cOCT6100_TLV_MAX_LENGTH_BOOTA_POUCH_BOFF_RW_BOOT_INST ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PouchBootInstructionOfst ); + } + break; + + case cOCT6100_TLV_TYPE_BOOTA_POUCH_BOFF_RW_BOOT_RESULT: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_BOOTA_POUCH_BOFF_RW_BOOT_RESULT, + cOCT6100_TLV_MAX_LENGTH_BOOTA_POUCH_BOFF_RW_BOOT_RESULT ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PouchBootResultOfst ); + } + break; + + case cOCT6100_TLV_TYPE_TDM_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TDM_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_TDM_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ToneDisablerControlOfst ); + } + + f_pApiInstance->pSharedInfo->ImageInfo.fToneDisabler = TRUE; + break; + + case cOCT6100_TLV_TYPE_DIS_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DIS_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_DIS_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.TailDisplEnableOfst ); + } + + f_pApiInstance->pSharedInfo->ImageInfo.fTailDisplacement = TRUE; + break; + + case cOCT6100_TLV_TYPE_NT_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_NT_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_NT_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.NlpTrivialFieldOfst ); + } + + break; + + case cOCT6100_TLV_TYPE_DEBUG_CHAN_INDEX_VALUE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DEBUG_CHAN_INDEX_VALUE, + cOCT6100_TLV_MAX_LENGTH_DEBUG_CHAN_INDEX_VALUE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + } + + f_pApiInstance->pSharedInfo->DebugInfo.usRecordMemIndex = (UINT16)( ulTempValue & 0xFFFF ); + + break; + + case cOCT6100_TLV_TYPE_ADPCM_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ADPCM_ENABLE, + cOCT6100_TLV_MAX_LENGTH_ADPCM_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + } + + if ( ulTempValue == 0 ) + f_pApiInstance->pSharedInfo->ImageInfo.fAdpcm = FALSE; + else + f_pApiInstance->pSharedInfo->ImageInfo.fAdpcm = TRUE; + + break; + + case cOCT6100_TLV_TYPE_CONFERENCING_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CONFERENCING_ENABLE, + cOCT6100_TLV_MAX_LENGTH_CONFERENCING_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + } + + if ( ulTempValue == 0 ) + f_pApiInstance->pSharedInfo->ImageInfo.fConferencing = FALSE; + else + f_pApiInstance->pSharedInfo->ImageInfo.fConferencing = TRUE; + + break; + + case cOCT6100_TLV_TYPE_TONE_DETECTOR_PROFILE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TONE_DETECTOR_PROFILE, + cOCT6100_TLV_MIN_LENGTH_TONE_DETECTOR_PROFILE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->ImageInfo.ulToneProfileNumber ); + } + + break; + + case cOCT6100_TLV_TYPE_MAX_TAIL_DISPLACEMENT: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MAX_TAIL_DISPLACEMENT, + cOCT6100_TLV_MAX_LENGTH_MAX_TAIL_DISPLACEMENT ); + if ( ulResult == cOCT6100_ERR_OK ) + { + UINT32 ulTailDispTempValue; + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTailDispTempValue ); + + ulTailDispTempValue += 1; /* Convert the value into milliseconds.*/ + ulTailDispTempValue *= 16; /* value was given in multiple of 16 ms. */ + + if ( ulTailDispTempValue >= 128 ) + f_pApiInstance->pSharedInfo->ImageInfo.usMaxTailDisplacement = (UINT16)( ulTailDispTempValue - 128 ); + else + f_pApiInstance->pSharedInfo->ImageInfo.usMaxTailDisplacement = 0; + + } + + break; + + case cOCT6100_TLV_TYPE_AEC_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AEC_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_AEC_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AecFieldOfst ); + } + + /* Set the flag. */ + f_pApiInstance->pSharedInfo->ImageInfo.fAecEnabled = TRUE; + + /* Acoustic echo cancellation available! */ + f_pApiInstance->pSharedInfo->ImageInfo.fAcousticEcho = TRUE; + + break; + + case cOCT6100_TLV_TYPE_PCM_LEAK_CONF_BOFF_RW: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_PCM_LEAK_CONF_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_PCM_LEAK_CONF_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PcmLeakFieldOfst ); + } + + f_pApiInstance->pSharedInfo->ImageInfo.fNonLinearityBehaviorA = TRUE; + break; + + case cOCT6100_TLV_TYPE_DEFAULT_ERL_CONF_BOFF_RW: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DEFAULT_ERL_CONF_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_DEFAULT_ERL_CONF_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.DefaultErlFieldOfst ); + } + + /* Set the flag. */ + f_pApiInstance->pSharedInfo->ImageInfo.fDefaultErl = TRUE; + + break; + + case cOCT6100_TLV_TYPE_TONE_REM_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TONE_REM_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_TONE_REM_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ToneRemovalFieldOfst ); + } + + /* Set the flag. */ + f_pApiInstance->pSharedInfo->ImageInfo.fToneRemoval = TRUE; + + break; + + + + case cOCT6100_TLV_TYPE_TLA_MAIN_IO_BOFF_RW_MAX_ECHO_POINT: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TLA_MAIN_IO_BOFF_RW_MAX_ECHO_POINT, + cOCT6100_TLV_MAX_LENGTH_TLA_MAIN_IO_BOFF_RW_MAX_ECHO_POINT ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ChanMainIoMaxEchoPointOfst ); + } + + /* Set the flag. */ + f_pApiInstance->pSharedInfo->ImageInfo.fMaxEchoPoint = TRUE; + + break; + + case cOCT6100_TLV_TYPE_NLP_CONV_CAP_CONF_BOFF_RW: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_NLP_CONV_CAP_CONF_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_NLP_CONV_CAP_CONF_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.NlpConvCapFieldOfst ); + } + + /* Set the flag. */ + f_pApiInstance->pSharedInfo->ImageInfo.fNonLinearityBehaviorB = TRUE; + + break; + + case cOCT6100_TLV_TYPE_MATRIX_EVENT_SIZE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MATRIX_EVENT_SIZE, + cOCT6100_TLV_MAX_LENGTH_MATRIX_EVENT_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulDebugEventSize ); + } + + break; + + case cOCT6100_TLV_TYPE_CNR_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CNR_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_CNR_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.fConferencingNoiseReduction = (UINT8)( ulTempValue & 0xFF ); + + if ( f_pApiInstance->pSharedInfo->ImageInfo.fConferencingNoiseReduction == TRUE ) + { + /* Set flag indicating that the dominant speaker feature is present. */ + f_pApiInstance->pSharedInfo->ImageInfo.fDominantSpeakerEnabled = TRUE; + } + } + + break; + + case cOCT6100_TLV_TYPE_MAX_TAIL_LENGTH_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MAX_TAIL_LENGTH_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_MAX_TAIL_LENGTH_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.usMaxTailLength = (UINT16)( ulTempValue & 0xFFFF ); + } + + break; + + case cOCT6100_TLV_TYPE_MAX_NUMBER_OF_CHANNELS: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MAX_NUMBER_OF_CHANNELS, + cOCT6100_TLV_MAX_LENGTH_MAX_NUMBER_OF_CHANNELS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.usMaxNumberOfChannels = (UINT16)( ulTempValue & 0xFFFF ); + } + + break; + + case cOCT6100_TLV_TYPE_PLAYOUT_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_PLAYOUT_ENABLE, + cOCT6100_TLV_MAX_LENGTH_PLAYOUT_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + /* Set flag indicating that the feature is present. */ + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + f_pApiInstance->pSharedInfo->ImageInfo.fBufferPlayout = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_DOMINANT_SPEAKER_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DOMINANT_SPEAKER_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_DOMINANT_SPEAKER_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.DominantSpeakerFieldOfst ); + } + + break; + + case cOCT6100_TLV_TYPE_TAIL_DISP_CONF_BOFF_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TAIL_DISP_CONF_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_TAIL_DISP_CONF_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PerChanTailDisplacementFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fPerChannelTailDisplacement = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_ANR_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ANR_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_ANR_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAdaptiveNoiseReduction = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_MUSIC_PROTECTION_RW_ENABLE: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MUSIC_PROTECTION_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_MUSIC_PROTECTION_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.fMusicProtection = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_AEC_DEFAULT_ERL_BOFF: + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AEC_DEFAULT_ERL_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_AEC_DEFAULT_ERL_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AecDefaultErlFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAecDefaultErl = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Z_ALC_TARGET_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Z_ALC_TARGET_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_Z_ALC_TARGET_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinAutoLevelControlTargetOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinAutoLevelControl = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Y_ALC_TARGET_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Y_ALC_TARGET_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_Y_ALC_TARGET_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SoutAutoLevelControlTargetOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSoutAutoLevelControl = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Z_HLC_TARGET_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Z_HLC_TARGET_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_Z_HLC_TARGET_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinHighLevelCompensationThresholdOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinHighLevelCompensation = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Y_HLC_TARGET_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Y_HLC_TARGET_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_Y_HLC_TARGET_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SoutHighLevelCompensationThresholdOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSoutHighLevelCompensation = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_ALC_HLC_STATUS_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ALC_HLC_STATUS_BOFF_RW_ENABLE, + cOCT6100_TLV_MAX_LENGTH_ALC_HLC_STATUS_BOFF_RW_ENABLE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AlcHlcStatusOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAlcHlcStatus = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Z_PLAYOUT_HARD_SKIP_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Z_PLAYOUT_HARD_SKIP_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_Z_PLAYOUT_HARD_SKIP_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutRinHardSkipOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinBufferPlayoutHardSkip = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_Y_PLAYOUT_HARD_SKIP_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_Y_PLAYOUT_HARD_SKIP_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_Y_PLAYOUT_HARD_SKIP_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PlayoutSoutHardSkipOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSoutBufferPlayoutHardSkip = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_AFT_FIELD_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AFT_FIELD_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_AFT_FIELD_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AftControlOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAftControl = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_VOICE_DETECTED_STAT_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_VOICE_DETECTED_STAT_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_VOICE_DETECTED_STAT_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SinVoiceDetectedStatOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSinVoiceDetectedStat = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_GAIN_APPLIED_RIN_STAT_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_GAIN_APPLIED_RIN_STAT_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_GAIN_APPLIED_RIN_STAT_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinAppliedGainStatOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinAppliedGainStat = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_GAIN_APPLIED_SOUT_STAT_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_GAIN_APPLIED_SOUT_STAT_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_GAIN_APPLIED_SOUT_STAT_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SoutAppliedGainStatOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSoutAppliedGainStat = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_MAX_ADAPT_ALE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MAX_ADAPT_ALE_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_MAX_ADAPT_ALE_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AdaptiveAleOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fListenerEnhancement = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_RIN_ANR_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_RIN_ANR_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_RIN_ANR_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinAnrOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRoutNoiseReduction = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_RIN_MUTE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_RIN_MUTE_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_RIN_MUTE_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinMuteOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinMute = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_SIN_MUTE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_SIN_MUTE_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_SIN_MUTE_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SinMuteOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSinMute = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_NUMBER_PLAYOUT_EVENTS: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_NUMBER_PLAYOUT_EVENTS, + cOCT6100_TLV_MAX_LENGTH_NUMBER_PLAYOUT_EVENTS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.byMaxNumberPlayoutEvents = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_ANR_SNR_IMPROVEMENT_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ANR_SNR_IMPROVEMENT_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_ANR_SNR_IMPROVEMENT_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AnrSnrEnhancementOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAnrSnrEnhancement = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_ANR_AGRESSIVITY_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ANR_AGRESSIVITY_BOFF_RW, + cOCT6100_TLV_MAX_LENGTH_ANR_AGRESSIVITY_BOFF_RW ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AnrVoiceNoiseSegregationOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAnrVoiceNoiseSegregation = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_CHAN_TAIL_LENGTH_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CHAN_TAIL_LENGTH_BOFF, + cOCT6100_TLV_MAX_LENGTH_CHAN_TAIL_LENGTH_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PerChanTailLengthFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fPerChannelTailLength = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_CHAN_VQE_TONE_DISABLING_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_CHAN_VQE_TONE_DIS_BOFF, + cOCT6100_TLV_MAX_LENGTH_CHAN_VQE_TONE_DIS_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.ToneDisablerVqeActivationDelayOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fToneDisablerVqeActivationDelay = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_AF_TAIL_DISP_VALUE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AF_TAIL_DISP_VALUE_BOFF, + cOCT6100_TLV_MAX_LENGTH_AF_TAIL_DISP_VALUE_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AfTailDisplacementFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAfTailDisplacement = TRUE; + } + + break; + + + case cOCT6100_TLV_TYPE_POUCH_COUNTER_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_POUCH_COUNTER_BOFF, + cOCT6100_TLV_MAX_LENGTH_POUCH_COUNTER_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.PouchCounterFieldOfst ); + + f_pApiInstance->pSharedInfo->DebugInfo.fPouchCounter = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_AEC_TAIL_LENGTH_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AEC_TAIL_BOFF, + cOCT6100_TLV_MAX_LENGTH_AEC_TAIL_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.AecTailLengthFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fAecTailLength = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_MATRIX_DWORD_BASE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MATRIX_DWORD_BASE, + cOCT6100_TLV_MAX_LENGTH_MATRIX_DWORD_BASE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulMatrixBaseAddress ); + + /* Mask the upper bits set by the firmware. */ + f_pApiInstance->pSharedInfo->DebugInfo.ulMatrixBaseAddress &= 0x0FFFFFFF; + + /* Modify the base address to incorporate the external memory offset. */ + f_pApiInstance->pSharedInfo->DebugInfo.ulMatrixBaseAddress += cOCT6100_EXTERNAL_MEM_BASE_ADDRESS; + } + + break; + + case cOCT6100_TLV_TYPE_DEBUG_CHAN_STATS_BYTE_SIZE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DEBUG_CHAN_STATS_BYTE_SIZE, + cOCT6100_TLV_MAX_LENGTH_DEBUG_CHAN_STATS_BYTE_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulDebugChanStatsByteSize ); + } + + break; + + case cOCT6100_TLV_TYPE_DEBUG_CHAN_LITE_STATS_BYTE_SIZE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DEBUG_CHAN_LITE_STATS_BYTE_SIZE, + cOCT6100_TLV_MAX_LENGTH_DEBUG_CHAN_LITE_STATS_BYTE_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulDebugChanLiteStatsByteSize ); + } + + break; + + case cOCT6100_TLV_TYPE_HOT_CHANNEL_SELECT_DWORD_BASE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_HOT_CHANNEL_SELECT_DWORD_BASE, + cOCT6100_TLV_MAX_LENGTH_HOT_CHANNEL_SELECT_DWORD_BASE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulHotChannelSelectBaseAddress ); + } + + break; + + case cOCT6100_TLV_TYPE_MATRIX_TIMESTAMP_DWORD_BASE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_TIMESTAMP_DWORD_BASE, + cOCT6100_TLV_MAX_LENGTH_TIMESTAMP_DWORD_BASE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulMatrixTimestampBaseAddress ); + } + + break; + + case cOCT6100_TLV_TYPE_MATRIX_WP_DWORD_BASE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MATRIX_WP_DWORD_BASE, + cOCT6100_TLV_MAX_LENGTH_MATRIX_WP_DWORD_BASE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulMatrixWpBaseAddress ); + } + + break; + + case cOCT6100_TLV_TYPE_AF_WRITE_PTR_BYTE_OFFSET: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AF_WRITE_PTR_BYTE_OFFSET, + cOCT6100_TLV_MAX_LENGTH_AF_WRITE_PTR_BYTE_OFFSET ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulAfWritePtrByteOffset ); + } + + break; + + case cOCT6100_TLV_TYPE_RECORDED_PCM_EVENT_BYTE_SIZE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_RECORDED_PCM_EVENT_BYTE_SIZE, + cOCT6100_TLV_MAX_LENGTH_RECORDED_PCM_EVENT_BYTE_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulRecordedPcmEventByteSize ); + } + + break; + + case cOCT6100_TLV_TYPE_IS_ISR_CALLED_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_IS_ISR_CALLED_BOFF, + cOCT6100_TLV_MAX_LENGTH_IS_ISR_CALLED_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.IsIsrCalledFieldOfst ); + + f_pApiInstance->pSharedInfo->DebugInfo.fIsIsrCalledField = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_MUSIC_PROTECTION_ENABLE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MUSIC_PROTECTION_ENABLE_BOFF, + cOCT6100_TLV_MAX_LENGTH_MUSIC_PROTECTION_ENABLE_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.MusicProtectionFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fMusicProtectionConfiguration = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_IDLE_CODE_DETECTION_ENABLE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_IDLE_CODE_DETECTION, + cOCT6100_TLV_MAX_LENGTH_IDLE_CODE_DETECTION ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.fIdleCodeDetection = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_IDLE_CODE_DETECTION_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_IDLE_CODE_DETECTION_BOFF, + cOCT6100_TLV_MAX_LENGTH_IDLE_CODE_DETECTION_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.IdleCodeDetectionFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fIdleCodeDetectionConfiguration = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_IMAGE_TYPE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_IMAGE_TYPE, + cOCT6100_TLV_MAX_LENGTH_IMAGE_TYPE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + /* Check if read image type value is what's expected. */ + if ( ( ulTempValue != cOCT6100_IMAGE_TYPE_WIRELINE ) + && ( ulTempValue != cOCT6100_IMAGE_TYPE_COMBINED ) ) + return cOCT6100_ERR_FATAL_E9; + + f_pApiInstance->pSharedInfo->ImageInfo.byImageType = (UINT8)( ulTempValue & 0xFF ); + } + + break; + + case cOCT6100_TLV_TYPE_MAX_WIRELINE_CHANNELS: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_MAX_WIRELINE_CHANNELS, + cOCT6100_TLV_MAX_LENGTH_MAX_WIRELINE_CHANNELS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + } + + break; + + case cOCT6100_TLV_TYPE_AF_EVENT_CB_SIZE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_AF_EVENT_CB_BYTE_SIZE, + cOCT6100_TLV_MAX_LENGTH_AF_EVENT_CB_BYTE_SIZE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->DebugInfo.ulAfEventCbByteSize ); + } + + break; + + case cOCT6100_TLV_TYPE_BUFFER_PLAYOUT_SKIP_IN_EVENTS: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_BUFFER_PLAYOUT_SKIP_IN_EVENTS, + cOCT6100_TLV_MAX_LENGTH_BUFFER_PLAYOUT_SKIP_IN_EVENTS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + f_pApiInstance->pSharedInfo->ImageInfo.fBufferPlayoutSkipInEvents = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_ZZ_ENERGY_CHAN_STATS_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_ZZ_ENERGY_CHAN_STATS_BOFF, + cOCT6100_TLV_MAX_LENGTH_ZZ_ENERGY_CHAN_STATS_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.RinEnergyStatFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fRinEnergyStat = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_YY_ENERGY_CHAN_STATS_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_YY_ENERGY_CHAN_STATS_BOFF, + cOCT6100_TLV_MAX_LENGTH_YY_ENERGY_CHAN_STATS_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.SoutEnergyStatFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fSoutEnergyStat = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_DOUBLE_TALK_BEH_MODE: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DOUBLE_TALK_BEH_MODE, + cOCT6100_TLV_MAX_LENGTH_DOUBLE_TALK_BEH_MODE ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + if ( ulTempValue != 0 ) + f_pApiInstance->pSharedInfo->ImageInfo.fDoubleTalkBehavior = TRUE; + else + f_pApiInstance->pSharedInfo->ImageInfo.fDoubleTalkBehavior = FALSE; + + } + + break; + + case cOCT6100_TLV_TYPE_DOUBLE_TALK_BEH_MODE_BOFF: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DOUBLE_TALK_BEH_MODE_BOFF, + cOCT6100_TLV_MAX_LENGTH_DOUBLE_TALK_BEH_MODE_BOFF ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiTlvReadBitOffsetStruct( f_pApiInstance, + f_ulTlvValueAddress, + &f_pApiInstance->pSharedInfo->MemoryMap.DoubleTalkBehaviorFieldOfst ); + + f_pApiInstance->pSharedInfo->ImageInfo.fDoubleTalkBehaviorFieldOfst = TRUE; + } + + break; + + case cOCT6100_TLV_TYPE_SOUT_NOISE_BLEACHING: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_SOUT_NOISE_BLEACHING, + cOCT6100_TLV_MAX_LENGTH_SOUT_NOISE_BLEACHING ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + if ( ulTempValue != 0 ) + f_pApiInstance->pSharedInfo->ImageInfo.fSoutNoiseBleaching = TRUE; + else + f_pApiInstance->pSharedInfo->ImageInfo.fSoutNoiseBleaching = FALSE; + + } + + break; + + case cOCT6100_TLV_TYPE_NLP_STATISTICS: + + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_NLP_STATISTICS, + cOCT6100_TLV_MAX_LENGTH_NLP_STATISTICS ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReadDword( f_pApiInstance, + f_ulTlvValueAddress, + &ulTempValue ); + + if ( ulTempValue != 0 ) + f_pApiInstance->pSharedInfo->ImageInfo.fSinLevel = TRUE; + else + f_pApiInstance->pSharedInfo->ImageInfo.fSinLevel = FALSE; + + } + + break; + + default: + /* Unknown TLV type field... check default length and nothing else. */ + ulResult = Oct6100ApiTlvCheckLengthField( f_ulTlvFieldLength, + cOCT6100_TLV_MIN_LENGTH_DEFAULT, + cOCT6100_TLV_MAX_LENGTH_DEFAULT ); + break; + } + + return ulResult; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiTlvCheckLengthField + +Description: This function validates the TLV length field. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_ulTlvFieldLength Length field read from the TLV. +f_ulMinLengthValue Minimum value supported for the TLV. +f_ulMaxLengthValue Maximum value supported for the TLV. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiTlvCheckLengthField( + IN UINT32 f_ulTlvFieldLength, + IN UINT32 f_ulMinLengthValue, + IN UINT32 f_ulMaxLengthValue ) +{ + /* Check if the value is too small. */ + if ( f_ulTlvFieldLength < f_ulMinLengthValue ) + return ( cOCT6100_ERR_FATAL_59 ); + + /* Check if the value is too big. */ + if ( f_ulTlvFieldLength > f_ulMaxLengthValue ) + return ( cOCT6100_ERR_FATAL_5A ); + + /* Check if the value is dword aligned. */ + if ( ( f_ulTlvFieldLength % 4 ) != 0 ) + return ( cOCT6100_ERR_OPEN_INVALID_TLV_LENGTH ); + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiTlvReadBitOffsetStruct + +Description: This function extracts a bit offset structure from the TLV. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_ulAddress Address where the read the TLV information. +f_pBitOffsetStruct Pointer to a bit offset stucture. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiTlvReadBitOffsetStruct( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN UINT32 f_ulAddress, + OUT tPOCT6100_TLV_OFFSET f_pBitOffsetStruct ) +{ + tOCT6100_READ_PARAMS ReadParams; + UINT16 usReadData; + + UINT32 ulResult; + UINT32 ulOffsetValue; + UINT32 ulSizeValue; + + ReadParams.pProcessContext = f_pApiInstance->pProcessContext; + + ReadParams.ulUserChipId = f_pApiInstance->pSharedInfo->ChipConfig.ulUserChipId; + ReadParams.pusReadData = &usReadData; + + /*======================================================================*/ + /* Read the first 16 bits of the TLV field. */ + + ReadParams.ulReadAddress = f_ulAddress; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulOffsetValue = usReadData << 16; + + /* Read the last word of the TLV type. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulOffsetValue |= usReadData; + + /*======================================================================*/ + + + /*======================================================================*/ + /* Read the first 16 bits of the TLV field. */ + + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulSizeValue = usReadData << 16; + + /* Read the last word of the TLV type. */ + ReadParams.ulReadAddress += 2; + mOCT6100_DRIVER_READ_API( ReadParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Save data. */ + ulSizeValue |= usReadData; + + /*======================================================================*/ + + /* Set the structure fields. */ + f_pBitOffsetStruct->usDwordOffset = (UINT16)(ulOffsetValue / 32); + f_pBitOffsetStruct->byBitOffset = (UINT8) (32 - (ulOffsetValue % 32) - ulSizeValue); + f_pBitOffsetStruct->byFieldSize = (UINT8) (ulSizeValue); + + return cOCT6100_ERR_OK; +} |