/* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __LIBXC_CPUFEATURE_H #define __LIBXC_CPUFEATURE_H /* Intel-defined CPU features, CPUID level 0x00000001 (edx) */ #define X86_FEATURE_FPU 0 /* Onboard FPU */ #define X86_FEATURE_VME 1 /* Virtual Mode Extensions */ #define X86_FEATURE_DE 2 /* Debugging Extensions */ #define X86_FEATURE_PSE 3 /* Page Size Extensions */ #define X86_FEATURE_TSC 4 /* Time Stamp Counter */ #define X86_FEATURE_MSR 5 /* Model-Specific Registers, RDMSR, WRMSR */ #define X86_FEATURE_PAE 6 /* Physical Address Extensions */ #define X86_FEATURE_MCE 7 /* Machine Check Architecture */ #define X86_FEATURE_CX8 8 /* CMPXCHG8 instruction */ #define X86_FEATURE_APIC 9 /* Onboard APIC */ #define X86_FEATURE_SEP 11 /* SYSENTER/SYSEXIT */ #define X86_FEATURE_MTRR 12 /* Memory Type Range Registers */ #define X86_FEATURE_PGE 13 /* Page Global Enable */ #define X86_FEATURE_MCA 14 /* Machine Check Architecture */ #define X86_FEATURE_CMOV 15 /* CMOV instruction */ #define X86_FEATURE_PAT 16 /* Page Attribute Table */ #define X86_FEATURE_PSE36 17 /* 36-bit PSEs */ #define X86_FEATURE_PN 18 /* Processor serial number */ #define X86_FEATURE_CLFLSH 19 /* Supports the CLFLUSH instruction */ #define X86_FEATURE_DS 21 /* Debug Store */ #define X86_FEATURE_ACPI 22 /* ACPI via MSR */ #define X86_FEATURE_MMX 23 /* Multimedia Extensions */ #define X86_FEATURE_FXSR 24 /* FXSAVE and FXRSTOR instructions */ #define X86_FEATURE_XMM 25 /* Streaming SIMD Extensions */ #define X86_FEATURE_XMM2 26 /* Streaming SIMD Extensions-2 */ #define X86_FEATURE_SELFSNOOP 27 /* CPU self snoop */ #define X86_FEATURE_HT 28 /* Hyper-Threading */ #define X86_FEATURE_ACC 29 /* Automatic clock control */ #define X86_FEATURE_IA64 30 /* IA-64 processor */ #define X86_FEATURE_PBE 31 /* Pending Break Enable */ /* AMD-defined CPU features, CPUID level 0x80000001 */ /* Don't duplicate feature flags which are redundant with Intel! */ #define X86_FEATURE_SYSCALL 11 /* SYSCALL/SYSRET */ #define X86_FEATURE_MP 19 /* MP Capable. */ #define X86_FEATURE_NX 20 /* Execute Disable */ #define X86_FEATURE_MMXEXT 22 /* AMD MMX extensions */ #define X86_FEATURE_FFXSR 25 /* FFXSR instruction optimizations */ #define X86_FEATURE_PAGE1GB 26 /* 1Gb large page support */ #define X86_FEATURE_RDTSCP 27 /* RDTSCP */ #define X86_FEATURE_LM 29 /* Long Mode (x86-64) */ #define X86_FEATURE_3DNOWEXT 30 /* AMD 3DNow! extensions */ #define X86_FEATURE_3DNOW 31 /* 3DNow! */ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx) */ #define X86_FEATURE_XMM3 0 /* Streaming SIMD Extensions-3 */ #define X86_FEATURE_PCLMULQDQ 1 /* Carry-less multiplication */ #define X86_FEATURE_DTES64 2 /* 64-bit Debug Store */ #define X86_FEATURE_MWAIT 3 /* Monitor/Mwait support */ #define X86_FEATURE_DSCPL 4 /* CPL Qualified Debug Store */ #define X86_FEATURE_VMXE 5 /* Virtual Machine Extensions */ #define X86_FEATURE_SMXE 6 /* Safer Mode Extensions */ #define X86_FEATURE_EST 7 /* Enhanced SpeedStep */ #define X86_FEATURE_TM2 8 /* Thermal Monitor 2 */ #define X86_FEATURE_SSSE3 9 /* Supplemental Streaming SIMD Exts-3 */ #define X86_FEATURE_CID 10 /* Context ID */ #define X86_FEATURE_FMA 12 /* Fused Multiply Add */ #define X86_FEATURE_CX16 13 /* CMPXCHG16B */ #define X86_FEATURE_XTPR 14 /* Send Task Priority Messages */ #define X86_FEATURE_PDCM 15 /* Perf/Debug Capability MSR */ #define X86_FEATURE_PCID 17 /* Process Context ID */ #define X86_FEATURE_DCA 18 /* Direct Cache Access */ #define X86_FEATURE_SSE4_1 19 /* Streaming SIMD Extensions 4.1 */ #define X86_FEATURE_SSE4_2 20 /* Streaming SIMD Extensions 4.2 */ #define X86_FEATURE_X2APIC 21 /* x2APIC */ #define X86_FEATURE_MOVBE 22 /* movbe instruction */ #define X86_FEATURE_POPCNT 23 /* POPCNT instruction */ #define X86_FEATURE_TSC_DEADLINE 24 /* "tdt" TSC Deadline Timer */ #define X86_FEATURE_AES 25 /* AES acceleration instructions */ #define X86_FEATURE_XSAVE 26 /* XSAVE/XRSTOR/XSETBV/XGETBV */ #define X86_FEATURE_AVX 28 /* Advanced Vector Extensions */ #define X86_FEATURE_F16C 29 /* Half-precision convert instruction */ #define X86_FEATURE_RDRAND 30 /* Digital Random Number Generator */ #define X86_FEATURE_HYPERVISOR 31 /* Running under some hypervisor */ /* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001 */ #define X86_FEATURE_XSTORE 2 /* on-CPU RNG present (xstore insn) */ #define X86_FEATURE_XSTORE_EN 3 /* on-CPU RNG enabled */ #define X86_FEATURE_XCRYPT 6 /* on-CPU crypto (xcrypt insn) */ #define X86_FEATURE_XCRYPT_EN 7 /* on-CPU crypto enabled */ #define X86_FEATURE_ACE2 8 /* Advanced Cryptography Engine v2 */ #define X86_FEATURE_ACE2_EN 9 /* ACE v2 enabled */ #define X86_FEATURE_PHE 10 /* PadLock Hash Engine */ #define X86_FEATURE_PHE_EN 11 /* PHE enabled */ #define X86_FEATURE_PMM 12 /* PadLock Montgomery Multiplier */ #define X86_FEATURE_PMM_EN 13 /* PMM enabled */ /* More extended AMD flags: CPUID level 0x80000001, ecx */ #define X86_FEATURE_LAHF_LM 0 /* LAHF/SAHF in long mode */ #define X86_FEATURE_CMP_LEGACY 1 /* If yes HyperThreading not valid */ #define X86_FEATURE_SVM 2 /* Secure virtual machine */ #define X86_FEATURE_EXTAPIC 3 /* Extended APIC space */ #define X86_FEATURE_CR8_LEGACY 4 /* CR8 in 32-bit mode */ #define X86_FEATURE_ABM 5 /* Advanced bit manipulation */ #define X86_FEATURE_SSE4A 6 /* SSE-4A */ #define X86_FEATURE_MISALIGNSSE 7 /* Misaligned SSE mode */ #define X86_FEATURE_3DNOWPREFETCH 8 /* 3DNow prefetch instructions */ #define X86_FEATURE_OSVW 9 /* OS Visible Workaround */ #define X86_FEATURE_IBS 10 /* Instruction Based Sampling */ #define X86_FEATURE_XOP 11 /* extended AVX instructions */ #define X86_FEATURE_SKINIT 12 /* SKINIT/STGI instructions */ #define X86_FEATURE_WDT 13 /* Watchdog timer */ #define X86_FEATURE_LWP 15 /* Light Weight Profiling */ #define X86_FEATURE_FMA4 16 /* 4 operands MAC instructions */ #define X86_FEATURE_NODEID_MSR 19 /* NodeId MSR */ #define X86_FEATURE_TBM 21 /* trailing bit manipulations */ #define X86_FEATURE_TOPOEXT 22 /* topology extensions CPUID leafs */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx) */ #define X86_FEATURE_FSGSBASE 0 /* {RD,WR}{FS,GS}BASE instructions */ #define X86_FEATURE_TSC_ADJUST 1 /* Tsc thread offset */ #define X86_FEATURE_BMI1 3 /* 1st group bit manipulation extensions */ #define X86_FEATURE_HLE 4 /* Hardware Lock Elision */ #define X86_FEATURE_AVX2 5 /* AVX2 instructions */ #define X86_FEATURE_SMEP 7 /* Supervisor Mode Execution Protection */ #define X86_FEATURE_BMI2 8 /* 2nd group bit manipulation extensions */ #define X86_FEATURE_ERMS 9 /* Enhanced REP MOVSB/STOSB */ #define X86_FEATURE_INVPCID 10 /* Invalidate Process Context ID */ #define X86_FEATURE_RTM 11 /* Restricted Transactional Memory */ #endif /* __LIBXC_CPUFEATURE_H */ 9 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
/*
             LUFA Library
     Copyright (C) Dean Camera, 2011.

  dean [at] fourwalledcubicle [dot] com
           www.lufa-lib.org
*/

