Subversion Repositories HelenOS-historic

Rev

Rev 1606 | Rev 1625 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1606 Rev 1619
Line 30... Line 30...
30
#include <arch/asm.h>
30
#include <arch/asm.h>
31
#include <console/chardev.h>
31
#include <console/chardev.h>
32
#include <console/console.h>
32
#include <console/console.h>
33
#include <arch/drivers/pic.h>
33
#include <arch/drivers/pic.h>
34
#include <interrupt.h>
34
#include <interrupt.h>
-
 
35
#include <stdarg.h>
-
 
36
 
-
 
37
#define PACKET_ADB  0x00
-
 
38
#define PACKET_CUDA 0x01
-
 
39
#define PACKET_NULL 0xff
35
 
40
 
36
#define CUDA_PACKET 0x01
-
 
37
#define CUDA_POWERDOWN 0x0a
41
#define CUDA_POWERDOWN 0x0a
38
 
42
 
39
#define RS 0x200
43
#define RS 0x200
40
#define B (0 * RS)
44
#define B (0 * RS)
41
#define A (1 * RS)
45
#define A (1 * RS)
Line 45... Line 49...
45
#define SR_OUT 0x10
49
#define SR_OUT 0x10
46
#define TACK 0x10
50
#define TACK 0x10
47
#define TIP 0x20
51
#define TIP 0x20
48
 
52
 
49
 
53
 
50
static volatile __u8 *cuda = (__u8 *) 0xf2000000;
54
static volatile __u8 *cuda = NULL;
-
 
55
 
-
 
56
 
-
 
57
static char lchars[0x80] = {
-
 
58
    'a',  's',  'd',  'f',  'h',  'g',  'z',  'x',  'c',  'v',    0,  'b',  'q',  'w',  'e',  'r',
-
 
59
    'y',  't',  '1',  '2',  '3',  '4',  '6',  '5',  '=',  '9',  '7',  '-',  '8',  '0',  ']',  'o',
-
 
60
    'u',  '[',  'i',  'p',   13,  'l',  'j', '\'',  'k',  ';', '\\',  ',',  '/',  'n',  'm',  '.',
-
 
61
      9,   32,  '`',    8,    0,   27,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
 
62
      0,  '.',    0,  '*',    0,  '+',    0,    0,    0,    0,    0,  '/',   13,    0,  '-',    0,
-
 
63
      0,    0,  '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',    0,  '8',  '9',    0,    0,    0,
-
 
64
      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
 
65
      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
-
 
66
};
-
 
67
 
-
 
68
 
-
 
69
static void send_packet(const __u8 kind, index_t count, ...)
-
 
70
{
-
 
71
    index_t i;
-
 
72
    va_list va;
-
 
73
   
-
 
74
    switch (kind) {
-
 
75
        case PACKET_NULL:
-
 
76
            break;
-
 
77
        default:
-
 
78
            cuda[B] = cuda[B] | TIP;
-
 
79
            cuda[ACR] = cuda[ACR] | SR_OUT;
-
 
80
            cuda[SR] = kind;
-
 
81
            cuda[B] = cuda[B] & ~TIP;
-
 
82
           
-
 
83
            va_start(va, count);
-
 
84
           
-
 
85
            for (i = 0; i < count; i++) {
-
 
86
                cuda[ACR] = cuda[ACR] | SR_OUT;
-
 
87
                cuda[SR] = va_arg(va, int);
-
 
88
                cuda[B] = cuda[B] | TACK;
-
 
89
            }
-
 
90
           
-
 
91
            va_end(va);
-
 
92
           
-
 
93
            cuda[B] = cuda[B] | TIP;
-
 
94
    }
-
 
95
}
-
 
96
 
-
 
97
 
-
 
98
static void receive_packet(__u8 *kind, index_t count, __u8 data[])
-
 
99
{
-
 
100
    cuda[B] = cuda[B] & ~TIP;
-
 
101
    *kind = cuda[SR];
-
 
102
   
-
 
103
    index_t i;
-
 
104
    for (i = 0; i < count; i++)
-
 
105
        data[i] = cuda[SR];
-
 
106
   
-
 
107
    cuda[B] = cuda[B] | TIP;
-
 
108
}
51
 
109
 
52
 
110
 
53
/* Called from getc(). */
111
/* Called from getc(). */
54
static void cuda_resume(chardev_t *d)
112
static void cuda_resume(chardev_t *d)
55
{
113
{
Line 76... Line 134...
76
    .suspend = cuda_suspend,
134
    .suspend = cuda_suspend,
77
    .resume = cuda_resume,
135
    .resume = cuda_resume,
78
    .read = key_read
136
    .read = key_read
79
};
137
};
80
 
138
 
81
#include <print.h>
-
 
-
 
139
 
82
static void cuda_irq(int n, istate_t *istate)
140
static void cuda_irq(int n, istate_t *istate)
83
{
141
{
-
 
142
    __u8 kind;
-
 
143
    __u8 data[4];
-
 
144
   
84
    printf("Got cuda msg\n");
145
    receive_packet(&kind, 4, data);
-
 
146
   
-
 
147
    if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c)) {
-
 
148
        __u8 key = data[2];
-
 
149
       
-
 
150
        if ((key & 0x80) != 0x80)
-
 
151
            chardev_push_character(&kbrd, lchars[key & 0x7f]);
-
 
152
    }
85
}
153
}
86
 
154
 
-
 
155
 
87
void cuda_init(void)
156
void cuda_init(__address base, size_t size)
88
{
157
{
-
 
158
    cuda = (__u8 *) hw_map(base, size);
-
 
159
   
89
    int_register(CUDA_IRQ, "cuda", cuda_irq);
160
    int_register(CUDA_IRQ, "cuda", cuda_irq);
90
    pic_enable_interrupt(CUDA_IRQ);
161
    pic_enable_interrupt(CUDA_IRQ);
91
   
162
   
92
    chardev_initialize("cuda_kbd", &kbrd, &ops);
163
    chardev_initialize("cuda_kbd", &kbrd, &ops);
93
    stdin = &kbrd;
164
    stdin = &kbrd;
94
}
165
}
95
 
166
 
96
 
167
 
97
void cuda_packet(const __u8 data)
-
 
98
{
-
 
99
    cuda[B] = cuda[B] | TIP;
-
 
100
    cuda[ACR] = cuda[ACR] | SR_OUT;
-
 
101
    cuda[SR] = CUDA_PACKET;
-
 
102
    cuda[B] = cuda[B] & ~TIP;
-
 
103
   
-
 
104
    cuda[ACR] = cuda[ACR] | SR_OUT;
-
 
105
    cuda[SR] = data;
-
 
106
    cuda[B] = cuda[B] | TACK;
-
 
107
   
-
 
108
    cuda[B] = cuda[B] | TIP;
-
 
109
}
-
 
110
 
-
 
111
 
-
 
112
void cpu_halt(void) {
168
void cpu_halt(void) {
113
#ifdef CONFIG_POWEROFF
169
#ifdef CONFIG_POWEROFF
114
    cuda_packet(CUDA_POWERDOWN);
170
    send_packet(PACKET_CUDA, 1, CUDA_POWERDOWN);
115
#else
171
#else
-
 
172
    send_packet(PACKET_NULL, 0);
-
 
173
#endif
116
    asm volatile (
174
    asm volatile (
117
        "b 0\n"
175
        "b 0\n"
118
    );
176
    );
119
#endif
-
 
120
    cpu_sleep();
-
 
121
}
177
}