96 lines
3.4 KiB
C
96 lines
3.4 KiB
C
// vim: set et:
|
|
|
|
#ifndef MODE_H_
|
|
#define MODE_H_
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "tusb_config.h"
|
|
#include <tusb.h>
|
|
|
|
// clang-format off
|
|
|
|
struct mode {
|
|
const char* name;
|
|
uint16_t version;
|
|
uint16_t n_string_desc;
|
|
|
|
const uint8_t* usb_desc;
|
|
const char** string_desc;
|
|
|
|
void (*enter)(void); // claim required hardware. no tusb calls here please
|
|
void (*leave)(void); // release current in-use hardware. no tusb calls here please
|
|
void (*task )(void);
|
|
void (*handle_cmd)(uint8_t cmd); // handle a command coming from the vnd_cfg itf
|
|
|
|
// tinyusb callbacks
|
|
#if CFG_TUD_HID > 0
|
|
uint16_t (*tud_hid_get_report_cb)(uint8_t instance, uint8_t report_id,
|
|
hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
|
|
void (*tud_hid_set_report_cb)(uint8_t instance, uint8_t report_id,
|
|
hid_report_type_t report_type, uint8_t const* rxbuf, uint16_t bufsize);
|
|
#endif
|
|
#if CFG_TUD_CDC > 0
|
|
void (*tud_cdc_line_coding_cb)(uint8_t itf, cdc_line_coding_t const* line_coding);
|
|
#endif
|
|
//#if CFG_TUD_VENDOR > 0
|
|
bool (*tud_vendor_control_xfer_cb)(uint8_t rhport, uint8_t ep_addr,
|
|
tusb_control_request_t const* req);
|
|
//#endif
|
|
|
|
uint8_t const* (*tud_hid_descriptor_report_cb)(uint8_t instance);
|
|
uint8_t const* (*tud_descriptor_device_cb)(void);
|
|
uint8_t const* (*tud_descriptor_configuration_cb)(uint8_t index);
|
|
uint16_t const* (*tud_descriptor_string_cb)(uint8_t index, uint16_t langid);
|
|
};
|
|
|
|
// call this BEFORE tusb_init!
|
|
void modes_init(void);
|
|
|
|
void modes_switch(uint8_t newmode);
|
|
|
|
extern int mode_current_id;
|
|
extern int mode_next_id;
|
|
extern const struct mode* mode_list[16];
|
|
#define mode_default (mode_list[1])
|
|
#define mode_current (((mode_current_id)==-1)?NULL:(mode_list[mode_current_id]))
|
|
|
|
// clang-format on
|
|
|
|
#if CFG_TUD_HID > 0
|
|
// Invoked when received GET_REPORT control request
|
|
// Application must fill buffer report's content and return its length.
|
|
// Return zero will cause the stack to STALL request
|
|
uint16_t mode_std_hid_get_report_cb(uint8_t instance, uint8_t report_id,
|
|
hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
|
|
void mode_std_hid_set_report_cb(uint8_t instance, uint8_t report_id,
|
|
hid_report_type_t report_type, uint8_t const* RxDataBuffer, uint16_t bufsize);
|
|
#endif
|
|
#if CFG_TUD_CDC > 0
|
|
void mode_std_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_coding);
|
|
#endif
|
|
//#if CFG_TUD_VENDOR > 0
|
|
bool mode_std_vendor_control_xfer_cb(uint8_t rhport, uint8_t ep_addr,
|
|
tusb_control_request_t const* req);
|
|
//#endif
|
|
|
|
// Invoked when received GET HID REPORT DESCRIPTOR
|
|
// Application return pointer to descriptor
|
|
// Descriptor contents must exist long enough for transfer to complete
|
|
const uint8_t* mode_std_hid_descriptor_report_cb(uint8_t instance);
|
|
// Invoked when received GET DEVICE DESCRIPTOR
|
|
// Application return pointer to descriptor
|
|
const uint8_t* mode_std_descriptor_device_cb(void);
|
|
// Invoked when received GET CONFIGURATION DESCRIPTOR
|
|
// Application return pointer to descriptor
|
|
// Descriptor contents must exist long enough for transfer to complete
|
|
const uint8_t* mode_std_descriptor_configuration_cb(uint8_t index);
|
|
// Invoked when received GET STRING DESCRIPTOR request
|
|
// Application return pointer to descriptor, whose contents must exist long enough for transfer to
|
|
// complete
|
|
const uint16_t* mode_std_descriptor_string_cb(uint8_t index, uint16_t langid);
|
|
|
|
#endif
|
|
|