Revision bc24a225 hw/lm832x.c
b/hw/lm832x.c | ||
---|---|---|
24 | 24 |
#include "qemu-timer.h" |
25 | 25 |
#include "console.h" |
26 | 26 |
|
27 |
struct lm_kbd_s {
|
|
27 |
typedef struct {
|
|
28 | 28 |
i2c_slave i2c; |
29 | 29 |
int i2c_dir; |
30 | 30 |
int i2c_cycle; |
... | ... | |
66 | 66 |
uint8_t addr[3]; |
67 | 67 |
QEMUTimer *tm[3]; |
68 | 68 |
} pwm; |
69 |
}; |
|
69 |
} LM823KbdState;
|
|
70 | 70 |
|
71 | 71 |
#define INT_KEYPAD (1 << 0) |
72 | 72 |
#define INT_ERROR (1 << 3) |
... | ... | |
78 | 78 |
#define ERR_KEYOVR (1 << 2) |
79 | 79 |
#define ERR_FIFOOVR (1 << 6) |
80 | 80 |
|
81 |
static void lm_kbd_irq_update(struct lm_kbd_s *s)
|
|
81 |
static void lm_kbd_irq_update(LM823KbdState *s)
|
|
82 | 82 |
{ |
83 | 83 |
qemu_set_irq(s->nirq, !s->status); |
84 | 84 |
} |
85 | 85 |
|
86 |
static void lm_kbd_gpio_update(struct lm_kbd_s *s)
|
|
86 |
static void lm_kbd_gpio_update(LM823KbdState *s)
|
|
87 | 87 |
{ |
88 | 88 |
} |
89 | 89 |
|
90 |
static void lm_kbd_reset(struct lm_kbd_s *s)
|
|
90 |
static void lm_kbd_reset(LM823KbdState *s)
|
|
91 | 91 |
{ |
92 | 92 |
s->config = 0x80; |
93 | 93 |
s->status = INT_NOINIT; |
... | ... | |
100 | 100 |
lm_kbd_gpio_update(s); |
101 | 101 |
} |
102 | 102 |
|
103 |
static void lm_kbd_error(struct lm_kbd_s *s, int err)
|
|
103 |
static void lm_kbd_error(LM823KbdState *s, int err)
|
|
104 | 104 |
{ |
105 | 105 |
s->error |= err; |
106 | 106 |
s->status |= INT_ERROR; |
107 | 107 |
lm_kbd_irq_update(s); |
108 | 108 |
} |
109 | 109 |
|
110 |
static void lm_kbd_pwm_tick(struct lm_kbd_s *s, int line)
|
|
110 |
static void lm_kbd_pwm_tick(LM823KbdState *s, int line)
|
|
111 | 111 |
{ |
112 | 112 |
} |
113 | 113 |
|
114 |
static void lm_kbd_pwm_start(struct lm_kbd_s *s, int line)
|
|
114 |
static void lm_kbd_pwm_start(LM823KbdState *s, int line)
|
|
115 | 115 |
{ |
116 | 116 |
lm_kbd_pwm_tick(s, line); |
117 | 117 |
} |
... | ... | |
158 | 158 |
#define LM832x_MAX_KPX 8 |
159 | 159 |
#define LM832x_MAX_KPY 12 |
160 | 160 |
|
161 |
static uint8_t lm_kbd_read(struct lm_kbd_s *s, int reg, int byte)
|
|
161 |
static uint8_t lm_kbd_read(LM823KbdState *s, int reg, int byte)
|
|
162 | 162 |
{ |
163 | 163 |
int ret; |
164 | 164 |
|
... | ... | |
239 | 239 |
return ret >> (byte << 3); |
240 | 240 |
} |
241 | 241 |
|
242 |
static void lm_kbd_write(struct lm_kbd_s *s, int reg, int byte, uint8_t value)
|
|
242 |
static void lm_kbd_write(LM823KbdState *s, int reg, int byte, uint8_t value)
|
|
243 | 243 |
{ |
244 | 244 |
switch (reg) { |
245 | 245 |
case LM832x_CMD_WRITE_CFG: |
... | ... | |
378 | 378 |
|
379 | 379 |
static void lm_i2c_event(i2c_slave *i2c, enum i2c_event event) |
380 | 380 |
{ |
381 |
struct lm_kbd_s *s = (struct lm_kbd_s *) i2c;
|
|
381 |
LM823KbdState *s = (LM823KbdState *) i2c;
|
|
382 | 382 |
|
383 | 383 |
switch (event) { |
384 | 384 |
case I2C_START_RECV: |
... | ... | |
394 | 394 |
|
395 | 395 |
static int lm_i2c_rx(i2c_slave *i2c) |
396 | 396 |
{ |
397 |
struct lm_kbd_s *s = (struct lm_kbd_s *) i2c;
|
|
397 |
LM823KbdState *s = (LM823KbdState *) i2c;
|
|
398 | 398 |
|
399 | 399 |
return lm_kbd_read(s, s->reg, s->i2c_cycle ++); |
400 | 400 |
} |
401 | 401 |
|
402 | 402 |
static int lm_i2c_tx(i2c_slave *i2c, uint8_t data) |
403 | 403 |
{ |
404 |
struct lm_kbd_s *s = (struct lm_kbd_s *) i2c;
|
|
404 |
LM823KbdState *s = (LM823KbdState *) i2c;
|
|
405 | 405 |
|
406 | 406 |
if (!s->i2c_cycle) |
407 | 407 |
s->reg = data; |
... | ... | |
414 | 414 |
|
415 | 415 |
static void lm_kbd_save(QEMUFile *f, void *opaque) |
416 | 416 |
{ |
417 |
struct lm_kbd_s *s = (struct lm_kbd_s *) opaque;
|
|
417 |
LM823KbdState *s = (LM823KbdState *) opaque;
|
|
418 | 418 |
int i; |
419 | 419 |
|
420 | 420 |
i2c_slave_save(f, &s->i2c); |
... | ... | |
450 | 450 |
|
451 | 451 |
static int lm_kbd_load(QEMUFile *f, void *opaque, int version_id) |
452 | 452 |
{ |
453 |
struct lm_kbd_s *s = (struct lm_kbd_s *) opaque;
|
|
453 |
LM823KbdState *s = (LM823KbdState *) opaque;
|
|
454 | 454 |
int i; |
455 | 455 |
|
456 | 456 |
i2c_slave_load(f, &s->i2c); |
... | ... | |
489 | 489 |
return 0; |
490 | 490 |
} |
491 | 491 |
|
492 |
struct i2c_slave *lm8323_init(i2c_bus *bus, qemu_irq nirq)
|
|
492 |
i2c_slave *lm8323_init(i2c_bus *bus, qemu_irq nirq) |
|
493 | 493 |
{ |
494 |
struct lm_kbd_s *s;
|
|
494 |
LM823KbdState *s;
|
|
495 | 495 |
|
496 |
s = (struct lm_kbd_s *) i2c_slave_init(bus, 0, sizeof(struct lm_kbd_s));
|
|
496 |
s = (LM823KbdState *) i2c_slave_init(bus, 0, sizeof(LM823KbdState));
|
|
497 | 497 |
s->model = 0x8323; |
498 | 498 |
s->pwm.tm[0] = qemu_new_timer(vm_clock, lm_kbd_pwm0_tick, s); |
499 | 499 |
s->pwm.tm[1] = qemu_new_timer(vm_clock, lm_kbd_pwm1_tick, s); |
... | ... | |
514 | 514 |
|
515 | 515 |
void lm832x_key_event(struct i2c_slave *i2c, int key, int state) |
516 | 516 |
{ |
517 |
struct lm_kbd_s *s = (struct lm_kbd_s *) i2c;
|
|
517 |
LM823KbdState *s = (LM823KbdState *) i2c;
|
|
518 | 518 |
|
519 | 519 |
if ((s->status & INT_ERROR) && (s->error & ERR_FIFOOVR)) |
520 | 520 |
return; |
Also available in: Unified diff