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;
 | 
					            break;
 | 
				
			||||||
        case KB_S:
 | 
					        case KB_S:
 | 
				
			||||||
 | 
					            print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n");
 | 
				
			||||||
#ifdef HOST_PJRC
 | 
					#ifdef HOST_PJRC
 | 
				
			||||||
            print("UDCON: "); phex(UDCON); print("\n");
 | 
					            print("UDCON: "); phex(UDCON); print("\n");
 | 
				
			||||||
            print("UDIEN: "); phex(UDIEN); 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)
 | 
					void host_system_send(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    static uint16_t last_data = 0;
 | 
				
			||||||
 | 
					    if (data == last_data) return;
 | 
				
			||||||
 | 
					    last_data = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!driver) return;
 | 
					    if (!driver) return;
 | 
				
			||||||
    (*driver->send_system)(data);
 | 
					    (*driver->send_system)(data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void host_consumer_send(uint16_t data)
 | 
					void host_consumer_send(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: this is needed?
 | 
					 | 
				
			||||||
    static uint16_t last_data = 0;
 | 
					    static uint16_t last_data = 0;
 | 
				
			||||||
    if (data == last_data) return;
 | 
					    if (data == last_data) return;
 | 
				
			||||||
    last_data = data;
 | 
					    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, \
 | 
					    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, \
 | 
					           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, \
 | 
					           LSFT,NO,  NO,  NO,  NO,  NO,  PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
 | 
				
			||||||
           NO,  LGUI,LALT,SPC, RALT,NO,  NO,  NO,  RCTL),
 | 
					           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
 | 
					             LUFA Library
 | 
				
			||||||
     Copyright (C) Dean Camera, 2012.
 | 
					     Copyright (C) Dean Camera, 2012.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,13 +46,12 @@
 | 
				
			||||||
#include "descriptor.h"
 | 
					#include "descriptor.h"
 | 
				
			||||||
#include "lufa.h"
 | 
					#include "lufa.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint8_t idle_duration = 0;
 | 
				
			||||||
 | 
					static uint8_t protocol_report = 1;
 | 
				
			||||||
static uint8_t keyboard_led_stats = 0;
 | 
					static uint8_t keyboard_led_stats = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: impl Control Request GET_REPORT
 | 
					 | 
				
			||||||
static report_keyboard_t keyboard_report_sent;
 | 
					static report_keyboard_t keyboard_report_sent;
 | 
				
			||||||
#ifdef MOUSE_ENABLE
 | 
					
 | 
				
			||||||
static report_mouse_t mouse_report_sent;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Host driver */
 | 
					/* Host driver */
 | 
				
			||||||
static uint8_t keyboard_leds(void);
 | 
					static uint8_t keyboard_leds(void);
 | 
				
			||||||
| 
						 | 
					@ -83,12 +82,8 @@ int main(void)
 | 
				
			||||||
    debug_keyboard = true;
 | 
					    debug_keyboard = true;
 | 
				
			||||||
    debug_mouse = true;
 | 
					    debug_mouse = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: can't print here
 | 
					    // TODO: can't print here
 | 
				
			||||||
    _delay_ms(5000);
 | 
					    debug("LUFA init\n");
 | 
				
			||||||
    USB_USBTask();
 | 
					 | 
				
			||||||
    print("abcdefg\n");
 | 
					 | 
				
			||||||
    USB_USBTask();
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    keyboard_init();
 | 
					    keyboard_init();
 | 
				
			||||||
    host_set_driver(&lufa_driver);
 | 
					    host_set_driver(&lufa_driver);
 | 
				
			||||||
| 
						 | 
					@ -228,19 +223,6 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
				
			||||||
                    ReportData = (uint8_t*)&keyboard_report_sent;
 | 
					                    ReportData = (uint8_t*)&keyboard_report_sent;
 | 
				
			||||||
                    ReportSize = sizeof(keyboard_report_sent);
 | 
					                    ReportSize = sizeof(keyboard_report_sent);
 | 
				
			||||||
                    break;
 | 
					                    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 */
 | 
					                /* Write the report data to the control endpoint */
 | 
				
			||||||
| 
						 | 
					@ -252,35 +234,65 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
				
			||||||
        case HID_REQ_SetReport:
 | 
					        case HID_REQ_SetReport:
 | 
				
			||||||
            if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 | 
					            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
 | 
					                // Interface
 | 
				
			||||||
                switch (USB_ControlRequest.wIndex) {
 | 
					                switch (USB_ControlRequest.wIndex) {
 | 
				
			||||||
                case KEYBOARD_INTERFACE:
 | 
					                case KEYBOARD_INTERFACE:
 | 
				
			||||||
                    // TODO: test/check
 | 
					                    Endpoint_ClearSETUP();
 | 
				
			||||||
                    /* Read in the LED report from the host */
 | 
					
 | 
				
			||||||
 | 
					                    while (!(Endpoint_IsOUTReceived())) {
 | 
				
			||||||
 | 
					                        if (USB_DeviceState == DEVICE_STATE_Unattached)
 | 
				
			||||||
 | 
					                          return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    keyboard_led_stats = Endpoint_Read_8();
 | 
					                    keyboard_led_stats = Endpoint_Read_8();
 | 
				
			||||||
                    break;
 | 
					
 | 
				
			||||||
#ifdef MOUSE_ENABLE
 | 
					                    Endpoint_ClearOUT();
 | 
				
			||||||
                case MOUSE_INTERFACE:
 | 
					                    Endpoint_ClearStatusStage();
 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef EXTRAKEY_ENABLE
 | 
					 | 
				
			||||||
                case EXTRA_INTERFACE:
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                case CONSOLE_INTERFACE:
 | 
					 | 
				
			||||||
                    break;
 | 
					                    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();
 | 
					                Endpoint_ClearStatusStage();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -329,23 +341,17 @@ static void send_mouse(report_mouse_t *report)
 | 
				
			||||||
        /* Finalize the stream transfer to send the last packet */
 | 
					        /* Finalize the stream transfer to send the last packet */
 | 
				
			||||||
        Endpoint_ClearIN();
 | 
					        Endpoint_ClearIN();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    mouse_report_sent = *report;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
    uint8_t  report_id;
 | 
					 | 
				
			||||||
    uint16_t usage;
 | 
					 | 
				
			||||||
} __attribute__ ((packed)) report_extra_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void send_system(uint16_t data)
 | 
					static void send_system(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    report_extra_t r = {
 | 
				
			||||||
 | 
					        .report_id = REPORT_ID_SYSTEM,
 | 
				
			||||||
 | 
					        .usage = data
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
					    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
				
			||||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
					    if (Endpoint_IsReadWriteAllowed()) {
 | 
				
			||||||
        report_extra_t r = {
 | 
					 | 
				
			||||||
            .report_id = REPORT_ID_SYSTEM,
 | 
					 | 
				
			||||||
            .usage = data
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
					        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
				
			||||||
        Endpoint_ClearIN();
 | 
					        Endpoint_ClearIN();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -353,12 +359,12 @@ static void send_system(uint16_t data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_consumer(uint16_t data)
 | 
					static void send_consumer(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    report_extra_t r = {
 | 
				
			||||||
 | 
					        .report_id = REPORT_ID_CONSUMER,
 | 
				
			||||||
 | 
					        .usage = data
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
					    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
				
			||||||
    if (Endpoint_IsReadWriteAllowed()) {
 | 
					    if (Endpoint_IsReadWriteAllowed()) {
 | 
				
			||||||
        report_extra_t r = {
 | 
					 | 
				
			||||||
            .report_id = REPORT_ID_CONSUMER,
 | 
					 | 
				
			||||||
            .usage = data
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
					        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
				
			||||||
        Endpoint_ClearIN();
 | 
					        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
 | 
					             LUFA Library
 | 
				
			||||||
     Copyright (C) Dean Camera, 2012.
 | 
					     Copyright (C) Dean Camera, 2012.
 | 
				
			||||||
| 
						 | 
					@ -32,7 +39,6 @@
 | 
				
			||||||
#ifndef _LUFA_H_
 | 
					#ifndef _LUFA_H_
 | 
				
			||||||
#define _LUFA_H_
 | 
					#define _LUFA_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Includes: */
 | 
					 | 
				
			||||||
#include <avr/io.h>
 | 
					#include <avr/io.h>
 | 
				
			||||||
#include <avr/wdt.h>
 | 
					#include <avr/wdt.h>
 | 
				
			||||||
#include <avr/power.h>
 | 
					#include <avr/power.h>
 | 
				
			||||||
| 
						 | 
					@ -42,4 +48,11 @@
 | 
				
			||||||
#include <LUFA/Version.h>
 | 
					#include <LUFA/Version.h>
 | 
				
			||||||
#include <LUFA/Drivers/USB/USB.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
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue