-/* 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
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);
}
// ARM
-#elif defined(_mk20dx128_)
+#elif defined(_mk20dx128_) || defined(_mk20dx256_)
// Error LED On (C5)
if ( on ) {
-/* 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
#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' )
usb_debug_putchar('\r');
usb_debug_putchar(c);
}
-#elif defined(_mk20dx128_) // ARM
+#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
usb_debug_putstr( (char*)s );
#endif
}
-/* 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
#include <avr/pgmspace.h>
#include "avr/usb_keyboard_debug.h"
-#elif defined(_mk20dx128_)
+#elif defined(_mk20dx128_) || defined(_mk20dx256_)
#include "arm/usb_serial.h"
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
{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}
};
#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
#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)
#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;
__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;
}
//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");
// 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
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
}