////////////////////////////////////////////////////////////////////////////// usbconfig.h //////// //////// An example set of device / configuration descriptors. //////// This set works exclusively with ex_usb_mouse.c example. //////// /////////////////////////////////////////////////////////////////////////////////// //////// Version History: //////// //////// March 5th, 2009: //////// Cleanup for Wizard. //////// PIC24 Initial release. //////// //////// June 20th, 2005: //////// Initial 18Fxx5x release //////// //////// March 21st, 2005: //////// EP 0x81 now uses USB_EP1_TX_SIZE to define max packet size, to //////// make it easier for dynamically changed code. //////// EP 0x81 will now use 1ms polling interval if using a full speed //////// device. //////// //////// June 24th, 2002: Cleanup //////// /////////////////////////////////////////////////////////////////////////////////// (C) Copyright 1996,2005 Custom Computer Services //////// This source code may only be used by licensed users of the CCS //////// C compiler. This source code may only be distributed to other //////// licensed users of the CCS C compiler. No other use, //////// reproduction or distribution is permitted without written //////// permission. Derivative programs created using this software //////// in object code form are not restricted in any way. ///////////////////////////////////////////////////////////////////////////////#IFNDEF __USB_DESCRIPTORS__#DEFINE __USB_DESCRIPTORS__///////// config options, although it's best to leave alone for this demo /////#define USB_CONFIG_PID 0xc631#define USB_CONFIG_VID 0x0403#define USB_CONFIG_BUS_POWER 100 //100mA (range is 0..500)#define USB_CONFIG_VERSION 0x0205 //01.00 //range is 00.00 to 99.99//////// end config /////////////////////////////////////////////////////////////#DEFINE USB_CONFIG_BUS_POWER FALSE//#define USB_USE_FULL_SPEED FALSE#DEFINE USB_HID_DEVICE FALSE //Tells the CCS PIC USB firmware//Enable to include HID handling code.//turn on EP0 for IN control transfers. (IN = PIC -> PC)#define USB_EP0_TX_ENABLE USB_ENABLE_CONTROL#define USB_EP0_TX_SIZE 64 //max packet size of this endpoint#define USB_EP0_RX_ENABLE USB_ENABLE_CONTROL#define USB_EP0_RX_SIZE 64 //max packet size of this endpoint//#define USB_EP1_TX_ENABLE USB_ENABLE_CONTROL//#define USB_EP1_TX_SIZE 8 //max packet size of this endpoint//#define USB_EP1_RX_ENABLE USB_ENABLE_CONTROL//#define USB_EP1_RX_SIZE 8 //max packet size of this endpoint#include <usb.h>//////////////////////////////////////////////////////////////////////// start config descriptor/// right now we only support one configuration descriptor./// the config, interface, class, and endpoint goes into this array./////////////////////////////////////////////////////////////////////#DEFINE USB_TOTAL_CONFIG_LEN 32 //config+interface+class+endpointconst char USB_CONFIG_DESC[] = {//IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:// config(s)// interface(s)// class(es)// endpoint(s)//config_descriptor for config index 1USB_DESC_CONFIG_LEN, //length of descriptor size ==1USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02) ==2USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config ==3,41, //number of interfaces this device supports ==50x01, //identifier for this configuration. (IF we had more than one configurations) ==60x00, //index of string descriptor for this configuration ==7#if USB_CONFIG_BUS_POWER0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1 ==8#else0x80, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1 ==8#endifUSB_CONFIG_BUS_POWER/2, //maximum bus power required (maximum milliamperes/2) (0x32 = 100mA) ==9//interface descriptor 1USB_DESC_INTERFACE_LEN, //length of descriptor =10USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04) =110x00, //number defining this interface (IF we had more than one interface) ==120x00, //alternate setting ==132, //number of endpoints, except 0 ==140xff, //class code, 03 = HID ==150xff, //subclass code //boot ==160xff, //protocol code ==170x00, //index of string descriptor for interface ==18//class descriptor 1 (HID)/* USB_DESC_CLASS_LEN, //length of descriptor ==19USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID) ==200x00,0x01, //hid class release number (1.0) (try 1.10) ==21,220x00, //localized country code (0 = none) ==230x01, //number of hid class descrptors that follow (1) ==240x22, //report descriptor type (0x22 == HID) ==250, 0x00, //length of report descriptor ==26,27*///endpoint descriptorUSB_DESC_ENDPOINT_LEN, //length of descriptor ==28USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==290x80, //endpoint number and direction (0x80 = EP0 IN) ==30USB_ENDPOINT_TYPE_CONTROL, //transfer type supported (0x03 is interrupt) ==31USB_EP0_TX_SIZE,0x00, //maximum packet size supported ==32,3310 //polling interval, in ms. (cant be smaller than 10 for slow speed devices) ==34//endpoint descriptorUSB_DESC_ENDPOINT_LEN, //length of descriptor ==28USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==290x00, //endpoint number and direction (0x80 = EP0 IN) ==30USB_ENDPOINT_TYPE_CONTROL, //transfer type supported (0x03 is interrupt) ==31USB_EP0_RX_SIZE,0x00, //maximum packet size supported ==32,3310 //polling interval, in ms. (cant be smaller than 10 for slow speed devices) ==34};//****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********//since we can't make pointers to constants in certain pic16s, this is an offset table to find// a specific descriptor in the above table.//NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL// FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1#define USB_NUM_HID_INTERFACES 1//the maximum number of interfaces seen on any config//for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2#define USB_MAX_NUM_INTERFACES 1//define how many interfaces there are per config. [0] is the first config, etc.const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};//define where to find class descriptors//first dimension is the config number//second dimension specifies which interface//last dimension specifies which class in this interface to get, but most will only have 1 class per interface//if a class descriptor is not valid, set the value to 0xFFFFconst int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_NUM_HID_INTERFACES][1]={//config 1//interface 0//class 118};#if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)#error USB_TOTAL_CONFIG_LEN not defined correctly#endif//////////////////////////////////////////////////////////////////////// start device descriptors/////////////////////////////////////////////////////////////////////const char USB_DEVICE_DESC[] = {//starts of with device configuration. only one possibleUSB_DESC_DEVICE_LEN, //the length of this report ==10x01, //the constant DEVICE (DEVICE 0x01) ==20x10,0x01, //usb version in bcd (pic167xx is 1.1) ==3,40xff, //class code vendor specific0x00, //subclass code ==60x00, //protocol code ==7USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id ==9, 10USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff ==11, 12USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number ==13,140x01, //index of string description of manufacturer. therefore we point to string_1 array (see below) ==150x02, //index of string descriptor of the product ==160x00, //index of string descriptor of serial number ==17USB_NUM_CONFIGURATIONS //number of possible configurations ==18};#if (sizeof(USB_DEVICE_DESC) != USB_DESC_DEVICE_LEN)#error USB_DESC_DEVICE_LEN not defined correctly#endif//////////////////////////////////////////////////////////////////////// start string descriptors/// String 0 is a special language string, and must be defined. People in U.S.A. can leave this alone.///////////////////////////////////////////////////////////////////////the offset of the starting location of each string. offset[0] is the start of string 0, offset[1] is the start of string 1, etc.const char USB_STRING_DESC_OFFSET[]={0,4,12};//number of strings you have, including string 0.#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)// Here is where the "CCS" Manufacturer string and "CCS USB Mouse" are stored.// Strings are saved as unicode.char const USB_STRING_DESC[]={//string 04, //length of string indexUSB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)0x09,0x04, //Microsoft Defined for US-English//string 18, //length of string indexUSB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)'U',0,'S',0,'T',0,//string 228, //length of string indexUSB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)'i',0,'2',0,'c',0,'-',0,'P',0,'I',0,'C',0,'-',0,'U',0,'S',0,'B',0,' ',0,' ',0};