Finished USB for Teensy 3.1 (Now 3.1 compatible!)
This commit is contained in:
parent
3fa9c16c04
commit
8263589e7e
@ -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
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -42,7 +42,7 @@ inline void init_errorLED()
|
|||||||
DDRD |= (1<<6);
|
DDRD |= (1<<6);
|
||||||
|
|
||||||
// ARM
|
// ARM
|
||||||
#elif defined(_mk20dx128_)
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
|
||||||
|
|
||||||
// Setup pin - Pin 11 -> C5 - See Lib/pin_map.teensy3 for more details on pins
|
// 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);
|
PORTC_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1);
|
||||||
@ -68,7 +68,7 @@ inline void errorLED( uint8_t on )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ARM
|
// ARM
|
||||||
#elif defined(_mk20dx128_)
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
|
||||||
|
|
||||||
// Error LED On (C5)
|
// Error LED On (C5)
|
||||||
if ( on ) {
|
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
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* 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
|
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
|
||||||
while ( *s != '\0' )
|
while ( *s != '\0' )
|
||||||
usb_debug_putchar( *s++ );
|
usb_debug_putchar( *s++ );
|
||||||
#elif defined(_mk20dx128_) // ARM
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
|
||||||
// Count characters until NULL character, then send the amount counted
|
// Count characters until NULL character, then send the amount counted
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
while ( s[count] != '\0' )
|
while ( s[count] != '\0' )
|
||||||
@ -84,7 +84,7 @@ void _print(const char *s)
|
|||||||
usb_debug_putchar('\r');
|
usb_debug_putchar('\r');
|
||||||
usb_debug_putchar(c);
|
usb_debug_putchar(c);
|
||||||
}
|
}
|
||||||
#elif defined(_mk20dx128_) // ARM
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
|
||||||
usb_debug_putstr( (char*)s );
|
usb_debug_putstr( (char*)s );
|
||||||
#endif
|
#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
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -30,7 +30,7 @@
|
|||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "avr/usb_keyboard_debug.h"
|
#include "avr/usb_keyboard_debug.h"
|
||||||
|
|
||||||
#elif defined(_mk20dx128_)
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
|
||||||
|
|
||||||
#include "arm/usb_serial.h"
|
#include "arm/usb_serial.h"
|
||||||
|
|
||||||
|
@ -358,23 +358,30 @@ struct usb_string_descriptor_struct {
|
|||||||
uint16_t wString[];
|
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,
|
4,
|
||||||
3,
|
3,
|
||||||
{0x0409}
|
{0x0409}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_string_descriptor_struct string1 = {
|
struct usb_string_descriptor_struct usb_string_manufacturer_name_default = {
|
||||||
sizeof(STR_MANUFACTURER),
|
sizeof(STR_MANUFACTURER),
|
||||||
3,
|
3,
|
||||||
STR_MANUFACTURER
|
STR_MANUFACTURER
|
||||||
};
|
};
|
||||||
static struct usb_string_descriptor_struct string2 = {
|
struct usb_string_descriptor_struct usb_string_product_name_default = {
|
||||||
sizeof(STR_PRODUCT),
|
sizeof(STR_PRODUCT),
|
||||||
3,
|
3,
|
||||||
STR_PRODUCT
|
STR_PRODUCT
|
||||||
};
|
};
|
||||||
static struct usb_string_descriptor_struct string3 = {
|
struct usb_string_descriptor_struct usb_string_serial_number_default = {
|
||||||
sizeof(STR_SERIAL),
|
sizeof(STR_SERIAL),
|
||||||
3,
|
3,
|
||||||
STR_SERIAL
|
STR_SERIAL
|
||||||
@ -399,10 +406,10 @@ const usb_descriptor_list_t usb_descriptor_list[] = {
|
|||||||
{0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)},
|
{0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)},
|
||||||
{0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9},
|
{0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9},
|
||||||
#endif
|
#endif
|
||||||
{0x0300, 0x0000, (const uint8_t *)&string0, 4},
|
{0x0300, 0x0000, (const uint8_t *)&string0, 0},
|
||||||
{0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)},
|
{0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0},
|
||||||
{0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)},
|
{0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0},
|
||||||
{0x0303, 0x0409, (const uint8_t *)&string3, sizeof(STR_SERIAL)},
|
{0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0},
|
||||||
{0, 0, NULL, 0}
|
{0, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,16 +45,49 @@
|
|||||||
#define ENDPOINT_RECEIVE_ONLY 0x19
|
#define ENDPOINT_RECEIVE_ONLY 0x19
|
||||||
#define ENDPOINT_TRANSMIT_AND_RECEIVE 0x1D
|
#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
|
To modify a USB Type to have different interfaces, start in this
|
||||||
// computer unless the vendor or product ID numbers change, or the
|
file. Delete the XYZ_INTERFACE lines for any interfaces you
|
||||||
// "bcdDevice" revision code is increased.
|
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_CLASS 0xEF
|
||||||
#define DEVICE_SUBCLASS 0x02
|
#define DEVICE_SUBCLASS 0x02
|
||||||
#define DEVICE_PROTOCOL 0x01
|
#define DEVICE_PROTOCOL 0x01
|
||||||
#define EP0_SIZE 64
|
#define EP0_SIZE 64
|
||||||
#define NUM_ENDPOINTS 15
|
#define NUM_ENDPOINTS 6
|
||||||
|
#define NUM_USB_BUFFERS 30
|
||||||
#define NUM_INTERFACE 4
|
#define NUM_INTERFACE 4
|
||||||
#define CDC_IAD_DESCRIPTOR 1
|
#define CDC_IAD_DESCRIPTOR 1
|
||||||
#define CDC_STATUS_INTERFACE 0
|
#define CDC_STATUS_INTERFACE 0
|
||||||
@ -73,15 +106,20 @@
|
|||||||
#define MOUSE_ENDPOINT 5
|
#define MOUSE_ENDPOINT 5
|
||||||
#define MOUSE_SIZE 8
|
#define MOUSE_SIZE 8
|
||||||
#define MOUSE_INTERVAL 2
|
#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 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 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 ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY
|
||||||
#define ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY
|
#define ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY
|
||||||
#define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY
|
#define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY
|
||||||
#define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY
|
#define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY
|
||||||
#define ENDPOINT5_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)
|
// NUM_ENDPOINTS = number of non-zero endpoints (0 to 15)
|
||||||
|
@ -32,11 +32,8 @@
|
|||||||
#include "usb_dev.h"
|
#include "usb_dev.h"
|
||||||
#include "usb_mem.h"
|
#include "usb_mem.h"
|
||||||
|
|
||||||
#define NUM_BUF 30
|
|
||||||
|
|
||||||
__attribute__ ((section(".usbbuffers"), used))
|
__attribute__ ((section(".usbbuffers"), used))
|
||||||
//static unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)];
|
unsigned char usb_buffer_memory[NUM_USB_BUFFERS * sizeof(usb_packet_t)];
|
||||||
unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)];
|
|
||||||
|
|
||||||
static uint32_t usb_buffer_available = 0xFFFFFFFF;
|
static uint32_t usb_buffer_available = 0xFFFFFFFF;
|
||||||
|
|
||||||
@ -53,7 +50,7 @@ usb_packet_t * usb_malloc(void)
|
|||||||
__disable_irq();
|
__disable_irq();
|
||||||
avail = usb_buffer_available;
|
avail = usb_buffer_available;
|
||||||
n = __builtin_clz(avail); // clz = count leading zeros
|
n = __builtin_clz(avail); // clz = count leading zeros
|
||||||
if (n >= NUM_BUF) {
|
if (n >= NUM_USB_BUFFERS) {
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -82,7 +79,7 @@ void usb_free(usb_packet_t *p)
|
|||||||
|
|
||||||
//serial_print("free:");
|
//serial_print("free:");
|
||||||
n = ((uint8_t *)p - usb_buffer_memory) / sizeof(usb_packet_t);
|
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_phex(n);
|
||||||
//serial_print("\n");
|
//serial_print("\n");
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
// USB Includes
|
// USB Includes
|
||||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
|
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
|
||||||
#include "avr/usb_keyboard_debug.h"
|
#include "avr/usb_keyboard_debug.h"
|
||||||
#elif defined(_mk20dx128_)
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
|
||||||
#include "arm/usb_keyboard.h"
|
#include "arm/usb_keyboard.h"
|
||||||
#include "arm/usb_dev.h"
|
#include "arm/usb_dev.h"
|
||||||
#endif
|
#endif
|
||||||
@ -110,7 +110,7 @@ inline void usb_send(void)
|
|||||||
inline void output_firmwareReload()
|
inline void output_firmwareReload()
|
||||||
{
|
{
|
||||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
|
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
|
||||||
#elif defined(_mk20dx128_)
|
#elif defined(_mk20dx128_) || defined(_mk20dx256_)
|
||||||
usb_device_reload();
|
usb_device_reload();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user