Browse Source

Interrupt driven Control ep and Console task

tags/v1.9
tmk 12 years ago
parent
commit
8947029950
3 changed files with 65 additions and 40 deletions
  1. 3
    0
      keyboard/hhkb/Makefile.lufa
  2. 1
    1
      protocol/lufa/descriptor.h
  3. 61
    39
      protocol/lufa/lufa.c

+ 3
- 0
keyboard/hhkb/Makefile.lufa View File

@@ -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.

+ 1
- 1
protocol/lufa/descriptor.h View File

@@ -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



+ 61
- 39
protocol/lufa/lufa.c View File

@@ -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();


Loading…
Cancel
Save