first commit

input_events
NepEgor 3 years ago
commit 1832bdca43

@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

@ -0,0 +1,14 @@
{
"files.associations": {
"usbd_core.h": "c",
"usbd_conf.h": "c",
"usbd_ctlreq.h": "c",
"usbd_def.h": "c",
"usbd_desc.h": "c",
"usbd_customhid.h": "c",
"usbd_custom_hid_if.h": "c",
"usbd_ioreq.h": "c",
"hid_def.h": "c",
"stdbool.h": "c"
}
}

@ -0,0 +1,13 @@
Open Trackpad Controller
Game controller with trackpads
Inspired by Steam Controller
Hardware:
* We Act studios Black Pill stm32f411ce
* elan 33200v-3600
* Bunch of 3d prints
Credits:
* hid_def: https://github.com/katyo/hid_def

File diff suppressed because it is too large Load Diff

@ -0,0 +1,70 @@
#ifndef __MACRO_H__
#define __MACRO_H__
#define _NONE(...)
#define _UNWR_(...) __VA_ARGS__
#define _UNWR(a) _UNWR_ a
#define _CAT2_(a, b) a##b
#define _CAT2(a, b) _CAT2_(a, b)
#define _CAT3_(a, b, c) a##b##c
#define _CAT3(a, b, c) _CAT3_(a, b, c)
#define _CAT4_(a, b, c, d) a##b##c##d
#define _CAT4(a, b, c, d) _CAT4_(a, b, c, d)
#define _CAT5_(a, b, c, d, e) a##b##c##d##e
#define _CAT5(a, b, c, d, e) _CAT5_(a, b, c, d, e)
#define _NTH0_(a, ...) a
#define _NTH0(...) _NTH0_(__VA_ARGS__)
#define _NTH1_(a, b, ...) b
#define _NTH1(...) _NTH1_(__VA_ARGS__)
#define _NTH2_(a, b, c, ...) c
#define _NTH2(...) _NTH2_(__VA_ARGS__)
#define _NTH3_(a, b, c, d, ...) d
#define _NTH3(...) _NTH3_(__VA_ARGS__)
#define _NTH4_(a, b, c, d, e, ...) e
#define _NTH4(...) _NTH4_(__VA_ARGS__)
#define _MAX2(a, b) ((a) > (b) ? (a) : (b))
#define _MIN2(a, b) ((a) < (b) ? (a) : (b))
#define _CALL_(f, ...) f(__VA_ARGS__)
#define _CALL(f, ...) _CALL_(f, ##__VA_ARGS__)
#define _EVAL0(...) __VA_ARGS__
#define _EVAL1(...) _EVAL0(_EVAL0(_EVAL0(__VA_ARGS__)))
#define _EVAL2(...) _EVAL1(_EVAL1(_EVAL1(__VA_ARGS__)))
#define _EVAL3(...) _EVAL2(_EVAL2(_EVAL2(__VA_ARGS__)))
#define _EVAL4(...) _EVAL3(_EVAL3(_EVAL3(__VA_ARGS__)))
#define _EVAL(...) _EVAL4(_EVAL4(_EVAL4(__VA_ARGS__)))
#define _MAP_END(...)
#define _MAP_OUT
#define _MAP_COMMA ,
#define _MAP_GET_END2() 0, _MAP_END
#define _MAP_GET_END1(...) _MAP_GET_END2
#define _MAP_GET_END(...) _MAP_GET_END1
#define _MAP_NEXT0(test, next, ...) next _MAP_OUT
#define _MAP_NEXT1(test, next) _MAP_NEXT0(test, next, 0)
#define _MAP_NEXT(test, next) _MAP_NEXT1(_MAP_GET_END test, next)
#define _MAP0(f, x, peek, ...) f(x) _MAP_NEXT(peek, _MAP1)(f, peek, __VA_ARGS__)
#define _MAP1(f, x, peek, ...) f(x) _MAP_NEXT(peek, _MAP0)(f, peek, __VA_ARGS__)
/**
* Applies the function macro `f` to each of the remaining parameters.
*/
#define _MAP(f, ...) _EVAL(_MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
#define _ASSERT(x) ((1/(!!(x))) ? (x) : (x))
#endif /* __MACRO_H__ */

