Skip to content
Snippets Groups Projects
Commit 669d27e2 authored by Michael Rolnik's avatar Michael Rolnik Committed by Philippe Mathieu-Daudé
Browse files

target/avr: Add definitions of AVR core types


AVR core types are:

  - avr5
  - avr51
  - avr6

Each core type covers multiple AVR MCUs, mentioned in the comments
before definition of particular AVR core type (part of this patch).

AVR core type defines shared features that are valid for all AVR
MCUs belonging in that type.

[AM: Split a larger AVR introduction patch into logical units]
Suggested-by: default avatarAleksandar Markovic <aleksandar.m.mail@gmail.com>
Co-developed-by: default avatarMichael Rolnik <mrolnik@gmail.com>
Co-developed-by: default avatarSarah Harris <S.E.Harris@kent.ac.uk>
Signed-off-by: default avatarMichael Rolnik <mrolnik@gmail.com>
Signed-off-by: default avatarSarah Harris <S.E.Harris@kent.ac.uk>
Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Signed-off-by: default avatarAleksandar Markovic <aleksandar.m.mail@gmail.com>
Acked-by: default avatarIgor Mammedov <imammedo@redhat.com>
Tested-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: default avatarThomas Huth <huth@tuxfamily.org>
Message-Id: <20200705140315.260514-9-huth@tuxfamily.org>
[PMD: Only include reviewed cores: avr5/avr51/avr6]
Signed-off-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
parent 25a08409
No related branches found
No related tags found
No related merge requests found
......@@ -215,3 +215,154 @@ static void avr_cpu_class_init(ObjectClass *oc, void *data)
cc->gdb_num_core_regs = 35;
cc->gdb_core_xml_file = "avr-cpu.xml";
}
/*
* Setting features of AVR core type avr5
* --------------------------------------
*
* This type of AVR core is present in the following AVR MCUs:
*
* ata5702m322, ata5782, ata5790, ata5790n, ata5791, ata5795, ata5831, ata6613c,
* ata6614q, ata8210, ata8510, atmega16, atmega16a, atmega161, atmega162,
* atmega163, atmega164a, atmega164p, atmega164pa, atmega165, atmega165a,
* atmega165p, atmega165pa, atmega168, atmega168a, atmega168p, atmega168pa,
* atmega168pb, atmega169, atmega169a, atmega169p, atmega169pa, atmega16hvb,
* atmega16hvbrevb, atmega16m1, atmega16u4, atmega32a, atmega32, atmega323,
* atmega324a, atmega324p, atmega324pa, atmega325, atmega325a, atmega325p,
* atmega325pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, atmega328,
* atmega328p, atmega328pb, atmega329, atmega329a, atmega329p, atmega329pa,
* atmega3290, atmega3290a, atmega3290p, atmega3290pa, atmega32c1, atmega32m1,
* atmega32u4, atmega32u6, atmega406, atmega64, atmega64a, atmega640, atmega644,
* atmega644a, atmega644p, atmega644pa, atmega645, atmega645a, atmega645p,
* atmega6450, atmega6450a, atmega6450p, atmega649, atmega649a, atmega649p,
* atmega6490, atmega16hva, atmega16hva2, atmega32hvb, atmega6490a, atmega6490p,
* atmega64c1, atmega64m1, atmega64hve, atmega64hve2, atmega64rfr2,
* atmega644rfr2, atmega32hvbrevb, at90can32, at90can64, at90pwm161, at90pwm216,
* at90pwm316, at90scr100, at90usb646, at90usb647, at94k, m3000
*/
static void avr_avr5_initfn(Object *obj)
{
AVRCPU *cpu = AVR_CPU(obj);
CPUAVRState *env = &cpu->env;
set_avr_feature(env, AVR_FEATURE_LPM);
set_avr_feature(env, AVR_FEATURE_IJMP_ICALL);
set_avr_feature(env, AVR_FEATURE_ADIW_SBIW);
set_avr_feature(env, AVR_FEATURE_SRAM);
set_avr_feature(env, AVR_FEATURE_BREAK);
set_avr_feature(env, AVR_FEATURE_2_BYTE_PC);
set_avr_feature(env, AVR_FEATURE_2_BYTE_SP);
set_avr_feature(env, AVR_FEATURE_JMP_CALL);
set_avr_feature(env, AVR_FEATURE_LPMX);
set_avr_feature(env, AVR_FEATURE_MOVW);
set_avr_feature(env, AVR_FEATURE_MUL);
}
/*
* Setting features of AVR core type avr51
* --------------------------------------
*
* This type of AVR core is present in the following AVR MCUs:
*
* atmega128, atmega128a, atmega1280, atmega1281, atmega1284, atmega1284p,
* atmega128rfa1, atmega128rfr2, atmega1284rfr2, at90can128, at90usb1286,
* at90usb1287
*/
static void avr_avr51_initfn(Object *obj)
{
AVRCPU *cpu = AVR_CPU(obj);
CPUAVRState *env = &cpu->env;
set_avr_feature(env, AVR_FEATURE_LPM);
set_avr_feature(env, AVR_FEATURE_IJMP_ICALL);
set_avr_feature(env, AVR_FEATURE_ADIW_SBIW);
set_avr_feature(env, AVR_FEATURE_SRAM);
set_avr_feature(env, AVR_FEATURE_BREAK);
set_avr_feature(env, AVR_FEATURE_2_BYTE_PC);
set_avr_feature(env, AVR_FEATURE_2_BYTE_SP);
set_avr_feature(env, AVR_FEATURE_RAMPZ);
set_avr_feature(env, AVR_FEATURE_ELPMX);
set_avr_feature(env, AVR_FEATURE_ELPM);
set_avr_feature(env, AVR_FEATURE_JMP_CALL);
set_avr_feature(env, AVR_FEATURE_LPMX);
set_avr_feature(env, AVR_FEATURE_MOVW);
set_avr_feature(env, AVR_FEATURE_MUL);
}
/*
* Setting features of AVR core type avr6
* --------------------------------------
*
* This type of AVR core is present in the following AVR MCUs:
*
* atmega2560, atmega2561, atmega256rfr2, atmega2564rfr2
*/
static void avr_avr6_initfn(Object *obj)
{
AVRCPU *cpu = AVR_CPU(obj);
CPUAVRState *env = &cpu->env;
set_avr_feature(env, AVR_FEATURE_LPM);
set_avr_feature(env, AVR_FEATURE_IJMP_ICALL);
set_avr_feature(env, AVR_FEATURE_ADIW_SBIW);
set_avr_feature(env, AVR_FEATURE_SRAM);
set_avr_feature(env, AVR_FEATURE_BREAK);
set_avr_feature(env, AVR_FEATURE_3_BYTE_PC);
set_avr_feature(env, AVR_FEATURE_2_BYTE_SP);
set_avr_feature(env, AVR_FEATURE_RAMPZ);
set_avr_feature(env, AVR_FEATURE_EIJMP_EICALL);
set_avr_feature(env, AVR_FEATURE_ELPMX);
set_avr_feature(env, AVR_FEATURE_ELPM);
set_avr_feature(env, AVR_FEATURE_JMP_CALL);
set_avr_feature(env, AVR_FEATURE_LPMX);
set_avr_feature(env, AVR_FEATURE_MOVW);
set_avr_feature(env, AVR_FEATURE_MUL);
}
typedef struct AVRCPUInfo {
const char *name;
void (*initfn)(Object *obj);
} AVRCPUInfo;
static void avr_cpu_list_entry(gpointer data, gpointer user_data)
{
const char *typename = object_class_get_name(OBJECT_CLASS(data));
qemu_printf("%s\n", typename);
}
void avr_cpu_list(void)
{
GSList *list;
list = object_class_get_list_sorted(TYPE_AVR_CPU, false);
g_slist_foreach(list, avr_cpu_list_entry, NULL);
g_slist_free(list);
}
#define DEFINE_AVR_CPU_TYPE(model, initfn) \
{ \
.parent = TYPE_AVR_CPU, \
.instance_init = initfn, \
.name = AVR_CPU_TYPE_NAME(model), \
}
static const TypeInfo avr_cpu_type_info[] = {
{
.name = TYPE_AVR_CPU,
.parent = TYPE_CPU,
.instance_size = sizeof(AVRCPU),
.instance_init = avr_cpu_initfn,
.class_size = sizeof(AVRCPUClass),
.class_init = avr_cpu_class_init,
.abstract = true,
},
DEFINE_AVR_CPU_TYPE("avr5", avr_avr5_initfn),
DEFINE_AVR_CPU_TYPE("avr51", avr_avr51_initfn),
DEFINE_AVR_CPU_TYPE("avr6", avr_avr6_initfn),
};
DEFINE_TYPES(avr_cpu_type_info)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment