|
|
@ -69,7 +69,7 @@ static host_driver_t lufa_driver = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void SetupHardware(void);
|
|
|
|
static void SetupHardware(void);
|
|
|
|
static void Console_HID_Task(void);
|
|
|
|
static void Console_Task(void);
|
|
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -90,8 +90,9 @@ int main(void)
|
|
|
|
while (1) {
|
|
|
|
while (1) {
|
|
|
|
keyboard_proc();
|
|
|
|
keyboard_proc();
|
|
|
|
|
|
|
|
|
|
|
|
Console_HID_Task();
|
|
|
|
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
|
|
|
USB_USBTask();
|
|
|
|
USB_USBTask();
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -105,42 +106,52 @@ void SetupHardware(void)
|
|
|
|
clock_prescale_set(clock_div_1);
|
|
|
|
clock_prescale_set(clock_div_1);
|
|
|
|
|
|
|
|
|
|
|
|
USB_Init();
|
|
|
|
USB_Init();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for Console_Task
|
|
|
|
|
|
|
|
USB_Device_EnableSOFEvents();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void Console_HID_Task(void)
|
|
|
|
static void Console_Task(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/* Device must be connected and configured for the task to run */
|
|
|
|
/* Device must be connected and configured for the task to run */
|
|
|
|
if (USB_DeviceState != DEVICE_STATE_Configured)
|
|
|
|
if (USB_DeviceState != DEVICE_STATE_Configured)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: impl receivechar()/recvchar()
|
|
|
|
uint8_t ep = Endpoint_GetCurrentEndpoint();
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
/* Check to see if a packet has been sent from the host */
|
|
|
|
// TODO: impl receivechar()/recvchar()
|
|
|
|
if (Endpoint_IsOUTReceived())
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Check to see if the packet contains data */
|
|
|
|
/* Check to see if a packet has been sent from the host */
|
|
|
|
if (Endpoint_IsReadWriteAllowed())
|
|
|
|
if (Endpoint_IsOUTReceived())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/* Create a temporary buffer to hold the read in report from the host */
|
|
|
|
/* Check to see if the packet contains data */
|
|
|
|
uint8_t ConsoleData[CONSOLE_EPSIZE];
|
|
|
|
if (Endpoint_IsReadWriteAllowed())
|
|
|
|
|
|
|
|
{
|
|
|
|
/* Read Console Report Data */
|
|
|
|
/* Create a temporary buffer to hold the read in report from the host */
|
|
|
|
Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
|
|
|
|
uint8_t ConsoleData[CONSOLE_EPSIZE];
|
|
|
|
|
|
|
|
|
|
|
|
/* Process Console Report Data */
|
|
|
|
/* Read Console Report Data */
|
|
|
|
//ProcessConsoleHIDReport(ConsoleData);
|
|
|
|
Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Process Console Report Data */
|
|
|
|
/* Finalize the stream transfer to send the last packet */
|
|
|
|
//ProcessConsoleHIDReport(ConsoleData);
|
|
|
|
Endpoint_ClearOUT();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Finalize the stream transfer to send the last packet */
|
|
|
|
/* IN packet */
|
|
|
|
Endpoint_ClearOUT();
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
|
|
|
|
}
|
|
|
|
// send IN packet
|
|
|
|
#endif
|
|
|
|
if (Endpoint_IsINReady())
|
|
|
|
|
|
|
|
Endpoint_ClearIN();
|
|
|
|
/* IN packet */
|
|
|
|
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
|
|
|
|
|
|
|
|
// flash senchar packet
|
|
|
|
|
|
|
|
if (Endpoint_IsINReady()) {
|
|
|
|
|
|
|
|
Endpoint_ClearIN();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Endpoint_SelectEndpoint(ep);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -157,6 +168,16 @@ void EVENT_USB_Device_Disconnect(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CONSOLE_TASK_INTERVAL 50
|
|
|
|
|
|
|
|
void EVENT_USB_Device_StartOfFrame(void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
static uint8_t interval;
|
|
|
|
|
|
|
|
if (++interval == CONSOLE_TASK_INTERVAL) {
|
|
|
|
|
|
|
|
Console_Task();
|
|
|
|
|
|
|
|
interval = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Event handler for the USB_ConfigurationChanged event.
|
|
|
|
/** Event handler for the USB_ConfigurationChanged event.
|
|
|
|
* This is fired when the host sets the current configuration of the USB device after enumeration.
|
|
|
|
* This is fired when the host sets the current configuration of the USB device after enumeration.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -182,7 +203,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
|
|
|
|
|
|
|
|
|
|
|
/* Setup Console HID Report Endpoints */
|
|
|
|
/* Setup Console HID Report Endpoints */
|
|
|
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
|
|
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
|
|
|
CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
|
|
CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE);
|
|
|
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
|
|
|
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
|
|
|
|
CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
|
|
CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -374,6 +395,7 @@ static void send_consumer(uint16_t data)
|
|
|
|
/*******************************************************************************
|
|
|
|
/*******************************************************************************
|
|
|
|
* sendchar
|
|
|
|
* sendchar
|
|
|
|
******************************************************************************/
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
#define SEND_TIMEOUT 10
|
|
|
|
int8_t sendchar(uint8_t c)
|
|
|
|
int8_t sendchar(uint8_t c)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (USB_DeviceState != DEVICE_STATE_Configured)
|
|
|
|
if (USB_DeviceState != DEVICE_STATE_Configured)
|
|
|
@ -381,9 +403,9 @@ int8_t sendchar(uint8_t c)
|
|
|
|
|
|
|
|
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
|
|
|
|
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t timeout = 10;
|
|
|
|
uint8_t timeout = SEND_TIMEOUT;
|
|
|
|
uint16_t prevFN = USB_Device_GetFrameNumber();
|
|
|
|
uint16_t prevFN = USB_Device_GetFrameNumber();
|
|
|
|
while (!Endpoint_IsINReady()) {
|
|
|
|
while (!Endpoint_IsReadWriteAllowed()) {
|
|
|
|
switch (USB_DeviceState) {
|
|
|
|
switch (USB_DeviceState) {
|
|
|
|
case DEVICE_STATE_Unattached:
|
|
|
|
case DEVICE_STATE_Unattached:
|
|
|
|
case DEVICE_STATE_Suspended:
|
|
|
|
case DEVICE_STATE_Suspended:
|
|
|
@ -400,7 +422,7 @@ int8_t sendchar(uint8_t c)
|
|
|
|
|
|
|
|
|
|
|
|
Endpoint_Write_8(c);
|
|
|
|
Endpoint_Write_8(c);
|
|
|
|
|
|
|
|
|
|
|
|
// send when packet is full
|
|
|
|
// send when bank is full
|
|
|
|
if (!Endpoint_IsReadWriteAllowed())
|
|
|
|
if (!Endpoint_IsReadWriteAllowed())
|
|
|
|
Endpoint_ClearIN();
|
|
|
|
Endpoint_ClearIN();
|
|
|
|
|
|
|
|
|
|
|
|