| /****************************************************************************** | 
 | * | 
 | *     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; | 
 | } |