12
#include <kernel/irq.h>
14
#include <drivers/input/input_dev.h>
15
#include <drivers/common/memory.h>
17
#include <drivers/pl050.h>
18
#include <drivers/ps_mouse.h>
20
#include <embox/unit.h>
22
#define BASE_ADDR OPTION_GET(NUMBER,base_addr)
23
#define IRQ_NUM OPTION_GET(NUMBER,irq_num)
25
EMBOX_UNIT_INIT(pl050_mouse_init);
28
struct pl050_mouse_indev {
29
struct input_dev input_dev;
30
struct pl050 *pl050_dev;
33
static int pl050_mouse_stop(struct input_dev *dev) {
39
static const struct input_dev_ops mouse_input_ops = {
41
.stop = pl050_mouse_stop,
44
static struct pl050_mouse_indev mouse_dev = {
46
.ops = &mouse_input_ops,
48
.type = INPUT_DEV_MOUSE,
52
static irq_return_t pl050_mouse_irq_hnd(unsigned int irq_nr, void *data) {
53
struct pl050_mouse_indev *pl050_mouse_indev;
57
struct input_dev *indev;
59
pl050_mouse_indev = (struct pl050_mouse_indev *)data;
60
pl050 = pl050_mouse_indev->pl050_dev;
62
indev = &pl050_mouse_indev->input_dev;
65
if (tmp == MOUSE_ACK) {
68
rx_data[0] = tmp & 0xFF;
71
rx_data[1] = tmp & 0xFF;
74
rx_data[2] = tmp & 0xFF;
76
ps_mouse_event_send(indev, rx_data);
82
static int pl050_mouse_init(void) {
85
res = irq_attach(IRQ_NUM, pl050_mouse_irq_hnd, 0,
86
&mouse_dev, "ps mouse");
91
mouse_dev.pl050_dev = (void*)(uintptr_t)BASE_ADDR;
93
pl050_init(mouse_dev.pl050_dev);
95
return input_dev_register(&mouse_dev.input_dev);
98
PERIPH_MEMORY_DEFINE(pl050_mouse, BASE_ADDR, 0x1000);