2
* Copyright (c) 2009 Vineeth Pillai
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
/** @addtogroup genarch
34
* @brief pl050 keyboard/mouse driver.
36
* It takes care of low-level keyboard functions.
39
#include <genarch/drivers/pl050/pl050.h>
41
#include <console/chardev.h>
43
#include <ddi/device.h>
45
#define PL050_KEY_RELEASE 0xF0
46
#define PL050_ESC_KEY 0xE0
47
#define PL050_CAPS_SCAN_CODE 0x58
49
/** Structure for pl050's IRQ. */
50
static pl050_t *pl050;
52
static irq_ownership_t pl050_claim(irq_t *irq)
55
if ((status = pio_read_8(pl050->status)) & PL050_STAT_RXFULL)
62
static void pl050_irq_handler(irq_t *irq)
66
pl050_instance_t *instance = irq->instance;
68
while ((status = pio_read_8(pl050->status)) & PL050_STAT_RXFULL) {
69
data = pio_read_8(pl050->data);
70
indev_push_character(instance->kbrdin, data);
75
/** Initialize pl050. */
76
pl050_instance_t *pl050_init(pl050_t *dev, inr_t inr)
79
pl050_instance_t *instance =
80
malloc(sizeof(pl050_instance_t), FRAME_ATOMIC);
85
instance->pl050 = dev;
86
instance->kbrdin = NULL;
88
irq_initialize(&instance->irq);
89
instance->irq.devno = device_assign_devno();
90
instance->irq.inr = inr;
91
instance->irq.claim = pl050_claim;
92
instance->irq.handler = pl050_irq_handler;
93
instance->irq.instance = instance;
99
void pl050_wire(pl050_instance_t *instance, indev_t *kbrdin)
103
instance->kbrdin = kbrdin;
104
irq_register(&instance->irq);
106
val = PL050_CR_RXINTR | PL050_CR_INTR;
108
pio_write_8(pl050->ctrl, val);
110
/* reset the data buffer */
111
pio_read_8(pl050->data);