@ -0,0 +1,52 @@
#ifndef USBD_DESCRIPTORS_H
#define USBD_DESCRIPTORS_H
#include <stdint.h>
#define USB_HID_CUSTOM_CONFIG_DESC_SIZ 34U
#define USB_HID_CUSTOM_DESC_SIZ 9U
#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU
#define HID_CUSTOM_REPORT_DESC_SIZE 29U
//#define HID_KEYBOARD_REPORT_DESC_SIZE 45U
#define HID_DESCRIPTOR_TYPE 0x21
#ifndef HID_HS_BINTERVAL
#define HID_HS_BINTERVAL 0x07U
#endif
#ifndef HID_FS_BINTERVAL
#define HID_FS_BINTERVAL 0x0AU
#endif
#define HID_CUSTOM_INTERFACE 0x00U
#define HID_CUSTOM_EPIN_ADDR 0x81U
#define HID_CUSTOM_EPIN_SIZE 0x08U
//#define HID_KEYBOARD_INTERFACE 0x01U
//#define HID_KEYBOARD_EPIN_ADDR 0x82U
//#define HID_KEYBOARD_EPIN_SIZE 0x08U
// USB HID device FS Configuration Descriptor
extern uint8_t USBD_HID_CUSTOM_CfgFSDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ];
// USB HID device HS Configuration Descriptor
extern uint8_t USBD_HID_CUSTOM_CfgHSDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ];
// USB HID device Other Speed Configuration Descriptor
extern uint8_t USBD_HID_CUSTOM_OtherSpeedCfgDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ];
// USB HID device Configuration Descriptor
extern uint8_t USBD_HID_CUSTOM_Desc[USB_HID_CUSTOM_DESC_SIZ];
// USB HID device Configuration Descriptor
//extern uint8_t USBD_KEYBOARD_HID_Desc[USB_HID_DESC_SIZ];
// USB Standard Device Descriptor
extern uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC];
// USB Custom Report Descriptor
extern uint8_t HID_CUSTOM_ReportDesc[HID_CUSTOM_REPORT_DESC_SIZE];
#endif

@ -0,0 +1,33 @@
#ifndef USBD_DEVICE_H
#define USBD_DEVICE_H
#include <Arduino.h>
#define MOUSE_LEFT 1
#define MOUSE_RIGHT 2
#define MOUSE_MIDDLE 4
#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)
class USBD_Device
{
private:
uint8_t _buttons;
void buttons(uint8_t b);
public:
USBD_Device(void);
void begin(void);
void end(void);
void click(uint8_t b = MOUSE_LEFT);
void move(signed char x, signed char y, signed char wheel = 0);
void press(uint8_t b = MOUSE_LEFT); // press LEFT by default
void release(uint8_t b = MOUSE_LEFT); // release LEFT by default
bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default
};
#endif

@ -0,0 +1,41 @@
#ifndef __USB_HID_CUSTOM_H
#define __USB_HID_CUSTOM_H
#include "usbd_ioreq.h"
#include "usbd_ep_conf.h"
#define HID_REPORT_DESC 0x22
#define HID_REQ_SET_PROTOCOL 0x0BU
#define HID_REQ_GET_PROTOCOL 0x03U
#define HID_REQ_SET_IDLE 0x0AU
#define HID_REQ_GET_IDLE 0x02U
#define HID_REQ_SET_REPORT 0x09U
#define HID_REQ_GET_REPORT 0x01U
typedef enum
{
HID_IDLE = 0,
HID_BUSY,
}
HID_StateTypeDef;
typedef struct
{
uint32_t Protocol;
uint32_t IdleState;
uint32_t AltSetting;
HID_StateTypeDef Mousestate;
}
USBD_HID_HandleTypeDef;
extern USBD_ClassTypeDef USBD_CUSTOM_HID;
#define USBD_CUSTOM_HID_CLASS &USBD_CUSTOM_HID
uint8_t USBD_HID_CUSTOM_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len);
uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev);
#endif

@ -0,0 +1,9 @@
#ifndef __USBD_HID_CUSTOM_IF_H
#define __USBD_HID_CUSTOM_IF_H
void HID_Custom_Init();
void HID_Custom_DeInit();
void HID_Custom_sendReport(uint8_t *report, uint16_t len);
#endif

