X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=metawatch%2FF5xx_F6xx_Core_Lib%2FHAL_TLV.c;fp=metawatch%2FF5xx_F6xx_Core_Lib%2FHAL_TLV.c;h=40016726464c2c3231b5a315713e700c5337f59e;hp=0000000000000000000000000000000000000000;hb=1b5790095c23913d02531727e47b79af3568e0b1;hpb=3e320aaa4175a0ed469581f1dea2eac35b390878 diff --git a/metawatch/F5xx_F6xx_Core_Lib/HAL_TLV.c b/metawatch/F5xx_F6xx_Core_Lib/HAL_TLV.c new file mode 100644 index 0000000..4001672 --- /dev/null +++ b/metawatch/F5xx_F6xx_Core_Lib/HAL_TLV.c @@ -0,0 +1,158 @@ +/******************************************************************************* + * + * HAL_TLV.c + * Provides Functions to Read the TLV Data Section of the MSP430 Devices + * + * + * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ + * + * + * 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. + * + * Updated: Version 2.0 01/17/2011 + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_TLV.h" + +void Get_TLV_Info(unsigned char tag, unsigned char instance, unsigned char *length, unsigned int **data_address) +{ + char *TLV_address = (char *)TLV_START; // TLV Structure Start Address + + 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) instance--; // repeat till requested instance is reached + TLV_address += *(TLV_address + 1) + 2; // add (Current TAG address + LENGTH) + 2 + } + + if (*TLV_address == tag) // Check if Tag match happened.. + { + *length = *(TLV_address + 1); // Return length = Address + 1 + *data_address = (unsigned int *)(TLV_address + 2); // Return address of first data/value info = Address + 2 + } + else // If there was no tag match and the end of TLV structure was reached.. + { + *length = 0; // Return 0 for TAG not found + *data_address = 0; // Return 0 for TAG not found + } +} + +unsigned int Get_Device_Type(void) +{ + unsigned int *pDeviceType = (unsigned int *)DEVICE_ID_0; + return pDeviceType[0]; // Return Value from TLV Table +} + +unsigned int Get_TLV_Memory(unsigned char instance) +{ + unsigned char *pPDTAG; + unsigned char bPDTAG_bytes; + unsigned int count; + + instance *= 2; // set tag for word access comparison + + // TLV access Function Call + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (unsigned int **)&pPDTAG); // Get Peripheral data pointer + + for (count = 0;count <= instance; count += 2) + { + if (pPDTAG[count] == 0) return 0; // Return 0 if end reached + if (count == instance) return (pPDTAG[count] | pPDTAG[count+1]<<8); + } + + return 0; // Return 0: not found +} + +unsigned int Get_TLV_Peripheral(unsigned char tag, unsigned char instance) +{ + unsigned char *pPDTAG; + unsigned char bPDTAG_bytes; + unsigned int count = 0; + unsigned int pcount = 0; + + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (unsigned int **)&pPDTAG); // Get Peripheral data pointer + + // read memory configuration from TLV to get offset for Peripherals + while (Get_TLV_Memory(count)) { + count++; + } + + pcount = pPDTAG[count * 2 + 1]; // get number of Peripheral entries + count++; // inc count to first Periperal + pPDTAG += count*2; // adjust point to first address of Peripheral + count = 0; // set counter back to 0 + pcount *= 2; // align pcount for work comparision + + // 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 (pPDTAG[count] | pPDTAG[count + 1] << 8); // Return found data + } + } + } + + return 0; // Return 0: not found +} + +unsigned char Get_TLV_Interrupt(unsigned char tag) +{ + unsigned char *pPDTAG; + unsigned char bPDTAG_bytes; + unsigned int count = 0; + unsigned int pcount = 0; + + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (unsigned int **)&pPDTAG); // Get Peripheral data pointer + + // read memory configuration from TLV to get offset for Peripherals + while (Get_TLV_Memory(count)) + { + count++; + } + + pcount = pPDTAG[count * 2 + 1]; + count++; // inc count to first Periperal + pPDTAG += (pcount + count) * 2; // adjust point to first address of Peripheral + count = 0; // set counter back to 0 + + // TLV access Function Call + for (count = 0; count <= tag; count += 2) + { + if (pPDTAG[count] == 0) return 0; // Return 0: not found/end of table + if (count == tag) return (pPDTAG[count]); // Return found data + } + + return 0; // Return 0: not found +}