提交 e927bb00 编写于 作者: B balrog

Nokia N810 basic system emulation.

Add TSC2005 touchscreen controller.
Add N810 machine definition.
Unify N800 and N810 ATAG list generation.
Pass a word length parameter on every SPI transfer.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4374 c046a42c-6fe2-441c-8c8c-71466251a162
上级 a350e694
...@@ -622,6 +622,7 @@ OBJS+= omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o ...@@ -622,6 +622,7 @@ OBJS+= omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o
OBJS+= omap2.o omap_dss.o OBJS+= omap2.o omap_dss.o
OBJS+= palm.o tsc210x.o OBJS+= palm.o tsc210x.o
OBJS+= nseries.o blizzard.o onenand.o vga.o cbus.o tusb6010.o usb-musb.o OBJS+= nseries.o blizzard.o onenand.o vga.o cbus.o tusb6010.o usb-musb.o
OBJS+= tsc2005.o
OBJS+= mst_fpga.o mainstone.o OBJS+= mst_fpga.o mainstone.o
OBJS+= musicpal.o pflash_cfi02.o OBJS+= musicpal.o pflash_cfi02.o
CPPFLAGS += -DHAS_AUDIO CPPFLAGS += -DHAS_AUDIO
......
...@@ -86,6 +86,7 @@ extern QEMUMachine palmte_machine; ...@@ -86,6 +86,7 @@ extern QEMUMachine palmte_machine;
/* nseries.c */ /* nseries.c */
extern QEMUMachine n800_machine; extern QEMUMachine n800_machine;
extern QEMUMachine n810_machine;
/* gumstix.c */ /* gumstix.c */
extern QEMUMachine connex_machine; extern QEMUMachine connex_machine;
......
...@@ -23,11 +23,16 @@ struct uwire_slave_s *tsc2102_init(qemu_irq pint, AudioState *audio); ...@@ -23,11 +23,16 @@ struct uwire_slave_s *tsc2102_init(qemu_irq pint, AudioState *audio);
struct uwire_slave_s *tsc2301_init(qemu_irq penirq, qemu_irq kbirq, struct uwire_slave_s *tsc2301_init(qemu_irq penirq, qemu_irq kbirq,
qemu_irq dav, AudioState *audio); qemu_irq dav, AudioState *audio);
struct i2s_codec_s *tsc210x_codec(struct uwire_slave_s *chip); struct i2s_codec_s *tsc210x_codec(struct uwire_slave_s *chip);
uint32_t tsc210x_txrx(void *opaque, uint32_t value); uint32_t tsc210x_txrx(void *opaque, uint32_t value, int len);
void tsc210x_set_transform(struct uwire_slave_s *chip, void tsc210x_set_transform(struct uwire_slave_s *chip,
struct mouse_transform_info_s *info); struct mouse_transform_info_s *info);
void tsc210x_key_event(struct uwire_slave_s *chip, int key, int down); void tsc210x_key_event(struct uwire_slave_s *chip, int key, int down);
/* tsc2005.c */
void *tsc2005_init(qemu_irq pintdav);
uint32_t tsc2005_txrx(void *opaque, uint32_t value, int len);
void tsc2005_set_transform(void *opaque, struct mouse_transform_info_s *info);
/* stellaris_input.c */ /* stellaris_input.c */
void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode); void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode);
......
此差异已折叠。
...@@ -695,7 +695,7 @@ struct omap_mcspi_s; ...@@ -695,7 +695,7 @@ struct omap_mcspi_s;
struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum, struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum,
qemu_irq irq, qemu_irq *drq, omap_clk fclk, omap_clk iclk); qemu_irq irq, qemu_irq *drq, omap_clk fclk, omap_clk iclk);
void omap_mcspi_attach(struct omap_mcspi_s *s, void omap_mcspi_attach(struct omap_mcspi_s *s,
uint32_t (*txrx)(void *opaque, uint32_t), void *opaque, uint32_t (*txrx)(void *opaque, uint32_t, int), void *opaque,
int chipselect); int chipselect);
struct omap_rtc_s; struct omap_rtc_s;
...@@ -1012,6 +1012,15 @@ void omap_mpu_wakeup(void *opaque, int irq, int req); ...@@ -1012,6 +1012,15 @@ void omap_mpu_wakeup(void *opaque, int irq, int req);
#define OMAP_TAG_FLASH_PART_STR 0x4f81 #define OMAP_TAG_FLASH_PART_STR 0x4f81
#define OMAP_TAG_VERSION_STR 0x4f82 #define OMAP_TAG_VERSION_STR 0x4f82
enum {
OMAP_GPIOSW_TYPE_COVER = 0 << 4,
OMAP_GPIOSW_TYPE_CONNECTION = 1 << 4,
OMAP_GPIOSW_TYPE_ACTIVITY = 2 << 4,
};
#define OMAP_GPIOSW_INVERTED 0x0001
#define OMAP_GPIOSW_OUTPUT 0x0002
# define TCMI_VERBOSE 1 # define TCMI_VERBOSE 1
//# define MEM_VERBOSE 1 //# define MEM_VERBOSE 1
......
...@@ -1109,7 +1109,7 @@ struct omap_mcspi_s { ...@@ -1109,7 +1109,7 @@ struct omap_mcspi_s {
struct omap_mcspi_ch_s { struct omap_mcspi_ch_s {
qemu_irq txdrq; qemu_irq txdrq;
qemu_irq rxdrq; qemu_irq rxdrq;
uint32_t (*txrx)(void *opaque, uint32_t); uint32_t (*txrx)(void *opaque, uint32_t, int);
void *opaque; void *opaque;
uint32_t tx; uint32_t tx;
...@@ -1157,7 +1157,8 @@ static void omap_mcspi_transfer_run(struct omap_mcspi_s *s, int chnum) ...@@ -1157,7 +1157,8 @@ static void omap_mcspi_transfer_run(struct omap_mcspi_s *s, int chnum)
if (!(s->control & 1) || /* SINGLE */ if (!(s->control & 1) || /* SINGLE */
(ch->config & (1 << 20))) { /* FORCE */ (ch->config & (1 << 20))) { /* FORCE */
if (ch->txrx) if (ch->txrx)
ch->rx = ch->txrx(ch->opaque, ch->tx); ch->rx = ch->txrx(ch->opaque, ch->tx, /* WL */
1 + (0x1f & (ch->config >> 7)));
} }
ch->tx = 0; ch->tx = 0;
...@@ -1408,7 +1409,7 @@ struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum, ...@@ -1408,7 +1409,7 @@ struct omap_mcspi_s *omap_mcspi_init(struct omap_target_agent_s *ta, int chnum,
} }
void omap_mcspi_attach(struct omap_mcspi_s *s, void omap_mcspi_attach(struct omap_mcspi_s *s,
uint32_t (*txrx)(void *opaque, uint32_t), void *opaque, uint32_t (*txrx)(void *opaque, uint32_t, int), void *opaque,
int chipselect) int chipselect)
{ {
if (chipselect < 0 || chipselect >= s->chnum) if (chipselect < 0 || chipselect >= s->chnum)
...@@ -1476,7 +1477,8 @@ static uint32_t omap_sti_read(void *opaque, target_phys_addr_t addr) ...@@ -1476,7 +1477,8 @@ static uint32_t omap_sti_read(void *opaque, target_phys_addr_t addr)
case 0x24: /* STI_ER / STI_DR / XTI_TRACESELECT */ case 0x24: /* STI_ER / STI_DR / XTI_TRACESELECT */
case 0x28: /* STI_RX_DR / XTI_RXDATA */ case 0x28: /* STI_RX_DR / XTI_RXDATA */
break; /* TODO */
return 0;
case 0x2c: /* STI_CLK_CTRL / XTI_SCLKCRTL */ case 0x2c: /* STI_CLK_CTRL / XTI_SCLKCRTL */
return s->clkcontrol; return s->clkcontrol;
...@@ -1527,6 +1529,9 @@ static void omap_sti_write(void *opaque, target_phys_addr_t addr, ...@@ -1527,6 +1529,9 @@ static void omap_sti_write(void *opaque, target_phys_addr_t addr,
case 0x24: /* STI_ER / STI_DR / XTI_TRACESELECT */ case 0x24: /* STI_ER / STI_DR / XTI_TRACESELECT */
case 0x28: /* STI_RX_DR / XTI_RXDATA */ case 0x28: /* STI_RX_DR / XTI_RXDATA */
/* TODO */
return;
default: default:
OMAP_BAD_REG(addr); OMAP_BAD_REG(addr);
return; return;
......
...@@ -939,11 +939,15 @@ static void tsc210x_write(struct tsc210x_state_s *s, uint16_t value) ...@@ -939,11 +939,15 @@ static void tsc210x_write(struct tsc210x_state_s *s, uint16_t value)
} }
} }
uint32_t tsc210x_txrx(void *opaque, uint32_t value) uint32_t tsc210x_txrx(void *opaque, uint32_t value, int len)
{ {
struct tsc210x_state_s *s = opaque; struct tsc210x_state_s *s = opaque;
uint32_t ret = 0; uint32_t ret = 0;
if (len != 16)
cpu_abort(cpu_single_env, "%s: FIXME: bad SPI word width %i\n",
__FUNCTION__, len);
/* TODO: sequential reads etc - how do we make sure the host doesn't /* TODO: sequential reads etc - how do we make sure the host doesn't
* unintentionally read out a conversion result from a register while * unintentionally read out a conversion result from a register while
* transmitting the command word of the next command? */ * transmitting the command word of the next command? */
...@@ -1124,12 +1128,12 @@ struct uwire_slave_s *tsc2102_init(qemu_irq pint, AudioState *audio) ...@@ -1124,12 +1128,12 @@ struct uwire_slave_s *tsc2102_init(qemu_irq pint, AudioState *audio)
s->tr[0] = 0; s->tr[0] = 0;
s->tr[1] = 1; s->tr[1] = 1;
s->tr[2] = 0; s->tr[2] = 1;
s->tr[3] = 1; s->tr[3] = 0;
s->tr[4] = 1; s->tr[4] = 1;
s->tr[5] = 0; s->tr[5] = 0;
s->tr[6] = 0; s->tr[6] = 1;
s->tr[7] = 1; s->tr[7] = 0;
s->chip.opaque = s; s->chip.opaque = s;
s->chip.send = (void *) tsc210x_write; s->chip.send = (void *) tsc210x_write;
...@@ -1178,12 +1182,12 @@ struct uwire_slave_s *tsc2301_init(qemu_irq penirq, qemu_irq kbirq, ...@@ -1178,12 +1182,12 @@ struct uwire_slave_s *tsc2301_init(qemu_irq penirq, qemu_irq kbirq,
s->tr[0] = 0; s->tr[0] = 0;
s->tr[1] = 1; s->tr[1] = 1;
s->tr[2] = 0; s->tr[2] = 1;
s->tr[3] = 1; s->tr[3] = 0;
s->tr[4] = 1; s->tr[4] = 1;
s->tr[5] = 0; s->tr[5] = 0;
s->tr[6] = 0; s->tr[6] = 1;
s->tr[7] = 1; s->tr[7] = 0;
s->chip.opaque = s; s->chip.opaque = s;
s->chip.send = (void *) tsc210x_write; s->chip.send = (void *) tsc210x_write;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册