Revision cf0dbb21
b/Makefile | ||
---|---|---|
54 | 54 |
|
55 | 55 |
OBJS+=irq.o |
56 | 56 |
OBJS+=i2c.o smbus.o smbus_eeprom.o max7310.o max111x.o wm8750.o |
57 |
OBJS+=ssd0303.o ssd0323.o ads7846.o |
|
57 |
OBJS+=ssd0303.o ssd0323.o ads7846.o stellaris_input.o
|
|
58 | 58 |
OBJS+=scsi-disk.o cdrom.o |
59 | 59 |
OBJS+=usb.o usb-hub.o usb-linux.o usb-hid.o usb-msd.o usb-wacom.o |
60 | 60 |
|
b/hw/devices.h | ||
---|---|---|
16 | 16 |
void ads7846_write(void *opaque, uint32_t value); |
17 | 17 |
struct ads7846_state_s *ads7846_init(qemu_irq penirq); |
18 | 18 |
|
19 |
/* stellaris_input.c */ |
|
20 |
void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode); |
|
21 |
|
|
19 | 22 |
#endif |
b/hw/irq.c | ||
---|---|---|
65 | 65 |
|
66 | 66 |
qemu_irq qemu_irq_invert(qemu_irq irq) |
67 | 67 |
{ |
68 |
/* The default state for IRQs is low, so raise the output now. */ |
|
69 |
qemu_irq_raise(irq); |
|
68 | 70 |
return qemu_allocate_irqs(qemu_notirq, irq, 1)[0]; |
69 | 71 |
} |
b/hw/stellaris.c | ||
---|---|---|
16 | 16 |
#include "sysemu.h" |
17 | 17 |
#include "boards.h" |
18 | 18 |
|
19 |
#define GPIO_A 0 |
|
20 |
#define GPIO_B 1 |
|
21 |
#define GPIO_C 2 |
|
22 |
#define GPIO_D 3 |
|
23 |
#define GPIO_E 4 |
|
24 |
#define GPIO_F 5 |
|
25 |
#define GPIO_G 6 |
|
26 |
|
|
27 |
#define BP_OLED_I2C 0x01 |
|
28 |
#define BP_OLED_SSI 0x02 |
|
29 |
#define BP_GAMEPAD 0x04 |
|
30 |
|
|
19 | 31 |
typedef const struct { |
20 | 32 |
const char *name; |
21 | 33 |
uint32_t did0; |
... | ... | |
25 | 37 |
uint32_t dc2; |
26 | 38 |
uint32_t dc3; |
27 | 39 |
uint32_t dc4; |
28 |
enum {OLED_I2C, OLED_SSI} oled;
|
|
40 |
uint32_t peripherals;
|
|
29 | 41 |
} stellaris_board_info; |
30 | 42 |
|
31 | 43 |
/* General purpose timer module. */ |
... | ... | |
991 | 1003 |
0x01071013, |
992 | 1004 |
0x3f0f01ff, |
993 | 1005 |
0x0000001f, |
994 |
OLED_I2C |
|
1006 |
BP_OLED_I2C
|
|
995 | 1007 |
}, |
996 | 1008 |
{ "LM3S6965EVB", |
997 | 1009 |
0x10010002, |
... | ... | |
1001 | 1013 |
0x030f5317, |
1002 | 1014 |
0x0f0f87ff, |
1003 | 1015 |
0x5000007f, |
1004 |
OLED_SSI
|
|
1016 |
BP_OLED_SSI | BP_GAMEPAD
|
|
1005 | 1017 |
} |
1006 | 1018 |
}; |
1007 | 1019 |
|
... | ... | |
1052 | 1064 |
if (board->dc2 & (1 << 12)) { |
1053 | 1065 |
i2c = i2c_init_bus(); |
1054 | 1066 |
stellaris_i2c_init(0x40020000, pic[8], i2c); |
1055 |
if (board->oled == OLED_I2C) {
|
|
1067 |
if (board->peripherals & BP_OLED_I2C) {
|
|
1056 | 1068 |
ssd0303_init(ds, i2c, 0x3d); |
1057 | 1069 |
} |
1058 | 1070 |
} |
... | ... | |
1064 | 1076 |
} |
1065 | 1077 |
} |
1066 | 1078 |
if (board->dc2 & (1 << 4)) { |
1067 |
if (board->oled == OLED_SSI) {
|
|
1079 |
if (board->peripherals & BP_OLED_SSI) {
|
|
1068 | 1080 |
void * oled; |
1069 | 1081 |
/* FIXME: Implement chip select for OLED/MMC. */ |
1070 |
oled = ssd0323_init(ds, &gpio_out[2][7]);
|
|
1082 |
oled = ssd0323_init(ds, &gpio_out[GPIO_C][7]);
|
|
1071 | 1083 |
pl022_init(0x40008000, pic[7], ssd0323_xfer_ssi, oled); |
1072 | 1084 |
} else { |
1073 | 1085 |
pl022_init(0x40008000, pic[7], NULL, NULL); |
1074 | 1086 |
} |
1075 | 1087 |
} |
1088 |
if (board->peripherals & BP_GAMEPAD) { |
|
1089 |
qemu_irq gpad_irq[5]; |
|
1090 |
static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d }; |
|
1091 |
|
|
1092 |
gpad_irq[0] = qemu_irq_invert(gpio_in[GPIO_E][0]); /* up */ |
|
1093 |
gpad_irq[1] = qemu_irq_invert(gpio_in[GPIO_E][1]); /* down */ |
|
1094 |
gpad_irq[2] = qemu_irq_invert(gpio_in[GPIO_E][2]); /* left */ |
|
1095 |
gpad_irq[3] = qemu_irq_invert(gpio_in[GPIO_E][3]); /* right */ |
|
1096 |
gpad_irq[4] = qemu_irq_invert(gpio_in[GPIO_F][1]); /* select */ |
|
1097 |
|
|
1098 |
stellaris_gamepad_init(5, gpad_irq, gpad_keycode); |
|
1099 |
} |
|
1076 | 1100 |
} |
1077 | 1101 |
|
1078 | 1102 |
/* FIXME: Figure out how to generate these from stellaris_boards. */ |
b/hw/stellaris_input.c | ||
---|---|---|
1 |
/* |
|
2 |
* Gamepad style buttons connected to IRQ/GPIO lines |
|
3 |
* |
|
4 |
* Copyright (c) 2007 CodeSourcery. |
|
5 |
* Written by Paul Brook |
|
6 |
* |
|
7 |
* This code is licenced under the GPL. |
|
8 |
*/ |
|
9 |
#include "hw.h" |
|
10 |
#include "devices.h" |
|
11 |
#include "console.h" |
|
12 |
|
|
13 |
typedef struct { |
|
14 |
qemu_irq irq; |
|
15 |
int keycode; |
|
16 |
int pressed; |
|
17 |
} gamepad_button; |
|
18 |
|
|
19 |
typedef struct { |
|
20 |
gamepad_button *buttons; |
|
21 |
int num_buttons; |
|
22 |
int extension; |
|
23 |
} gamepad_state; |
|
24 |
|
|
25 |
static void stellaris_gamepad_put_key(void * opaque, int keycode) |
|
26 |
{ |
|
27 |
gamepad_state *s = (gamepad_state *)opaque; |
|
28 |
int i; |
|
29 |
int down; |
|
30 |
|
|
31 |
if (keycode == 0xe0 && !s->extension) { |
|
32 |
s->extension = 0x80; |
|
33 |
return; |
|
34 |
} |
|
35 |
|
|
36 |
down = (keycode & 0x80) == 0; |
|
37 |
keycode = (keycode & 0x7f) | s->extension; |
|
38 |
|
|
39 |
for (i = 0; i < s->num_buttons; i++) { |
|
40 |
if (s->buttons[i].keycode == keycode |
|
41 |
&& s->buttons[i].pressed != down) { |
|
42 |
s->buttons[i].pressed = down; |
|
43 |
qemu_set_irq(s->buttons[i].irq, down); |
|
44 |
} |
|
45 |
} |
|
46 |
|
|
47 |
s->extension = 0; |
|
48 |
} |
|
49 |
|
|
50 |
/* Returns an array 5 ouput slots. */ |
|
51 |
void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode) |
|
52 |
{ |
|
53 |
gamepad_state *s; |
|
54 |
int i; |
|
55 |
|
|
56 |
s = (gamepad_state *)qemu_mallocz(sizeof (gamepad_state)); |
|
57 |
s->buttons = (gamepad_button *)qemu_mallocz(n * sizeof (gamepad_button)); |
|
58 |
for (i = 0; i < n; i++) { |
|
59 |
s->buttons[i].irq = irq[i]; |
|
60 |
s->buttons[i].keycode = keycode[i]; |
|
61 |
} |
|
62 |
s->num_buttons = n; |
|
63 |
qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s); |
|
64 |
} |
|
65 |
|
|
66 |
|
Also available in: Unified diff