@ -0,0 +1,25 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:blackpill_f411ce]
platform = ststm32
board = blackpill_f411ce
upload_protocol = stlink
monitor_port = COM[4]
monitor_speed = 256000
framework = arduino
build_flags =
-D PIO_FRAMEWORK_ARDUINO_ENABLE_HID
-D USBD_USE_HID_COMPOSITE
-D USBCON
-D USBD_VID=0x0483
-D USBD_PID=0x0483
-D USB_MANUFACTURER="Goshi"
-D USB_PRODUCT="\"BLACKPILL_F411CE\""

@ -0,0 +1,56 @@
#include <Arduino.h>
#include "usbd_hid_custom_if.h"
//USBD_Device device;
const uint8_t TRIGGER_RIGHT_PIN = PA3;
const uint8_t TRACKPAD_CLICK_RIGHT_PIN = PB4;
typedef struct
{
uint16_t x:16;
uint16_t y:16;
uint16_t r:16;
} __packed PedalsReport_t;
PedalsReport_t PedalsReport;
void setup()
{
Serial.begin(256000);
pinMode(TRIGGER_RIGHT_PIN, INPUT_ANALOG);
pinMode(TRACKPAD_CLICK_RIGHT_PIN, INPUT_PULLDOWN);
//device.begin();
printf("HID Init\n");
HID_Custom_Init();
printf("HID Init success\n");
PedalsReport = { 0, 1024/3, 2048/3 };
}
void loop()
{
uint32_t right_trigger = analogRead(TRIGGER_RIGHT_PIN);
uint8_t right_tp_click = digitalRead(TRACKPAD_CLICK_RIGHT_PIN);
//Serial.printf("RT: %u RTPC: %u\n", right_trigger, right_tp_click);
PedalsReport.x = (PedalsReport.x + 10) % 1024;
PedalsReport.y = (PedalsReport.y + 20) % 1024;
PedalsReport.r = (PedalsReport.r + 30) % 1024;
//Serial.printf("%u %u %u\n", PedalsReport.x, PedalsReport.y, PedalsReport.r);
//device.move(PedalsReport.x, PedalsReport.y);
HID_Custom_sendReport((uint8_t*)(&PedalsReport), 6);
delay(100);
}

@ -0,0 +1,189 @@
#include "usbd_descriptors.h"
#include "usbd_def.h"
#include "hid_def.h"
// USB HID device FS Configuration Descriptor
__ALIGN_BEGIN uint8_t USBD_HID_CUSTOM_CfgFSDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ] __ALIGN_END = {
0x09, // bLength: Configuration Descriptor size
USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration
LOBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ), // wTotalLength: Bytes returned
HIBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ),
0x01, //bNumInterfaces: 2 interface
0x01, //bConfigurationValue: Configuration value
0x00, //iConfiguration: Index of string descriptor describing the configuration
0xC0, //bmAttributes: bus powered and no Support Remote Wake-up
0x32, //MaxPower 100 mA: this current is used for detecting Vbus
//************* Descriptor of interface ***************
// 09
0x09, //bLength: Interface Descriptor size
USB_DESC_TYPE_INTERFACE,//bDescriptorType: Interface descriptor type
HID_CUSTOM_INTERFACE, //bInterfaceNumber: Number of Interface
0x00, //bAlternateSetting: Alternate setting
0x01, //bNumEndpoints
0x03, //bInterfaceClass: HID
0x00, //bInterfaceSubClass : 1=BOOT, 0=no boot
0x00, //nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
0x00, //iInterface: Index of string descriptor
//******************* Descriptor of Joystick Mouse HID *******************
// 18
0x09, //bLength: HID Descriptor size
HID_DESCRIPTOR_TYPE, //bDescriptorType: HID
0x11, //bcdHID: HID Class Spec release number
0x01,
0x00, //bCountryCode: Hardware target country
0x01, //bNumDescriptors: Number of HID class descriptors to follow
0x22, //bDescriptorType
HID_CUSTOM_REPORT_DESC_SIZE,//wItemLength: Total length of Report descriptor
0x00,
//******************* Descriptor of Mouse endpoint *******************
// 27
0x07, //bLength: Endpoint Descriptor size
USB_DESC_TYPE_ENDPOINT, //bDescriptorType:
HID_CUSTOM_EPIN_ADDR, //bEndpointAddress: Endpoint Address (IN)
0x03, //bmAttributes: Interrupt endpoint
HID_CUSTOM_EPIN_SIZE, //wMaxPacketSize: 4 Byte max
0x00,
HID_FS_BINTERVAL, //bInterval: Polling Interval
};
// USB HID device HS Configuration Descriptor
__ALIGN_BEGIN uint8_t USBD_HID_CUSTOM_CfgHSDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ] __ALIGN_END = {
0x09, // bLength: Configuration Descriptor size
USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration
LOBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ), // wTotalLength: Bytes returned
HIBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ),
0x01, //bNumInterfaces: 2 interface
0x01, //bConfigurationValue: Configuration value
0x00, //iConfiguration: Index of string descriptor describing the configuration
0xC0, //bmAttributes: bus powered and no Support Remote Wake-up
0x32, //MaxPower 100 mA: this current is used for detecting Vbus
//************* Descriptor of interface ***************
// 09
0x09, //bLength: Interface Descriptor size
USB_DESC_TYPE_INTERFACE,//bDescriptorType: Interface descriptor type
HID_CUSTOM_INTERFACE, //bInterfaceNumber: Number of Interface
0x00, //bAlternateSetting: Alternate setting
0x01, //bNumEndpoints
0x03, //bInterfaceClass: HID
0x00, //bInterfaceSubClass : 1=BOOT, 0=no boot
0x00, //nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
0x00, //iInterface: Index of string descriptor
//******************* Descriptor of Joystick Mouse HID *******************
// 18
0x09, //bLength: HID Descriptor size
HID_DESCRIPTOR_TYPE, //bDescriptorType: HID
0x11, //bcdHID: HID Class Spec release number
0x01,
0x00, //bCountryCode: Hardware target country
0x01, //bNumDescriptors: Number of HID class descriptors to follow
0x22, //bDescriptorType
HID_CUSTOM_REPORT_DESC_SIZE,//wItemLength: Total length of Report descriptor
0x00,
//******************* Descriptor of Mouse endpoint *******************
// 27
0x07, //bLength: Endpoint Descriptor size
USB_DESC_TYPE_ENDPOINT, //bDescriptorType:
HID_CUSTOM_EPIN_ADDR, //bEndpointAddress: Endpoint Address (IN)
0x03, //bmAttributes: Interrupt endpoint
HID_CUSTOM_EPIN_SIZE, //wMaxPacketSize: 4 Byte max
0x00,
HID_HS_BINTERVAL, //bInterval: Polling Interval
};
// USB HID device Other Speed Configuration Descriptor
__ALIGN_BEGIN uint8_t USBD_HID_CUSTOM_OtherSpeedCfgDesc[USB_HID_CUSTOM_CONFIG_DESC_SIZ] __ALIGN_END = {
0x09, // bLength: Configuration Descriptor size
USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration
LOBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ), // wTotalLength: Bytes returned
HIBYTE(USB_HID_CUSTOM_CONFIG_DESC_SIZ),
0x01, //bNumInterfaces: 2 interface
0x01, //bConfigurationValue: Configuration value
0x00, //iConfiguration: Index of string descriptor describing the configuration
0xC0, //bmAttributes: bus powered and no Support Remote Wake-up
0x32, //MaxPower 100 mA: this current is used for detecting Vbus
//************* Descriptor of interface ***************
// 09
0x09, //bLength: Interface Descriptor size
USB_DESC_TYPE_INTERFACE,//bDescriptorType: Interface descriptor type
HID_CUSTOM_INTERFACE, //bInterfaceNumber: Number of Interface
0x00, //bAlternateSetting: Alternate setting
0x01, //bNumEndpoints
0x03, //bInterfaceClass: HID
0x00, //bInterfaceSubClass : 1=BOOT, 0=no boot
0x00, //nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
0x00, //iInterface: Index of string descriptor
//******************* Descriptor of Joystick Mouse HID *******************
// 18
0x09, //bLength: HID Descriptor size
HID_DESCRIPTOR_TYPE, //bDescriptorType: HID
0x11, //bcdHID: HID Class Spec release number
0x01,
0x00, //bCountryCode: Hardware target country
0x01, //bNumDescriptors: Number of HID class descriptors to follow
0x22, //bDescriptorType
HID_CUSTOM_REPORT_DESC_SIZE,//wItemLength: Total length of Report descriptor
0x00,
//******************* Descriptor of Mouse endpoint *******************
// 27
0x07, //bLength: Endpoint Descriptor size
USB_DESC_TYPE_ENDPOINT, //bDescriptorType:
HID_CUSTOM_EPIN_ADDR, //bEndpointAddress: Endpoint Address (IN)
0x03, //bmAttributes: Interrupt endpoint
HID_CUSTOM_EPIN_SIZE, //wMaxPacketSize: 4 Byte max
0x00,
HID_FS_BINTERVAL, //bInterval: Polling Interval
};
// USB HID device Configuration Descriptor
__ALIGN_BEGIN uint8_t USBD_HID_CUSTOM_Desc[USB_HID_CUSTOM_DESC_SIZ] __ALIGN_END = {
USB_HID_CUSTOM_DESC_SIZ, //bLength: HID Descriptor size
HID_DESCRIPTOR_TYPE, //bDescriptorType: HID
0x11, //bcdHID: HID Class Spec release number
0x01,
0x00, //bCountryCode: Hardware target country
0x01, //bNumDescriptors: Number of HID class descriptors to follow
0x22, //bDescriptorType
HID_CUSTOM_REPORT_DESC_SIZE,//wItemLength: Total length of Report descriptor
0x00
};
// USB Standard Device Descriptor
__ALIGN_BEGIN uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = {
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
0x00,
0x02,
0x00,
0x00,
0x00,
0x40,
0x01,
0x00,
};
__ALIGN_BEGIN uint8_t HID_CUSTOM_ReportDesc[HID_CUSTOM_REPORT_DESC_SIZE] __ALIGN_END = {
HID_USAGE_PAGE(GENERIC_DESKTOP),
HID_USAGE(JOYSTICK),
HID_COLLECTION(APPLICATION),
HID_COLLECTION(PHYSICAL),
HID_USAGE_PAGE(GENERIC_DESKTOP),
HID_USAGE(SLIDER),
HID_USAGE(RY),
HID_USAGE(RX),
HID_LOGICAL_MINIMUM(1, 0),
HID_LOGICAL_MAXIMUM(2, 1023),
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_INPUT(DATA, VARIABLE, ABSOLUTE),
HID_END_COLLECTION(PHYSICAL),
//HID_END_COLLECTION(APPLICATION)
0xC0
};

