Subversion Repositories HelenOS

Rev

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

Rev 3958 Rev 3963
Line 87... Line 87...
87
static chardev_operations_t ops = {
87
static chardev_operations_t ops = {
88
    .suspend = i8042_suspend,
88
    .suspend = i8042_suspend,
89
    .resume = i8042_resume,
89
    .resume = i8042_resume,
90
};
90
};
91
 
91
 
92
/** Structure for i8042's IRQ. */
-
 
93
static irq_t i8042_kbd_irq;
-
 
94
static irq_t i8042_mouse_irq;
-
 
95
 
-
 
96
static irq_ownership_t i8042_claim(irq_t *irq)
92
static irq_ownership_t i8042_claim(irq_t *irq)
97
{
93
{
98
    i8042_instance_t *i8042_instance = irq->instance;
94
    i8042_instance_t *i8042_instance = irq->instance;
99
    i8042_t *dev = i8042_instance->i8042;
95
    i8042_t *dev = i8042_instance->i8042;
100
    if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
96
    if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
Line 123... Line 119...
123
            key_pressed(data);
119
            key_pressed(data);
124
    }
120
    }
125
}
121
}
126
 
122
 
127
/** Initialize i8042. */
123
/** Initialize i8042. */
128
void
124
bool
129
i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno,
125
i8042_init(i8042_t *dev, devno_t devno, inr_t inr)
130
    inr_t mouse_inr)
-
 
131
{
126
{
132
    i8042_t *dev = lgcy_i8042_instance.i8042;
127
    i8042_instance_t *instance;
133
 
128
 
134
    chardev_initialize("i8042_kbd", &kbrd, &ops);
129
    chardev_initialize("i8042_kbd", &kbrd, &ops);
135
    stdin = &kbrd;
130
    stdin = &kbrd;
136
   
131
   
137
    irq_initialize(&i8042_kbd_irq);
132
    instance = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC);
138
    i8042_kbd_irq.devno = kbd_devno;
-
 
139
    i8042_kbd_irq.inr = kbd_inr;
133
    if (!instance)
140
    i8042_kbd_irq.claim = i8042_claim;
-
 
141
    i8042_kbd_irq.handler = i8042_irq_handler;
-
 
142
    i8042_kbd_irq.instance = &lgcy_i8042_instance;
-
 
143
    irq_register(&i8042_kbd_irq);
134
        return false;
144
   
135
   
145
    irq_initialize(&i8042_mouse_irq);
-
 
146
    i8042_mouse_irq.devno = mouse_devno;
136
    instance->devno = devno;
147
    i8042_mouse_irq.inr = mouse_inr;
-
 
148
    i8042_mouse_irq.claim = i8042_claim;
-
 
149
    i8042_mouse_irq.handler = i8042_irq_handler;
-
 
150
    i8042_mouse_irq.instance = &lgcy_i8042_instance;
-
 
151
    irq_register(&i8042_mouse_irq);
137
    instance->i8042 = dev;
152
   
138
   
153
    trap_virtual_enable_irqs(1 << kbd_inr);
139
    irq_initialize(&instance->irq);
-
 
140
    instance->irq.devno = devno;
-
 
141
    instance->irq.inr = inr;
-
 
142
    instance->irq.claim = i8042_claim;
-
 
143
    instance->irq.handler = i8042_irq_handler;
-
 
144
    instance->irq.instance = instance;
-
 
145
    irq_register(&instance->irq);
-
 
146
   
154
    trap_virtual_enable_irqs(1 << mouse_inr);
147
    trap_virtual_enable_irqs(1 << inr);
155
   
148
   
156
    /*
149
    /*
157
     * Clear input buffer.
150
     * Clear input buffer.
158
     */
151
     */
159
    while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
152
    while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
Line 162... Line 155...
162
    /*
155
    /*
163
     * This is the necessary evil until the userspace driver is entirely
156
     * This is the necessary evil until the userspace driver is entirely
164
     * self-sufficient.
157
     * self-sufficient.
165
     */
158
     */
166
    sysinfo_set_item_val("kbd", NULL, true);
159
    sysinfo_set_item_val("kbd", NULL, true);
167
    sysinfo_set_item_val("kbd.devno", NULL, kbd_devno);
160
    sysinfo_set_item_val("kbd.devno", NULL, devno);
168
    sysinfo_set_item_val("kbd.inr", NULL, kbd_inr);
161
    sysinfo_set_item_val("kbd.inr", NULL, inr);
169
#ifdef KBD_LEGACY
162
#ifdef KBD_LEGACY
170
    sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY);
163
    sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY);
171
#endif
164
#endif
-
 
165
 
172
    sysinfo_set_item_val("mouse", NULL, true);
166
    return true;
173
    sysinfo_set_item_val("mouse.devno", NULL, mouse_devno);
-
 
174
    sysinfo_set_item_val("mouse.inr", NULL, mouse_inr);
-
 
175
}
167
}
176
 
168
 
177
/* Called from getc(). */
169
/* Called from getc(). */
178
void i8042_resume(chardev_t *d)
170
void i8042_resume(chardev_t *d)
179
{
171
{