Skip to content

Commit 50486d6

Browse files
committed
hw/avr: Add limited support for some Arduino boards
Arduino boards are build with AVR chipsets. Add some of these boards: - Arduino Duemilanove - Arduino Uno - Arduino Mega For more information: https://www.arduino.cc/en/Main/Products https://store.arduino.cc/arduino-genuino/most-popular [AM: Remove word 'Atmel' from filenames and all elements of code] Suggested-by: Aleksandar Markovic <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Richard Henderson <[email protected]> Signed-off-by: Aleksandar Markovic <[email protected]> Reviewed-by: Igor Mammedov <[email protected]> Reviewed-by: Joaquin de Andres <[email protected]> [thuth: sysbus_init_child_obj() ==> object_initialize_child()] Signed-off-by: Thomas Huth <[email protected]> Message-Id: <[email protected]>
1 parent af55b78 commit 50486d6

File tree

6 files changed

+165
-0
lines changed

6 files changed

+165
-0
lines changed

MAINTAINERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,12 @@ F: hw/timer/avr_timer16.c
991991
F: include/hw/misc/avr_power.h
992992
F: hw/misc/avr_power.c
993993

994+
Arduino
995+
M: Philippe Mathieu-Daudé <[email protected]>
996+
R: Sarah Harris <[email protected]>
997+
S: Maintained
998+
F: hw/avr/arduino.c
999+
9941000
CRIS Machines
9951001
-------------
9961002
Axis Dev88

default-configs/avr-softmmu.mak

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
11
# Default configuration for avr-softmmu
2+
3+
# Boards:
4+
#
5+
CONFIG_ARDUINO=y

hw/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ source watchdog/Kconfig
4343
# arch Kconfig
4444
source arm/Kconfig
4545
source alpha/Kconfig
46+
source avr/Kconfig
4647
source cris/Kconfig
4748
source hppa/Kconfig
4849
source i386/Kconfig

hw/avr/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ config AVR_ATMEGA_MCU
33
select AVR_TIMER16
44
select AVR_USART
55
select AVR_POWER
6+
7+
config ARDUINO
8+
select AVR_ATMEGA_MCU
9+
select UNIMP

hw/avr/Makefile.objs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
obj-y += boot.o
22
obj-$(CONFIG_AVR_ATMEGA_MCU) += atmega.o
3+
obj-$(CONFIG_ARDUINO) += arduino.o