@ -0,0 +1,61 @@
#include "usbd_device.h"
#include "usbd_hid_custom_if.h"
USBD_Device::USBD_Device(void)
{
_buttons = 0;
}
void USBD_Device::begin(void)
{
HID_Custom_Init();
}
void USBD_Device::end(void)
{
HID_Custom_DeInit();
}
void USBD_Device::click(uint8_t b)
{
_buttons = b;
move(0, 0, 0);
_buttons = 0;
move(0, 0, 0);
}
void USBD_Device::move(signed char x, signed char y, signed char wheel)
{
uint8_t m[4];
m[0] = _buttons;
m[1] = x;
m[2] = y;
m[3] = wheel;
HID_Custom_sendReport(m, 4);
}
void USBD_Device::buttons(uint8_t b)
{
if (b != _buttons)
{
_buttons = b;
move(0, 0, 0);
}
}
void USBD_Device::press(uint8_t b)
{
buttons(_buttons | b);
}
void USBD_Device::release(uint8_t b)
{
buttons(_buttons & ~b);
}
bool USBD_Device::isPressed(uint8_t b)
{
return (b & _buttons) > 0;
}

@ -0,0 +1,286 @@
#include "usbd_hid_custom.h"
#include "usbd_ctlreq.h"
#include "usbd_descriptors.h"
static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req);
static uint8_t USBD_HID_MOUSE_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req);
static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length);
static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length);
static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length);
static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length);
static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum);
USBD_ClassTypeDef USBD_CUSTOM_HID = {
USBD_HID_Init,
USBD_HID_DeInit,
USBD_CUSTOM_HID_Setup,
NULL, //EP0_TxSent
NULL, //EP0_RxReady
USBD_HID_DataIn, //DataIn
NULL, //DataOut
NULL, //SOF
NULL,
NULL,
USBD_HID_GetHSCfgDesc,
USBD_HID_GetFSCfgDesc,
USBD_HID_GetOtherSpeedCfgDesc,
USBD_HID_GetDeviceQualifierDesc,
};
static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
{
UNUSED(cfgidx);
uint8_t ret = USBD_OK;
// Open EP IN
USBD_LL_OpenEP(pdev, HID_CUSTOM_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_CUSTOM_EPIN_SIZE);
pdev->ep_in[HID_CUSTOM_EPIN_ADDR & 0xFU].is_used = 1U;
/*
// Open EP IN
USBD_LL_OpenEP(pdev,
HID_KEYBOARD_EPIN_ADDR,
USBD_EP_TYPE_INTR,
HID_KEYBOARD_EPIN_SIZE);
pdev->ep_in[HID_KEYBOARD_EPIN_ADDR & 0xFU].is_used = 1U;
*/
pdev->pClassData = USBD_malloc(sizeof(USBD_HID_HandleTypeDef));
if (pdev->pClassData == NULL)
{
ret = USBD_FAIL;
}
else
{
((USBD_HID_HandleTypeDef *)pdev->pClassData)->Mousestate = HID_IDLE;
//((USBD_HID_HandleTypeDef *)pdev->pClassData)->Keyboardstate = HID_IDLE;
}
return ret;
}
static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
{
UNUSED(cfgidx);
/* Close HID EPs */
USBD_LL_CloseEP(pdev, HID_CUSTOM_EPIN_ADDR);
pdev->ep_in[HID_CUSTOM_EPIN_ADDR & 0xFU].is_used = 0U;
/*
USBD_LL_CloseEP(pdev, HID_KEYBOARD_EPIN_ADDR);
pdev->ep_in[HID_KEYBOARD_EPIN_ADDR & 0xFU].is_used = 0U;
*/
/* Free allocated memory */
if (pdev->pClassData != NULL)
{
USBD_free(pdev->pClassData);
pdev->pClassData = NULL;
}
return USBD_OK;
}
static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
{
/* Check which interface is targetted by this request */
//if ((req->wIndex & 0x00FF) == HID_KEYBOARD_INTERFACE)
//{
// return USBD_HID_KEYBOARD_Setup(pdev, req);
//}
//else
//{
return USBD_HID_MOUSE_Setup(pdev, req);
//}
}
static uint8_t USBD_HID_MOUSE_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
{
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData;
uint16_t len = 0U;
uint8_t *pbuf = NULL;
uint16_t status_info = 0U;
USBD_StatusTypeDef ret = USBD_OK;
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
case USB_REQ_TYPE_CLASS:
switch (req->bRequest)
{
case HID_REQ_SET_PROTOCOL:
hhid->Protocol = (uint8_t)(req->wValue);
break;
case HID_REQ_GET_PROTOCOL:
USBD_CtlSendData(pdev, (uint8_t *)&hhid->Protocol, 1U);
break;
case HID_REQ_SET_IDLE:
hhid->IdleState = (uint8_t)(req->wValue >> 8);
break;
case HID_REQ_GET_IDLE:
USBD_CtlSendData(pdev, (uint8_t *)&hhid->IdleState, 1U);
break;
default:
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
break;
}
break;
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
case USB_REQ_GET_STATUS:
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
USBD_CtlSendData(pdev, (uint8_t *)(void *)&status_info, 2U);
}
else
{
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
}
break;
case USB_REQ_GET_DESCRIPTOR:
if (req->wValue >> 8 == HID_REPORT_DESC)
{
len = MIN(HID_CUSTOM_REPORT_DESC_SIZE, req->wLength);
pbuf = HID_CUSTOM_ReportDesc;
}
else if (req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
{
pbuf = USBD_HID_CUSTOM_Desc;
len = MIN(USB_HID_CUSTOM_DESC_SIZ, req->wLength);
}
else
{
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
break;
}
USBD_CtlSendData(pdev, pbuf, len);
break;
case USB_REQ_GET_INTERFACE :
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
USBD_CtlSendData(pdev, (uint8_t *)&hhid->AltSetting, 1U);
}
else
{
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
}
break;
case USB_REQ_SET_INTERFACE :
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
hhid->AltSetting = (uint8_t)(req->wValue);
}
else
{
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
}
break;
default:
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
break;
}
break;
default:
USBD_CtlError(pdev, req);
ret = USBD_FAIL;
break;
}
return ret;
}
uint8_t USBD_HID_CUSTOM_SendReport(USBD_HandleTypeDef* pdev, uint8_t* report, uint16_t len)
{
USBD_HID_HandleTypeDef* hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData;
if (pdev->dev_state == USBD_STATE_CONFIGURED)
{
if (hhid->Mousestate == HID_IDLE)
{
hhid->Mousestate = HID_BUSY;
USBD_LL_Transmit(pdev, HID_CUSTOM_EPIN_ADDR, report, len);
}
}
return USBD_OK;
}
uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev)
{
uint32_t polling_interval = 0U;
/* HIGH-speed endpoints */
if (pdev->dev_speed == USBD_SPEED_HIGH)
{
/* Sets the data transfer polling interval for high speed transfers.
Values between 1..16 are allowed. Values correspond to interval
of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */
polling_interval = (((1U << (HID_HS_BINTERVAL - 1U))) / 8U);
}
else
{ /* LOW and FULL-speed endpoints */
/* Sets the data transfer polling interval for low and full
speed transfers */
polling_interval = HID_FS_BINTERVAL;
}
return ((uint32_t)(polling_interval));
}
static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length)
{
*length = sizeof(USBD_HID_CUSTOM_CfgFSDesc);
return USBD_HID_CUSTOM_CfgFSDesc;
}
static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length)
{
*length = sizeof(USBD_HID_CUSTOM_CfgHSDesc);
return USBD_HID_CUSTOM_CfgHSDesc;
}
static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length)
{
*length = sizeof(USBD_HID_CUSTOM_OtherSpeedCfgDesc);
return USBD_HID_CUSTOM_OtherSpeedCfgDesc;
}
static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
/* Ensure that the FIFO is empty before a new transfer, this condition could
be caused by a new transfer before the end of the previous transfer */
//if (epnum == (HID_KEYBOARD_EPIN_ADDR & 0x7F))
//{
//((USBD_HID_HandleTypeDef *)pdev->pClassData)->Keyboardstate = HID_IDLE;
//}
//else if (epnum == (HID_CUSTOM_EPIN_ADDR & 0x7F))
//{
((USBD_HID_HandleTypeDef*)pdev->pClassData)->Mousestate = HID_IDLE;
//}
return USBD_OK;
}
static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length)
{
*length = sizeof(USBD_HID_DeviceQualifierDesc);
return USBD_HID_DeviceQualifierDesc;
}

@ -0,0 +1,35 @@
#include "usbd_desc.h"
#include "usbd_hid_custom_if.h"
#include "usbd_hid_custom.h"
USBD_HandleTypeDef hUSBD_Device_HID;
static bool HID_custom_initialized = false;
void HID_Custom_Init()
{
if (USBD_Init(&hUSBD_Device_HID, &USBD_Desc, 0) == USBD_OK)
{
if (USBD_RegisterClass(&hUSBD_Device_HID, USBD_CUSTOM_HID_CLASS) == USBD_OK)
{
USBD_Start(&hUSBD_Device_HID);
HID_custom_initialized = true;
}
}
}
void HID_Custom_DeInit()
{
if (HID_custom_initialized)
{
USBD_Stop(&hUSBD_Device_HID);
USBD_DeInit(&hUSBD_Device_HID);
HID_custom_initialized = false;
}
}
void HID_Custom_sendReport(uint8_t *report, uint16_t len)
{
USBD_HID_CUSTOM_SendReport(&hUSBD_Device_HID, report, len);
}
Loading…
Cancel
Save