forked from mirrors/qmk_userspace
		
	Interrupt driven Control ep and Console task
This commit is contained in:
		
					parent
					
						
							
								ab89bfce03
							
						
					
				
			
			
				commit
				
					
						8947029950
					
				
			
		
					 3 changed files with 59 additions and 34 deletions
				
			
		| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,14 +106,20 @@ 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;
 | 
			
		||||
 | 
			
		||||
    uint8_t ep = Endpoint_GetCurrentEndpoint();
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    // TODO: impl receivechar()/recvchar()
 | 
			
		||||
    Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -135,14 +142,18 @@ static void Console_HID_Task(void)
 | 
			
		|||
        /* Finalize the stream transfer to send the last packet */
 | 
			
		||||
        Endpoint_ClearOUT();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* IN packet */
 | 
			
		||||
    Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
 | 
			
		||||
        // send IN packet
 | 
			
		||||
	if (Endpoint_IsINReady())
 | 
			
		||||
    // flash senchar packet
 | 
			
		||||
    if (Endpoint_IsINReady()) {
 | 
			
		||||
        Endpoint_ClearIN();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Endpoint_SelectEndpoint(ep);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
 * USB Events
 | 
			
		||||
| 
						 | 
				
			
			@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue