// usb_client.h
// BCD -- Ben Hutton, Chris Leary, Devrin Talen
// 100-column width
#ifndef _USB_CLIENT_H
#define _USB_CLIENT_H
/************/
/* INCLUDES */
/************/
#include "usb_system.h"
/***********/
/* DEFINES */
/***********/
/*********/
/* ENUMS */
/*********/
typedef enum
{
GET_STATUS=0, CLEAR_FEATURE=1, SET_FEATURE=3, SET_ADDRESS=5, GET_DESCRIPTOR=6, SET_DESCRIPTOR=7,
GET_CONFIGURATION=8, SET_CONFIGURATION=9, GET_INTERFACE=10, SET_INTERFACE=11, SYNCH_FRAME=12
} REQUEST_TYPE_T;
typedef enum
{
GET_REPORT=1, GET_IDLE=2, GET_PROTOCOL=3, SET_REPORT=9, SET_IDLE=10, SET_PROTOCOL=11
} HID_REQUEST_TYPE_T;
typedef enum
{
DEVICE_REMOTE_WAKEUP = 0x1, ENDPOINT_HALT = 0x0, TEST_MODE = 0x2
} FEATURE_SELECTOR_T;
/***********/
/* STRUCTS */
/***********/
// ---------------------
// - STANDARD REQUESTS -
// ---------------------
typedef struct StandardRequest
/*
* Send as the data payload of the data packet in the setup transaction of a control transfer
*/
{
uint8_t bmRequestType;
REQUEST_TYPE_T bRequest;
uint8_t wValueHi; // high byte of wValue
uint8_t wValueLo; // low byte of wValue
uint16_t wIndex; // 2 bytes...
uint16_t wLength; // 2 bytes...
} STANDARD_REQUEST_T;
/*************/
/* FUNCTIONS */
/*************/
STANDARD_REQUEST_T *StandardRequest(DESCRIPTOR_TYPE_T request_target, REQUEST_TYPE_T request,
uint8_t valueHi, uint8_t valueLo, uint16_t index,
uint16_t length);
void DestroyStandardRequest(STANDARD_REQUEST_T *standard_request);
STANDARD_REQUEST_T *standard_request_from_template(REQUEST_TYPE_T request_type,
DESCRIPTOR_TYPE_T request_target);
STANDARD_REQUEST_T *hid_request_from_template(HID_REQUEST_TYPE_T request_type);
DATA_PACKET_T *make_standard_request_data_packet(STANDARD_REQUEST_T *request);
DATA_PACKET_T *make_standard_request(DESCRIPTOR_TYPE_T request_target, REQUEST_TYPE_T request_type,
uint8_t valueHi, uint8_t valueLo, uint16_t index,
uint16_t length);
void execute_standard_request(STANDARD_REQUEST_T *request, SIE_T *sie, HC_T *hc, uint8_t addr, uint8_t endp,
DATA_PACKET_T *payload, uint8_t reset_after);
#endif