/* --COPYRIGHT--,BSD * Copyright (c) 2014, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --/COPYRIGHT--*/ //***************************************************************************** // // tlv.c - Driver for the tlv Module. // //***************************************************************************** //***************************************************************************** // //! \addtogroup tlv_api tlv //! @{ // //***************************************************************************** #include "inc/hw_regaccess.h" #include "inc/hw_memmap.h" #ifdef __MSP430_HAS_TLV__ #include "tlv.h" #include void TLV_getInfo(uint8_t tag, uint8_t instance, uint8_t *length, uint16_t **data_address) { // TLV Structure Start Address char *TLV_address = (char *)TLV_START; while((TLV_address < (char *)TLV_END) && ((*TLV_address != tag) || instance) // check for tag and instance && (*TLV_address != TLV_TAGEND)) // do range check first { if(*TLV_address == tag) { // repeat till requested instance is reached instance--; } // add (Current TAG address + LENGTH) + 2 TLV_address += *(TLV_address + 1) + 2; } // Check if Tag match happened.. if(*TLV_address == tag) { // Return length = Address + 1 *length = *(TLV_address + 1); // Return address of first data/value info = Address + 2 *data_address = (uint16_t *)(TLV_address + 2); } // If there was no tag match and the end of TLV structure was reached.. else { // Return 0 for TAG not found *length = 0; // Return 0 for TAG not found *data_address = 0; } } uint16_t TLV_getDeviceType() { uint16_t *pDeviceType = (uint16_t *)TLV_DEVICE_ID_0; // Return Value from TLV Table return(pDeviceType[0]); } uint16_t TLV_getMemory(uint8_t instance) { uint8_t *pPDTAG; uint8_t bPDTAG_bytes; uint16_t count; // set tag for word access comparison instance *= 2; // TLV access Function Call // Get Peripheral data pointer TLV_getInfo(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG ); for(count = 0; count <= instance; count += 2) { if(pPDTAG[count] == 0) { // Return 0 if end reached return(0); } if(count == instance) { return (pPDTAG[count] | pPDTAG[count + 1] << 8); } } // Return 0: not found return(0); } uint16_t TLV_getPeripheral(uint8_t tag, uint8_t instance) { uint8_t *pPDTAG; uint8_t bPDTAG_bytes; uint16_t count = 0; uint16_t pcount = 0; // Get Peripheral data pointer TLV_getInfo(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG ); // read memory configuration from TLV to get offset for Peripherals while(TLV_getMemory(count)) { count++; } // get number of Peripheral entries pcount = pPDTAG[count * 2 + 1]; // inc count to first Periperal count++; // adjust point to first address of Peripheral pPDTAG += count * 2; // set counter back to 0 count = 0; // align pcount for work comparision pcount *= 2; // TLV access Function Call for(count = 0; count <= pcount; count += 2) { if(pPDTAG[count + 1] == tag) { // test if required Peripheral is found if(instance > 0) { // test if required instance is found instance--; } else { // Return found data return (pPDTAG[count] | pPDTAG[count + 1] << 8); } } } // Return 0: not found return(0); } uint8_t TLV_getInterrupt(uint8_t tag) { uint8_t *pPDTAG; uint8_t bPDTAG_bytes; uint16_t count = 0; uint16_t pcount = 0; // Get Peripheral data pointer TLV_getInfo(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG ); // read memory configuration from TLV to get offset for Peripherals while(TLV_getMemory(count)) { count++; } pcount = pPDTAG[count * 2 + 1]; // inc count to first Periperal count++; // adjust point to first address of Peripheral pPDTAG += (pcount + count) * 2; // set counter back to 0 count = 0; // TLV access Function Call for(count = 0; count <= tag; count += 2) { if(pPDTAG[count] == 0) { // Return 0: not found/end of table return(0); } if(count == tag) { // Return found data return (pPDTAG[count]); } } // Return 0: not found return(0); } #endif //***************************************************************************** // //! Close the doxygen group for tlv_api //! @} // //*****************************************************************************