forked from mirrors/qmk_userspace
		
	confirm SetReport LED.
This commit is contained in:
		
					parent
					
						
							
								f2ebac101d
							
						
					
				
			
			
				commit
				
					
						a112f3614e
					
				
			
		
					 6 changed files with 91 additions and 61 deletions
				
			
		| 
						 | 
				
			
			@ -138,6 +138,7 @@ static uint8_t command_common(void)
 | 
			
		|||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case KB_S:
 | 
			
		||||
            print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n");
 | 
			
		||||
#ifdef HOST_PJRC
 | 
			
		||||
            print("UDCON: "); phex(UDCON); print("\n");
 | 
			
		||||
            print("UDIEN: "); phex(UDIEN); print("\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -168,13 +168,16 @@ void host_mouse_send(report_mouse_t *report)
 | 
			
		|||
 | 
			
		||||
void host_system_send(uint16_t data)
 | 
			
		||||
{
 | 
			
		||||
    static uint16_t last_data = 0;
 | 
			
		||||
    if (data == last_data) return;
 | 
			
		||||
    last_data = data;
 | 
			
		||||
 | 
			
		||||
    if (!driver) return;
 | 
			
		||||
    (*driver->send_system)(data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void host_consumer_send(uint16_t data)
 | 
			
		||||
{
 | 
			
		||||
    // TODO: this is needed?
 | 
			
		||||
    static uint16_t last_data = 0;
 | 
			
		||||
    if (data == last_data) return;
 | 
			
		||||
    last_data = data;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
     * `-----------------------------------------------------------'
 | 
			
		||||
     */ 
 | 
			
		||||
    KEYMAP(PWR, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, \
 | 
			
		||||
           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NO,  \
 | 
			
		||||
           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NLCK,\
 | 
			
		||||
           LCTL,VOLD,VOLU,MUTE,NO,  NO,  PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
 | 
			
		||||
           LSFT,NO,  NO,  NO,  NO,  NO,  PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
 | 
			
		||||
           NO,  LGUI,LALT,SPC, RALT,NO,  NO,  NO,  RCTL),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
/* 
 | 
			
		||||
 * Copyright 2012 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
 * This file is based on:
 | 
			
		||||
 *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
 | 
			
		||||
 *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2012.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,13 +46,12 @@
 | 
			
		|||
#include "descriptor.h"
 | 
			
		||||
#include "lufa.h"
 | 
			
		||||
 | 
			
		||||
static uint8_t idle_duration = 0;
 | 
			
		||||
static uint8_t protocol_report = 1;
 | 
			
		||||
static uint8_t keyboard_led_stats = 0;
 | 
			
		||||
 | 
			
		||||
// TODO: impl Control Request GET_REPORT
 | 
			
		||||
static report_keyboard_t keyboard_report_sent;
 | 
			
		||||
#ifdef MOUSE_ENABLE
 | 
			
		||||
static report_mouse_t mouse_report_sent;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Host driver */
 | 
			
		||||
static uint8_t keyboard_leds(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -83,12 +82,8 @@ int main(void)
 | 
			
		|||
    debug_keyboard = true;
 | 
			
		||||
    debug_mouse = true;
 | 
			
		||||
 | 
			
		||||
/* TODO: can't print here
 | 
			
		||||
    _delay_ms(5000);
 | 
			
		||||
    USB_USBTask();
 | 
			
		||||
    print("abcdefg\n");
 | 
			
		||||
    USB_USBTask();
 | 
			
		||||
*/
 | 
			
		||||
    // TODO: can't print here
 | 
			
		||||
    debug("LUFA init\n");
 | 
			
		||||
 | 
			
		||||
    keyboard_init();
 | 
			
		||||
    host_set_driver(&lufa_driver);
 | 
			
		||||
| 
						 | 
				
			
			@ -228,19 +223,6 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
			
		|||
                    ReportData = (uint8_t*)&keyboard_report_sent;
 | 
			
		||||
                    ReportSize = sizeof(keyboard_report_sent);
 | 
			
		||||
                    break;
 | 
			
		||||
#ifdef MOUSE_ENABLE
 | 
			
		||||
                case MOUSE_INTERFACE:
 | 
			
		||||
                    // TODO: test/check
 | 
			
		||||
                    ReportData = (uint8_t*)&mouse_report_sent;
 | 
			
		||||
                    ReportSize = sizeof(mouse_report_sent);
 | 
			
		||||
                    break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef EXTRAKEY_ENABLE
 | 
			
		||||
                case EXTRA_INTERFACE:
 | 
			
		||||
                    break;
 | 
			
		||||
#endif
 | 
			
		||||
                case CONSOLE_INTERFACE:
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                /* Write the report data to the control endpoint */
 | 
			
		||||
| 
						 | 
				
			
			@ -252,35 +234,65 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
			
		|||
        case HID_REQ_SetReport:
 | 
			
		||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
            {
 | 
			
		||||
                Endpoint_ClearSETUP();
 | 
			
		||||
 | 
			
		||||
                /* Wait until the LED report has been sent by the host */
 | 
			
		||||
                while (!(Endpoint_IsOUTReceived()))
 | 
			
		||||
                {
 | 
			
		||||
                    if (USB_DeviceState == DEVICE_STATE_Unattached)
 | 
			
		||||
                      return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Interface
 | 
			
		||||
                switch (USB_ControlRequest.wIndex) {
 | 
			
		||||
                case KEYBOARD_INTERFACE:
 | 
			
		||||
                    // TODO: test/check
 | 
			
		||||
                    /* Read in the LED report from the host */
 | 
			
		||||
                    Endpoint_ClearSETUP();
 | 
			
		||||
 | 
			
		||||
                    while (!(Endpoint_IsOUTReceived())) {
 | 
			
		||||
                        if (USB_DeviceState == DEVICE_STATE_Unattached)
 | 
			
		||||
                          return;
 | 
			
		||||
                    }
 | 
			
		||||
                    keyboard_led_stats = Endpoint_Read_8();
 | 
			
		||||
                    break;
 | 
			
		||||
#ifdef MOUSE_ENABLE
 | 
			
		||||
                case MOUSE_INTERFACE:
 | 
			
		||||
                    break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef EXTRAKEY_ENABLE
 | 
			
		||||
                case EXTRA_INTERFACE:
 | 
			
		||||
                    break;
 | 
			
		||||
#endif
 | 
			
		||||
                case CONSOLE_INTERFACE:
 | 
			
		||||
 | 
			
		||||
                    Endpoint_ClearOUT();
 | 
			
		||||
                    Endpoint_ClearStatusStage();
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                Endpoint_ClearOUT();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case HID_REQ_GetProtocol:
 | 
			
		||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
            {
 | 
			
		||||
                Endpoint_ClearSETUP();
 | 
			
		||||
                while (!(Endpoint_IsINReady()));
 | 
			
		||||
                Endpoint_Write_8(protocol_report);
 | 
			
		||||
                Endpoint_ClearIN();
 | 
			
		||||
                Endpoint_ClearStatusStage();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        case HID_REQ_SetProtocol:
 | 
			
		||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
            {
 | 
			
		||||
                Endpoint_ClearSETUP();
 | 
			
		||||
                Endpoint_ClearStatusStage();
 | 
			
		||||
 | 
			
		||||
                protocol_report = ((USB_ControlRequest.wValue & 0xFF) != 0x00);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        case HID_REQ_SetIdle:
 | 
			
		||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
            {
 | 
			
		||||
                Endpoint_ClearSETUP();
 | 
			
		||||
                Endpoint_ClearStatusStage();
 | 
			
		||||
 | 
			
		||||
                idle_duration = ((USB_ControlRequest.wValue & 0xFF00) >> 8);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        case HID_REQ_GetIdle:
 | 
			
		||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
            {
 | 
			
		||||
                Endpoint_ClearSETUP();
 | 
			
		||||
                while (!(Endpoint_IsINReady()));
 | 
			
		||||
                Endpoint_Write_8(idle_duration);
 | 
			
		||||
                Endpoint_ClearIN();
 | 
			
		||||
                Endpoint_ClearStatusStage();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -329,23 +341,17 @@ static void send_mouse(report_mouse_t *report)
 | 
			
		|||
        /* Finalize the stream transfer to send the last packet */
 | 
			
		||||
        Endpoint_ClearIN();
 | 
			
		||||
    }
 | 
			
		||||
    mouse_report_sent = *report;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    uint8_t  report_id;
 | 
			
		||||
    uint16_t usage;
 | 
			
		||||
} __attribute__ ((packed)) report_extra_t;
 | 
			
		||||
 | 
			
		||||
static void send_system(uint16_t data)
 | 
			
		||||
{
 | 
			
		||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
			
		||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
			
		||||
    report_extra_t r = {
 | 
			
		||||
        .report_id = REPORT_ID_SYSTEM,
 | 
			
		||||
        .usage = data
 | 
			
		||||
    };
 | 
			
		||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
			
		||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
			
		||||
        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
			
		||||
        Endpoint_ClearIN();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -353,12 +359,12 @@ static void send_system(uint16_t data)
 | 
			
		|||
 | 
			
		||||
static void send_consumer(uint16_t data)
 | 
			
		||||
{
 | 
			
		||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
			
		||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
			
		||||
    report_extra_t r = {
 | 
			
		||||
        .report_id = REPORT_ID_CONSUMER,
 | 
			
		||||
        .usage = data
 | 
			
		||||
    };
 | 
			
		||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
			
		||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
			
		||||
        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
			
		||||
        Endpoint_ClearIN();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
/* 
 | 
			
		||||
 * Copyright 2012 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
 * This file is based on:
 | 
			
		||||
 *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
 | 
			
		||||
 *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2012.
 | 
			
		||||
| 
						 | 
				
			
			@ -32,7 +39,6 @@
 | 
			
		|||
#ifndef _LUFA_H_
 | 
			
		||||
#define _LUFA_H_
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
#include <avr/wdt.h>
 | 
			
		||||
#include <avr/power.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -42,4 +48,11 @@
 | 
			
		|||
#include <LUFA/Version.h>
 | 
			
		||||
#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* extra report structure */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    uint8_t  report_id;
 | 
			
		||||
    uint16_t usage;
 | 
			
		||||
} __attribute__ ((packed)) report_extra_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue