Remove mbed files (#7605)
* Remove mbed files * Remove mbed files - fix comment * Remove mbed logic blocksmaster
parent
770a4ee729
commit
071eb2478f
|
@ -99,14 +99,6 @@ You can buy a really unique VID:PID here. I don't think you need this for person
|
||||||
- http://www.obdev.at/products/vusb/license.html
|
- http://www.obdev.at/products/vusb/license.html
|
||||||
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
||||||
|
|
||||||
## Cortex: `cstddef: No such file or directory`
|
|
||||||
GCC 4.8 of Ubuntu 14.04 had this problem and had to update to 4.9 with this PPA.
|
|
||||||
https://launchpad.net/~terry.guo/+archive/ubuntu/gcc-arm-embedded
|
|
||||||
|
|
||||||
https://github.com/tmk/tmk_keyboard/issues/212
|
|
||||||
https://github.com/tmk/tmk_keyboard/wiki/mbed-cortex-porting#compile-error-cstddef
|
|
||||||
https://developer.mbed.org/forum/mbed/topic/5205/
|
|
||||||
|
|
||||||
## BOOTLOADER_SIZE for AVR
|
## BOOTLOADER_SIZE for AVR
|
||||||
Note that Teensy2.0++ bootloader size is 2048byte. Some Makefiles may have wrong comment.
|
Note that Teensy2.0++ bootloader size is 2048byte. Some Makefiles may have wrong comment.
|
||||||
|
|
||||||
|
|
|
@ -99,15 +99,6 @@ Vous pouvez acheter un VID:PID unique ici. Je ne pense pas que ce soit nécessai
|
||||||
- http://www.obdev.at/products/vusb/license.html
|
- http://www.obdev.at/products/vusb/license.html
|
||||||
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
||||||
|
|
||||||
## Cortex: `cstddef: No such file or directory`
|
|
||||||
|
|
||||||
Ce problème existait avec le GCC 4.8 d'Ubuntu 14.04, la solution a nécessité de mettre à jour vers 4.9 avec ce PPA.
|
|
||||||
https://launchpad.net/~terry.guo/+archive/ubuntu/gcc-arm-embedded
|
|
||||||
|
|
||||||
https://github.com/tmk/tmk_keyboard/issues/212
|
|
||||||
https://github.com/tmk/tmk_keyboard/wiki/mbed-cortex-porting#compile-error-cstddef
|
|
||||||
https://developer.mbed.org/forum/mbed/topic/5205/
|
|
||||||
|
|
||||||
## BOOTLOADER_SIZE pour AVR
|
## BOOTLOADER_SIZE pour AVR
|
||||||
|
|
||||||
Notez que la taille du bootloader pour les Teensy2.0++ est de 2048bytes. Quelques Makefiles peuvent contenir une erreur et avoir le mauvais commentaire.
|
Notez que la taille du bootloader pour les Teensy2.0++ est de 2048bytes. Quelques Makefiles peuvent contenir une erreur et avoir le mauvais commentaire.
|
||||||
|
|
|
@ -68,14 +68,6 @@ https://github.com/tmk/tmk_keyboard/issues/150
|
||||||
- http://www.obdev.at/products/vusb/license.html
|
- http://www.obdev.at/products/vusb/license.html
|
||||||
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
||||||
|
|
||||||
## Cortex: `cstddef: No such file or directory`
|
|
||||||
在Ubuntu 14.04上的GCC 4.8 会出现这种问题需要用这个PPA升级到4.9。
|
|
||||||
https://launchpad.net/~terry.guo/+archive/ubuntu/gcc-arm-embedded
|
|
||||||
|
|
||||||
https://github.com/tmk/tmk_keyboard/issues/212
|
|
||||||
https://github.com/tmk/tmk_keyboard/wiki/mbed-cortex-porting#compile-error-cstddef
|
|
||||||
https://developer.mbed.org/forum/mbed/topic/5205/
|
|
||||||
|
|
||||||
## AVR的BOOTLOADER_SIZE
|
## AVR的BOOTLOADER_SIZE
|
||||||
注意Teensy2.0++ bootloader的大小是2048字节。有些Makefile注释错了。
|
注意Teensy2.0++ bootloader的大小是2048字节。有些Makefile注释错了。
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ tmk_core/protocol/bluefruit
|
||||||
tmk_core/protocol/chibios
|
tmk_core/protocol/chibios
|
||||||
tmk_core/protocol/iwrap
|
tmk_core/protocol/iwrap
|
||||||
tmk_core/protocol/lufa
|
tmk_core/protocol/lufa
|
||||||
tmk_core/protocol/mbed
|
|
||||||
tmk_core/protocol/midi
|
tmk_core/protocol/midi
|
||||||
tmk_core/protocol/midi/bytequeue
|
tmk_core/protocol/midi/bytequeue
|
||||||
tmk_core/protocol/midi/Config
|
tmk_core/protocol/midi/Config
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
#include "bootloader.h"
|
|
||||||
|
|
||||||
void bootloader_jump(void) {}
|
|
|
@ -1,5 +0,0 @@
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
void suspend_power_down(void) {}
|
|
||||||
bool suspend_wakeup_condition(void) { return true; }
|
|
||||||
void suspend_wakeup_init(void) {}
|
|
|
@ -1,23 +0,0 @@
|
||||||
#include "cmsis.h"
|
|
||||||
#include "timer.h"
|
|
||||||
|
|
||||||
/* Mill second tick count */
|
|
||||||
volatile uint32_t timer_count = 0;
|
|
||||||
|
|
||||||
/* Timer interrupt handler */
|
|
||||||
void SysTick_Handler(void) { timer_count++; }
|
|
||||||
|
|
||||||
void timer_init(void) {
|
|
||||||
timer_count = 0;
|
|
||||||
SysTick_Config(SystemCoreClock / 1000); /* 1ms tick */
|
|
||||||
}
|
|
||||||
|
|
||||||
void timer_clear(void) { timer_count = 0; }
|
|
||||||
|
|
||||||
uint16_t timer_read(void) { return (uint16_t)(timer_count & 0xFFFF); }
|
|
||||||
|
|
||||||
uint32_t timer_read32(void) { return timer_count; }
|
|
||||||
|
|
||||||
uint16_t timer_elapsed(uint16_t last) { return TIMER_DIFF_16(timer_read(), last); }
|
|
||||||
|
|
||||||
uint32_t timer_elapsed32(uint32_t last) { return TIMER_DIFF_32(timer_read32(), last); }
|
|
|
@ -1,50 +0,0 @@
|
||||||
#include <cstdarg>
|
|
||||||
//#include <stdarg.h>
|
|
||||||
#include "mbed.h"
|
|
||||||
#include "mbed/xprintf.h"
|
|
||||||
|
|
||||||
#define STRING_STACK_LIMIT 120
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
int __xprintf(const char* format, ...) { return 0; }
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* mbed Serial */
|
|
||||||
Serial ser(UART_TX, UART_RX);
|
|
||||||
|
|
||||||
/* TODO: Need small implementation for embedded */
|
|
||||||
int xprintf(const char* format, ...)
|
|
||||||
{
|
|
||||||
/* copy from mbed/common/RawSerial.cpp */
|
|
||||||
std::va_list arg;
|
|
||||||
va_start(arg, format);
|
|
||||||
int len = vsnprintf(NULL, 0, format, arg);
|
|
||||||
if (len < STRING_STACK_LIMIT) {
|
|
||||||
char temp[STRING_STACK_LIMIT];
|
|
||||||
vsprintf(temp, format, arg);
|
|
||||||
ser.puts(temp);
|
|
||||||
} else {
|
|
||||||
char *temp = new char[len + 1];
|
|
||||||
vsprintf(temp, format, arg);
|
|
||||||
ser.puts(temp);
|
|
||||||
delete[] temp;
|
|
||||||
}
|
|
||||||
va_end(arg);
|
|
||||||
return len;
|
|
||||||
|
|
||||||
/* Fail: __builtin_va_arg_pack?
|
|
||||||
* https://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Constructing-Calls.html#Constructing-Calls
|
|
||||||
void *arg = __builtin_apply_args();
|
|
||||||
void *ret = __builtin_apply((void*)(&(ser.printf)), arg, 100);
|
|
||||||
__builtin_return(ret)
|
|
||||||
*/
|
|
||||||
/* Fail: varargs can not be passed to printf
|
|
||||||
//int r = ser.printf("test %i\r\n", 123);
|
|
||||||
va_list arg;
|
|
||||||
va_start(arg, format);
|
|
||||||
int r = ser.printf(format, arg);
|
|
||||||
va_end(arg);
|
|
||||||
return r;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,16 +0,0 @@
|
||||||
#ifndef XPRINTF_H
|
|
||||||
#define XPRINTF_H
|
|
||||||
|
|
||||||
//#define xprintf(format, ...) __xprintf(format, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int __xprintf(const char *format, ...);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -128,38 +128,7 @@ extern "C"
|
||||||
|
|
||||||
# endif /* USER_PRINT / NORMAL PRINT */
|
# endif /* USER_PRINT / NORMAL PRINT */
|
||||||
|
|
||||||
# elif defined(__arm__) /* __arm__ */
|
# endif /* __AVR__ / PROTOCOL_CHIBIOS / PROTOCOL_ARM_ATSAM */
|
||||||
|
|
||||||
# include "mbed/xprintf.h"
|
|
||||||
|
|
||||||
# ifdef USER_PRINT /* USER_PRINT */
|
|
||||||
|
|
||||||
// Remove normal print defines
|
|
||||||
# define print(s)
|
|
||||||
# define println(s)
|
|
||||||
# define xprintf(fmt, ...)
|
|
||||||
|
|
||||||
// Create user print defines
|
|
||||||
# define uprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__)
|
|
||||||
# define uprint(s) xprintf(s)
|
|
||||||
# define uprintln(s) xprintf(s "\r\n")
|
|
||||||
|
|
||||||
# else /* NORMAL PRINT */
|
|
||||||
|
|
||||||
// Create user & normal print defines
|
|
||||||
# define xprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__)
|
|
||||||
# define print(s) xprintf(s)
|
|
||||||
# define println(s) xprintf(s "\r\n")
|
|
||||||
# define uprint(s) print(s)
|
|
||||||
# define uprintln(s) println(s)
|
|
||||||
# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
# endif /* USER_PRINT / NORMAL PRINT */
|
|
||||||
|
|
||||||
/* TODO: to select output destinations: UART/USBSerial */
|
|
||||||
# define print_set_sendchar(func)
|
|
||||||
|
|
||||||
# endif /* __AVR__ / PROTOCOL_CHIBIOS / PROTOCOL_ARM_ATSAM / __arm__ */
|
|
||||||
|
|
||||||
// User print disables the normal print messages in the body of QMK/TMK code and
|
// User print disables the normal print messages in the body of QMK/TMK code and
|
||||||
// is meant as a lightweight alternative to NOPRINT. Use it when you only want to do
|
// is meant as a lightweight alternative to NOPRINT. Use it when you only want to do
|
||||||
|
|
|
@ -33,8 +33,6 @@ extern "C" {
|
||||||
# include "clks.h"
|
# include "clks.h"
|
||||||
# define wait_ms(ms) CLK_delay_ms(ms)
|
# define wait_ms(ms) CLK_delay_ms(ms)
|
||||||
# define wait_us(us) CLK_delay_us(us)
|
# define wait_us(us) CLK_delay_us(us)
|
||||||
#elif defined(__arm__)
|
|
||||||
# include "wait_api.h"
|
|
||||||
#else // Unit tests
|
#else // Unit tests
|
||||||
void wait_ms(uint32_t ms);
|
void wait_ms(uint32_t ms);
|
||||||
# define wait_us(us) wait_ms(us / 1000)
|
# define wait_us(us) wait_ms(us / 1000)
|
||||||
|
|
|
@ -1,260 +0,0 @@
|
||||||
#include <stdint.h>
|
|
||||||
#include "USBHID.h"
|
|
||||||
#include "USBHID_Types.h"
|
|
||||||
#include "USBDescriptor.h"
|
|
||||||
#include "HIDKeyboard.h"
|
|
||||||
|
|
||||||
#define DEFAULT_CONFIGURATION (1)
|
|
||||||
|
|
||||||
HIDKeyboard::HIDKeyboard(uint16_t vendor_id, uint16_t product_id, uint16_t product_release) : USBDevice(vendor_id, product_id, product_release) { USBDevice::connect(); }
|
|
||||||
|
|
||||||
bool HIDKeyboard::sendReport(report_keyboard_t report) {
|
|
||||||
USBDevice::write(EP1IN, report.raw, sizeof(report), MAX_PACKET_SIZE_EP1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t HIDKeyboard::leds() { return led_state; }
|
|
||||||
|
|
||||||
bool HIDKeyboard::USBCallback_setConfiguration(uint8_t configuration) {
|
|
||||||
if (configuration != DEFAULT_CONFIGURATION) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure endpoints > 0
|
|
||||||
addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
|
|
||||||
// addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
|
|
||||||
|
|
||||||
// We activate the endpoint to be able to recceive data
|
|
||||||
// readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *HIDKeyboard::stringImanufacturerDesc() {
|
|
||||||
static uint8_t stringImanufacturerDescriptor[] = {
|
|
||||||
0x18, /*bLength*/
|
|
||||||
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
|
|
||||||
't',
|
|
||||||
0,
|
|
||||||
'm',
|
|
||||||
0,
|
|
||||||
'k',
|
|
||||||
0,
|
|
||||||
'-',
|
|
||||||
0,
|
|
||||||
'k',
|
|
||||||
0,
|
|
||||||
'b',
|
|
||||||
0,
|
|
||||||
'd',
|
|
||||||
0,
|
|
||||||
'.',
|
|
||||||
0,
|
|
||||||
'c',
|
|
||||||
0,
|
|
||||||
'o',
|
|
||||||
0,
|
|
||||||
'm',
|
|
||||||
0 /*bString iManufacturer*/
|
|
||||||
};
|
|
||||||
return stringImanufacturerDescriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *HIDKeyboard::stringIproductDesc() {
|
|
||||||
static uint8_t stringIproductDescriptor[] = {
|
|
||||||
0x0a, /*bLength*/
|
|
||||||
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
|
|
||||||
'm',
|
|
||||||
0,
|
|
||||||
'b',
|
|
||||||
0,
|
|
||||||
'e',
|
|
||||||
0,
|
|
||||||
'd',
|
|
||||||
0 /*bString iProduct*/
|
|
||||||
};
|
|
||||||
return stringIproductDescriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *HIDKeyboard::stringIserialDesc() {
|
|
||||||
static uint8_t stringIserialDescriptor[] = {
|
|
||||||
0x04, /*bLength*/
|
|
||||||
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
|
|
||||||
'0', 0 /*bString iSerial*/
|
|
||||||
};
|
|
||||||
return stringIserialDescriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *HIDKeyboard::reportDesc() {
|
|
||||||
static uint8_t reportDescriptor[] = {
|
|
||||||
USAGE_PAGE(1), 0x01, // Generic Desktop
|
|
||||||
USAGE(1), 0x06, // Keyboard
|
|
||||||
COLLECTION(1), 0x01, // Application
|
|
||||||
|
|
||||||
USAGE_PAGE(1), 0x07, // Key Codes
|
|
||||||
USAGE_MINIMUM(1), 0xE0, USAGE_MAXIMUM(1), 0xE7, LOGICAL_MINIMUM(1), 0x00, LOGICAL_MAXIMUM(1), 0x01, REPORT_SIZE(1), 0x01, REPORT_COUNT(1), 0x08, INPUT(1), 0x02, // Data, Variable, Absolute
|
|
||||||
|
|
||||||
REPORT_COUNT(1), 0x01, REPORT_SIZE(1), 0x08, INPUT(1), 0x01, // Constant
|
|
||||||
|
|
||||||
REPORT_COUNT(1), 0x05, REPORT_SIZE(1), 0x01, USAGE_PAGE(1), 0x08, // LEDs
|
|
||||||
USAGE_MINIMUM(1), 0x01, USAGE_MAXIMUM(1), 0x05, OUTPUT(1), 0x02, // Data, Variable, Absolute
|
|
||||||
|
|
||||||
REPORT_COUNT(1), 0x01, REPORT_SIZE(1), 0x03, OUTPUT(1), 0x01, // Constant
|
|
||||||
|
|
||||||
REPORT_COUNT(1), 0x06, REPORT_SIZE(1), 0x08, LOGICAL_MINIMUM(1), 0x00, LOGICAL_MAXIMUM(1), 0xFF, USAGE_PAGE(1), 0x07, // Key Codes
|
|
||||||
USAGE_MINIMUM(1), 0x00, USAGE_MAXIMUM(1), 0xFF, INPUT(1), 0x00, // Data, Array
|
|
||||||
END_COLLECTION(0),
|
|
||||||
};
|
|
||||||
reportLength = sizeof(reportDescriptor);
|
|
||||||
return reportDescriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t HIDKeyboard::reportDescLength() {
|
|
||||||
reportDesc();
|
|
||||||
return reportLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) + (1 * INTERFACE_DESCRIPTOR_LENGTH) + (1 * HID_DESCRIPTOR_LENGTH) + (1 * ENDPOINT_DESCRIPTOR_LENGTH))
|
|
||||||
uint8_t *HIDKeyboard::configurationDesc() {
|
|
||||||
static uint8_t configurationDescriptor[] = {
|
|
||||||
CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
|
|
||||||
CONFIGURATION_DESCRIPTOR, // bDescriptorType
|
|
||||||
LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
|
|
||||||
MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
|
|
||||||
0x01, // bNumInterfaces
|
|
||||||
DEFAULT_CONFIGURATION, // bConfigurationValue
|
|
||||||
0x00, // iConfiguration
|
|
||||||
C_RESERVED | C_REMOTE_WAKEUP, // bmAttributes
|
|
||||||
C_POWER(100), // bMaxPowerHello World from Mbed
|
|
||||||
|
|
||||||
INTERFACE_DESCRIPTOR_LENGTH, // bLength
|
|
||||||
INTERFACE_DESCRIPTOR, // bDescriptorType
|
|
||||||
0x00, // bInterfaceNumber
|
|
||||||
0x00, // bAlternateSetting
|
|
||||||
0x01, // bNumEndpoints
|
|
||||||
HID_CLASS, // bInterfaceClass
|
|
||||||
1, // bInterfaceSubClass (boot)
|
|
||||||
1, // bInterfaceProtocol (keyboard)
|
|
||||||
0x00, // iInterface
|
|
||||||
|
|
||||||
HID_DESCRIPTOR_LENGTH, // bLength
|
|
||||||
HID_DESCRIPTOR, // bDescriptorType
|
|
||||||
LSB(HID_VERSION_1_11), // bcdHID (LSB)
|
|
||||||
MSB(HID_VERSION_1_11), // bcdHID (MSB)
|
|
||||||
0x00, // bCountryCode
|
|
||||||
0x01, // bNumDescriptors
|
|
||||||
REPORT_DESCRIPTOR, // bDescriptorType
|
|
||||||
(uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
|
|
||||||
(uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
|
|
||||||
|
|
||||||
ENDPOINT_DESCRIPTOR_LENGTH, // bLength
|
|
||||||
ENDPOINT_DESCRIPTOR, // bDescriptorType
|
|
||||||
PHY_TO_DESC(EP1IN), // bEndpointAddress
|
|
||||||
E_INTERRUPT, // bmAttributes
|
|
||||||
LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
|
|
||||||
MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
|
|
||||||
1, // bInterval (milliseconds)
|
|
||||||
};
|
|
||||||
return configurationDescriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
uint8_t * HIDKeyboard::deviceDesc() {
|
|
||||||
static uint8_t deviceDescriptor[] = {
|
|
||||||
DEVICE_DESCRIPTOR_LENGTH, /* bLength */
|
|
||||||
DEVICE_DESCRIPTOR, /* bDescriptorType */
|
|
||||||
LSB(USB_VERSION_2_0), /* bcdUSB (LSB) */
|
|
||||||
MSB(USB_VERSION_2_0), /* bcdUSB (MSB) */
|
|
||||||
0x00, /* bDeviceClass */
|
|
||||||
0x00, /* bDeviceSubClass */
|
|
||||||
0x00, /* bDeviceprotocol */
|
|
||||||
MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */
|
|
||||||
(uint8_t)(LSB(0xfeed)), /* idVendor (LSB) */
|
|
||||||
(uint8_t)(MSB(0xfeed)), /* idVendor (MSB) */
|
|
||||||
(uint8_t)(LSB(0x1bed)), /* idProduct (LSB) */
|
|
||||||
(uint8_t)(MSB(0x1bed)), /* idProduct (MSB) */
|
|
||||||
(uint8_t)(LSB(0x0002)), /* bcdDevice (LSB) */
|
|
||||||
(uint8_t)(MSB(0x0002)), /* bcdDevice (MSB) */
|
|
||||||
0, /* iManufacturer */
|
|
||||||
0, /* iProduct */
|
|
||||||
0, /* iSerialNumber */
|
|
||||||
0x01 /* bNumConfigurations */
|
|
||||||
};
|
|
||||||
return deviceDescriptor;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool HIDKeyboard::USBCallback_request() {
|
|
||||||
bool success = false;
|
|
||||||
CONTROL_TRANSFER *transfer = getTransferPtr();
|
|
||||||
uint8_t * hidDescriptor;
|
|
||||||
|
|
||||||
// Process additional standard requests
|
|
||||||
|
|
||||||
if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE)) {
|
|
||||||
switch (transfer->setup.bRequest) {
|
|
||||||
case GET_DESCRIPTOR:
|
|
||||||
switch (DESCRIPTOR_TYPE(transfer->setup.wValue)) {
|
|
||||||
case REPORT_DESCRIPTOR:
|
|
||||||
if ((reportDesc() != NULL) && (reportDescLength() != 0)) {
|
|
||||||
transfer->remaining = reportDescLength();
|
|
||||||
transfer->ptr = reportDesc();
|
|
||||||
transfer->direction = DEVICE_TO_HOST;
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case HID_DESCRIPTOR:
|
|
||||||
// Find the HID descriptor, after the configuration descriptor
|
|
||||||
hidDescriptor = findDescriptor(HID_DESCRIPTOR);
|
|
||||||
if (hidDescriptor != NULL) {
|
|
||||||
transfer->remaining = HID_DESCRIPTOR_LENGTH;
|
|
||||||
transfer->ptr = hidDescriptor;
|
|
||||||
transfer->direction = DEVICE_TO_HOST;
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process class-specific requests
|
|
||||||
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
|
|
||||||
switch (transfer->setup.bRequest) {
|
|
||||||
case SET_REPORT:
|
|
||||||
// LED indicator
|
|
||||||
// TODO: check Interface and Report length?
|
|
||||||
// if (transfer->setup.wIndex == INTERFACE_KEYBOAD) { }
|
|
||||||
// if (transfer->setup.wLength == 1)
|
|
||||||
|
|
||||||
transfer->remaining = 1;
|
|
||||||
// transfer->ptr = ?? what ptr should be set when OUT(not used?)
|
|
||||||
transfer->direction = HOST_TO_DEVICE;
|
|
||||||
transfer->notify = true; /* notify with USBCallback_requestCompleted */
|
|
||||||
success = true;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HIDKeyboard::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
|
|
||||||
if (length > 0) {
|
|
||||||
CONTROL_TRANSFER *transfer = getTransferPtr();
|
|
||||||
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
|
|
||||||
switch (transfer->setup.bRequest) {
|
|
||||||
case SET_REPORT:
|
|
||||||
led_state = buf[0];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
#ifndef HIDKEYBOARD_H
|
|
||||||
|
|
||||||
# include "stdint.h"
|
|
||||||
# include "stdbool.h"
|
|
||||||
# include "USBHID.h"
|
|
||||||
# include "report.h"
|
|
||||||
|
|
||||||
class HIDKeyboard : public USBDevice {
|
|
||||||
public:
|
|
||||||
HIDKeyboard(uint16_t vendor_id = 0xFEED, uint16_t product_id = 0xabed, uint16_t product_release = 0x0001);
|
|
||||||
|
|
||||||
bool sendReport(report_keyboard_t report);
|
|
||||||
uint8_t leds(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
uint16_t reportLength;
|
|
||||||
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
|
||||||
virtual uint8_t* stringImanufacturerDesc();
|
|
||||||
virtual uint8_t* stringIproductDesc();
|
|
||||||
virtual uint8_t* stringIserialDesc();
|
|
||||||
virtual uint16_t reportDescLength();
|
|
||||||
virtual uint8_t* reportDesc();
|
|
||||||
virtual uint8_t* configurationDesc();
|
|
||||||
// virtual uint8_t * deviceDesc();
|
|
||||||
virtual bool USBCallback_request();
|
|
||||||
virtual void USBCallback_requestCompleted(uint8_t* buf, uint32_t length);
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t led_state;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,21 +0,0 @@
|
||||||
#include "HIDKeyboard.h"
|
|
||||||
#include "host.h"
|
|
||||||
#include "host_driver.h"
|
|
||||||
#include "mbed_driver.h"
|
|
||||||
|
|
||||||
HIDKeyboard keyboard;
|
|
||||||
|
|
||||||
/* Host driver */
|
|
||||||
static uint8_t keyboard_leds(void);
|
|
||||||
static void send_keyboard(report_keyboard_t *report);
|
|
||||||
static void send_mouse(report_mouse_t *report);
|
|
||||||
static void send_system(uint16_t data);
|
|
||||||
static void send_consumer(uint16_t data);
|
|
||||||
|
|
||||||
host_driver_t mbed_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
|
|
||||||
|
|
||||||
static uint8_t keyboard_leds(void) { return keyboard.leds(); }
|
|
||||||
static void send_keyboard(report_keyboard_t *report) { keyboard.sendReport(*report); }
|
|
||||||
static void send_mouse(report_mouse_t *report) {}
|
|
||||||
static void send_system(uint16_t data) {}
|
|
||||||
static void send_consumer(uint16_t data) {}
|
|
|
@ -1,3 +0,0 @@
|
||||||
#include "host_driver.h"
|
|
||||||
|
|
||||||
extern host_driver_t mbed_driver;
|
|
|
@ -1,51 +0,0 @@
|
||||||
#include <stdbool.h>
|
|
||||||
#include "ps2_io.h"
|
|
||||||
#include "gpio_api.h"
|
|
||||||
|
|
||||||
static gpio_t clock;
|
|
||||||
static gpio_t data;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Clock
|
|
||||||
*/
|
|
||||||
void clock_init(void) {
|
|
||||||
gpio_init(&clock, P0_9);
|
|
||||||
gpio_mode(&clock, OpenDrain | PullNone);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_lo(void) {
|
|
||||||
gpio_dir(&clock, PIN_OUTPUT);
|
|
||||||
gpio_write(&clock, 0);
|
|
||||||
}
|
|
||||||
void clock_hi(void) {
|
|
||||||
gpio_dir(&clock, PIN_OUTPUT);
|
|
||||||
gpio_write(&clock, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool clock_in(void) {
|
|
||||||
gpio_dir(&clock, PIN_INPUT);
|
|
||||||
return gpio_read(&clock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Data
|
|
||||||
*/
|
|
||||||
void data_init(void) {
|
|
||||||
gpio_init(&data, P0_8);
|
|
||||||
gpio_mode(&data, OpenDrain | PullNone);
|
|
||||||
}
|
|
||||||
|
|
||||||
void data_lo(void) {
|
|
||||||
gpio_dir(&data, PIN_OUTPUT);
|
|
||||||
gpio_write(&data, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void data_hi(void) {
|
|
||||||
gpio_dir(&data, PIN_OUTPUT);
|
|
||||||
gpio_write(&data, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool data_in(void) {
|
|
||||||
gpio_dir(&data, PIN_INPUT);
|
|
||||||
return gpio_read(&data);
|
|
||||||
}
|
|
Loading…
Reference in New Issue