]> git.proxmox.com Git - qemu.git/blame - hw/tosa.c
Tosa: emulate LEDs (Dmitry Baryshkov).
[qemu.git] / hw / tosa.c
CommitLineData
89cdb6af
AZ
1/* vim:set shiftwidth=4 ts=4 et: */
2/*
3 * PXA255 Sharp Zaurus SL-6000 PDA platform
4 *
5 * Copyright (c) 2008 Dmitry Baryshkov
6 *
7 * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org>
8 * This code is licensed under the GNU GPL v2.
9 */
10
11#include "hw.h"
12#include "pxa.h"
13#include "arm-misc.h"
14#include "sysemu.h"
88d2c950 15#include "devices.h"
89cdb6af
AZ
16#include "sharpsl.h"
17#include "pcmcia.h"
18#include "block.h"
19#include "boards.h"
20
21#define TOSA_RAM 0x04000000
22#define TOSA_ROM 0x00800000
23
24#define TOSA_GPIO_nSD_DETECT (9)
25#define TOSA_GPIO_ON_RESET (19)
26#define TOSA_GPIO_CF_IRQ (21) /* CF slot0 Ready */
27#define TOSA_GPIO_CF_CD (13)
28#define TOSA_GPIO_JC_CF_IRQ (36) /* CF slot1 Ready */
29
6bc1d858 30#define TOSA_SCOOP_GPIO_BASE 1
89cdb6af
AZ
31#define TOSA_GPIO_IR_POWERDWN (TOSA_SCOOP_GPIO_BASE + 2)
32#define TOSA_GPIO_SD_WP (TOSA_SCOOP_GPIO_BASE + 3)
33#define TOSA_GPIO_PWR_ON (TOSA_SCOOP_GPIO_BASE + 4)
34
6bc1d858
AZ
35#define TOSA_SCOOP_JC_GPIO_BASE 1
36#define TOSA_GPIO_BT_LED (TOSA_SCOOP_JC_GPIO_BASE + 0)
37#define TOSA_GPIO_NOTE_LED (TOSA_SCOOP_JC_GPIO_BASE + 1)
38#define TOSA_GPIO_CHRG_ERR_LED (TOSA_SCOOP_JC_GPIO_BASE + 2)
39#define TOSA_GPIO_WLAN_LED (TOSA_SCOOP_JC_GPIO_BASE + 7)
40
89cdb6af
AZ
41static void tosa_microdrive_attach(struct pxa2xx_state_s *cpu)
42{
43 struct pcmcia_card_s *md;
44 int index;
45 BlockDriverState *bs;
46
47 index = drive_get_index(IF_IDE, 0, 0);
48 if (index == -1)
49 return;
50 bs = drives_table[index].bdrv;
51 if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
52 md = dscm1xxxx_init(bs);
53 pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
54 }
55}
56
6bc1d858
AZ
57static void tosa_out_switch(void *opaque, int line, int level)
58{
59 switch (line) {
60 case 0:
61 fprintf(stderr, "blue LED %s.\n", level ? "on" : "off");
62 break;
63 case 1:
64 fprintf(stderr, "green LED %s.\n", level ? "on" : "off");
65 break;
66 case 2:
67 fprintf(stderr, "amber LED %s.\n", level ? "on" : "off");
68 break;
69 case 3:
70 fprintf(stderr, "wlan LED %s.\n", level ? "on" : "off");
71 break;
72 default:
73 fprintf(stderr, "Uhandled out event: %d = %d\n", line, level);
74 break;
75 }
76}
77
78
89cdb6af
AZ
79static void tosa_gpio_setup(struct pxa2xx_state_s *cpu,
80 struct scoop_info_s *scp0,
81 struct scoop_info_s *scp1)
82{
6bc1d858 83 qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
89cdb6af
AZ
84 /* MMC/SD host */
85 pxa2xx_mmci_handlers(cpu->mmc,
86 scoop_gpio_in_get(scp0)[TOSA_GPIO_SD_WP],
87 qemu_irq_invert(pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_nSD_DETECT]));
88
89 /* Handle reset */
90 pxa2xx_gpio_out_set(cpu->gpio, TOSA_GPIO_ON_RESET, cpu->reset);
91
92 /* PCMCIA signals: card's IRQ and Card-Detect */
93 pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
94 pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_CF_IRQ],
95 pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_CF_CD]);
96
97 pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[1],
98 pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_JC_CF_IRQ],
99 NULL);
100
6bc1d858
AZ
101 scoop_gpio_out_set(scp1, TOSA_GPIO_BT_LED, outsignals[0]);
102 scoop_gpio_out_set(scp1, TOSA_GPIO_NOTE_LED, outsignals[1]);
103 scoop_gpio_out_set(scp1, TOSA_GPIO_CHRG_ERR_LED, outsignals[2]);
104 scoop_gpio_out_set(scp1, TOSA_GPIO_WLAN_LED, outsignals[3]);
89cdb6af
AZ
105}
106
107static struct arm_boot_info tosa_binfo = {
108 .loader_start = PXA2XX_SDRAM_BASE,
109 .ram_size = 0x04000000,
110};
111
112static void tosa_init(ram_addr_t ram_size, int vga_ram_size,
113 const char *boot_device, DisplayState *ds,
114 const char *kernel_filename, const char *kernel_cmdline,
115 const char *initrd_filename, const char *cpu_model)
116{
117 struct pxa2xx_state_s *cpu;
118 struct scoop_info_s *scp0, *scp1;
119
120 if (ram_size < (TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE)) {
121 fprintf(stderr, "This platform requires %i bytes of memory\n",
122 TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE);
123 exit(1);
124 }
125
126 if (!cpu_model)
127 cpu_model = "pxa255";
128
129 cpu = pxa255_init(tosa_binfo.ram_size, ds);
130
131 cpu_register_physical_memory(0, TOSA_ROM,
132 qemu_ram_alloc(TOSA_ROM) | IO_MEM_ROM);
133
88d2c950 134 tc6393xb_init(0x10000000, NULL);
89cdb6af
AZ
135
136 scp0 = scoop_init(cpu, 0, 0x08800000);
137 scp1 = scoop_init(cpu, 1, 0x14800040);
138
139 tosa_gpio_setup(cpu, scp0, scp1);
140
141 tosa_microdrive_attach(cpu);
142
143 /* Setup initial (reset) machine state */
144 cpu->env->regs[15] = tosa_binfo.loader_start;
145
146 tosa_binfo.kernel_filename = kernel_filename;
147 tosa_binfo.kernel_cmdline = kernel_cmdline;
148 tosa_binfo.initrd_filename = initrd_filename;
149 tosa_binfo.board_id = 0x208;
150 arm_load_kernel(cpu->env, &tosa_binfo);
151 sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_SDRAM_BASE);
152}
153
154QEMUMachine tosapda_machine = {
4b32e168
AL
155 .name = "tosa",
156 .desc = "Tosa PDA (PXA255)",
157 .init = tosa_init,
158 .ram_require = TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
89cdb6af 159};