summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Gilling <konkers@android.com>2011-03-22 14:00:39 -0700
committerErik Gilling <konkers@android.com>2011-03-22 14:10:42 -0700
commit6b82d374ba60341b54577dfce1922d8e4c210bd0 (patch)
tree7087fb4bca99e02ceb4b2471f97b6e214962d416
parent2f634de59b551eda0c5702157156600f8914f160 (diff)
downloadarduino-6b82d374ba60341b54577dfce1922d8e4c210bd0.tar.gz
remove examples
Change-Id: Ifebc01667dc1a5cc6dd8105b825722220f2d247e
-rw-r--r--USB_Host_Shield/examples/LCDkbd.pde335
-rw-r--r--USB_Host_Shield/examples/PS3LCD.pde566
-rw-r--r--USB_Host_Shield/examples/arm_mouse.pde284
-rw-r--r--USB_Host_Shield/examples/board_test/board_test.h21
-rw-r--r--USB_Host_Shield/examples/board_test/board_test.pde296
-rw-r--r--USB_Host_Shield/examples/conf_descr_dump.pde181
-rw-r--r--USB_Host_Shield/examples/descriptor_parser/descriptor_parser.h284
-rw-r--r--USB_Host_Shield/examples/descriptor_parser/descriptor_parser.pde720
8 files changed, 0 insertions, 2687 deletions
diff --git a/USB_Host_Shield/examples/LCDkbd.pde b/USB_Host_Shield/examples/LCDkbd.pde
deleted file mode 100644
index 0f4dba1..0000000
--- a/USB_Host_Shield/examples/LCDkbd.pde
+++ /dev/null
@@ -1,335 +0,0 @@
-/* MAX3421E USB Host controller LCD/keyboard demonstration */
-#include <Spi.h>
-#include <Max3421e.h>
-#include <Usb.h>
-#include <Max_LCD.h>
-
-/* keyboard data taken from configuration descriptor */
-#define KBD_ADDR 1
-#define KBD_EP 1
-#define KBD_IF 0
-#define EP_MAXPKTSIZE 8
-#define EP_POLL 0x0a
-/**/
-//******************************************************************************
-// macros to identify special charaters(other than Digits and Alphabets)
-//******************************************************************************
-#define BANG (0x1E)
-#define AT (0x1F)
-#define POUND (0x20)
-#define DOLLAR (0x21)
-#define PERCENT (0x22)
-#define CAP (0x23)
-#define AND (0x24)
-#define STAR (0x25)
-#define OPENBKT (0x26)
-#define CLOSEBKT (0x27)
-
-#define RETURN (0x28)
-#define ESCAPE (0x29)
-#define BACKSPACE (0x2A)
-#define TAB (0x2B)
-#define SPACE (0x2C)
-#define HYPHEN (0x2D)
-#define EQUAL (0x2E)
-#define SQBKTOPEN (0x2F)
-#define SQBKTCLOSE (0x30)
-#define BACKSLASH (0x31)
-#define SEMICOLON (0x33)
-#define INVCOMMA (0x34)
-#define TILDE (0x35)
-#define COMMA (0x36)
-#define PERIOD (0x37)
-#define FRONTSLASH (0x38)
-#define DELETE (0x4c)
-/**/
-/* Modifier masks. One for both modifiers */
-#define SHIFT 0x22
-#define CTRL 0x11
-#define ALT 0x44
-#define GUI 0x88
-/**/
-/* "Sticky keys */
-#define CAPSLOCK (0x39)
-#define NUMLOCK (0x53)
-#define SCROLLLOCK (0x47)
-/* Sticky keys output report bitmasks */
-#define bmNUMLOCK 0x01
-#define bmCAPSLOCK 0x02
-#define bmSCROLLLOCK 0x04
-/**/
-EP_RECORD ep_record[ 2 ]; //endpoint record structure for the keyboard
-
-char buf[ 8 ] = { 0 }; //keyboard buffer
-char old_buf[ 8 ] = { 0 }; //last poll
-/* Sticky key state */
-bool numLock = false;
-bool capsLock = false;
-bool scrollLock = false;
-bool line = false;
-
-void setup();
-void loop();
-
-MAX3421E Max;
-USB Usb;
-Max_LCD LCD;
-
-void setup() {
- // set up the LCD's number of rows and columns:
- LCD.begin(16, 2);
- LCD.home();
- Serial.begin( 9600 );
- Serial.println("Start");
- Max.powerOn();
- delay( 200 );
-}
-
-void loop() {
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) { //wait for addressing state
- kbd_init();
- Usb.setUsbTaskState( USB_STATE_RUNNING );
- }
- if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { //poll the keyboard
- kbd_poll();
- }
-}
-/* Initialize keyboard */
-void kbd_init( void )
-{
- byte rcode = 0; //return code
-/**/
- /* Initialize data structures */
- ep_record[ 0 ] = *( Usb.getDevTableEntry( 0,0 )); //copy endpoint 0 parameters
- ep_record[ 1 ].MaxPktSize = EP_MAXPKTSIZE;
- ep_record[ 1 ].Interval = EP_POLL;
- ep_record[ 1 ].sndToggle = bmSNDTOG0;
- ep_record[ 1 ].rcvToggle = bmRCVTOG0;
- Usb.setDevTableEntry( 1, ep_record ); //plug kbd.endpoint parameters to devtable
- /* Configure device */
- rcode = Usb.setConf( KBD_ADDR, 0, 1 );
- if( rcode ) {
- Serial.print("Error attempting to configure keyboard. Return code :");
- Serial.println( rcode, HEX );
- while(1); //stop
- }
- /* Set boot protocol */
- rcode = Usb.setProto( KBD_ADDR, 0, 0, 0 );
- if( rcode ) {
- Serial.print("Error attempting to configure boot protocol. Return code :");
- Serial.println( rcode, HEX );
- while( 1 ); //stop
- }
- LCD.print("Keyboard initialized");
- delay(2000);
- LCD.clear();
- LCD.home();
- Serial.println("Keyboard initialized");
-}
-
-/* Poll keyboard and print result */
-/* buffer starts at position 2, 0 is modifier key state and 1 is irrelevant */
-void kbd_poll( void )
-{
- char i;
- static char leds = 0;
- byte rcode = 0; //return code
- /* poll keyboard */
- rcode = Usb.inTransfer( KBD_ADDR, KBD_EP, 8, buf );
- if( rcode != 0 ) {
- return;
- }//if ( rcode..
- for( i = 2; i < 8; i++ ) {
- if( buf[ i ] == 0 ) { //end of non-empty space
- break;
- }
- if( buf_compare( buf[ i ] ) == false ) { //if new key
- switch( buf[ i ] ) {
- case CAPSLOCK:
- capsLock =! capsLock;
- leds = ( capsLock ) ? leds |= bmCAPSLOCK : leds &= ~bmCAPSLOCK; // set or clear bit 1 of LED report byte
- break;
- case NUMLOCK:
- numLock =! numLock;
- leds = ( numLock ) ? leds |= bmNUMLOCK : leds &= ~bmNUMLOCK; // set or clear bit 0 of LED report byte
- break;
- case SCROLLLOCK:
- scrollLock =! scrollLock;
- leds = ( scrollLock ) ? leds |= bmSCROLLLOCK : leds &= ~bmSCROLLLOCK; // set or clear bit 2 of LED report byte
- break;
- case DELETE:
- LCD.clear();
- LCD.home();
- line = false;
- break;
- case RETURN:
- line =! line;
- LCD.setCursor( 0, line );
- break;
- default:
- //LCD.print("A"); //output
- LCD.print( HIDtoA( buf[ i ], buf[ 0 ] ));
- Serial.print(HIDtoA( buf[ i ], buf[ 0 ] ));
- break;
- }//switch( buf[ i ...
- rcode = Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, &leds );
- if( rcode ) {
- Serial.print("Set report error: ");
- Serial.println( rcode, HEX );
- }//if( rcode ...
- }//if( buf_compare( buf[ i ] ) == false ...
- }//for( i = 2...
- for( i = 2; i < 8; i++ ) { //copy new buffer to old
- old_buf[ i ] = buf[ i ];
- }
-}
-/* compare byte against bytes in old buffer */
-bool buf_compare( byte data )
-{
- char i;
- for( i = 2; i < 8; i++ ) {
- if( old_buf[ i ] == data ) {
- return( true );
- }
- }
- return( false );
-}
-
-/* HID to ASCII converter. Takes HID keyboard scancode, returns ASCII code */
-byte HIDtoA( byte HIDbyte, byte mod )
-{
- /* upper row of the keyboard, numbers and special symbols */
- if( HIDbyte >= 0x1e && HIDbyte <= 0x27 ) {
- if(( mod & SHIFT ) || numLock ) { //shift key pressed
- switch( HIDbyte ) {
- case BANG: return( 0x21 );
- case AT: return( 0x40 );
- case POUND: return( 0x23 );
- case DOLLAR: return( 0x24 );
- case PERCENT: return( 0x25 );
- case CAP: return( 0x5e );
- case AND: return( 0x26 );
- case STAR: return( 0x2a );
- case OPENBKT: return( 0x28 );
- case CLOSEBKT: return( 0x29 );
- }//switch( HIDbyte...
- }
- else { //numbers
- if( HIDbyte == 0x27 ) { //zero
- return( 0x30 );
- }
- else {
- return( HIDbyte + 0x13 );
- }
- }//numbers
- }//if( HIDbyte >= 0x1e && HIDbyte <= 0x27
- /**/
- /* number pad. Arrows are not supported */
- if(( HIDbyte >= 0x59 && HIDbyte <= 0x61 ) && ( numLock == true )) { // numbers 1-9
- return( HIDbyte - 0x28 );
- }
- if(( HIDbyte == 0x62 ) && ( numLock == true )) { //zero
- return( 0x30 );
- }
- /* Letters a-z */
- if( HIDbyte >= 0x04 && HIDbyte <= 0x1d ) {
- if((( capsLock == true ) && ( mod & SHIFT ) == 0 ) || (( capsLock == false ) && ( mod & SHIFT ))) { //upper case
- return( HIDbyte + 0x3d );
- }
- else { //lower case
- return( HIDbyte + 0x5d );
- }
- }//if( HIDbyte >= 0x04 && HIDbyte <= 0x1d...
- /* Other special symbols */
- if( HIDbyte >= 0x2c && HIDbyte <= 0x38 ) {
- switch( HIDbyte ) {
- case SPACE: return( 0x20 );
- case HYPHEN:
- if(( mod & SHIFT ) == false ) {
- return( 0x2d );
- }
- else {
- return( 0x5f );
- }
- case EQUAL:
- if(( mod & SHIFT ) == false ) {
- return( 0x3d );
- }
- else {
- return( 0x2b );
- }
- case SQBKTOPEN:
- if(( mod & SHIFT ) == false ) {
- return( 0x5b );
- }
- else {
- return( 0x7b );
- }
- case SQBKTCLOSE:
- if(( mod & SHIFT ) == false ) {
- return( 0x5d );
- }
- else {
- return( 0x7d );
- }
- case BACKSLASH:
- if(( mod & SHIFT ) == false ) {
- return( 0x5c );
- }
- else {
- return( 0x7c );
- }
- case SEMICOLON:
- if(( mod & SHIFT ) == false ) {
- return( 0x3b );
- }
- else {
- return( 0x3a );
- }
- case INVCOMMA:
- if(( mod & SHIFT ) == false ) {
- return( 0x27 );
- }
- else {
- return( 0x22 );
- }
- case TILDE:
- if(( mod & SHIFT ) == false ) {
- return( 0x60 );
- }
- else {
- return( 0x7e );
- }
- case COMMA:
- if(( mod & SHIFT ) == false ) {
- return( 0x2c );
- }
- else {
- return( 0x3c );
- }
- case PERIOD:
- if(( mod & SHIFT ) == false ) {
- return( 0x2e );
- }
- else {
- return( 0x3e );
- }
- case FRONTSLASH:
- if(( mod & SHIFT ) == false ) {
- return( 0x2f );
- }
- else {
- return( 0x3f );
- }
- default:
- break;
- }//switch( HIDbyte..
- }//if( HIDbye >= 0x2d && HIDbyte <= 0x38..
- return( 0 );
-}
-
-
-
-
diff --git a/USB_Host_Shield/examples/PS3LCD.pde b/USB_Host_Shield/examples/PS3LCD.pde
deleted file mode 100644
index ae103e0..0000000
--- a/USB_Host_Shield/examples/PS3LCD.pde
+++ /dev/null
@@ -1,566 +0,0 @@
-
-
-/* MAX3421E USB Host controller LCD/PS3 demonstration */
-#include <Spi.h>
-#include <Max3421e.h>
-#include <Usb.h>
-#include <Max_LCD.h>
-#include <MemoryFree.h>
-#include <avr/pgmspace.h>
-
-/*The application will work in reduced host mode, so we can save program and data
-memory space. After verifying the PID and VID we will use known values for the
-configuration values for device, interface, endpoints and HID */
-
-/* PS3 data taken from descriptors */
-#define PS3_ADDR 1
-#define PS3_VID_LO 0x4c // Sony VID
-#define PS3_VID_HI 0x05
-#define PS3_PID_LO 0x68 // Batch Device
-#define PS3_PID_HI 0x02
-#define PS3_CONFIGURATION 1
-#define PS3_IF 0
-#define PS3_NUM_EP 3
-#define EP_MAXPKTSIZE 64
-#define EP_INTERRUPT 0x03
-#define EP_POLL 0x01
-#define CONTROL_EP 0
-#define OUTPUT_EP 1
-#define REPORT_EP 2
-
-
-#define PS3_F4_REPORT_LEN 4
-#define PS3_F5_REPORT_LEN 8
-#define PS3_01_REPORT_LEN 48
-#define HID_REPORT_FEATURE 3
-#define HID_REPORT_OUTPUT 2
-#define PS3_F4_REPORT_ID 0xF4
-#define PS3_01_REPORT_ID 0x01
-#define PS3_F5_REPORT_ID 0xF5
-
-/* Defines for the PS3 Data in the HID Report
-*/
-#define LAnalogX buf[6]
-#define LAnalogY buf[7]
-#define RAnalogX buf[8]
-#define RAnalogY buf[9]
-#define buttons1 buf[2]
-#define buttons2 buf[3]
-#define buttons3 buf[4]
-#define buttonchange ((buttons1 != oldbuttons1) | (buttons2 != oldbuttons2))
-#define buSelect (buttons1 & 0x01)
-#define buLAnalog (buttons1 & 0x02)
-#define buRAnalog (buttons1 & 0x04)
-#define buStart (buttons1 & 0x08)
-#define buUp (buttons1 & 0x10)
-#define buRight (buttons1 & 0x20)
-#define buDown (buttons1 & 0x40)
-#define buLeft (buttons1 & 0x80)
-#define buL2 (buttons2 & 0x01)
-#define buR2 (buttons2 & 0x02)
-#define buL1 (buttons2 & 0x04)
-#define buR1 (buttons2 & 0x08)
-#define buTriangle (buttons2 & 0x10)
-#define buCircle (buttons2 & 0x20)
-#define buCross (buttons2 & 0x40)
-#define buSquare (buttons2 & 0x80)
-#define buPS (buttons3 & 0x01)
-#define AnalogUp buf[14]
-#define AnalogRight buf[15]
-#define AnalogDown buf[16]
-#define AnalogLeft buf[17]
-#define AnalogL2 buf[18]
-#define AnalogR2 buf[19]
-#define AnalogL1 buf[20]
-#define AnalogR1 buf[21]
-#define AnalogTriangle buf[22]
-#define AnalogCircle buf[23]
-#define AnalogCross buf[24]
-#define AnalogSquare buf[25]
-#define AccelX (((unsigned char)buf[42] | (unsigned char)buf[41] << 8)-512)
-#define AccelY (((unsigned char)buf[44] | (unsigned char)buf[43] << 8)-512)
-#define AccelZ (((unsigned char)buf[46] | (unsigned char)buf[45] << 8)-512)
-#define GyroX (((unsigned char)buf[48] | (unsigned char)buf[47] << 8)-512)
-
-
-
-/*Menu screens
-
-*/
-#define Root 0
-#define Basic 1
-#define Buttons 2
-#define Joystick 3
-#define Pressure 4
-#define Accelerometer 5
-#define LED 6
-#define Bdaddr 7
-#define Freememory 8
-
-
-/* Menu Text
-*/
-
-prog_char menutext_0[] PROGMEM = "Select Test";
-prog_char menutext_1[] PROGMEM = "Basic Tests";
-prog_char menutext_2[] PROGMEM = "Buttons Test";
-prog_char menutext_3[] PROGMEM = "Joystick Test";
-prog_char menutext_4[] PROGMEM = "Pressure Test";
-prog_char menutext_5[] PROGMEM = "Motion Test";
-prog_char menutext_6[] PROGMEM = "LED/Rumble Test";
-prog_char menutext_7[] PROGMEM = "Bluetooth Addr";
-prog_char menutext_8[] PROGMEM = "Free Memory";
-
-
-PROGMEM const char *menu_table[] =
-{
- menutext_0,
- menutext_1,
- menutext_2,
- menutext_3,
- menutext_4,
- menutext_5,
- menutext_6,
- menutext_7,
- menutext_8 };
-
-prog_char output_01_report[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x02, 0xff, 0x27, 0x10, 0x00, 0x32, 0xff,
- 0x27, 0x10, 0x00, 0x32, 0xff, 0x27, 0x10, 0x00,
- 0x32, 0xff, 0x27, 0x10, 0x00, 0x32, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-prog_char feature_F4_report[] PROGMEM = {0x42, 0x0c, 0x00, 0x00};
-
-EP_RECORD ep_record[ PS3_NUM_EP ]; //endpoint record structure for the PS3 controller
-
-char buf[ 64 ] = { 0 }; //General purpose buffer for usb data
-char oldbuttons1, oldbuttons2;
-char screen, selscreen;
-char lcdbuffer[17];
-unsigned char bdaddr[6];
-char bdcursor;
-char ledrum;
-char lrcursor;
-
-
-void setup();
-void loop();
-
-MAX3421E Max;
-USB Usb;
-Max_LCD LCD;
-
-void setup() {
- // set up the LCD's number of rows and columns:
- LCD.begin(16, 2);
- LCD.home();
- LCD.print("PS3 Controller");
- LCD.setCursor(0,1);
- LCD.print("Wait for connect");
- Serial.begin( 9600 );
- Serial.println("PS3 Controller Start");
- Serial.print("freeMemory() reports ");
- Serial.println( freeMemory() );
- Max.powerOn();
- delay(200);
-}
-
-void loop() {
-
-
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) { //wait for addressing state
- PS3_init();
- process_report();
- Usb.setUsbTaskState( USB_STATE_RUNNING );
- }
- if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { //poll the PS3 Controller
- PS3_poll();
- }
-}
-/* Initialize PS3 Controller */
-void PS3_init( void )
-{
- byte rcode = 0; //return code
- byte i;
-/**/
-
- /* Initialize data structures for endpoints of device 1*/
- ep_record[ CONTROL_EP ] = *( Usb.getDevTableEntry( 0,0 )); //copy endpoint 0 parameters
- ep_record[ OUTPUT_EP ].epAddr = 0x02; // PS3 output endpoint
- ep_record[ OUTPUT_EP ].Attr = EP_INTERRUPT;
- ep_record[ OUTPUT_EP ].MaxPktSize = EP_MAXPKTSIZE;
- ep_record[ OUTPUT_EP ].Interval = EP_POLL;
- ep_record[ OUTPUT_EP ].sndToggle = bmSNDTOG0;
- ep_record[ OUTPUT_EP ].rcvToggle = bmRCVTOG0;
- ep_record[ REPORT_EP ].epAddr = 0x01; // PS3 report endpoint
- ep_record[ REPORT_EP ].Attr = EP_INTERRUPT;
- ep_record[ REPORT_EP ].MaxPktSize = EP_MAXPKTSIZE;
- ep_record[ REPORT_EP ].Interval = EP_POLL;
- ep_record[ REPORT_EP ].sndToggle = bmSNDTOG0;
- ep_record[ REPORT_EP ].rcvToggle = bmRCVTOG0;
-
- Usb.setDevTableEntry( PS3_ADDR, ep_record ); //plug kbd.endpoint parameters to devtable
-
- /* read the device descriptor and check VID and PID*/
- rcode = Usb.getDevDescr( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, DEV_DESCR_LEN , buf );
- if( rcode ) {
- Serial.print("Error attempting read device descriptor. Return code :");
- Serial.println( rcode, HEX );
- while(1); //stop
- }
- if((buf[ 8 ] != PS3_VID_LO) || (buf[ 9 ] != PS3_VID_HI) || (buf[ 10 ] != PS3_PID_LO) || (buf[ 11 ] != PS3_PID_HI) ) {
- Serial.print("Unsupported USB Device");
- while(1); //stop
- }
-
- /* Configure device */
- rcode = Usb.setConf( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_CONFIGURATION );
- if( rcode ) {
- Serial.print("Error attempting to configure PS3 controller. Return code :");
- Serial.println( rcode, HEX );
- while(1); //stop
- }
-
-
- /* Set the PS3 controller to send reports */
- for (i=0; i < PS3_F4_REPORT_LEN; i++) buf[i] = pgm_read_byte_near( feature_F4_report + i);
- rcode = Usb.setReport( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_F4_REPORT_LEN, PS3_IF, HID_REPORT_FEATURE, PS3_F4_REPORT_ID , buf );
- if( rcode ) {
- Serial.print("Set report error: ");
- Serial.println( rcode, HEX );
- while(1); //stop
-
- }
-
- /* Set the PS3 controller LED 1 On */
- for (i=0; i < PS3_01_REPORT_LEN; i++) buf[i] = pgm_read_byte_near( output_01_report + i);
- rcode = Usb.setReport( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_01_REPORT_LEN, PS3_IF, HID_REPORT_OUTPUT, PS3_01_REPORT_ID , buf );
- if( rcode ) {
- Serial.print("Set report error: ");
- Serial.println( rcode, HEX );
- while(1); //stop
-
- }
-
- LCD.print("PS3 initialized");
- Serial.println("PS3 initialized");
- delay(200);
- screen = Root;
- selscreen = Basic;
- LCD.clear();
- LCD.home();
- LCD.print("Main Menu");
- LCD.setCursor(0,1);
- strcpy_P(lcdbuffer, (char*)pgm_read_word(&(menu_table[selscreen])));
- LCD.print(lcdbuffer);
-
-
-}
-
-/* Poll PS3 and print result */
-
-void PS3_poll( void )
-{
-
- byte rcode = 0; //return code
- /* poll PS3 */
- rcode = Usb.inTransfer(PS3_ADDR, ep_record[ REPORT_EP ].epAddr, PS3_01_REPORT_LEN, buf );
- if( rcode != 0 ) {
- return;
- }
- process_report();
- return;
-}
-
-void process_report(void)
-{
- byte i, j, mask;
- if(buPS){
- screen = Root;
- selscreen = Basic;
- LCD.clear();
- LCD.home();
- LCD.print("Main Menu");
- LCD.setCursor(0,1);
- strcpy_P(lcdbuffer, (char*)pgm_read_word(&(menu_table[selscreen])));
- LCD.print(lcdbuffer);
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
-
- }
-
- switch (screen){
-
- case Root:
- if(buttonchange){
- if(buDown) selscreen--;
- else if(buUp | buSelect) selscreen++;
- else if(buStart) {
- screen = selscreen;
- LCD.clear();
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
- break;
- }
- else {
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
- break;
-
- }
- if (selscreen == 0) selscreen = 1;
- if (selscreen > 8) selscreen = 1;
- LCD.clear();
- LCD.home();
- LCD.print("Main Menu:");
- LCD.setCursor(0,1);
- strcpy_P(lcdbuffer, (char*)pgm_read_word(&(menu_table[selscreen])));
- LCD.print(lcdbuffer);
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
- }
- break;
-
- case Basic:
- if(buttonchange){
- LCD.home();
- if (buL1) LCD.print('X');
- else LCD.print(' ');
- LCD.print(" Test L/R");
- LCD.setCursor(0,1);
- if (buL2) LCD.print('X');
- else LCD.print(' ');
- LCD.print(" Buttons");
- LCD.setCursor(15,0);
- if (buR1) LCD.print('X');
- else LCD.print(' ');
-
- LCD.setCursor(15,1);
- if (buR2) LCD.print('X');
- else LCD.print(' ');
- }
-
- break;
-
- case Buttons:
- if(buttonchange){
- LCD.home();
- LCD.print("0123456789ABCDEF");
- LCD.setCursor(0,1);
- mask = 1;
- for( i = 0; i < 8; i++){
- if (buttons1 & mask) lcdbuffer[i] = '^';
- else lcdbuffer[i] = ' ';
- mask <<= 1;
- }
- mask = 1;
- for( i = 0; i < 8; i++){
- if (buttons2 & mask) lcdbuffer[i+8] = '^';
- else lcdbuffer[i+8] = ' ';
- mask <<= 1;
- }
- LCD.print(lcdbuffer);
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
-
- }
-
- break;
-
- case Joystick:
- LCD.home();
- LCD.print('^');
- LCD.print((unsigned char)LAnalogY, DEC);
- LCD.print(" ");
- LCD.setCursor(8,0);
- LCD.print('^');
- LCD.print((unsigned char)RAnalogY, DEC);
- LCD.print(" ");
- LCD.setCursor(0,1);
- LCD.print('>');
- LCD.print((unsigned char)LAnalogX, DEC);
- LCD.print(" ");
- LCD.setCursor(8,1);
- LCD.print('>');
- LCD.print((unsigned char)RAnalogX, DEC);
- LCD.print(" ");
- break;
-
- case Pressure:
- LCD.home();
- LCD.print((unsigned char)AnalogUp, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogDown, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogLeft, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogRight, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogL1, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogR1, DEC);
- LCD.print(" ");
-
- LCD.setCursor(0,1);
- LCD.print((unsigned char)AnalogCircle, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogTriangle, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogSquare, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogCross, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogL2, DEC);
- LCD.print(" ");
- LCD.print((unsigned char)AnalogR2, DEC);
- LCD.print(" ");
-
- break;
-
- case Accelerometer:
- LCD.home();
- LCD.print('X');
- LCD.print(AccelX, DEC);
- LCD.print(" ");
- LCD.setCursor(8,0);
- LCD.print('Y');
- LCD.print(AccelY, DEC);
- LCD.print(" ");
- LCD.setCursor(0,1);
- LCD.print('Z');
- LCD.print(AccelZ, DEC);
- LCD.print(" ");
- LCD.setCursor(8,1);
- LCD.print('G');
- LCD.print(GyroX, DEC);
- LCD.print(" ");
- break;
-
- case LED:
- if(buttonchange){
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
- if (buRight) lrcursor++;
- else if (buLeft) lrcursor--;
- else if (buUp) ledrum |= 1 << lrcursor;
- else if (buDown) ledrum &= ~(1 << lrcursor);
- if (lrcursor > 7) lrcursor = 0;
- if (lrcursor < 0) lrcursor = 7;
- }
- LCD.home();
- LCD.print("1 2 3 4 S W ");
- LCD.setCursor(0,1);
- j = 0;
- for (i=0; i < 6; i++){
- if(ledrum & 1 << i) lcdbuffer[j] = 'X';
- else lcdbuffer[j] = ' ';
- j++; ;
- lcdbuffer[j] = ' ';
- j++;
- }
- lcdbuffer[j] = 0;
- LCD.print(lcdbuffer);
- LCD.setCursor((lrcursor * 2),1);
- LCD.cursor();
- /* default buffer values */
- for (i=0; i < PS3_01_REPORT_LEN; i++) buf[i] = pgm_read_byte_near( output_01_report + i);
- /* LED setings */
- buf[9] = (ledrum & 0x0f) << 1;
- /* rumble settings */
- if (ledrum & 0x30){
- buf[1] = buf[3] = 0xfe;
- if (ledrum & 0x10) buf[4] = 0xff;
- else buf[2] = 0xff;
- }
-
- Usb.setReport( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_01_REPORT_LEN, PS3_IF, HID_REPORT_OUTPUT, PS3_01_REPORT_ID , buf );
-
- delay(100);
- LCD.noCursor();
- break;
-
- case Bdaddr:
- if(buttonchange){
- oldbuttons1 = buttons1;
- oldbuttons2 = buttons2;
-
- if (buRight) bdcursor++;
- else if (buLeft) bdcursor--;
- if (bdcursor > 11) bdcursor = 0;
- if (bdcursor < 0) bdcursor = 11;
- if(buUp){
- if(bdcursor % 2){
- if ((bdaddr[bdcursor /2] & 0x0f) == 0x0f) bdaddr[bdcursor /2] &= 0xf0;
- bdaddr[bdcursor / 2] += 0x1;
- }
- else{
- if ((bdaddr[bdcursor /2] & 0xf0) == 0xf0) bdaddr[bdcursor /2] &= 0x0f;
- bdaddr[bdcursor / 2] += 0x10;
- }
-
- }
- else if (buDown){
- if(bdcursor % 2){
- if ((bdaddr[bdcursor /2] & 0x0f) == 0x0) bdaddr[bdcursor /2] |= 0x0f;
- bdaddr[bdcursor / 2] -= 0x1;
- }
- else{
- if ((bdaddr[bdcursor /2] & 0xf0) == 0x0) bdaddr[bdcursor /2] |= 0xf0;
- bdaddr[bdcursor / 2] -= 0x10;
- }
-
- }
- if( buCross){
- buf[0] = 0x01;
- buf[1] = 0x00;
- for (i=0; i < 6; i++){
- buf[i+2] = bdaddr[i];
- }
- Serial.println( "bdaddr");
- Usb.setReport( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_F5_REPORT_LEN, PS3_IF, HID_REPORT_FEATURE, PS3_F5_REPORT_ID , buf );
- }
- }
- LCD.home();
- LCD.print("R: ");
- Usb.getReport( PS3_ADDR, ep_record[ CONTROL_EP ].epAddr, PS3_F5_REPORT_LEN, PS3_IF, HID_REPORT_FEATURE, PS3_F5_REPORT_ID , buf );
- for( i=0; i < 6; i++){
- if ((unsigned char)buf[i+2] < 16) LCD.print ('0');
- LCD.print((unsigned char)buf[i + 2], HEX);
- }
-
- LCD.setCursor(0,1);
- LCD.print("W: ");
- for( i=0; i < 6; i++){
- if (bdaddr[i] < 16) LCD.print ('0');
- LCD.print(bdaddr[i], HEX);
- }
- LCD.setCursor(3 + bdcursor ,1);
- LCD.cursor();
-
- delay(100);
- LCD.noCursor();
- break;
-
- case Freememory:
- LCD.home();
- LCD.print("Free Memory ");
- LCD.print( freeMemory(), DEC );
- LCD.setCursor(0,1);
- break;
-
- default:
- break;
-
- }
-
- return;
-}
-
-
-
-
diff --git a/USB_Host_Shield/examples/arm_mouse.pde b/USB_Host_Shield/examples/arm_mouse.pde
deleted file mode 100644
index e934354..0000000
--- a/USB_Host_Shield/examples/arm_mouse.pde
+++ /dev/null
@@ -1,284 +0,0 @@
-/* AL5D robotic arm manual control using USB mouse. Servo controller by Renbotics with some pins swapped, USB Host Shield by Circuits At Home */
-#include <ServoShield.h>
-#include <Spi.h>
-#include <Max3421e.h>
-#include <Usb.h>
-
-#define DEVADDR 1
-#define CONFVALUE 1
-
-
-
-
-/* Arm dimensions( mm ) */
-#define BASE_HGT 67.31 //base hight 2.65"
-#define HUMERUS 146.05 //shoulder-to-elbow "bone" 5.75"
-#define ULNA 187.325 //elbow-to-wrist "bone" 7.375"
-#define GRIPPER 100.00 //gripper (incl.heavy duty wrist rotate mechanism) length 3.94"
-
-#define ftl(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) //float to long conversion
-
-/* Servo names/numbers */
-/* Base servo HS-485HB */
-#define BAS_SERVO 0
-/* Shoulder Servo HS-5745-MG */
-#define SHL_SERVO 1
-/* Elbow Servo HS-5745-MG */
-#define ELB_SERVO 2
-/* Wrist servo HS-645MG */
-#define WRI_SERVO 3
-/* Wrist rotate servo HS-485HB */
-#define WRO_SERVO 4
-/* Gripper servo HS-422 */
-#define GRI_SERVO 5
-
-//#define ARM_PARK set_arm( -50, 140, 100, 0 ) //arm parking position
-
-/* pre-calculations */
-float hum_sq = HUMERUS*HUMERUS;
-float uln_sq = ULNA*ULNA;
-
-void setup();
-void loop();
-
-ServoShield servos; //ServoShield object
-MAX3421E Max;
-USB Usb;
-//ServoShield servos; //ServoShield object
-
-/* Arm data structure */
-struct {
- float x_coord; // X coordinate of the gripper tip
- float y_coord; // Y coordinate of the gripper tip
- float z_coord; //Z coordinate of the gripper tip
- float gripper_angle; //gripper angle
- int16_t gripper_servo; //gripper servo pulse duration
- int16_t wrist_rotate; //wrist rotate servo pulse duration
-} armdata;
-
-void setup()
-{
- /* set servo end points */
- servos.setbounds( BAS_SERVO, 900, 2100 );
- servos.setbounds( SHL_SERVO, 1000, 2100 );
- servos.setbounds( ELB_SERVO, 900, 2100 );
- servos.setbounds( WRI_SERVO, 600, 2400 );
- servos.setbounds( WRO_SERVO, 600, 2400 );
- servos.setbounds( GRI_SERVO, 890, 2100 );
- /**/
-// servo_park();
- arm_park();
-
- servos.start(); //Start the servo shield
- Max.powerOn();
- Serial.begin( 115200 );
- Serial.println("Start");
- delay( 500 );
- //ARM_PARK;
-}
-
-void loop()
-{
-byte rcode;
- //delay( 10 );
- set_arm( armdata.x_coord, armdata.y_coord, armdata.z_coord, armdata.gripper_angle );
- servos.setposition( WRO_SERVO, armdata.wrist_rotate );
- servos.setposition( GRI_SERVO, armdata.gripper_servo );
- //ARM_PARK;
- // circle();
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) {
- mouse_init();
- }//if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING...
- if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { //poll the keyboard
- rcode = mouse_poll();
- if( rcode ) {
- Serial.print("Mouse Poll Error: ");
- Serial.println( rcode, HEX );
- }//if( rcode...
- }//if( Usb.getUsbTaskState() == USB_STATE_RUNNING...
- //Serial.println( armdata.gripper_servo, DEC );
-}
-
-/* Initialize mouse */
-void mouse_init( void )
-{
- byte rcode = 0; //return code
- /**/
- Usb.setDevTableEntry( 1, Usb.getDevTableEntry( 0,0 ) ); //copy device 0 endpoint information to device 1
- /* Configure device */
- rcode = Usb.setConf( DEVADDR, 0, CONFVALUE );
- if( rcode ) {
- Serial.print("Error configuring mouse. Return code : ");
- Serial.println( rcode, HEX );
- while(1); //stop
- }//if( rcode...
- Usb.setUsbTaskState( USB_STATE_RUNNING );
- return;
-}
-
-/* Poll mouse using Get Report and fill arm data structure */
-byte mouse_poll( void )
-{
- byte rcode;
- char buf[ 4 ]; //mouse buffer
- static uint16_t delay = 500; //delay before park
-
- /* poll mouse */
- rcode = Usb.getReport( DEVADDR, 0, 4, 0, 1, 0, buf );
- if( rcode ) { //error
- return( rcode );
- }
- // todo: add arm limit check
- armdata.x_coord += ( buf[ 1 ] * -0.1 );
- armdata.y_coord += ( buf[ 2 ] * -0.1 );
- switch( buf[ 0 ] ) { //read buttons
- case 0x00: //no buttons pressed
- armdata.z_coord += ( buf[ 3 ] * -2 ) ;
- break;
- case 0x01: //button 1 pressed. Wheel sets gripper angle
- armdata.gripper_servo += ( buf[ 3 ] * -20 );
- /* check gripper boundaries */
- if( armdata.gripper_servo < 1000 ) {
- armdata.gripper_servo = 1000;
- }
- if( armdata.gripper_servo > 2100 ) {
- armdata.gripper_servo = 2100;
- }
- break;
- case 0x02: //button 2 pressed. Wheel sets wrist rotate
- armdata.wrist_rotate += ( buf[ 3 ] * -10 );
- /* check wrist rotate boundaries */
- if( armdata.wrist_rotate < 600 ) {
- armdata.wrist_rotate = 600;
- }
- if( armdata.wrist_rotate > 2400 ) {
- armdata.wrist_rotate = 2400;
- }
- break;
- case 0x04: //wheel button pressed. Wheel controls gripper
- armdata.gripper_angle += ( buf[ 3 ] * -1 );
- /* check gripper angle boundaries */
- if( armdata.gripper_angle < -90 ) {
- armdata.gripper_angle = -90;
- }
- if( armdata.gripper_angle > 90 ) {
- armdata.gripper_angle = 90;
- }
- break;
- case 0x07: //all 3 buttons pressed. Park the arm
- arm_park();
- break;
- }//switch( buf[ 0 ...
- Serial.println( armdata.wrist_rotate, DEC );
-}
-
-
-/* arm positioning routine utilizing inverse kinematics */
-/* z is height, y is distance from base center out, x is side to side. y,z can only be positive */
-//void set_arm( uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle )
-void set_arm( float x, float y, float z, float grip_angle_d )
-{
- float grip_angle_r = radians( grip_angle_d ); //grip angle in radians for use in calculations
- /* Base angle and radial distance from x,y coordinates */
- float bas_angle_r = atan2( x, y );
- float rdist = sqrt(( x * x ) + ( y * y ));
- /* rdist is y coordinate for the arm */
- y = rdist;
- /* Grip offsets calculated based on grip angle */
- float grip_off_z = ( sin( grip_angle_r )) * GRIPPER;
- float grip_off_y = ( cos( grip_angle_r )) * GRIPPER;
- /* Wrist position */
- float wrist_z = ( z - grip_off_z ) - BASE_HGT;
- float wrist_y = y - grip_off_y;
- /* Shoulder to wrist distance ( AKA sw ) */
- float s_w = ( wrist_z * wrist_z ) + ( wrist_y * wrist_y );
- float s_w_sqrt = sqrt( s_w );
- /* s_w angle to ground */
- //float a1 = atan2( wrist_y, wrist_z );
- float a1 = atan2( wrist_z, wrist_y );
- /* s_w angle to humerus */
- float a2 = acos((( hum_sq - uln_sq ) + s_w ) / ( 2 * HUMERUS * s_w_sqrt ));
- /* shoulder angle */
- float shl_angle_r = a1 + a2;
- float shl_angle_d = degrees( shl_angle_r );
- /* elbow angle */
- float elb_angle_r = acos(( hum_sq + uln_sq - s_w ) / ( 2 * HUMERUS * ULNA ));
- float elb_angle_d = degrees( elb_angle_r );
- float elb_angle_dn = -( 180.0 - elb_angle_d );
- /* wrist angle */
- float wri_angle_d = ( grip_angle_d - elb_angle_dn ) - shl_angle_d;
-
- /* Servo pulses */
- float bas_servopulse = 1500.0 - (( degrees( bas_angle_r )) * 11.11 );
- float shl_servopulse = 1500.0 + (( shl_angle_d - 90.0 ) * 6.6 );
- float elb_servopulse = 1500.0 - (( elb_angle_d - 90.0 ) * 6.6 );
- float wri_servopulse = 1500 + ( wri_angle_d * 11.1 );
-
- /* Set servos */
- servos.setposition( BAS_SERVO, ftl( bas_servopulse ));
- servos.setposition( WRI_SERVO, ftl( wri_servopulse ));
- servos.setposition( SHL_SERVO, ftl( shl_servopulse ));
- servos.setposition( ELB_SERVO, ftl( elb_servopulse ));
-
-}
-
-/* moves the arm to parking position */
-void arm_park()
-{
- set_arm( armdata.x_coord = -50, armdata.y_coord = 140, armdata.z_coord = 100, armdata.gripper_angle = 0 );
- servos.setposition( WRO_SERVO, armdata.wrist_rotate = 600 );
- servos.setposition( GRI_SERVO, armdata.gripper_servo = 900 );
-}
-
-/* move servos to parking position */
-void servo_park()
-{
- servos.setposition( BAS_SERVO, 1715 );
- servos.setposition( SHL_SERVO, 2100 );
- servos.setposition( ELB_SERVO, 2100 );
- servos.setposition( WRI_SERVO, 1800 );
- servos.setposition( WRO_SERVO, 600 );
- servos.setposition( GRI_SERVO, 900 );
- return;
-}
-
-void zero_x()
-{
- for( double yaxis = 150.0; yaxis < 356.0; yaxis += 1 ) {
- set_arm( 0, yaxis, 127.0, 0 );
- delay( 10 );
- }
- for( double yaxis = 356.0; yaxis > 150.0; yaxis -= 1 ) {
- set_arm( 0, yaxis, 127.0, 0 );
- delay( 10 );
- }
-}
-
-/* moves arm in a straight line */
-void line()
-{
- for( double xaxis = -100.0; xaxis < 100.0; xaxis += 0.5 ) {
- set_arm( xaxis, 250, 100, 0 );
- delay( 10 );
- }
- for( float xaxis = 100.0; xaxis > -100.0; xaxis -= 0.5 ) {
- set_arm( xaxis, 250, 100, 0 );
- delay( 10 );
- }
-}
-
-void circle()
-{
- #define RADIUS 80.0
- //float angle = 0;
- float zaxis,yaxis;
- for( float angle = 0.0; angle < 360.0; angle += 1.0 ) {
- yaxis = RADIUS * sin( radians( angle )) + 200;
- zaxis = RADIUS * cos( radians( angle )) + 200;
- set_arm( 0, yaxis, zaxis, 0 );
- delay( 1 );
- }
-}
-
diff --git a/USB_Host_Shield/examples/board_test/board_test.h b/USB_Host_Shield/examples/board_test/board_test.h
deleted file mode 100644
index 7435d7d..0000000
--- a/USB_Host_Shield/examples/board_test/board_test.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* USB Host Shield board test sketch header */
-#ifndef _BOARD_TEST_H_
-#define _BOARD_TEST_H_
-
-/* PGMSPACE */
-#include <inttypes.h>
-#include <avr/pgmspace.h>
-
-/* Messages */
-const char startBanner [] PROGMEM = "\r\nCircuits At Home 2010"
- "\r\nUSB Host Shield QC test routine\r\n";
-const char anykey_msg [] PROGMEM = "\r\nPress any key to continue...";
-const char testpassed_msg [] PROGMEM = "\r\nTest PASSED";
-const char testfailed_msg [] PROGMEM = "\r\nTest FAILED*!*";
-const char osctest_oscstate_msg [] PROGMEM = " Oscillator state is ";
-const char test_halted_msg [] PROGMEM = "\r\nTest Halted."
- "\r\n0x55 pattern is being transmitted via SPI to aid in troubleshooting";
-const char spitest_fail_msg [] PROGMEM = "\r\nSPI transmit/receive mismatch"
- "\r\nValue written: ";
-
-#endif
diff --git a/USB_Host_Shield/examples/board_test/board_test.pde b/USB_Host_Shield/examples/board_test/board_test.pde
deleted file mode 100644
index 1188fbf..0000000
--- a/USB_Host_Shield/examples/board_test/board_test.pde
+++ /dev/null
@@ -1,296 +0,0 @@
-/* USB Host Shield Board test routine. Runs after assembly to check board functionality */
-
-/* USB related */
-//#include <Spi.h>
-#include <Max3421e.h>
-#include <Max3421e_constants.h>
-#include <Usb.h>
-
-#include "board_test.h" /* Board test messages */
-
-//#define MAX_SS 10
-
-void setup();
-void loop();
-
-MAX3421E Max;
-USB Usb;
-
-void setup()
-{
- Serial.begin( 115200 );
- //Serial.println("Start");
- //Serial.println( SCK_PIN, DEC );
- Max.powerOn();
- printProgStr( startBanner );
- printProgStr( anykey_msg );
- //Serial.print( Max.getvar(), DEC);
-}
-
-void loop()
-{
- while( Serial.available() == 0 ); //wait for input
- Serial.read(); //empty input buffer
- /* start tests */
- /* SPI short test */
- if (!revregcheck()) test_halted();
- /* GPIO test */
- if (!gpiocheck()) printProgStr(PSTR("\r\nGPIO check failed. Make sure GPIO loopback adapter is installed"));
- /* SPI long test */
- if (!spitest()) test_halted(); //test SPI for transmission errors
- if (!osctest()) printProgStr(PSTR("OSCOK test failed. Check the oscillator"));
- if (!usbtest()) printProgStr(PSTR("USB connection test failed. Check traces from USB connector to MAX3421E, as well as VBUS")); //never gets here
- /* All tests passed */
- printProgStr( anykey_msg );
-}
-
-/* SPI short test. Checks connectivity to MAX3421E by reading REVISION register. */
-/* Die rev.1 returns 0x01, rev.2 0x12, rev.3 0x13. Any other value is considered communication error */
-bool revregcheck()
-{
- byte tmpbyte;
- printProgStr(PSTR("\r\nReading REVISION register...Die revision "));
- tmpbyte = Max.regRd( rREVISION );
- switch( tmpbyte ) {
- case( 0x01 ): //rev.01
- printProgStr(PSTR("01"));
- break;
- case( 0x12 ): //rev.02
- printProgStr(PSTR("02"));
- break;
- case( 0x13 ): //rev.03
- printProgStr(PSTR("03"));
- break;
- default:
- printProgStr(PSTR("invalid. Value returned: "));
- print_hex( tmpbyte, 8 );
- printProgStr( testfailed_msg );
- return( false );
- break;
- }//switch( tmpbyte )...
- printProgStr( testpassed_msg );
- return( true );
-}
-/* SPI long test */
-bool spitest()
-{
- byte l = 0;
- byte k = 0;
- byte gpinpol_copy = Max.regRd( rGPINPOL );
- printProgStr(PSTR("\r\nSPI test. Each '.' indicates 64K transferred. Stops after transferring 1MB (16 dots)\r\n"));
- /**/
- for( byte j = 0; j < 16; j++ ) {
- for( word i = 0; i < 65535; i++ ) {
- Max.regWr( rGPINPOL, k );
- l = Max.regRd( rGPINPOL);
- if( l != k ) {
- printProgStr( spitest_fail_msg );
- print_hex( k, 8);
- printProgStr(PSTR("Value read: "));
- print_hex( l, 8 );
- return( false ); //test failed
- }
- k++;
- }//for( i = 0; i < 65535; i++
- Serial.print(".");
- }//for j = 0; j < 16...
- Max.regWr( rGPINPOL, gpinpol_copy );
- printProgStr(testpassed_msg);
- return( true );
-}
-/* Oscillator test */
-bool osctest()
-{
- printProgStr(PSTR("\r\nOscillator start/stop test."));
- printProgStr( osctest_oscstate_msg );
- check_OSCOKIRQ(); //print OSCOK state
- printProgStr(PSTR("\r\nSetting CHIP RESET."));
- Max.regWr( rUSBCTL, bmCHIPRES ); //Chip reset. This stops the oscillator
- printProgStr( osctest_oscstate_msg );
- check_OSCOKIRQ(); //print OSCOK state
- printProgStr(PSTR("\r\nClearing CHIP RESET. "));
- Max.regWr( rUSBCTL, 0x00 ); //Chip reset release
- for( word i = 0; i < 65535; i++) {
- if( Max.regRd( rUSBIRQ ) & bmOSCOKIRQ ) {
- printProgStr(PSTR("PLL is stable. Time to stabilize - "));
- Serial.print( i, DEC );
- printProgStr(PSTR(" cycles"));
- printProgStr( testpassed_msg );
- return( true );
- }
- }//for i =
- return(false);
-}
-/* Stop/start oscillator */
-void check_OSCOKIRQ()
-{
- if( Max.regRd( rUSBIRQ ) & bmOSCOKIRQ ) { //checking oscillator state
- printProgStr(PSTR("ON"));
- }
- else {
- printProgStr(PSTR("OFF"));
- }
-}
-/* Test USB connectivity */
-bool usbtest()
-{
- byte rcode;
- byte usbstate;
- Max.powerOn();
- delay( 200 );
- printProgStr(PSTR("\r\nUSB Connectivity test. Waiting for device connection... "));
- while( 1 ) {
- delay( 200 );
- Max.Task();
- Usb.Task();
- usbstate = Usb.getUsbTaskState();
- switch( usbstate ) {
- case( USB_ATTACHED_SUBSTATE_RESET_DEVICE ):
- printProgStr(PSTR("\r\nDevice connected. Resetting"));
- break;
- case( USB_ATTACHED_SUBSTATE_WAIT_SOF ):
- printProgStr(PSTR("\r\nReset complete. Waiting for the first SOF..."));
- //delay( 1000 );
- break;
- case( USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE ):
- printProgStr(PSTR("\r\nSOF generation started. Enumerating device."));
- break;
- case( USB_STATE_ADDRESSING ):
- printProgStr(PSTR("\r\nSetting device address"));
- //delay( 100 );
- break;
- case( USB_STATE_CONFIGURING ):
- //delay( 1000 );
- printProgStr(PSTR("\r\nGetting device descriptor"));
- rcode = getdevdescr( 1 );
- if( rcode ) {
- printProgStr(PSTR("\r\nError reading device descriptor. Error code "));
- print_hex( rcode, 8 );
- }
- else {
- printProgStr(PSTR("\r\n\nAll tests passed. Press RESET to restart test"));
- while(1);
- }
- break;
- case( USB_STATE_ERROR ):
- printProgStr(PSTR("\r\nUSB state machine reached error state"));
- break;
- default:
- break;
- }//switch
- }//while(1)
-}
-/* Get device descriptor */
-byte getdevdescr( byte addr )
-{
- USB_DEVICE_DESCRIPTOR buf;
- byte rcode;
- rcode = Usb.getDevDescr( addr, 0, 0x12, ( char *)&buf );
- if( rcode ) {
- return( rcode );
- }
- printProgStr(PSTR("\r\nDevice descriptor: "));
- printProgStr(PSTR("\r\nDescriptor Length:\t"));
- print_hex( buf.bLength, 8 );
- printProgStr(PSTR("\r\nDescriptor type:\t"));
- print_hex( buf.bDescriptorType, 8 );
- printProgStr(PSTR("\r\nUSB version:\t"));
- print_hex( buf.bcdUSB, 16 );
- printProgStr(PSTR("\r\nDevice class:\t"));
- print_hex( buf.bDeviceClass, 8 );
- printProgStr(PSTR("\r\nDevice Subclass:\t"));
- print_hex( buf.bDeviceSubClass, 8 );
- printProgStr(PSTR("\r\nDevice Protocol:\t"));
- print_hex( buf.bDeviceProtocol, 8 );
- printProgStr(PSTR("\r\nMax.packet size:\t"));
- print_hex( buf.bMaxPacketSize0, 8 );
- printProgStr(PSTR("\r\nVendor ID:\t"));
- print_hex( buf.idVendor, 16 );
- printProgStr(PSTR("\r\nProduct ID:\t"));
- print_hex( buf.idProduct, 16 );
- printProgStr(PSTR("\r\nRevision ID:\t"));
- print_hex( buf.bcdDevice, 16 );
- printProgStr(PSTR("\r\nMfg.string index:\t"));
- print_hex( buf.iManufacturer, 8 );
- printProgStr(PSTR("\r\nProd.string index:\t"));
- print_hex( buf.iProduct, 8 );
- printProgStr(PSTR("\r\nSerial number index:\t"));
- print_hex( buf.iSerialNumber, 8 );
- printProgStr(PSTR("\r\nNumber of conf.:\t"));
- print_hex( buf.bNumConfigurations, 8 );
- return( 0 );
-}
-
-/* GPIO lines check. A loopback adapter connecting GPIN to GPOUT is assumed */
-bool gpiocheck()
-{
- byte tmpbyte = 0;
- printProgStr(PSTR("\r\nChecking GPIO lines. Install GPIO loopback adapter and press any key to continue..."));
- while( Serial.available() == 0 ); //wait for input
- Serial.read(); //empty input buffer
- for( byte i = 0; i < 255; i++ ) {
- Max.gpioWr( i );
- tmpbyte = Max.gpioRd();
- if( tmpbyte != i ) {
- printProgStr(PSTR("GPIO read/write mismatch. Write: "));
- Serial.print(i, HEX);
- printProgStr(PSTR(" Read: "));
- Serial.println( tmpbyte, HEX );
- return( false );
- }//if( tmpbyte != i )
- }//for( i= 0...
- printProgStr( testpassed_msg );
- return( true );
-}
-/* Test halted state. Generates 0x55 to aid in SPI troubleshooting */
-void test_halted()
-{
- printProgStr( test_halted_msg );
- printProgStr(PSTR("\r\nPress RESET to restart test"));
- while( 1 ) { //System Stop. Generating pattern to keep SCLK, MISO, MOSI, SS busy
- digitalWrite(MAX_SS,LOW);
- Max.regWr( 0x55, 0x55 );
-// Spi.transfer( 0x55 );
- digitalWrite(MAX_SS,HIGH);
- }
-}
-/* given a PROGMEM string, use Serial.print() to send it out */
-/* Some non-intuitive casting necessary: */
-/* printProgStr(PSTR("Func.Mode:\t0x")); */
-/* printProgStr((char*)pgm_read_word(&mtpopNames[(op & 0xFF)])); */
-void printProgStr(const char* str )
-{
- if(!str) {
- return;
- }
- char c;
- while((c = pgm_read_byte(str++))) {
- Serial.print(c,BYTE);
- }
-}
-/* prints hex numbers with leading zeroes */
-// copyright, Peter H Anderson, Baltimore, MD, Nov, '07
-// source: http://www.phanderson.com/arduino/arduino_display.html
-void print_hex(int v, int num_places)
-{
- int mask=0, n, num_nibbles, digit;
-
- for (n=1; n<=num_places; n++)
- {
- mask = (mask << 1) | 0x0001;
- }
- v = v & mask; // truncate v to specified number of places
-
- num_nibbles = num_places / 4;
- if ((num_places % 4) != 0)
- {
- ++num_nibbles;
- }
-
- do
- {
- digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
- Serial.print(digit, HEX);
- }
- while(--num_nibbles);
-}
diff --git a/USB_Host_Shield/examples/conf_descr_dump.pde b/USB_Host_Shield/examples/conf_descr_dump.pde
deleted file mode 100644
index 56d7a58..0000000
--- a/USB_Host_Shield/examples/conf_descr_dump.pde
+++ /dev/null
@@ -1,181 +0,0 @@
-/* MAX3421E USB Host controller get configuration descriptor */
-#include <Spi.h>
-#include <Max3421e.h>
-#include <Usb.h>
-
-#define LOBYTE(x) ((char*)(&(x)))[0]
-#define HIBYTE(x) ((char*)(&(x)))[1]
-#define BUFSIZE 256 //buffer size
-
-void setup();
-void loop();
-
-MAX3421E Max;
-USB Usb;
-
-void setup()
-{
- byte tmpdata = 0;
- Serial.begin( 9600 );
- Serial.println("Start");
- Max.powerOn();
- delay( 200 );
-}
-
-void loop()
-{
- byte rcode;
- byte tmpbyte;
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() >= USB_STATE_CONFIGURING ) { //state configuring or higher
- /* entering configuration number to decode. Restricted to first 10 configurations */
- Serial.print("Enter configuration number: ");
- while( Serial.available() == 0 ); //wait for input
- tmpbyte = Serial.read();
- Serial.println( tmpbyte );
- tmpbyte -= 0x30; //convert to number
- if( tmpbyte > 9 ) {
- Serial.println("Not a number. Assuming configuration 0");
- tmpbyte = 0;
- }
- rcode = getconfdescr( 1, tmpbyte ); //get configuration descriptor
- if( rcode ) {
- Serial.println( rcode, HEX );
- }
-// while( 1 ); //stop
- }
-}
-
-byte getconfdescr( byte addr, byte conf )
-{
- char buf[ BUFSIZE ];
- char* buf_ptr = buf;
- byte rcode;
- byte descr_length;
- byte descr_type;
- unsigned int total_length;
- rcode = Usb.getConfDescr( addr, 0, 4, conf, buf ); //get total length
- LOBYTE( total_length ) = buf[ 2 ];
- HIBYTE( total_length ) = buf[ 3 ];
- if( total_length > BUFSIZE ) { //check if total length is larger than buffer
- Serial.println("Total length truncated to 256 bytes");
- total_length = BUFSIZE;
- }
- rcode = Usb.getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor
- while( buf_ptr < buf + total_length ) { //parsing descriptors
- descr_length = *( buf_ptr );
- descr_type = *( buf_ptr + 1 );
- switch( descr_type ) {
- case( USB_DESCRIPTOR_CONFIGURATION ):
- printconfdescr( buf_ptr );
- break;
- case( USB_DESCRIPTOR_INTERFACE ):
- printintfdescr( buf_ptr );
- break;
- case( USB_DESCRIPTOR_ENDPOINT ):
- printepdescr( buf_ptr );
- break;
- default:
- printunkdescr( buf_ptr );
- break;
- }//switch( descr_type
- Serial.println("");
- buf_ptr = ( buf_ptr + descr_length ); //advance buffer pointer
- }//while( buf_ptr <=...
- return( 0 );
-}
-/* prints hex numbers with leading zeroes */
-// copyright, Peter H Anderson, Baltimore, MD, Nov, '07
-// source: http://www.phanderson.com/arduino/arduino_display.html
-void print_hex(int v, int num_places)
-{
- int mask=0, n, num_nibbles, digit;
-
- for (n=1; n<=num_places; n++) {
- mask = (mask << 1) | 0x0001;
- }
- v = v & mask; // truncate v to specified number of places
-
- num_nibbles = num_places / 4;
- if ((num_places % 4) != 0) {
- ++num_nibbles;
- }
- do {
- digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
- Serial.print(digit, HEX);
- }
- while(--num_nibbles);
-}
-/* function to print configuration descriptor */
-void printconfdescr( char* descr_ptr )
-{
- USB_CONFIGURATION_DESCRIPTOR* conf_ptr = ( USB_CONFIGURATION_DESCRIPTOR* )descr_ptr;
- Serial.println("Configuration descriptor:");
- Serial.print("Total length:\t");
- print_hex( conf_ptr->wTotalLength, 16 );
- Serial.print("\r\nNum.intf:\t\t");
- print_hex( conf_ptr->bNumInterfaces, 8 );
- Serial.print("\r\nConf.value:\t");
- print_hex( conf_ptr->bConfigurationValue, 8 );
- Serial.print("\r\nConf.string:\t");
- print_hex( conf_ptr->iConfiguration, 8 );
- Serial.print("\r\nAttr.:\t\t");
- print_hex( conf_ptr->bmAttributes, 8 );
- Serial.print("\r\nMax.pwr:\t\t");
- print_hex( conf_ptr->bMaxPower, 8 );
- return;
-}
-/* function to print interface descriptor */
-void printintfdescr( char* descr_ptr )
-{
- USB_INTERFACE_DESCRIPTOR* intf_ptr = ( USB_INTERFACE_DESCRIPTOR* )descr_ptr;
- Serial.println("\r\nInterface descriptor:");
- Serial.print("Intf.number:\t");
- print_hex( intf_ptr->bInterfaceNumber, 8 );
- Serial.print("\r\nAlt.:\t\t");
- print_hex( intf_ptr->bAlternateSetting, 8 );
- Serial.print("\r\nEndpoints:\t\t");
- print_hex( intf_ptr->bNumEndpoints, 8 );
- Serial.print("\r\nClass:\t\t");
- print_hex( intf_ptr->bInterfaceClass, 8 );
- Serial.print("\r\nSubclass:\t\t");
- print_hex( intf_ptr->bInterfaceSubClass, 8 );
- Serial.print("\r\nProtocol:\t\t");
- print_hex( intf_ptr->bInterfaceProtocol, 8 );
- Serial.print("\r\nIntf.string:\t");
- print_hex( intf_ptr->iInterface, 8 );
- return;
-}
-/* function to print endpoint descriptor */
-void printepdescr( char* descr_ptr )
-{
- USB_ENDPOINT_DESCRIPTOR* ep_ptr = ( USB_ENDPOINT_DESCRIPTOR* )descr_ptr;
- Serial.println("\r\nEndpoint descriptor:");
- Serial.print("Endpoint address:\t");
- print_hex( ep_ptr->bEndpointAddress, 8 );
- Serial.print("\r\nAttr.:\t\t");
- print_hex( ep_ptr->bmAttributes, 8 );
- Serial.print("\r\nMax.pkt size:\t");
- print_hex( ep_ptr->wMaxPacketSize, 16 );
- Serial.print("\r\nPolling interval:\t");
- print_hex( ep_ptr->bInterval, 8 );
- return;
-}
-/*function to print unknown descriptor */
-void printunkdescr( char* descr_ptr )
-{
- byte length = *descr_ptr;
- byte i;
- Serial.println("\r\nUnknown descriptor:");
- Serial. print("Length:\t\t");
- print_hex( *descr_ptr, 8 );
- Serial.print("\r\nType:\t\t");
- print_hex( *(descr_ptr + 1 ), 8 );
- Serial.print("\r\nContents:\t");
- descr_ptr += 2;
- for( i = 0; i < length; i++ ) {
- print_hex( *descr_ptr, 8 );
- descr_ptr++;
- }
-}
diff --git a/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.h b/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.h
deleted file mode 100644
index 7570841..0000000
--- a/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.h
+++ /dev/null
@@ -1,284 +0,0 @@
-#ifndef _DESCRIPTOR_PARSER_
-#define _DESCRIPTOR_PARSER_
-
-/* PGMSPACE */
-#include <inttypes.h>
-#include <avr/pgmspace.h>
-
-typedef void (*PARSE)( uint8_t bytes );
-
-/* Common Messages */
-
-const char descr_len [] PROGMEM = "\r\nDescriptor Length:\t";
-const char descr_type [] PROGMEM = "\r\nDescriptor type:\t";
-const char class_str [] PROGMEM = "\r\nClass:\t\t\t";
-const char subclass_str [] PROGMEM = "\r\nSubclass:\t\t";
-const char protocol_str [] PROGMEM = "\r\nProtocol:\t\t";
-const char maxpktsize_str [] PROGMEM = "\r\nMax.packet size:\t";
-const char unk_msg [] PROGMEM = " Unknown";
-const char reserved_msg [] PROGMEM = "Reserved";
-const char rcode_error_msg [] PROGMEM = "\r\nRequest error. Reurn code: ";
-
-/* Endpoint attributes */
-
-const char control_tr [] PROGMEM = "Control";
-const char iso_tr [] PROGMEM = "Isochronous";
-const char bulk_tr [] PROGMEM = "Bulk";
-const char int_tr [] PROGMEM = "Interrupt";
-
-const char* transfer_types [] PROGMEM =
-{
- control_tr,
- iso_tr,
- bulk_tr,
- int_tr
-};
-
-const char nosync_type [] PROGMEM = "No Synchronization";
-const char async_type [] PROGMEM = "Asynchronous";
-const char adaptive_type [] PROGMEM = "Adaptive";
-const char sync_type [] PROGMEM = "Synchronous";
-
-const char* sync_types [] PROGMEM =
-{
- nosync_type,
- async_type,
- adaptive_type,
- sync_type
-};
-
-const char data_usage [] PROGMEM = "Data";
-const char feedback_usage [] PROGMEM = "Feedback";
-const char implicit_usage [] PROGMEM = "Implicit Feedback Data";
-const char reserved_usage [] PROGMEM = "Reserved";
-
-const char* usage_types [] PROGMEM =
-{
- data_usage,
- feedback_usage,
- implicit_usage,
- reserved_usage
-};
-
-/* HID Country Codes */
-
-const char notsupported_cc [] PROGMEM = "Not Supported";
-const char arabic_cc [] PROGMEM = "Arabic";
-const char belgian_cc [] PROGMEM = "Belgian";
-const char canadianbi_cc [] PROGMEM = "Canadian-Bilingual";
-const char canadianfr_cc [] PROGMEM = "Canadian-French";
-const char czech_cc [] PROGMEM = "Czech Republic";
-const char danish_cc [] PROGMEM = "Danish";
-const char finnish_cc [] PROGMEM = "Finnish";
-const char french_cc [] PROGMEM = "French";
-const char german_cc [] PROGMEM = "German";
-const char greek_cc [] PROGMEM = "Greek";
-const char hebrew_cc [] PROGMEM = "Hebrew";
-const char hungary_cc [] PROGMEM = "Hungary";
-const char intl_cc [] PROGMEM = "International (ISO)";
-const char italian_cc [] PROGMEM = "Italian";
-const char japan_cc [] PROGMEM = "Japan (Katakana)";
-const char korean_cc [] PROGMEM = "Korean";
-const char latam_cc [] PROGMEM = "Latin American";
-const char dutch_cc [] PROGMEM = "Netherlands/Dutch";
-const char norwegian_cc [] PROGMEM = "Norwegian";
-const char persian_cc [] PROGMEM = "Persian (Farsi)";
-const char poland_cc [] PROGMEM = "Poland";
-const char portuguese_cc [] PROGMEM = "Portuguese";
-const char russia_cc [] PROGMEM = "Russia";
-const char slovakia_cc [] PROGMEM = "Slovakia";
-const char spanish_cc [] PROGMEM = "Spanish";
-const char swedish_cc [] PROGMEM = "Swedish";
-const char swiss_fr_cc [] PROGMEM = "Swiss/French";
-const char swiss_ger_cc [] PROGMEM = "Swiss/German";
-const char swiss_cc [] PROGMEM = "Switzerland";
-const char taiwan_cc [] PROGMEM = "Taiwan";
-const char turkish_q_cc [] PROGMEM = "Turkish-Q";
-const char uk_cc [] PROGMEM = "UK";
-const char us_cc [] PROGMEM = "US";
-const char yugo_cc [] PROGMEM = "Yugoslavia";
-const char turkish_f_cc [] PROGMEM = "Turkish-F";
-
-const char* HID_Country_Codes [] PROGMEM =
-{
-notsupported_cc,
-arabic_cc,
-belgian_cc,
-canadianbi_cc,
-canadianfr_cc,
-czech_cc,
-danish_cc,
-finnish_cc,
-french_cc,
-german_cc,
-greek_cc,
-hebrew_cc,
-hungary_cc,
-intl_cc,
-italian_cc,
-japan_cc,
-korean_cc,
-latam_cc,
-dutch_cc,
-norwegian_cc,
-persian_cc,
-poland_cc,
-portuguese_cc,
-russia_cc,
-slovakia_cc,
-spanish_cc,
-swedish_cc,
-swiss_fr_cc,
-swiss_ger_cc,
-swiss_cc,
-taiwan_cc,
-turkish_q_cc,
-uk_cc,
-us_cc,
-yugo_cc,
-turkish_f_cc
-};
-
-/* HID report descriptor parser string definitions */
-/* Item type strings */
-const char btype_main [] PROGMEM = "Main";
-const char btype_global [] PROGMEM = "Global";
-const char btype_local [] PROGMEM = "Local";
-const char btype_reserved [] PROGMEM = "Reserved";
-/* Item types strings array. Array index corresponds to bType */
-const char* btypes [] PROGMEM =
-{
- btype_main,
- btype_global,
- btype_local,
- btype_reserved
-};
-/* Main Item Tag Strings */
-const char main_tag_input [] PROGMEM = "Input\t\t";
-const char main_tag_output [] PROGMEM = "Output\t\t";
-const char main_tag_collection [] PROGMEM = "Collection\t\t";
-const char main_tag_feature [] PROGMEM = "Feature\t\t";
-const char main_tag_endcoll [] PROGMEM = "End Collection\t";
-/* Main Item Tags Strings Array */
-const char* maintags [] PROGMEM =
-{
- main_tag_input,
- main_tag_output,
- main_tag_collection,
- main_tag_feature,
- main_tag_endcoll
-};
-/* Global Item Tag Strings */
-const char global_tag_usagepage [] PROGMEM = "Usage Page\t\t";
-const char global_tag_logmin [] PROGMEM = "Logical Minimum\t";
-const char global_tag_logmax [] PROGMEM = "Logical Maximum\t";
-const char global_tag_physmin [] PROGMEM = "Physical Minimum\t";
-const char global_tag_physmax [] PROGMEM = "Physical Maximum\t";
-const char global_tag_unitexp [] PROGMEM = "Unit Exponent\t";
-const char global_tag_unit [] PROGMEM = "Unit\t\t";
-const char global_tag_repsize [] PROGMEM = "Report Size\t";
-const char global_tag_repid [] PROGMEM = "Report ID\t\t";
-const char global_tag_repcount [] PROGMEM = "Report Count\t";
-const char global_tag_push [] PROGMEM = "Push\t\t";
-const char global_tag_pop [] PROGMEM = "Pop\t\t";
-/* Global Item Tag Strings Array */
-const char* globaltags [] PROGMEM =
-{
- global_tag_usagepage,
- global_tag_logmin,
- global_tag_logmax,
- global_tag_physmin,
- global_tag_physmax,
- global_tag_unitexp,
- global_tag_unit,
- global_tag_repsize,
- global_tag_repid,
- global_tag_repcount,
- global_tag_push,
- global_tag_pop
-};
-/* Local Item Tag Strings */
-const char local_tag_usage [] PROGMEM = "Usage\t\t";
-const char local_tag_usagemin [] PROGMEM = "Usage Minimum\t";
-const char local_tag_usagemax [] PROGMEM = "Usage Maximum\t";
-const char local_tag_desidx [] PROGMEM = "Designator Index\t";
-const char local_tag_desmin [] PROGMEM = "Designator Minimum\t";
-const char local_tag_desmax [] PROGMEM = "Designator Maximum\t";
-const char local_tag_stridx [] PROGMEM = "String Index\t";
-const char local_tag_strmin [] PROGMEM = "String Minimum\t";
-const char local_tag_strmax [] PROGMEM = "String Maximum\t";
-const char local_tag_delimiter [] PROGMEM = "Delimiter\t";
-/* Local Item Tag Strings Array */
-const char* localtags [] PROGMEM =
-{
- local_tag_usage,
- local_tag_usagemin,
- local_tag_usagemax,
- local_tag_desidx,
- local_tag_desmin,
- local_tag_desmax,
- local_tag_stridx,
- local_tag_strmin,
- local_tag_strmax,
- local_tag_delimiter
-};
-/* Collection Types Strings */
-const char coll_phy [] PROGMEM = "Physical (group of axes)";
-const char coll_app [] PROGMEM = "Application (mouse, keyboard)";
-const char coll_log [] PROGMEM = "Logical (interrelated data)";
-const char coll_rep [] PROGMEM = "Report";
-const char coll_arr [] PROGMEM = "Named Array";
-const char coll_usw [] PROGMEM = "Usage Switch";
-const char coll_umod [] PROGMEM = "Usage Modifier";
-/* Collection Types Strings Array */
-const char* collections [] PROGMEM =
-{
- coll_phy,
- coll_app,
- coll_log,
- coll_rep,
- coll_arr,
- coll_usw,
- coll_umod
-};
-/* Usage Pages Strings */
-const char up_undef [] PROGMEM = "Undefined";
-const char up_gendesk [] PROGMEM = "Generic Desktop Controls";
-const char up_sim [] PROGMEM = "Simulation Controls";
-const char up_vr [] PROGMEM = "VR Controls";
-const char up_sport [] PROGMEM = "Sport Controls";
-const char up_game [] PROGMEM = "Game Controls";
-const char up_gendev [] PROGMEM = "Generic Device Controls";
-const char up_kbd [] PROGMEM = "Keyboard/Keypad";
-const char up_led [] PROGMEM = "LEDs";
-const char up_button [] PROGMEM = "Button";
-const char up_ord [] PROGMEM = "Ordinal";
-const char up_tele [] PROGMEM = "Telephony";
-const char up_cons [] PROGMEM = "Consumer";
-const char up_dig [] PROGMEM = "Digitizer";
-//const char up_res [] PROGMEM = "Reserved";
-const char up_pid [] PROGMEM = "PID Page";
-const char up_uni [] PROGMEM = "Unicode";
-/* Usage Pages Strings Array */
-const char * usage_pages [] PROGMEM =
-{
- up_undef,
- up_gendesk,
- up_sim,
- up_vr,
- up_sport,
- up_game,
- up_gendev,
- up_kbd,
- up_led,
- up_button,
- up_ord,
- up_tele,
- up_cons,
- up_dig,
- reserved_msg,
- up_pid,
- up_uni
-};
-
-#endif //_DESCRIPTOR_PARSER_
diff --git a/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.pde b/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.pde
deleted file mode 100644
index d417e76..0000000
--- a/USB_Host_Shield/examples/descriptor_parser/descriptor_parser.pde
+++ /dev/null
@@ -1,720 +0,0 @@
-/* MAX3421E USB Host controller configuration descriptor parser */
-#include <Spi.h>
-#include <Max3421e.h>
-#include <Usb.h>
-#include "descriptor_parser.h"
-
-#define LOBYTE(x) ((char*)(&(x)))[0]
-#define HIBYTE(x) ((char*)(&(x)))[1]
-#define BUFSIZE 256 //buffer size
-#define DEVADDR 1
-
-#define getReportDescr( addr, ep, nbytes, parse_func, nak_limit ) ctrlXfer( addr, ep, bmREQ_HIDREPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, HID_DESCRIPTOR_REPORT, 0x0000, nbytes, parse_func, nak_limit )
-#define getReport( addr, ep, nbytes, interface, report_type, report_id, parse_func, nak_limit ) ctrlXfer( addr, ep, bmREQ_HIDIN, HID_REQUEST_GET_REPORT, report_id, report_type, interface, nbytes, parse_func, nak_limit )
-
-/* Foeward declarations */
-void setup();
-void loop();
-byte ctrlXfer( byte addr, byte ep, byte bmReqType, byte bRequest, byte wValLo, byte wValHi, unsigned int wInd, uint16_t nbytes, PARSE parse_func, uint16_t nak_limit );
-void HIDreport_parse( uint8_t* buf, uint8_t* head, uint8_t* tail);
-
-typedef struct {
- uint8_t bDescriptorType;
- uint16_t wDescriptorLength;
-} HID_CLASS_DESCRIPTOR;
-
-
-//typedef void (*PARSE)( int8_t*, int8_t*, int8_t );
-
-MAX3421E Max;
-USB Usb;
-
-void setup()
-{
- Serial.begin( 115200 );
- printProgStr(PSTR("\r\nStart"));
- Max.powerOn();
- delay( 200 );
-}
-
-void loop()
-{
- uint8_t rcode;
- uint8_t tmpbyte = 0;
- //PARSE pf = &HIDreport_parse;
- /**/
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() >= USB_STATE_CONFIGURING ) { //state configuring or higher
- /* printing device descriptor */
- printProgStr(PSTR("\r\nDevice addressed... "));
- printProgStr(PSTR("Requesting device descriptor."));
- tmpbyte = getdevdescr( DEVADDR ); //number of configurations, 0 if error
- if( tmpbyte == 0 ) {
- printProgStr(PSTR("\r\nDevice descriptor cannot be retrieved. Program Halted\r\n"));
- while( 1 ); //stop
- }//if( tmpbyte
- /* print configuration descriptors for all configurations */
- for( uint8_t i = 0; i < tmpbyte; i++ ) {
- getconfdescr( DEVADDR, i );
- }
- /* Stop */
- while( 1 ); //stop
- }
-}
-
-/* Prints device descriptor. Returns number of configurations or zero if request error occured */
-byte getdevdescr( byte addr )
-{
- USB_DEVICE_DESCRIPTOR buf;
- byte rcode;
- //Max.toggle( BPNT_0 );
- rcode = Usb.getDevDescr( addr, 0, 0x12, ( char *)&buf );
- if( rcode ) {
- printProgStr( rcode_error_msg );
- print_hex( rcode, 8 );
- return( 0 );
- }
- printProgStr(PSTR("\r\nDevice descriptor: \r\n"));
- //Descriptor length
- printProgStr( descr_len );
- print_hex( buf.bLength, 8 );
- //Descriptor type
-// printProgStr( descr_type );
-// print_hex( buf.bDescriptorType, 8 );
-// printProgStr( descrtype_parse( buf.bDescriptorType ));
- //USB Version
- printProgStr(PSTR("\r\nUSB version:\t\t"));
- Serial.print(( HIBYTE( buf.bcdUSB )), HEX );
- Serial.print(".");
- Serial.print(( LOBYTE( buf.bcdUSB )), HEX );
- //Device class
- printProgStr( class_str );
- print_hex( buf.bDeviceClass, 8 );
- printProgStr( classname_parse( buf.bDeviceClass ));
- //Device Subclass
- printProgStr( subclass_str );
- print_hex( buf.bDeviceSubClass, 8 );
- //Device Protocol
- printProgStr( protocol_str );
- print_hex( buf.bDeviceProtocol, 8 );
- //Max.packet size
- printProgStr( maxpktsize_str );
- print_hex( buf.bMaxPacketSize0, 8 );
- //VID
- printProgStr(PSTR("\r\nVendor ID:\t\t"));
- print_hex( buf.idVendor, 16 );
- //PID
- printProgStr(PSTR("\r\nProduct ID:\t\t"));
- print_hex( buf.idProduct, 16 );
- //Revision
- printProgStr(PSTR("\r\nRevision ID:\t\t"));
- print_hex( buf.bcdDevice, 16 );
- //Mfg.string
- printProgStr (PSTR("\r\nMfg.string index:\t"));
- print_hex( buf.iManufacturer, 8 );
- getstrdescr( addr, buf.iManufacturer );
- //Prod.string
- printProgStr(PSTR("\r\nProd.string index:\t"));
- print_hex( buf.iProduct, 8 );
- //printProgStr( str_cont );
- getstrdescr( addr, buf.iProduct );
- //Serial number string
- printProgStr(PSTR("\r\nSerial number index:\t"));
- print_hex( buf.iSerialNumber, 8 );
- //printProgStr( str_cont );
- getstrdescr( addr, buf.iSerialNumber );
- //Number of configurations
- printProgStr(PSTR("\r\nNumber of conf.:\t"));
- print_hex( buf.bNumConfigurations, 8 );
- return( buf.bNumConfigurations );
-}
-/* Get string descriptor. Takes device address and string index */
-byte getstrdescr( byte addr, byte idx )
-{
- char buf[ BUFSIZE ];
- byte rcode;
- byte length;
- byte i;
- unsigned int langid;
- if( idx == 0 ) { //don't try to get index zero
- return( 0 );
- }
- rcode = Usb.getStrDescr( addr, 0, 1, 0, 0, buf ); //get language table length
- if( rcode ) {
- printProgStr(PSTR("\r\nError retrieving LangID table length"));
- return( rcode );
- }
- length = buf[ 0 ]; //length is the first byte
- rcode = Usb.getStrDescr( addr, 0, length, 0, 0, buf ); //get language table
- if( rcode ) {
- printProgStr(PSTR("\r\nError retrieving LangID table"));
- return( rcode );
- }
- HIBYTE( langid ) = buf[ 3 ]; //get first langid
- LOBYTE( langid ) = buf[ 2 ]; //bytes are swapped to account for endiannes
- //printProgStr(PSTR("\r\nLanguage ID: "));
- //print_hex( langid, 16 );
- rcode = Usb.getStrDescr( addr, 0, 1, idx, langid, buf );
- if( rcode ) {
- printProgStr(PSTR("\r\nError retrieving string length"));
- return( rcode );
- }
- length = ( buf[ 0 ] < 254 ? buf[ 0 ] : 254 );
- printProgStr(PSTR(" Length: "));
- Serial.print( length, DEC );
- rcode = Usb.getStrDescr( addr, 0, length, idx, langid, buf );
- if( rcode ) {
- printProgStr(PSTR("\r\nError retrieveing string"));
- return( rcode );
- }
- printProgStr(PSTR(" Contents: "));
- for( i = 2; i < length; i+=2 ) {
- Serial.print( buf[ i ] );
- }
- return( idx );
-}
-/* Returns string to class name */
-const char* classname_parse( byte class_number )
-{
- switch( class_number ) {
- case 0x00:
- return PSTR(" Use class information in the Interface Descriptor");
- case 0x01:
- return PSTR(" Audio");
- case 0x02:
- return PSTR(" Communications and CDC Control");
- case 0x03:
- return PSTR(" HID (Human Interface Device)");
- case 0x05:
- return PSTR(" Physical");
- case 0x06:
- return PSTR(" Image");
- case 0x07:
- return PSTR(" Printer");
- case 0x08:
- return PSTR(" Mass Storage");
- case 0x09:
- return PSTR(" Hub");
- case 0x0a:
- return PSTR(" CDC-Data");
- case 0x0b:
- return PSTR(" Smart Card");
- case 0x0d:
- return PSTR(" Content Security");
- case 0x0e:
- return PSTR(" Video");
- case 0x0f:
- return PSTR(" Personal Healthcare");
- case 0xdc:
- return PSTR("Diagnostic Device");
- case 0xe0:
- return PSTR(" Wireless Controller");
- case 0xef:
- return PSTR(" Miscellaneous");
- case 0xfe:
- return PSTR(" Application Specific");
- case 0xff:
- return PSTR(" Vendor Specific");
- default:
- return unk_msg;
- }//switch( class_number
-}
-/* Getting configuration descriptor */
-byte getconfdescr( byte addr, byte conf )
-{
- char buf[ BUFSIZE ];
- char* buf_ptr = buf;
- byte rcode;
- byte descr_length;
- byte descr_type;
- unsigned int total_length;
- printProgStr(PSTR("\r\n\nConfiguration number "));
- Serial.print( conf, HEX );
- rcode = Usb.getConfDescr( addr, 0, 4, conf, buf ); //get total length
- if( rcode ) {
- printProgStr(PSTR("Error retrieving configuration length. Error code "));
- Serial.println( rcode, HEX );
- return( 0 );
- }//if( rcode
- LOBYTE( total_length ) = buf[ 2 ];
- HIBYTE( total_length ) = buf[ 3 ];
- printProgStr(PSTR("\r\nTotal configuration length: "));
- Serial.print( total_length, DEC );
- printProgStr(PSTR(" bytes"));
- if( total_length > BUFSIZE ) { //check if total length is larger than buffer
- printProgStr(PSTR("Total length truncated to "));
- Serial.print( BUFSIZE, DEC);
- printProgStr(PSTR("bytes"));
- total_length = BUFSIZE;
- }
- rcode = Usb.getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor
- while( buf_ptr < buf + total_length ) { //parsing descriptors
- descr_length = *( buf_ptr );
- descr_type = *( buf_ptr + 1 );
- switch( descr_type ) {
- case( USB_DESCRIPTOR_CONFIGURATION ):
- printconfdescr( buf_ptr );
- break;
- case( USB_DESCRIPTOR_INTERFACE ):
- printintfdescr( buf_ptr );
- break;
- case( USB_DESCRIPTOR_ENDPOINT ):
- printepdescr( buf_ptr );
- break;
- case( HID_DESCRIPTOR_HID ):
- printhid_descr( buf_ptr );
- break;
- default:
- printunkdescr( buf_ptr );
- break;
- }//switch( descr_type
- Serial.println("");
- buf_ptr = ( buf_ptr + descr_length ); //advance buffer pointer
- }//while( buf_ptr <=...
- return( 0 );
-}
-/* function to print configuration descriptor */
-void printconfdescr( char* descr_ptr )
-{
- USB_CONFIGURATION_DESCRIPTOR* conf_ptr = ( USB_CONFIGURATION_DESCRIPTOR* )descr_ptr;
- uint8_t tmpbyte;
- printProgStr(PSTR("\r\n\nConfiguration descriptor:"));
- printProgStr(PSTR("\r\nTotal length:\t\t"));
- print_hex( conf_ptr->wTotalLength, 16 );
- printProgStr(PSTR("\r\nNumber of interfaces:\t"));
- print_hex( conf_ptr->bNumInterfaces, 8 );
- printProgStr(PSTR("\r\nConfiguration value:\t"));
- print_hex( conf_ptr->bConfigurationValue, 8 );
- printProgStr(PSTR("\r\nConfiguration string:\t"));
- tmpbyte = conf_ptr->iConfiguration;
- print_hex( tmpbyte, 8 );
- getstrdescr( DEVADDR, tmpbyte );
- printProgStr(PSTR("\r\nAttributes:\t\t"));
- tmpbyte = conf_ptr->bmAttributes;
- print_hex( tmpbyte, 8 );
- if( tmpbyte & 0x40 ) { //D6
- printProgStr(PSTR(" Self-powered"));
- }
- if( tmpbyte & 0x20 ) { //D5
- printProgStr(PSTR(" Remote Wakeup"));
- }
- printProgStr(PSTR("\r\nMax.power:\t\t"));
- tmpbyte = conf_ptr->bMaxPower;
- print_hex( tmpbyte, 8 );
- printProgStr(PSTR(" "));
- Serial.print(( tmpbyte * 2 ), DEC);
- printProgStr(PSTR("ma"));
- return;
-}
-/* function to print interface descriptor */
-void printintfdescr( char* descr_ptr )
-{
- USB_INTERFACE_DESCRIPTOR* intf_ptr = ( USB_INTERFACE_DESCRIPTOR* )descr_ptr;
- uint8_t tmpbyte;
- printProgStr(PSTR("\r\nInterface descriptor:"));
- printProgStr(PSTR("\r\nInterface number:\t"));
- print_hex( intf_ptr->bInterfaceNumber, 8 );
- printProgStr(PSTR("\r\nAlternate setting:\t"));
- print_hex( intf_ptr->bAlternateSetting, 8 );
- printProgStr(PSTR("\r\nEndpoints:\t\t"));
- print_hex( intf_ptr->bNumEndpoints, 8 );
- printProgStr( class_str );
- tmpbyte = intf_ptr->bInterfaceClass;
- print_hex( tmpbyte, 8 );
- printProgStr(classname_parse( tmpbyte ));
- printProgStr( subclass_str );
- print_hex( intf_ptr->bInterfaceSubClass, 8 );
- printProgStr( protocol_str );
- print_hex( intf_ptr->bInterfaceProtocol, 8 );
- printProgStr(PSTR("\r\nInterface string:\t"));
- tmpbyte = intf_ptr->iInterface;
- print_hex( tmpbyte, 8 );
- getstrdescr( DEVADDR, tmpbyte );
- return;
-}
-/* function to print endpoint descriptor */
-void printepdescr( char* descr_ptr )
-{
- USB_ENDPOINT_DESCRIPTOR* ep_ptr = ( USB_ENDPOINT_DESCRIPTOR* )descr_ptr;
- uint8_t tmpbyte;
- printProgStr(PSTR("\r\nEndpoint descriptor:"));
- printProgStr(PSTR("\r\nEndpoint address:\t"));
- tmpbyte = ep_ptr->bEndpointAddress;
- print_hex( tmpbyte & 0x0f, 8 );
- printProgStr(PSTR(" Direction: "));
- ( tmpbyte & 0x80 ) ? printProgStr(PSTR("IN")) : printProgStr(PSTR("OUT"));
- printProgStr(PSTR("\r\nAttributes:\t\t"));
- tmpbyte = ep_ptr->bmAttributes;
- print_hex( tmpbyte, 8 );
- printProgStr(PSTR(" Transfer type: "));
- printProgStr((char*)pgm_read_word(&transfer_types[(tmpbyte & 0x03)]));
- if(( tmpbyte & 0x03 ) == 1 ) { //Isochronous Transfer
- printProgStr(PSTR(", Sync Type: "));
- printProgStr((char*)pgm_read_word(&sync_types[(tmpbyte & 0x0c)]));
- printProgStr(PSTR(", Usage Type: "));
- printProgStr((char*)pgm_read_word(&usage_types[(tmpbyte & 0x30)]));
- }//if( tmpbyte & 0x01
- printProgStr( maxpktsize_str );
- print_hex( ep_ptr->wMaxPacketSize, 16 );
- printProgStr(PSTR("\r\nPolling interval:\t"));
- tmpbyte = ep_ptr->bInterval;
- print_hex( tmpbyte, 8 );
- printProgStr(PSTR(" "));
- Serial.print( tmpbyte, DEC );
- printProgStr(PSTR(" ms"));
- return;
-}
-/* function to print HID descriptor */
-void printhid_descr( char* descr_ptr )
-{
- PARSE pf = &HIDreport_parse;
- USB_HID_DESCRIPTOR* hid_ptr = ( USB_HID_DESCRIPTOR* )descr_ptr;
- uint8_t tmpbyte;
- /**/
- printProgStr(PSTR("\r\nHID descriptor:"));
- printProgStr(PSTR("\r\nDescriptor length:\t"));
- tmpbyte = hid_ptr->bLength;
- print_hex( tmpbyte, 8 );
- printProgStr(PSTR(" "));
- Serial.print( tmpbyte, DEC );
- printProgStr(PSTR(" bytes"));
- printProgStr(PSTR("\r\nHID version:\t\t"));
- Serial.print(( HIBYTE( hid_ptr->bcdHID )), HEX );
- Serial.print(".");
- Serial.print(( LOBYTE( hid_ptr->bcdHID )), HEX );
- tmpbyte = hid_ptr->bCountryCode;
- printProgStr(PSTR("\r\nCountry Code:\t\t"));
- Serial.print( tmpbyte, DEC );
- printProgStr(PSTR(" "));
- ( tmpbyte > 35 ) ? printProgStr(PSTR("Reserved")) : printProgStr((char*)pgm_read_word(&HID_Country_Codes[ tmpbyte ]));
- tmpbyte = hid_ptr->bNumDescriptors;
- printProgStr(PSTR("\r\nClass Descriptors:\t"));
- Serial.print( tmpbyte, DEC );
- //Printing class descriptors
- descr_ptr += 6; //advance buffer pointer
- for( uint8_t i = 0; i < tmpbyte; i++ ) {
- uint8_t tmpdata;
- HID_CLASS_DESCRIPTOR* hidclass_ptr = ( HID_CLASS_DESCRIPTOR* )descr_ptr;
- tmpdata = hidclass_ptr->bDescriptorType;
- printProgStr(PSTR("\r\nClass Descriptor Type:\t"));
- Serial.print( tmpdata, HEX );
- if(( tmpdata < 0x21 ) || ( tmpdata > 0x2f )) {
- printProgStr(PSTR(" Invalid"));
- }
- switch( tmpdata ) {
- case 0x21:
- printProgStr(PSTR(" HID"));
- break;
- case 0x22:
- printProgStr(PSTR(" Report"));
- break;
- case 0x23:
- printProgStr(PSTR(" Physical"));
- break;
- default:
- printProgStr(PSTR(" Reserved"));
- break;
- }//switch( tmpdata
- printProgStr(PSTR("\r\nClass Descriptor Length:"));
- Serial.print( hidclass_ptr->wDescriptorLength );
- printProgStr(PSTR(" bytes"));
- printProgStr(PSTR("\r\n\nHID report descriptor:\r\n"));
- getReportDescr( DEVADDR, 0 , hidclass_ptr->wDescriptorLength, pf, USB_NAK_LIMIT );
- descr_ptr += 3; //advance to the next record
- }//for( uint8_t i=...
- return;
-}
-/*function to print unknown descriptor */
-void printunkdescr( char* descr_ptr )
-{
- byte length = *descr_ptr;
- byte i;
- printProgStr(PSTR("\r\nUnknown descriptor:"));
- printProgStr(PSTR("Length:\t\t"));
- print_hex( *descr_ptr, 8 );
- printProgStr(PSTR("\r\nType:\t\t"));
- print_hex( *(descr_ptr + 1 ), 8 );
- printProgStr(PSTR("\r\nContents:\t"));
- descr_ptr += 2;
- for( i = 0; i < length; i++ ) {
- print_hex( *descr_ptr, 8 );
- descr_ptr++;
- }
-}
-/* Control-IN transfer with callback. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer */
-/* Control, data, and setup stages combined from standard USB library to be able to read large data blocks. Restricted to control-IN transfers with data stage */
-/* data read and MAX3421E RECV FIFO buffer release shall be performed by parse_func callback */
-/* return codes: */
-/* 00 = success */
-/* 01-0f = non-zero HRSLT */
-byte ctrlXfer( byte addr, byte ep, byte bmReqType, byte bRequest, byte wValLo, byte wValHi, unsigned int wInd, uint16_t nbytes, PARSE parse_func, uint16_t nak_limit = USB_NAK_LIMIT )
-{
- byte rcode;
- SETUP_PKT sp;
- EP_RECORD* ep_rec = Usb.getDevTableEntry( addr, ep );
- byte pktsize;
- byte maxpktsize = ep_rec->MaxPktSize;
- unsigned int xfrlen = 0;
- /**/
- Max.regWr( rPERADDR, addr ); //set peripheral address
- /* fill in setup packet */
- sp.ReqType_u.bmRequestType = bmReqType;
- sp.bRequest = bRequest;
- sp.wVal_u.wValueLo = wValLo;
- sp.wVal_u.wValueHi = wValHi;
- sp.wIndex = wInd;
- sp.wLength = nbytes;
- Max.bytesWr( rSUDFIFO, 8, ( char *)&sp ); //transfer to setup packet FIFO
- rcode = Usb.dispatchPkt( tokSETUP, ep, nak_limit ); //dispatch packet
- //Serial.println("Setup packet"); //DEBUG
- if( rcode ) { //return HRSLT if not zero
- printProgStr(PSTR("\r\nSetup packet error: "));
- Serial.print( rcode, HEX );
- return( rcode );
- }
- /* Data stage */
- //ep_rec->rcvToggle = bmRCVTOG1;
- Max.regWr( rHCTL, bmRCVTOG1 ); //set toggle
- while( 1 ) { //exited by break
- /* request data */
- rcode = Usb.dispatchPkt( tokIN, ep, nak_limit );
- if( rcode ) {
- printProgStr(PSTR("\r\nData Stage Error: "));
- Serial.print( rcode, HEX );
- return( rcode );
- }
- /* check for RCVDAVIRQ and generate error if not present */
- /* the only case when absense of RCVDAVIRQ makes sense is when toggle error occured. Need to add handling for that */
- if(( Max.regRd( rHIRQ ) & bmRCVDAVIRQ ) == 0 ) {
- printProgStr(PSTR("\r\nData Toggle error."));
- return ( 0xf0 );
- }
- pktsize = Max.regRd( rRCVBC ); //get received bytes count
- parse_func( pktsize ); //call parse function. Parse is expected to read the FIFO completely
- Max.regWr( rHIRQ, bmRCVDAVIRQ ); // Clear the IRQ & free the buffer
- xfrlen += pktsize; // add this packet's byte count to total transfer length
- /* The transfer is complete under two conditions: */
- /* 1. The device sent a short packet (L.T. maxPacketSize) */
- /* 2. 'nbytes' have been transferred. */
- if (( pktsize < maxpktsize ) || (xfrlen >= nbytes )) { // have we transferred 'nbytes' bytes?
- break;
- }
- }//while( 1 )
- rcode = Usb.dispatchPkt( tokOUTHS, ep, nak_limit );
- if( rcode ) { //return error
- printProgStr(PSTR("Status packet error: "));
- Serial.print( rcode, HEX );
- }
- return( rcode );
-}
-/* Parses bitfields in main items */
-void print_mainbitfield( uint8_t byte_toparse )
-{
- ( byte_toparse & 0x01 ) ? printProgStr(PSTR("Constant,")) : printProgStr(PSTR("Data,")); //bit 0
- ( byte_toparse & 0x02 ) ? printProgStr(PSTR("Variable,")) : printProgStr(PSTR("Array,")); //bit 1
- ( byte_toparse & 0x04 ) ? printProgStr(PSTR("Relative,")) : printProgStr(PSTR("Absolute,")); //...
- ( byte_toparse & 0x08 ) ? printProgStr(PSTR("Wrap,")) : printProgStr(PSTR("No Wrap,"));
- ( byte_toparse & 0x10 ) ? printProgStr(PSTR("Non Linear,")) : printProgStr(PSTR("Linear,"));
- ( byte_toparse & 0x20 ) ? printProgStr(PSTR("No preferred,")) : printProgStr(PSTR("Preferred State,"));
- ( byte_toparse & 0x40 ) ? printProgStr(PSTR("Null State,")) : printProgStr(PSTR("No Null Position,")); //bit 6
- ( byte_toparse & 0x40 ) ? printProgStr(PSTR("Volatile( ignore for Input),")) : printProgStr(PSTR("Non-volatile(Ignore for Input),")); //bit 7
-}
-/* HID Report Desriptor Parser Callback */
-/* called repeatedly from Control transfer function */
-void HIDreport_parse( uint8_t pkt_size )
-{
-#define B_SIZE 0x03 //bSize bitmask
-#define B_TYPE 0x0c //bType bitmask
-#define B_TAG 0xf0 //bTag bitmask
- /* parser states */
- enum STATE { ITEM_START, DATA_PARSE };
- static STATE state = ITEM_START;
- static uint8_t databytes_left = 0;
- static uint8_t prefix; //item prefix - type and tag
- uint8_t byte_toparse;
- uint8_t bType;
- uint8_t tmpbyte;
- /**/
- while( 1 ) {
- if( pkt_size ) {
- byte_toparse = Max.regRd( rRCVFIFO ); //read a byte from FIFO
- pkt_size--;
- }
- else {
- return; //all bytes read
- }
- switch( state ) {
- case ITEM_START: //start of the record
- prefix = byte_toparse >>2; //store prefix for databyte parsing
- tmpbyte = byte_toparse & B_SIZE;
- /* get item length */
- ( tmpbyte == 0x03 ) ? databytes_left = 4 : databytes_left = tmpbyte;
- if( databytes_left ) {
- state = DATA_PARSE; //read bytes after prefix
- }
- printProgStr(PSTR("\r\nLength: "));
- Serial.print( databytes_left, DEC );
- /* get item type */
- bType = ( byte_toparse & B_TYPE ) >>2;
- printProgStr(PSTR(" Type: "));
- printProgStr((char*)pgm_read_word(&btypes[ bType ]));
- /* get item tag */
- printProgStr(PSTR("\t\tTag: "));
- tmpbyte = ( byte_toparse & B_TAG ) >>4 ;
- switch( bType ) {
- case 0: //Main
- if( tmpbyte < 0x08 ) {
- printProgStr(PSTR("Invalid Tag"));
- }
- else if( tmpbyte > 0x0c ) {
- printProgStr( reserved_msg );
- }
- else {
- printProgStr((char*)pgm_read_word(&maintags[ tmpbyte - 8 /* & 0x03 */]));
- //Serial.print("Byte: ");
- //Serial.println( tmpbyte, HEX );
- }
- break;//case 0 Main
- case 1: //Global
- ( tmpbyte > 0x0b ) ? printProgStr( reserved_msg ) : printProgStr((char*)pgm_read_word(&globaltags[ tmpbyte ]));
- break;//case 1 Global
- case 2: //Local
- ( tmpbyte > 0x0a ) ? printProgStr( reserved_msg ) : printProgStr((char*)pgm_read_word(&localtags[ tmpbyte ]));
- break;//case 2 Local
- default:
- break;
- }//switch( bType...
- break;//case ITEM_START
- case DATA_PARSE:
- switch( prefix ) {
- case 0x20: //Main Input
- case 0x24: //Main Output
- case 0x2c: //Main Feature
- /* todo: add parsing 8th bit */
- print_mainbitfield( byte_toparse );
- break;
- case 0x28: //Main Collection
- if(( byte_toparse > 0x06 ) && ( byte_toparse < 0x80 )) {
- printProgStr( reserved_msg );
- }
- else if(( byte_toparse > 0x7f ) && ( byte_toparse <= 0xff )) {
- printProgStr(PSTR("Vendor-defined"));
- }
- else {
- printProgStr((char*)pgm_read_word(&collections[ byte_toparse ]));
- }
- break;//case 0x28 Main Collection
- //case 0x30: //Main End Collection
- case 0x01: //Global Usage Page
- switch( byte_toparse ) { //see HID Usage Tables doc v.1.12 page 14
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
- case 0x10:
- printProgStr((char*)pgm_read_word(&usage_pages[ byte_toparse ]));
- break;
- case 0x14:
- printProgStr(PSTR("Alphanumeric Display"));
- break;
- case 0x40:
- printProgStr(PSTR("Medical Instruments"));
- break;
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- printProgStr(PSTR("Monitor page"));
- break;
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- printProgStr(PSTR("Power page"));
- break;
- case 0x8c:
- printProgStr(PSTR("Bar Code Scanner page"));
- break;
- case 0x8d:
- printProgStr(PSTR("Scale page"));
- break;
- case 0x8e:
- printProgStr(PSTR("Magnetic Stripe Reading (MSR) Devices"));
- break;
- case 0x8f:
- printProgStr(PSTR("Reserved Point of Sale pages"));
- break;
- case 0x90:
- printProgStr(PSTR("Camera Control Page"));
- break;
- case 0x91:
- printProgStr(PSTR("Arcade Page"));
- break;
- default:
-// printProgStr(PSTR("Data: "));
-// print_hex( byte_toparse, 8 );
- //databytes_left--;
- break;
- }//switch case 0x01: //Global Usage Page
- }//switch( prefix ...
- printProgStr(PSTR(" Data: "));
- print_hex( byte_toparse, 8 );
- databytes_left--;
- if( !databytes_left ) {
- state = ITEM_START;
- }
- break;
- }//switch( state...
- }//while( 1 ...
-}
-/* prints hex numbers with leading zeroes */
-// copyright, Peter H Anderson, Baltimore, MD, Nov, '07
-// source: http://www.phanderson.com/arduino/arduino_display.html
-void print_hex(int v, int num_places)
-{
- int mask=0, n, num_nibbles, digit;
-
- for (n=1; n<=num_places; n++) {
- mask = (mask << 1) | 0x0001;
- }
- v = v & mask; // truncate v to specified number of places
-
- num_nibbles = num_places / 4;
- if ((num_places % 4) != 0) {
- ++num_nibbles;
- }
- do {
- digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
- Serial.print(digit, HEX);
- }
- while(--num_nibbles);
-}
-
-/* given a PROGMEM string, use Serial.print() to send it out */
-/* Some non-intuitive casting necessary: */
-/* printProgStr(PSTR("Func.Mode:\t0x")); */
-/* printProgStr((char*)pgm_read_word(&mtpopNames[(op & 0xFF)])); */
-void printProgStr(const char* str)
-{
- if(!str) {
- return;
- }
- char c;
- while((c = pgm_read_byte(str++))) {
- Serial.print(c,BYTE);
- }
- return;
-}