Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1627 → Rev 1628

/kernel/trunk/generic/src/ipc/irq.c
66,7 → 66,7
static void code_execute(call_t *call, irq_code_t *code)
{
int i;
 
if (!code)
return;
109,9 → 109,9
IPC_SET_ARG2(call->data, _getc(&ski_uconsole));
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
default:
/kernel/trunk/arch/ppc32/include/drivers/cuda.h
30,13 → 30,11
#define __CUDA_H__
 
#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
/kernel/trunk/arch/ppc32/src/drivers/cuda.c
29,6 → 29,7
#include <arch/drivers/cuda.h>
#include <arch/asm.h>
#include <console/console.h>
#include <console/chardev.h>
#include <arch/drivers/pic.h>
#include <sysinfo/sysinfo.h>
#include <interrupt.h>
36,7 → 37,6
 
#define PACKET_ADB 0x00
#define PACKET_CUDA 0x01
#define PACKET_NULL 0xff
 
#define CUDA_POWERDOWN 0x0a
 
66,33 → 66,7
};
 
 
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, ...);
 
 
static void receive_packet(__u8 *kind, index_t count, __u8 data[])
129,7 → 103,7
}
 
 
chardev_t kbrd;
static chardev_t kbrd;
static chardev_operations_t ops = {
.suspend = cuda_suspend,
.resume = cuda_resume,
137,7 → 111,7
};
 
 
static void cuda_irq(int n, istate_t *istate)
__u8 cuda_get_scancode(void)
{
__u8 kind;
__u8 data[4];
144,15 → 118,22
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]);
}
 
 
void cuda_init(__address base, size_t size)
{
cuda = (__u8 *) hw_map(base, size);
168,11 → 149,33
}
 
 
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 (
"b 0\n"