changeset 232:9a3c9f6f4866

USB NKRO working for ARM! - Setting NKRO mode as default (up to bios to disable)
author Jacob Alexander <haata@kiibohd.com>
date Sun, 28 Sep 2014 17:24:52 -0700
parents 4afb170978e9
children 757e06368d0f
files Output/pjrcUSB/arm/usb_keyboard.c Output/pjrcUSB/output_com.c
diffstat 2 files changed, 102 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/Output/pjrcUSB/arm/usb_keyboard.c	Sun Sep 28 16:44:57 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_keyboard.c	Sun Sep 28 17:24:52 2014 -0700
@@ -76,6 +76,7 @@
 	uint32_t wait_count = 0;
 	usb_packet_t *tx_packet;
 
+	// Wait till ready
 	while ( 1 )
 	{
 		if ( !usb_configuration )
@@ -83,12 +84,26 @@
 			erro_print("USB not configured...");
 			return;
 		}
-		if ( usb_tx_packet_count(KEYBOARD_ENDPOINT) < TX_PACKET_LIMIT )
+
+		if ( USBKeys_Protocol == 0 ) // Boot Mode
 		{
-			tx_packet = usb_malloc();
-			if ( tx_packet )
-				break;
+			if ( usb_tx_packet_count( NKRO_KEYBOARD_ENDPOINT ) < TX_PACKET_LIMIT )
+			{
+				tx_packet = usb_malloc();
+				if ( tx_packet )
+					break;
+			}
 		}
+		else if ( USBKeys_Protocol == 1 ) // NKRO Mode
+		{
+			if ( usb_tx_packet_count( KEYBOARD_ENDPOINT ) < TX_PACKET_LIMIT )
+			{
+				tx_packet = usb_malloc();
+				if ( tx_packet )
+					break;
+			}
+		}
+
 		if ( ++wait_count > TX_TIMEOUT || transmit_previous_timeout )
 		{
 			transmit_previous_timeout = 1;
@@ -98,15 +113,89 @@
 		yield();
 	}
 
-	// Boot Mode
-	*(tx_packet->buf) = USBKeys_Modifiers;
-	*(tx_packet->buf + 1) = 0;
-	memcpy( tx_packet->buf + 2, USBKeys_Keys, USB_BOOT_MAX_KEYS );
-	tx_packet->len = 8;
+	// Pointer to USB tx packet buffer
+	uint8_t *tx_buf = tx_packet->buf;
+
+	switch ( USBKeys_Protocol )
+	{
+	// Send boot keyboard interrupt packet(s)
+	case 0:
+		// Boot Mode
+		*tx_buf++ = USBKeys_Modifiers;
+		*tx_buf++ = 0;
+		memcpy( tx_buf, USBKeys_Keys, USB_BOOT_MAX_KEYS );
+		tx_packet->len = 8;
+
+		// Send USB Packet
+		usb_tx( KEYBOARD_ENDPOINT, tx_packet );
+		USBKeys_Changed = USBKeyChangeState_None;
+		break;
+
+	// Send NKRO keyboard interrupts packet(s)
+	case 1:
+		// Check modifiers
+		if ( USBKeys_Changed & USBKeyChangeState_Modifiers )
+		{
+			*tx_buf++ = 0x01; // ID
+			*tx_buf   = USBKeys_Modifiers;
+			tx_packet->len = 2;
+
+			// Send USB Packet
+			usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+			USBKeys_Changed &= ~USBKeyChangeState_Modifiers; // Mark sent
+		}
+		// Check main key section
+		else if ( USBKeys_Changed & USBKeyChangeState_MainKeys )
+		{
+			*tx_buf++ = 0x03; // ID
+
+			// 4-164 (first 20 bytes)
+			memcpy( tx_buf, USBKeys_Keys, 20 );
+			tx_packet->len = 21;
 
-	// Send USB Packet
-	usb_tx( KEYBOARD_ENDPOINT, tx_packet );
-	USBKeys_Changed = USBKeyChangeState_None;
+			// Send USB Packet
+			usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+			USBKeys_Changed &= ~USBKeyChangeState_MainKeys; // Mark sent
+		}
+		// Check secondary key section
+		else if ( USBKeys_Changed & USBKeyChangeState_SecondaryKeys )
+		{
+			*tx_buf++ = 0x04; // ID
+
+			// 176-221 (last 6 bytes)
+			memcpy( tx_buf, USBKeys_Keys + 20, 6 );
+			tx_packet->len = 7;
+
+			// Send USB Packet
+			usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+			USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent
+		}
+		// Check system control keys
+		else if ( USBKeys_Changed & USBKeyChangeState_System )
+		{
+			*tx_buf++ = 0x05; // ID
+			*tx_buf   = USBKeys_SysCtrl;
+			tx_packet->len = 2;
+
+			// Send USB Packet
+			usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+			USBKeys_Changed &= ~USBKeyChangeState_System; // Mark sent
+		}
+		// Check consumer control keys
+		else if ( USBKeys_Changed & USBKeyChangeState_Consumer )
+		{
+			*tx_buf++ = 0x06; // ID
+			*tx_buf++ = (uint8_t)(USBKeys_ConsCtrl & 0x00FF);
+			*tx_buf   = (uint8_t)(USBKeys_ConsCtrl >> 8);
+			tx_packet->len = 3;
+
+			// Send USB Packet
+			usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+			USBKeys_Changed &= ~USBKeyChangeState_Consumer; // Mark sent
+		}
+
+		break;
+	}
 
 	return;
 }
--- a/Output/pjrcUSB/output_com.c	Sun Sep 28 16:44:57 2014 -0700
+++ b/Output/pjrcUSB/output_com.c	Sun Sep 28 17:24:52 2014 -0700
@@ -106,7 +106,7 @@
 // Protocol setting from the host.
 // 0 - Boot Mode
 // 1 - NKRO Mode (Default, unless set by a BIOS or boot interface)
-volatile uint8_t  USBKeys_Protocol = 0;
+volatile uint8_t  USBKeys_Protocol = 1;
 
 // Indicate if USB should send update
 // OS only needs update if there has been a change in state