Index: arch/ppc32/include/drivers/cuda.h
===================================================================
--- arch/ppc32/include/drivers/cuda.h	(revision 9ceaef4102e685bd8c484ffb6da226f353c7c841)
+++ arch/ppc32/include/drivers/cuda.h	(revision ae971b3e902b87e9e944e1e94506f329e69c3e97)
@@ -31,12 +31,10 @@
 
 #include <arch/types.h>
-#include <console/chardev.h>
 #include <typedefs.h>
 
 #define CUDA_IRQ 10
 
-chardev_t kbrd;
-
 extern void cuda_init(__address base, size_t size);
+extern __u8 cuda_get_scancode(void);
 
 #endif
Index: arch/ppc32/src/drivers/cuda.c
===================================================================
--- arch/ppc32/src/drivers/cuda.c	(revision 9ceaef4102e685bd8c484ffb6da226f353c7c841)
+++ arch/ppc32/src/drivers/cuda.c	(revision ae971b3e902b87e9e944e1e94506f329e69c3e97)
@@ -30,4 +30,5 @@
 #include <arch/asm.h>
 #include <console/console.h>
+#include <console/chardev.h>
 #include <arch/drivers/pic.h>
 #include <sysinfo/sysinfo.h>
@@ -37,5 +38,4 @@
 #define PACKET_ADB  0x00
 #define PACKET_CUDA 0x01
-#define PACKET_NULL 0xff
 
 #define CUDA_POWERDOWN 0x0a
@@ -67,31 +67,5 @@
 
 
-static void send_packet(const __u8 kind, index_t count, ...)
-{
-	index_t i;
-	va_list va;
-	
-	switch (kind) {
-		case PACKET_NULL:
-			break;
-		default:
-			cuda[B] = cuda[B] | TIP;
-			cuda[ACR] = cuda[ACR] | SR_OUT;
-			cuda[SR] = kind;
-			cuda[B] = cuda[B] & ~TIP;
-			
-			va_start(va, count);
-			
-			for (i = 0; i < count; i++) {
-				cuda[ACR] = cuda[ACR] | SR_OUT;
-				cuda[SR] = va_arg(va, int);
-				cuda[B] = cuda[B] | TACK;
-			}
-			
-			va_end(va);
-			
-			cuda[B] = cuda[B] | TIP;
-	}
-}
+void send_packet(const __u8 kind, index_t count, ...);
 
 
@@ -130,5 +104,5 @@
 
 
-chardev_t kbrd;
+static chardev_t kbrd;
 static chardev_operations_t ops = {
 	.suspend = cuda_suspend,
@@ -138,5 +112,5 @@
 
 
-static void cuda_irq(int n, istate_t *istate)
+__u8 cuda_get_scancode(void)
 {
 	__u8 kind;
@@ -145,10 +119,17 @@
 	receive_packet(&kind, 4, data);
 	
-	if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c)) {
-		__u8 key = data[2];
-		
-		if ((key & 0x80) != 0x80)
-			chardev_push_character(&kbrd, lchars[key & 0x7f]);
-	}
+	if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c))
+		return data[2];
+	
+	return 0;
+}
+
+
+static void cuda_irq(int n, istate_t *istate)
+{
+	__u8 scancode = cuda_get_scancode();
+	
+	if ((scancode != 0) && ((scancode & 0x80) != 0x80))
+		chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
 }
 
@@ -169,9 +150,31 @@
 
 
+void send_packet(const __u8 kind, index_t count, ...)
+{
+	index_t i;
+	va_list va;
+	
+	cuda[B] = cuda[B] | TIP;
+	cuda[ACR] = cuda[ACR] | SR_OUT;
+	cuda[SR] = kind;
+	cuda[B] = cuda[B] & ~TIP;
+	
+	va_start(va, count);
+	
+	for (i = 0; i < count; i++) {
+		cuda[ACR] = cuda[ACR] | SR_OUT;
+		cuda[SR] = va_arg(va, int);
+		cuda[B] = cuda[B] | TACK;
+	}
+	
+	va_end(va);
+	
+	cuda[B] = cuda[B] | TIP;
+}
+
+
 void cpu_halt(void) {
 #ifdef CONFIG_POWEROFF
 	send_packet(PACKET_CUDA, 1, CUDA_POWERDOWN);
-#else
-	send_packet(PACKET_NULL, 0);
 #endif
 	asm volatile (
Index: generic/src/ipc/irq.c
===================================================================
--- generic/src/ipc/irq.c	(revision 9ceaef4102e685bd8c484ffb6da226f353c7c841)
+++ generic/src/ipc/irq.c	(revision ae971b3e902b87e9e944e1e94506f329e69c3e97)
@@ -67,5 +67,5 @@
 {
 	int i;
-
+	
 	if (!code)
 		return;
@@ -110,7 +110,7 @@
 			break;
 #endif
-#if defined(ppc32) 
+#if defined(ppc32)
 		case CMD_PPC32_GETCHAR:
-			IPC_SET_ARG2(call->data, _getc(&kbrd));
+			IPC_SET_ARG2(call->data, cuda_get_scancode());
 			break;
 #endif