/*
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, distribute, and sell this
  software and its documentation for any purpose is hereby granted
  without fee, provided that the above copyright notice appear in
  all copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting
  documentation, and that the name of the author not be used in
  advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  The author disclaim all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

/** \file
 *
 *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special
 *  computer-readable structures which the host requests upon device enumeration, to determine
 *  the device's capabilities and functions.
 */

#include "Descriptors.h"

/** HID class report descriptor. This is a special descriptor constructed with values from the
 *  USBIF HID class specification to describe the reports and capabilities of the HID device. This
 *  descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
 *  the device will send, and what it may be sent back from the host. Refer to the HID specification for
 *  more details on HID report descriptors.
 *
 *  This descriptor describes the multiple possible reports of the HID interface's report structure.
 */
const USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] =
{
	/* Mouse Report */
	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
	HID_RI_USAGE(8, 0x02), /* Mouse */
	HID_RI_COLLECTION(8, 0x01), /* Application */
		HID_RI_REPORT_ID(8, HID_REPORTID_MouseReport),
	    HID_RI_USAGE(8, 0x01), /* Pointer */
	    HID_RI_COLLECTION(8, 0x00), /* Physical */
	        HID_RI_USAGE_PAGE(8, 0x09), /* Button */
	        HID_RI_USAGE_MINIMUM(8, 0x01),
	        HID_RI_USAGE_MAXIMUM(8, 0x03),
	        HID_RI_LOGICAL_MINIMUM(8, 0x00),
	        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
	        HID_RI_REPORT_COUNT(8, 0x03),
	        HID_RI_REPORT_SIZE(8, 0x01),
	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
	        HID_RI_REPORT_COUNT(8, 0x01),
	        HID_RI_REPORT_SIZE(8, 0x05),
	        HID_RI_INPUT(8, HID_IOF_CONSTANT),
	        HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
	        HID_RI_USAGE(8, 0x30), /* Usage X */
	        HID_RI_USAGE(8, 0x31), /* Usage Y */
	        HID_RI_LOGICAL_MINIMUM(8, -1),
	        HID_RI_LOGICAL_MAXIMUM(8, 1),
	        HID_RI_PHYSICAL_MINIMUM(8, -1),
	        HID_RI_PHYSICAL_MAXIMUM(8, 1),
	        HID_RI_REPORT_COUNT(8, 0x02),
	        HID_RI_REPORT_SIZE(8, 0x08),
	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
	    HID_RI_END_COLLECTION(0),
	HID_RI_END_COLLECTION(0),
	
	/* Keyboard Report */
	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
	HID_RI_USAGE(8, 0x06), /* Keyboard */
	HID_RI_COLLECTION(8, 0x01), /* Application */
		HID_RI_REPORT_ID(8, HID_REPORTID_KeyboardReport),
	    HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
	    HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
	    HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
	    HID_RI_LOGICAL_MAXIMUM(8, 0x01),
	    HID_RI_REPORT_SIZE(8, 0x01),
	    HID_RI_REPORT_COUNT(8, 0x08),
	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
	    HID_RI_REPORT_COUNT(8, 0x01),
	    HID_RI_REPORT_SIZE(8, 0x08),
	    HID_RI_INPUT(8, HID_IOF_CONSTANT),
	    HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
	    HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
	    HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
	    HID_RI_REPORT_COUNT(8, 0x05),
	    HID_RI_REPORT_SIZE(8, 0x01),
	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
	    HID_RI_REPORT_COUNT(8, 0x01),
	    HID_RI_REPORT_SIZE(8, 0x03),
	    HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
	    HID_RI_LOGICAL_MAXIMUM(8, 0x65),
	    HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
	    HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
	    HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
	    HID_RI_REPORT_COUNT(8, 0x06),
	    HID_RI_REPORT_SIZE(8, 0x08),
	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
	HID_RI_END_COLLECTION(0),
};

/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 *  device characteristics, including the supported USB version, control endpoint size and the
 *  number of device configurations. The descriptor is read out by the USB host when the enumeration
 *  process begins.
 */
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
{
	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},

	.USBSpecification       = VERSION_BCD(01.10),
	.Class                  = USB_CSCP_NoDeviceClass,
	.SubClass               = USB_CSCP_NoDeviceSubclass,
	.Protocol               = USB_CSCP_NoDeviceProtocol,

	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,

	.VendorID               = 0x03EB,
	.ProductID              = 0x2066,
	.ReleaseNumber          = VERSION_BCD(00.01),

	.ManufacturerStrIndex   = 0x01,
	.ProductStrIndex        = 0x02,
	.SerialNumStrIndex      = NO_DESCRIPTOR,

	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
};

/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 *  of the device in one of its supported configurations, including information about any device interfaces
 *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
 *  a configuration so that the host may correctly communicate with the USB device.
 */
const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
	.Config =
		{
			.Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},

			.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
			.TotalInterfaces        = 1,

			.ConfigurationNumber    = 1,
			.ConfigurationStrIndex  = NO_DESCRIPTOR,

			.ConfigAttributes       = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),

			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
		},

	.HID_Interface =
		{
			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},

			.InterfaceNumber        = 0x00,
			.AlternateSetting       = 0x00,

			.TotalEndpoints         = 1,

			.Class                  = HID_CSCP_HIDClass,
			.SubClass               = HID_CSCP_NonBootSubclass,
			.Protocol               = HID_CSCP_NonBootProtocol,

			.InterfaceStrIndex      = NO_DESCRIPTOR
		},

	.HID_HIDData =
		{
			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},

			.HIDSpec                = VERSION_BCD(01.11),
			.CountryCode            = 0x00,
			.TotalReportDescriptors = 1,
			.HIDReportType          = HID_DTYPE_Report,
			.HIDReportLength        = sizeof(HIDReport)
		},

	.HID_ReportINEndpoint =
		{
			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

			.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | HID_IN_EPNUM),
			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
			.EndpointSize           = HID_EPSIZE,
			.PollingIntervalMS      = 0x01
		},
};

