From 8263589e7ee28c54c0d6e4a76bd59c5915606333 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 2 Feb 2014 21:12:20 -0800 Subject: [PATCH] Finished USB for Teensy 3.1 (Now 3.1 compatible!) --- Debug/led/led.c | 6 ++-- Debug/print/print.c | 6 ++-- Debug/print/print.h | 4 +-- Output/pjrcUSB/arm/usb_desc.c | 23 ++++++++++------ Output/pjrcUSB/arm/usb_desc.h | 52 ++++++++++++++++++++++++++++++----- Output/pjrcUSB/arm/usb_mem.c | 9 ++---- Output/pjrcUSB/output_com.c | 4 +-- 7 files changed, 73 insertions(+), 31 deletions(-) diff --git a/Debug/led/led.c b/Debug/led/led.c index e8a28cc..4ecff2a 100644 --- a/Debug/led/led.c +++ b/Debug/led/led.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2011 by Jacob Alexander +/* Copyright (C) 2011-2014 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,7 +42,7 @@ inline void init_errorLED() DDRD |= (1<<6); // ARM -#elif defined(_mk20dx128_) +#elif defined(_mk20dx128_) || defined(_mk20dx256_) // Setup pin - Pin 11 -> C5 - See Lib/pin_map.teensy3 for more details on pins PORTC_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); @@ -68,7 +68,7 @@ inline void errorLED( uint8_t on ) } // ARM -#elif defined(_mk20dx128_) +#elif defined(_mk20dx128_) || defined(_mk20dx256_) // Error LED On (C5) if ( on ) { diff --git a/Debug/print/print.c b/Debug/print/print.c index 4f765ac..5fcb97f 100644 --- a/Debug/print/print.c +++ b/Debug/print/print.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2011-2013 by Jacob Alexander +/* Copyright (C) 2011-2014 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -37,7 +37,7 @@ void usb_debug_putstr( char* s ) #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR while ( *s != '\0' ) usb_debug_putchar( *s++ ); -#elif defined(_mk20dx128_) // ARM +#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM // Count characters until NULL character, then send the amount counted uint32_t count = 0; while ( s[count] != '\0' ) @@ -84,7 +84,7 @@ void _print(const char *s) usb_debug_putchar('\r'); usb_debug_putchar(c); } -#elif defined(_mk20dx128_) // ARM +#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM usb_debug_putstr( (char*)s ); #endif } diff --git a/Debug/print/print.h b/Debug/print/print.h index 8a07baa..bf9aacd 100644 --- a/Debug/print/print.h +++ b/Debug/print/print.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2011-2013 by Jacob Alexander +/* Copyright (C) 2011-2014 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -30,7 +30,7 @@ #include #include "avr/usb_keyboard_debug.h" -#elif defined(_mk20dx128_) +#elif defined(_mk20dx128_) || defined(_mk20dx256_) #include "arm/usb_serial.h" diff --git a/Output/pjrcUSB/arm/usb_desc.c b/Output/pjrcUSB/arm/usb_desc.c index 51143e5..c5d9982 100644 --- a/Output/pjrcUSB/arm/usb_desc.c +++ b/Output/pjrcUSB/arm/usb_desc.c @@ -358,23 +358,30 @@ struct usb_string_descriptor_struct { uint16_t wString[]; }; -static struct usb_string_descriptor_struct string0 = { +extern struct usb_string_descriptor_struct usb_string_manufacturer_name + __attribute__ ((weak, alias("usb_string_manufacturer_name_default"))); +extern struct usb_string_descriptor_struct usb_string_product_name + __attribute__ ((weak, alias("usb_string_product_name_default"))); +extern struct usb_string_descriptor_struct usb_string_serial_number + __attribute__ ((weak, alias("usb_string_serial_number_default"))); + +struct usb_string_descriptor_struct string0 = { 4, 3, {0x0409} }; -static struct usb_string_descriptor_struct string1 = { +struct usb_string_descriptor_struct usb_string_manufacturer_name_default = { sizeof(STR_MANUFACTURER), 3, STR_MANUFACTURER }; -static struct usb_string_descriptor_struct string2 = { +struct usb_string_descriptor_struct usb_string_product_name_default = { sizeof(STR_PRODUCT), 3, STR_PRODUCT }; -static struct usb_string_descriptor_struct string3 = { +struct usb_string_descriptor_struct usb_string_serial_number_default = { sizeof(STR_SERIAL), 3, STR_SERIAL @@ -399,10 +406,10 @@ const usb_descriptor_list_t usb_descriptor_list[] = { {0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)}, {0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9}, #endif - {0x0300, 0x0000, (const uint8_t *)&string0, 4}, - {0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)}, - {0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)}, - {0x0303, 0x0409, (const uint8_t *)&string3, sizeof(STR_SERIAL)}, + {0x0300, 0x0000, (const uint8_t *)&string0, 0}, + {0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0}, + {0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0}, + {0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0}, {0, 0, NULL, 0} }; diff --git a/Output/pjrcUSB/arm/usb_desc.h b/Output/pjrcUSB/arm/usb_desc.h index 4703de7..acebf5f 100644 --- a/Output/pjrcUSB/arm/usb_desc.h +++ b/Output/pjrcUSB/arm/usb_desc.h @@ -45,16 +45,49 @@ #define ENDPOINT_RECEIVE_ONLY 0x19 #define ENDPOINT_TRANSMIT_AND_RECEIVE 0x1D -// Some operating systems, especially Windows, may cache USB device -// info. Changes to the device name may not update on the same -// computer unless the vendor or product ID numbers change, or the -// "bcdDevice" revision code is increased. +/* +To modify a USB Type to have different interfaces, start in this +file. Delete the XYZ_INTERFACE lines for any interfaces you +wish to remove, and copy them from another USB Type for any you +want to add. + +Give each interface a unique number, and edit NUM_INTERFACE to +reflect the number of interfaces. + +Within each interface, make sure it uses a unique set of endpoints. +Edit NUM_ENDPOINTS to be at least the largest endpoint number used. +Then edit the ENDPOINT*_CONFIG lines so each endpoint is configured +the proper way (transmit, receive, or both). + +The CONFIG_DESC_SIZE and any XYZ_DESC_OFFSET numbers must be +edited to the correct sizes. See usb_desc.c for the giant array +of bytes. Someday these may be done automatically..... (but how?) + +If you are using existing interfaces, the code in each file should +automatically adapt to the changes you specify. If you need to +create a new type of interface, you'll need to write the code which +sends and receives packets, and presents an API to the user. + +Finally, edit usb_inst.cpp, which creats instances of the C++ +objects for each combination. + +Some operating systems, especially Windows, may cache USB device +info. Changes to the device name may not update on the same +computer unless the vendor or product ID numbers change, or the +"bcdDevice" revision code is increased. + +If these instructions are missing steps or could be improved, please +let me know? http://forum.pjrc.com/forums/4-Suggestions-amp-Bug-Reports +*/ + + #define DEVICE_CLASS 0xEF #define DEVICE_SUBCLASS 0x02 #define DEVICE_PROTOCOL 0x01 #define EP0_SIZE 64 -#define NUM_ENDPOINTS 15 +#define NUM_ENDPOINTS 6 +#define NUM_USB_BUFFERS 30 #define NUM_INTERFACE 4 #define CDC_IAD_DESCRIPTOR 1 #define CDC_STATUS_INTERFACE 0 @@ -73,15 +106,20 @@ #define MOUSE_ENDPOINT 5 #define MOUSE_SIZE 8 #define MOUSE_INTERVAL 2 +#define JOYSTICK_INTERFACE 4 // Joystick +#define JOYSTICK_ENDPOINT 6 +#define JOYSTICK_SIZE 16 +#define JOYSTICK_INTERVAL 1 #define KEYBOARD_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9) #define MOUSE_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9) -#define CONFIG_DESC_SIZE (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7) +#define JOYSTICK_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7 + 9) +#define CONFIG_DESC_SIZE (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7 + 9+9+7) #define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY #define ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY #define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY #define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY #define ENDPOINT5_CONFIG ENDPOINT_TRANSIMIT_ONLY - +#define ENDPOINT6_CONFIG ENDPOINT_TRANSIMIT_ONLY // NUM_ENDPOINTS = number of non-zero endpoints (0 to 15) diff --git a/Output/pjrcUSB/arm/usb_mem.c b/Output/pjrcUSB/arm/usb_mem.c index 9793e56..8a909cf 100644 --- a/Output/pjrcUSB/arm/usb_mem.c +++ b/Output/pjrcUSB/arm/usb_mem.c @@ -32,11 +32,8 @@ #include "usb_dev.h" #include "usb_mem.h" -#define NUM_BUF 30 - __attribute__ ((section(".usbbuffers"), used)) -//static unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)]; -unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)]; +unsigned char usb_buffer_memory[NUM_USB_BUFFERS * sizeof(usb_packet_t)]; static uint32_t usb_buffer_available = 0xFFFFFFFF; @@ -53,7 +50,7 @@ usb_packet_t * usb_malloc(void) __disable_irq(); avail = usb_buffer_available; n = __builtin_clz(avail); // clz = count leading zeros - if (n >= NUM_BUF) { + if (n >= NUM_USB_BUFFERS) { __enable_irq(); return NULL; } @@ -82,7 +79,7 @@ void usb_free(usb_packet_t *p) //serial_print("free:"); n = ((uint8_t *)p - usb_buffer_memory) / sizeof(usb_packet_t); - if (n >= NUM_BUF) return; + if (n >= NUM_USB_BUFFERS) return; //serial_phex(n); //serial_print("\n"); diff --git a/Output/pjrcUSB/output_com.c b/Output/pjrcUSB/output_com.c index 78c797e..6e258dd 100644 --- a/Output/pjrcUSB/output_com.c +++ b/Output/pjrcUSB/output_com.c @@ -30,7 +30,7 @@ // USB Includes #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) #include "avr/usb_keyboard_debug.h" -#elif defined(_mk20dx128_) +#elif defined(_mk20dx128_) || defined(_mk20dx256_) #include "arm/usb_keyboard.h" #include "arm/usb_dev.h" #endif @@ -110,7 +110,7 @@ inline void usb_send(void) inline void output_firmwareReload() { #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) -#elif defined(_mk20dx128_) +#elif defined(_mk20dx128_) || defined(_mk20dx256_) usb_device_reload(); #endif }