14c87aefeSPatrick Mooney /* $FreeBSD$ */
24c87aefeSPatrick Mooney /*
34c87aefeSPatrick Mooney  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
44c87aefeSPatrick Mooney  *
54c87aefeSPatrick Mooney  * Redistribution and use in source and binary forms, with or without
64c87aefeSPatrick Mooney  * modification, are permitted provided that the following conditions
74c87aefeSPatrick Mooney  * are met:
84c87aefeSPatrick Mooney  * 1. Redistributions of source code must retain the above copyright
94c87aefeSPatrick Mooney  *    notice, this list of conditions and the following disclaimer.
104c87aefeSPatrick Mooney  * 2. Redistributions in binary form must reproduce the above copyright
114c87aefeSPatrick Mooney  *    notice, this list of conditions and the following disclaimer in the
124c87aefeSPatrick Mooney  *    documentation and/or other materials provided with the distribution.
134c87aefeSPatrick Mooney  *
144c87aefeSPatrick Mooney  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
154c87aefeSPatrick Mooney  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164c87aefeSPatrick Mooney  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174c87aefeSPatrick Mooney  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
184c87aefeSPatrick Mooney  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
194c87aefeSPatrick Mooney  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
204c87aefeSPatrick Mooney  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
214c87aefeSPatrick Mooney  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
224c87aefeSPatrick Mooney  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
234c87aefeSPatrick Mooney  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
244c87aefeSPatrick Mooney  * SUCH DAMAGE.
254c87aefeSPatrick Mooney  */
264c87aefeSPatrick Mooney 
274c87aefeSPatrick Mooney #ifndef _USB_ENDIAN_H_
284c87aefeSPatrick Mooney #define	_USB_ENDIAN_H_
294c87aefeSPatrick Mooney 
304c87aefeSPatrick Mooney #ifndef USB_GLOBAL_INCLUDE_FILE
314c87aefeSPatrick Mooney #include <sys/stdint.h>
324c87aefeSPatrick Mooney #include <sys/endian.h>
334c87aefeSPatrick Mooney #endif
344c87aefeSPatrick Mooney 
354c87aefeSPatrick Mooney /*
364c87aefeSPatrick Mooney  * Declare the basic USB record types. USB records have an alignment
374c87aefeSPatrick Mooney  * of 1 byte and are always packed.
384c87aefeSPatrick Mooney  */
394c87aefeSPatrick Mooney typedef uint8_t uByte;
404c87aefeSPatrick Mooney typedef uint8_t uWord[2];
414c87aefeSPatrick Mooney typedef uint8_t uDWord[4];
424c87aefeSPatrick Mooney typedef uint8_t uQWord[8];
434c87aefeSPatrick Mooney 
444c87aefeSPatrick Mooney /*
454c87aefeSPatrick Mooney  * Define a set of macros that can get and set data independent of
464c87aefeSPatrick Mooney  * CPU endianness and CPU alignment requirements:
474c87aefeSPatrick Mooney  */
484c87aefeSPatrick Mooney #define	UGETB(w)			\
494c87aefeSPatrick Mooney   ((w)[0])
504c87aefeSPatrick Mooney 
514c87aefeSPatrick Mooney #define	UGETW(w)			\
524c87aefeSPatrick Mooney   ((w)[0] |				\
534c87aefeSPatrick Mooney   (((uint16_t)((w)[1])) << 8))
544c87aefeSPatrick Mooney 
554c87aefeSPatrick Mooney #define	UGETDW(w)			\
564c87aefeSPatrick Mooney   ((w)[0] |				\
574c87aefeSPatrick Mooney   (((uint16_t)((w)[1])) << 8) |		\
584c87aefeSPatrick Mooney   (((uint32_t)((w)[2])) << 16) |	\
594c87aefeSPatrick Mooney   (((uint32_t)((w)[3])) << 24))
604c87aefeSPatrick Mooney 
614c87aefeSPatrick Mooney #define	UGETQW(w)			\
624c87aefeSPatrick Mooney   ((w)[0] |				\
634c87aefeSPatrick Mooney   (((uint16_t)((w)[1])) << 8) |		\
644c87aefeSPatrick Mooney   (((uint32_t)((w)[2])) << 16) |	\
654c87aefeSPatrick Mooney   (((uint32_t)((w)[3])) << 24) |	\
664c87aefeSPatrick Mooney   (((uint64_t)((w)[4])) << 32) |	\
674c87aefeSPatrick Mooney   (((uint64_t)((w)[5])) << 40) |	\
684c87aefeSPatrick Mooney   (((uint64_t)((w)[6])) << 48) |	\
694c87aefeSPatrick Mooney   (((uint64_t)((w)[7])) << 56))
704c87aefeSPatrick Mooney 
714c87aefeSPatrick Mooney #define	USETB(w,v) do {			\
724c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(v);		\
734c87aefeSPatrick Mooney } while (0)
744c87aefeSPatrick Mooney 
754c87aefeSPatrick Mooney #define	USETW(w,v) do {			\
764c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(v);		\
774c87aefeSPatrick Mooney   (w)[1] = (uint8_t)((v) >> 8);		\
784c87aefeSPatrick Mooney } while (0)
794c87aefeSPatrick Mooney 
804c87aefeSPatrick Mooney #define	USETDW(w,v) do {		\
814c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(v);		\
824c87aefeSPatrick Mooney   (w)[1] = (uint8_t)((v) >> 8);		\
834c87aefeSPatrick Mooney   (w)[2] = (uint8_t)((v) >> 16);	\
844c87aefeSPatrick Mooney   (w)[3] = (uint8_t)((v) >> 24);	\
854c87aefeSPatrick Mooney } while (0)
864c87aefeSPatrick Mooney 
874c87aefeSPatrick Mooney #define	USETQW(w,v) do {		\
884c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(v);		\
894c87aefeSPatrick Mooney   (w)[1] = (uint8_t)((v) >> 8);		\
904c87aefeSPatrick Mooney   (w)[2] = (uint8_t)((v) >> 16);	\
914c87aefeSPatrick Mooney   (w)[3] = (uint8_t)((v) >> 24);	\
924c87aefeSPatrick Mooney   (w)[4] = (uint8_t)((v) >> 32);	\
934c87aefeSPatrick Mooney   (w)[5] = (uint8_t)((v) >> 40);	\
944c87aefeSPatrick Mooney   (w)[6] = (uint8_t)((v) >> 48);	\
954c87aefeSPatrick Mooney   (w)[7] = (uint8_t)((v) >> 56);	\
964c87aefeSPatrick Mooney } while (0)
974c87aefeSPatrick Mooney 
984c87aefeSPatrick Mooney #define	USETW2(w,b1,b0) do {		\
994c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(b0);		\
1004c87aefeSPatrick Mooney   (w)[1] = (uint8_t)(b1);		\
1014c87aefeSPatrick Mooney } while (0)
1024c87aefeSPatrick Mooney 
1034c87aefeSPatrick Mooney #define	USETW4(w,b3,b2,b1,b0) do {	\
1044c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(b0);		\
1054c87aefeSPatrick Mooney   (w)[1] = (uint8_t)(b1);		\
1064c87aefeSPatrick Mooney   (w)[2] = (uint8_t)(b2);		\
1074c87aefeSPatrick Mooney   (w)[3] = (uint8_t)(b3);		\
1084c87aefeSPatrick Mooney } while (0)
1094c87aefeSPatrick Mooney 
1104c87aefeSPatrick Mooney #define	USETW8(w,b7,b6,b5,b4,b3,b2,b1,b0) do {	\
1114c87aefeSPatrick Mooney   (w)[0] = (uint8_t)(b0);		\
1124c87aefeSPatrick Mooney   (w)[1] = (uint8_t)(b1);		\
1134c87aefeSPatrick Mooney   (w)[2] = (uint8_t)(b2);		\
1144c87aefeSPatrick Mooney   (w)[3] = (uint8_t)(b3);		\
1154c87aefeSPatrick Mooney   (w)[4] = (uint8_t)(b4);		\
1164c87aefeSPatrick Mooney   (w)[5] = (uint8_t)(b5);		\
1174c87aefeSPatrick Mooney   (w)[6] = (uint8_t)(b6);		\
1184c87aefeSPatrick Mooney   (w)[7] = (uint8_t)(b7);		\
1194c87aefeSPatrick Mooney } while (0)
1204c87aefeSPatrick Mooney 
1214c87aefeSPatrick Mooney #endif					/* _USB_ENDIAN_H_ */
122