/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
 *  via the language ID table available at USB.org what languages the device supports for its string descriptors.
 */
const USB_Descriptor_String_t PROGMEM LanguageString =
{
	.Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},

	.UnicodeString          = {LANGUAGE_ID_ENG}
};

/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
 *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
 *  Descriptor.
 */
const USB_Descriptor_String_t PROGMEM ManufacturerString =
{
	.Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},

	.UnicodeString          = L"Dean Camera"
};

/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
 *  Descriptor.
 */
const USB_Descriptor_String_t PROGMEM ProductString =
{
	.Header                 = {.Size = USB_STRING_LEN(26), .Type = DTYPE_String},

	.UnicodeString          = L"LUFA Multi HID Report Demo"
};

/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 *  documentation) by the application code so that the address and size of a requested descriptor can be given
 *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
 *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
 *  USB host.
 */
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                    const uint8_t wIndex,
                                    const void** const DescriptorAddress)
{
	const uint8_t  DescriptorType   = (wValue >> 8);
	const uint8_t  DescriptorNumber = (wValue & 0xFF);

	const void* Address = NULL;
	uint16_t    Size    = NO_DESCRIPTOR;

	switch (DescriptorType)
	{
		case DTYPE_Device:
			Address = &DeviceDescriptor;
			Size    = sizeof(USB_Descriptor_Device_t);
			break;
		case DTYPE_Configuration:
			Address = &ConfigurationDescriptor;
			Size    = sizeof(USB_Descriptor_Configuration_t);
			break;
		case DTYPE_String:
			switch (DescriptorNumber)
			{
				case 0x00:
					Address = &LanguageString;
					Size    = pgm_read_byte(&LanguageString.Header.Size);
					break;
				case 0x01:
					Address = &ManufacturerString;
					Size    = pgm_read_byte(&ManufacturerString.Header.Size);
					break;
				case 0x02:
					Address = &ProductString;
					Size    = pgm_read_byte(&ProductString.Header.Size);
					break;
			}

			break;
		case HID_DTYPE_HID:
			Address = &ConfigurationDescriptor.HID_HIDData;
			Size    = sizeof(USB_HID_Descriptor_HID_t);			
			break;
		case HID_DTYPE_Report:
			Address = &HIDReport;
			Size    = sizeof(HIDReport);
			break;
	}

	*DescriptorAddress = Address;
	return Size;
}