~ruther/qmk_firmware

8947029950ba19c16bedd3d4618d4227f4714564 — tmk 13 years ago ab89bfc
Interrupt driven Control ep and Console task
3 files changed, 65 insertions(+), 40 deletions(-)

M keyboard/hhkb/Makefile.lufa
M protocol/lufa/descriptor.h
M protocol/lufa/lufa.c
M keyboard/hhkb/Makefile.lufa => keyboard/hhkb/Makefile.lufa +3 -0
@@ 93,6 93,9 @@ ARCH = AVR8
#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)

# Interrupt driven control endpoint task
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT


# Build Options
#   comment out to disable the options.

M protocol/lufa/descriptor.h => protocol/lufa/descriptor.h +1 -1
@@ 110,7 110,7 @@ typedef struct

#define KEYBOARD_EPSIZE             8
#define MOUSE_EPSIZE                8
#define CONSOLE_EPSIZE              8
#define CONSOLE_EPSIZE              32
#define EXTRA_EPSIZE                8



M protocol/lufa/lufa.c => protocol/lufa/lufa.c +61 -39
@@ 69,7 69,7 @@ static host_driver_t lufa_driver = {


static void SetupHardware(void);
static void Console_HID_Task(void);
static void Console_Task(void);

int main(void)
{


@@ 90,8 90,9 @@ int main(void)
    while (1) {
        keyboard_proc();

        Console_HID_Task();
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
        USB_USBTask();
#endif
    }
}



@@ 105,42 106,52 @@ void SetupHardware(void)
    clock_prescale_set(clock_div_1);

    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 */
	if (USB_DeviceState != DEVICE_STATE_Configured)
	  return;

        // TODO: impl receivechar()/recvchar()
	Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);

	/* Check to see if a packet has been sent from the host */
	if (Endpoint_IsOUTReceived())
	{
		/* Check to see if the packet contains data */
		if (Endpoint_IsReadWriteAllowed())
		{
			/* Create a temporary buffer to hold the read in report from the host */
			uint8_t ConsoleData[CONSOLE_EPSIZE];

			/* Read Console Report Data */
			Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);

			/* Process Console Report Data */
			//ProcessConsoleHIDReport(ConsoleData);
		}

		/* Finalize the stream transfer to send the last packet */
		Endpoint_ClearOUT();
	}

        /* IN packet */
	Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
        // send IN packet
	if (Endpoint_IsINReady())
            Endpoint_ClearIN();
    /* Device must be connected and configured for the task to run */
    if (USB_DeviceState != DEVICE_STATE_Configured)
      return;

    uint8_t ep = Endpoint_GetCurrentEndpoint();

#if 0
    // TODO: impl receivechar()/recvchar()
    Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);

    /* Check to see if a packet has been sent from the host */
    if (Endpoint_IsOUTReceived())
    {
        /* Check to see if the packet contains data */
        if (Endpoint_IsReadWriteAllowed())
        {
            /* Create a temporary buffer to hold the read in report from the host */
            uint8_t ConsoleData[CONSOLE_EPSIZE];
 
            /* Read Console Report Data */
            Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
 
            /* Process Console Report Data */
            //ProcessConsoleHIDReport(ConsoleData);
        }

        /* Finalize the stream transfer to send the last packet */
        Endpoint_ClearOUT();
    }
#endif

    /* 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.
 * 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 */
    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,
                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
}


@@ 374,6 395,7 @@ static void send_consumer(uint16_t data)
/*******************************************************************************
 * sendchar
 ******************************************************************************/
#define SEND_TIMEOUT 10
int8_t sendchar(uint8_t c)
{
    if (USB_DeviceState != DEVICE_STATE_Configured)


@@ 381,9 403,9 @@ int8_t sendchar(uint8_t c)

    Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);

    uint8_t timeout = 10;
    uint8_t timeout = SEND_TIMEOUT;
    uint16_t prevFN = USB_Device_GetFrameNumber();
    while (!Endpoint_IsINReady()) {
    while (!Endpoint_IsReadWriteAllowed()) {
        switch (USB_DeviceState) {
        case DEVICE_STATE_Unattached:
        case DEVICE_STATE_Suspended:


@@ 400,7 422,7 @@ int8_t sendchar(uint8_t c)

    Endpoint_Write_8(c);

    // send when packet is full
    // send when bank is full
    if (!Endpoint_IsReadWriteAllowed())
        Endpoint_ClearIN();