Finished USB for Teensy 3.1 (Now 3.1 compatible!)
This commit is contained in:
		
							parent
							
								
									3fa9c16c04
								
							
						
					
					
						commit
						8263589e7e
					
				
					 7 changed files with 73 additions and 31 deletions
				
			
		| 
						 | 
				
			
			@ -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 ) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 <avr/pgmspace.h>
 | 
			
		||||
#include "avr/usb_keyboard_debug.h"
 | 
			
		||||
 | 
			
		||||
#elif defined(_mk20dx128_)
 | 
			
		||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
 | 
			
		||||
 | 
			
		||||
#include "arm/usb_serial.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue