| /****************************************************************************** | |
| * | |
| * Author: Xilinx, Inc. | |
| * | |
| * | |
| * This program 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. | |
| * | |
| * | |
| * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A | |
| * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS | |
| * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, | |
| * XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE | |
| * FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING | |
| * ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. | |
| * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO | |
| * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY | |
| * WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM | |
| * CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| * FITNESS FOR A PARTICULAR PURPOSE. | |
| * | |
| * | |
| * Xilinx hardware products are not intended for use in life support | |
| * appliances, devices, or systems. Use in such applications is | |
| * expressly prohibited. | |
| * | |
| * | |
| * (c) Copyright 2002-2004 Xilinx Inc. | |
| * All rights reserved. | |
| * | |
| * | |
| * You should have received a copy of the GNU General Public License along | |
| * with this program; if not, write to the Free Software Foundation, Inc., | |
| * 675 Mass Ave, Cambridge, MA 02139, USA. | |
| * | |
| ******************************************************************************/ | |
| /***************************************************************************** | |
| * | |
| * This file contains the implementation of the XVersion component. This | |
| * component represents a version ID. It is encapsulated within a component | |
| * so that it's type and implementation can change without affecting users of | |
| * it. | |
| * | |
| * The version is formatted as X.YYZ where X = 0 - 9, Y = 00 - 99, Z = a - z | |
| * X is the major revision, YY is the minor revision, and Z is the | |
| * compatability revision. | |
| * | |
| * Packed versions are also utilized for the configuration ROM such that | |
| * memory is minimized. A packed version consumes only 16 bits and is | |
| * formatted as follows. | |
| * | |
| * <pre> | |
| * Revision Range Bit Positions | |
| * | |
| * Major Revision 0 - 9 Bits 15 - 12 | |
| * Minor Revision 0 - 99 Bits 11 - 5 | |
| * Compatability Revision a - z Bits 4 - 0 | |
| </pre> | |
| * | |
| ******************************************************************************/ | |
| /***************************** Include Files *********************************/ | |
| #include "xbasic_types.h" | |
| #include "xversion.h" | |
| /************************** Constant Definitions *****************************/ | |
| /* the following constants define the masks and shift values to allow the | |
| * revisions to be packed and unpacked, a packed version is packed into a 16 | |
| * bit value in the following format, XXXXYYYYYYYZZZZZ, where XXXX is the | |
| * major revision, YYYYYYY is the minor revision, and ZZZZZ is the compatability | |
| * revision | |
| */ | |
| #define XVE_MAJOR_SHIFT_VALUE 12 | |
| #define XVE_MINOR_ONLY_MASK 0x0FE0 | |
| #define XVE_MINOR_SHIFT_VALUE 5 | |
| #define XVE_COMP_ONLY_MASK 0x001F | |
| /* the following constants define the specific characters of a version string | |
| * for each character of the revision, a version string is in the following | |
| * format, "X.YYZ" where X is the major revision (0 - 9), YY is the minor | |
| * revision (00 - 99), and Z is the compatability revision (a - z) | |
| */ | |
| #define XVE_MAJOR_CHAR 0 /* major revision 0 - 9 */ | |
| #define XVE_MINOR_TENS_CHAR 2 /* minor revision tens 0 - 9 */ | |
| #define XVE_MINOR_ONES_CHAR 3 /* minor revision ones 0 - 9 */ | |
| #define XVE_COMP_CHAR 4 /* compatability revision a - z */ | |
| #define XVE_END_STRING_CHAR 5 | |
| /**************************** Type Definitions *******************************/ | |
| /***************** Macros (Inline Functions) Definitions *********************/ | |
| /************************** Function Prototypes ******************************/ | |
| static u32 IsVersionStringValid(s8 * StringPtr); | |
| /***************************************************************************** | |
| * | |
| * Unpacks a packed version into the specified version. Versions are packed | |
| * into the configuration ROM to reduce the amount storage. A packed version | |
| * is a binary format as oppossed to a non-packed version which is implemented | |
| * as a string. | |
| * | |
| * @param InstancePtr points to the version to unpack the packed version into. | |
| * @param PackedVersion contains the packed version to unpack. | |
| * | |
| * @return | |
| * | |
| * None. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| void | |
| XVersion_UnPack(XVersion * InstancePtr, u16 PackedVersion) | |
| { | |
| /* not implemented yet since CROM related */ | |
| } | |
| /***************************************************************************** | |
| * | |
| * Packs a version into the specified packed version. Versions are packed into | |
| * the configuration ROM to reduce the amount storage. | |
| * | |
| * @param InstancePtr points to the version to pack. | |
| * @param PackedVersionPtr points to the packed version which will receive | |
| * the new packed version. | |
| * | |
| * @return | |
| * | |
| * A status, XST_SUCCESS, indicating the packing was accomplished | |
| * successfully, or an error, XST_INVALID_VERSION, indicating the specified | |
| * input version was not valid such that the pack did not occur | |
| * <br><br> | |
| * The packed version pointed to by PackedVersionPtr is modified with the new | |
| * packed version if the status indicates success. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| XStatus | |
| XVersion_Pack(XVersion * InstancePtr, u16 * PackedVersionPtr) | |
| { | |
| /* not implemented yet since CROM related */ | |
| return XST_SUCCESS; | |
| } | |
| /***************************************************************************** | |
| * | |
| * Determines if two versions are equal. | |
| * | |
| * @param InstancePtr points to the first version to be compared. | |
| * @param VersionPtr points to a second version to be compared. | |
| * | |
| * @return | |
| * | |
| * TRUE if the versions are equal, FALSE otherwise. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| u32 | |
| XVersion_IsEqual(XVersion * InstancePtr, XVersion * VersionPtr) | |
| { | |
| u8 *Version1 = (u8 *) InstancePtr; | |
| u8 *Version2 = (u8 *) VersionPtr; | |
| int Index; | |
| /* assert to verify input arguments */ | |
| XASSERT_NONVOID(InstancePtr != NULL); | |
| XASSERT_NONVOID(VersionPtr != NULL); | |
| /* check each byte of the versions to see if they are the same, | |
| * return at any point a byte differs between them | |
| */ | |
| for (Index = 0; Index < sizeof (XVersion); Index++) { | |
| if (Version1[Index] != Version2[Index]) { | |
| return FALSE; | |
| } | |
| } | |
| /* No byte was found to be different between the versions, so indicate | |
| * the versions are equal | |
| */ | |
| return TRUE; | |
| } | |
| /***************************************************************************** | |
| * | |
| * Converts a version to a null terminated string. | |
| * | |
| * @param InstancePtr points to the version to convert. | |
| * @param StringPtr points to the string which will be the result of the | |
| * conversion. This does not need to point to a null terminated | |
| * string as an input, but must point to storage which is an adequate | |
| * amount to hold the result string. | |
| * | |
| * @return | |
| * | |
| * The null terminated string is inserted at the location pointed to by | |
| * StringPtr if the status indicates success. | |
| * | |
| * @note | |
| * | |
| * It is necessary for the caller to have already allocated the storage to | |
| * contain the string. The amount of memory necessary for the string is | |
| * specified in the version header file. | |
| * | |
| ******************************************************************************/ | |
| void | |
| XVersion_ToString(XVersion * InstancePtr, s8 * StringPtr) | |
| { | |
| /* assert to verify input arguments */ | |
| XASSERT_VOID(InstancePtr != NULL); | |
| XASSERT_VOID(StringPtr != NULL); | |
| /* since version is implemented as a string, just copy the specified | |
| * input into the specified output | |
| */ | |
| XVersion_Copy(InstancePtr, (XVersion *) StringPtr); | |
| } | |
| /***************************************************************************** | |
| * | |
| * Initializes a version from a null terminated string. Since the string may not | |
| * be a format which is compatible with the version, an error could occur. | |
| * | |
| * @param InstancePtr points to the version which is to be initialized. | |
| * @param StringPtr points to a null terminated string which will be | |
| * converted to a version. The format of the string must match the | |
| * version string format which is X.YYX where X = 0 - 9, YY = 00 - 99, | |
| * Z = a - z. | |
| * | |
| * @return | |
| * | |
| * A status, XST_SUCCESS, indicating the conversion was accomplished | |
| * successfully, or XST_INVALID_VERSION indicating the version string format | |
| * was not valid. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| XStatus | |
| XVersion_FromString(XVersion * InstancePtr, s8 * StringPtr) | |
| { | |
| /* assert to verify input arguments */ | |
| XASSERT_NONVOID(InstancePtr != NULL); | |
| XASSERT_NONVOID(StringPtr != NULL); | |
| /* if the version string specified is not valid, return an error */ | |
| if (!IsVersionStringValid(StringPtr)) { | |
| return XST_INVALID_VERSION; | |
| } | |
| /* copy the specified string into the specified version and indicate the | |
| * conversion was successful | |
| */ | |
| XVersion_Copy((XVersion *) StringPtr, InstancePtr); | |
| return XST_SUCCESS; | |
| } | |
| /***************************************************************************** | |
| * | |
| * Copies the contents of a version to another version. | |
| * | |
| * @param InstancePtr points to the version which is the source of data for | |
| * the copy operation. | |
| * @param VersionPtr points to another version which is the destination of | |
| * the copy operation. | |
| * | |
| * @return | |
| * | |
| * None. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| void | |
| XVersion_Copy(XVersion * InstancePtr, XVersion * VersionPtr) | |
| { | |
| u8 *Source = (u8 *) InstancePtr; | |
| u8 *Destination = (u8 *) VersionPtr; | |
| int Index; | |
| /* assert to verify input arguments */ | |
| XASSERT_VOID(InstancePtr != NULL); | |
| XASSERT_VOID(VersionPtr != NULL); | |
| /* copy each byte of the source version to the destination version */ | |
| for (Index = 0; Index < sizeof (XVersion); Index++) { | |
| Destination[Index] = Source[Index]; | |
| } | |
| } | |
| /***************************************************************************** | |
| * | |
| * Determines if the specified version is valid. | |
| * | |
| * @param StringPtr points to the string to be validated. | |
| * | |
| * @return | |
| * | |
| * TRUE if the version string is a valid format, FALSE otherwise. | |
| * | |
| * @note | |
| * | |
| * None. | |
| * | |
| ******************************************************************************/ | |
| static u32 | |
| IsVersionStringValid(s8 * StringPtr) | |
| { | |
| /* if the input string is not a valid format, "X.YYZ" where X = 0 - 9, | |
| * YY = 00 - 99, and Z = a - z, then indicate it's not valid | |
| */ | |
| if ((StringPtr[XVE_MAJOR_CHAR] < '0') || | |
| (StringPtr[XVE_MAJOR_CHAR] > '9') || | |
| (StringPtr[XVE_MINOR_TENS_CHAR] < '0') || | |
| (StringPtr[XVE_MINOR_TENS_CHAR] > '9') || | |
| (StringPtr[XVE_MINOR_ONES_CHAR] < '0') || | |
| (StringPtr[XVE_MINOR_ONES_CHAR] > '9') || | |
| (StringPtr[XVE_COMP_CHAR] < 'a') || | |
| (StringPtr[XVE_COMP_CHAR] > 'z')) { | |
| return FALSE; | |
| } | |
| return TRUE; | |
| } |