Archived
1
0

Finished USB for Teensy 3.1 (Now 3.1 compatible!)

This commit is contained in:
Jacob Alexander 2014-02-02 21:12:20 -08:00
parent 3fa9c16c04
commit 8263589e7e
7 changed files with 73 additions and 31 deletions

View File

@ -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 ) {

View File

@ -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
}

View File

@ -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"

View File

@ -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}
};

View File

@ -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)

View File

@ -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");

View File

@ -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
}