hw/avr/arduino.c

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*
2+
* QEMU Arduino boards
3+
*
4+
* Copyright (c) 2019-2020 Philippe Mathieu-Daudé
5+
*
6+
* This work is licensed under the terms of the GNU GPLv2 or later.
7+
* See the COPYING file in the top-level directory.
8+
* SPDX-License-Identifier: GPL-2.0-or-later
9+
*/
10+
11+
/* TODO: Implement the use of EXTRAM */
12+
13+
#include "qemu/osdep.h"
14+
#include "qapi/error.h"
15+
#include "hw/boards.h"
16+
#include "atmega.h"
17+
#include "boot.h"
18+
19+
typedef struct ArduinoMachineState {
20+
/*< private >*/
21+
MachineState parent_obj;
22+
/*< public >*/
23+
AtmegaMcuState mcu;
24+
} ArduinoMachineState;
25+
26+
typedef struct ArduinoMachineClass {
27+
/*< private >*/
28+
MachineClass parent_class;
29+
/*< public >*/
30+
const char *mcu_type;
31+
uint64_t xtal_hz;
32+
} ArduinoMachineClass;
33+
34+
#define TYPE_ARDUINO_MACHINE \
35+
MACHINE_TYPE_NAME("arduino")
36+
#define ARDUINO_MACHINE(obj) \
37+
OBJECT_CHECK(ArduinoMachineState, (obj), TYPE_ARDUINO_MACHINE)
38+
#define ARDUINO_MACHINE_CLASS(klass) \
39+
OBJECT_CLASS_CHECK(ArduinoMachineClass, (klass), TYPE_ARDUINO_MACHINE)
40+
#define ARDUINO_MACHINE_GET_CLASS(obj) \
41+
OBJECT_GET_CLASS(ArduinoMachineClass, (obj), TYPE_ARDUINO_MACHINE)
42+
43+
static void arduino_machine_init(MachineState *machine)
44+
{
45+
ArduinoMachineClass *amc = ARDUINO_MACHINE_GET_CLASS(machine);
46+
ArduinoMachineState *ams = ARDUINO_MACHINE(machine);
47+
48+
object_initialize_child(OBJECT(machine), "mcu", &ams->mcu, amc->mcu_type);
49+
object_property_set_uint(OBJECT(&ams->mcu), "xtal-frequency-hz",
50+
amc->xtal_hz, &error_abort);
51+
sysbus_realize(SYS_BUS_DEVICE(&ams->mcu), &error_abort);
52+
53+
if (machine->firmware) {
54+
if (!avr_load_firmware(&ams->mcu.cpu, machine,
55+
&ams->mcu.flash, machine->firmware)) {
56+
exit(1);
57+
}
58+
}
59+
}
60+
61+
static void arduino_machine_class_init(ObjectClass *oc, void *data)
62+
{
63+
MachineClass *mc = MACHINE_CLASS(oc);
64+
65+
mc->init = arduino_machine_init;
66+
mc->default_cpus = 1;
67+
mc->min_cpus = mc->default_cpus;
68+
mc->max_cpus = mc->default_cpus;
69+
mc->no_floppy = 1;
70+
mc->no_cdrom = 1;
71+
mc->no_parallel = 1;
72+
}
73+
74+
static void arduino_duemilanove_class_init(ObjectClass *oc, void *data)
75+
{
76+
MachineClass *mc = MACHINE_CLASS(oc);
77+
ArduinoMachineClass *amc = ARDUINO_MACHINE_CLASS(oc);
78+
79+
/* https://www.arduino.cc/en/Main/ArduinoBoardDuemilanove */
80+
mc->desc = "Arduino Duemilanove (ATmega168)",
81+
mc->alias = "2009";
82+
amc->mcu_type = TYPE_ATMEGA168_MCU;
83+
amc->xtal_hz = 16 * 1000 * 1000;
84+
};
85+
86+
static void arduino_uno_class_init(ObjectClass *oc, void *data)
87+
{
88+
MachineClass *mc = MACHINE_CLASS(oc);
89+
ArduinoMachineClass *amc = ARDUINO_MACHINE_CLASS(oc);
90+
91+
/* https://store.arduino.cc/arduino-uno-rev3 */
92+
mc->desc = "Arduino UNO (ATmega328P)";
93+
mc->alias = "uno";
94+
amc->mcu_type = TYPE_ATMEGA328_MCU;
95+
amc->xtal_hz = 16 * 1000 * 1000;
96+
};
97+
98+
static void arduino_mega_class_init(ObjectClass *oc, void *data)
99+
{
100+
MachineClass *mc = MACHINE_CLASS(oc);
101+
ArduinoMachineClass *amc = ARDUINO_MACHINE_CLASS(oc);
102+
103+
/* https://www.arduino.cc/en/Main/ArduinoBoardMega */
104+
mc->desc = "Arduino Mega (ATmega1280)";
105+
mc->alias = "mega";
106+
amc->mcu_type = TYPE_ATMEGA1280_MCU;
107+
amc->xtal_hz = 16 * 1000 * 1000;
108+
};
109+
110+
static void arduino_mega2560_class_init(ObjectClass *oc, void *data)
111+
{
112+
MachineClass *mc = MACHINE_CLASS(oc);
113+
ArduinoMachineClass *amc = ARDUINO_MACHINE_CLASS(oc);
114+
115+
/* https://store.arduino.cc/arduino-mega-2560-rev3 */
116+
mc->desc = "Arduino Mega 2560 (ATmega2560)";
117+
mc->alias = "mega2560";
118+
amc->mcu_type = TYPE_ATMEGA2560_MCU;
119+
amc->xtal_hz = 16 * 1000 * 1000; /* CSTCE16M0V53-R0 */
120+
};
121+
122+
static const TypeInfo arduino_machine_types[] = {
123+
{
124+
.name = MACHINE_TYPE_NAME("arduino-duemilanove"),
125+
.parent = TYPE_ARDUINO_MACHINE,
126+
.class_init = arduino_duemilanove_class_init,
127+
}, {
128+
.name = MACHINE_TYPE_NAME("arduino-uno"),
129+
.parent = TYPE_ARDUINO_MACHINE,
130+
.class_init = arduino_uno_class_init,
131+
}, {
132+
.name = MACHINE_TYPE_NAME("arduino-mega"),
133+
.parent = TYPE_ARDUINO_MACHINE,
134+
.class_init = arduino_mega_class_init,
135+
}, {
136+
.name = MACHINE_TYPE_NAME("arduino-mega-2560-v3"),
137+
.parent = TYPE_ARDUINO_MACHINE,
138+
.class_init = arduino_mega2560_class_init,
139+
}, {
140+
.name = TYPE_ARDUINO_MACHINE,
141+
.parent = TYPE_MACHINE,
142+
.instance_size = sizeof(ArduinoMachineState),
143+
.class_size = sizeof(ArduinoMachineClass),
144+
.class_init = arduino_machine_class_init,
145+
.abstract = true,
146+
}
147+
};
148+
149+
DEFINE_TYPES(arduino_machine_types)

0 commit comments

Comments
 (0)