/* Device information for AVR 8-bit microcontrollers.
Copyright (C) 2012-2024 Free Software Foundation, Inc.
Contributed by Georg-Johann Lay (avr@gjlay.de)
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
. */
#ifndef AVR_ARCH_H
#define AVR_ARCH_H
#define AVR_MMCU_DEFAULT "avr2"
/* This enum supplies indices into the avr_arch_types[] table below. */
enum avr_arch_id
{
ARCH_UNKNOWN,
ARCH_AVR1,
ARCH_AVR2,
ARCH_AVR25,
ARCH_AVR3,
ARCH_AVR31,
ARCH_AVR35,
ARCH_AVR4,
ARCH_AVR5,
ARCH_AVR51,
ARCH_AVR6,
ARCH_AVRTINY,
ARCH_AVRXMEGA2,
ARCH_AVRXMEGA3,
ARCH_AVRXMEGA4,
ARCH_AVRXMEGA5,
ARCH_AVRXMEGA6,
ARCH_AVRXMEGA7
};
/* Architecture-specific properties. */
typedef struct
{
/* Assembler only. */
int asm_only;
/* Core have 'MUL*' instructions. */
int have_mul;
/* Core have 'CALL' and 'JMP' instructions. */
int have_jmp_call;
/* Core have 'MOVW' and 'LPM Rx,Z' instructions. */
int have_movw_lpmx;
/* Core have 'ELPM' instructions. */
int have_elpm;
/* Core have 'ELPM Rx,Z' instructions. */
int have_elpmx;
/* Core have 'EICALL' and 'EIJMP' instructions. */
int have_eijmp_eicall;
/* This is an XMEGA core. */
int xmega_p;
/* This core has the RAMPD special function register
and thus also the RAMPX, RAMPY and RAMPZ registers. */
int have_rampd;
/* This is a TINY core. */
int tiny_p;
/* Default start of data section address for architecture. */
int default_data_section_start;
/* Offset where flash memory is seen in RAM address range or 0. */
int flash_pm_offset;
/* Offset between SFR address and RAM address:
SFR-address = RAM-address - sfr_offset */
int sfr_offset;
/* Architecture id to built-in define __AVR_ARCH__ (NULL -> no macro) */
const char *const macro;
/* Architecture name. */
const char *const name;
} avr_arch_t;
/* Device-specific properties. */
typedef struct
{
/* Device name. */
const char *const name;
/* Index in avr_arch_types[]. */
enum avr_arch_id arch_id;
/* device specific feature */
int dev_attribute;
/* Must lie outside user's namespace. NULL == no macro. */
const char *const macro;
/* Start of data section. */
int data_section_start;
/* Start of text section. */
int text_section_start;
/* Flash size in bytes. */
int flash_size;
/* Offset where flash is seen in the RAM address space. */
int flash_pm_offset;
} avr_mcu_t;
/* AVR device specific features.
AVR_ISA_RMW
Only few avr devices have Read-Modify-Write (RMW) instructions
(XCH, LAC, LAS and LAT)
AVR_SHORT_SP
Stack Pointer has only 8 bit width.
The device / multilib has an 8-bit stack pointer (no SPH).
AVR_ERRATA_SKIP
Some AVR devices have a core erratum when skipping a 2-word instruction.
Skip instructions are: SBRC, SBRS, SBIC, SBIS, CPSE.
Problems will occur with return address is IRQ executes during the
skip sequence.
A support ticket from Atmel returned the following information:
Subject: (ATTicket:644469) On AVR skip-bug core Erratum
From: avr@atmel.com Date: 2011-07-27
(Please keep the subject when replying to this mail)
This errata exists only in AT90S8515 and ATmega103 devices.
For information please refer the following respective errata links
http://www.atmel.com/dyn/resources/prod_documents/doc2494.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc1436.pdf
AVR_ISA_RCALL
Always use RJMP / RCALL and assume JMP / CALL are not available.
This affects multilib selection via specs generation and -mshort-calls.
Even if a device like ATtiny417 from avrxmega3 supports JMP / CALL, we
assume these instructions are not available and we set the built-in
macro __AVR_HAVE_JMP_CALL__ accordingly. This macro is used to
determine a rough estimate of flash size in libgcc, and AVR-LibC uses
this macro to determine vector sizes.
AVR_ISA_FLMAP
The device has the NVMCTRL_CTRLB.FLMAP bitfield. The value of FLMAP
determines which 32 KiB segment of the program memory (flash) is visible
in the RAM address space at 0x8000.
If Binutils support emulations avrxmega2_flmap resp. avrxmega4_flmap
(PR31124), then the location of the .rodata section can be determined
by means of option -m[no-]rodata-in-ram. If .rodata is located in flash,
the user can chose which 32 KiB flash block is visible in RAM space by
means of defining symbol __flmap.
The startup code from AVR-LibC initializes FLMAP according to __flmap
provided one of the avrxmega*_flmap emulations is used. If avrxmega2/4
is used, then the startup code does not initialize FLMAP.
__AVR_HAVE_FLMAP__ is a macro defined in device-specs and supposed to be
consumed by code that sets FLMAP, like the startup code for example.
The macro is defined when all of the following conditions are met:
* The device is AVR_ISA_FLMAP.
* It's not known at compile time / assembler time whether or not .rodata
will be located in flash or in RAM. This implies Binutils PR31124.
* The definition of the macro is independent of -m[no-]rodata-in-ram.
AVR_ISA_FLMAP does not affect multilib layout or selection in any way.
For details on which symbols are defined in which way depending on the
emulation, see /ld/scripttempl/avr.sc. */
enum avr_device_specific_features
{
AVR_ISA_NONE,
AVR_ISA_RMW = 0x1, /* device has RMW instructions. */
AVR_SHORT_SP = 0x2, /* Stack Pointer has 8 bits width. */
AVR_ERRATA_SKIP = 0x4, /* device has a core erratum. */
AVR_ISA_LDS = 0x8, /* whether LDS / STS is valid for all data in static
storage. Only useful for reduced Tiny. */
AVR_ISA_RCALL = 0x10, /* Use RJMP / RCALL even though JMP / CALL
are available (-mshort-calls). */
AVR_ISA_FLMAP = 0x20 /* Has NVMCTRL_CTRLB.FLMAP to select which 32 KiB
block of program memory is visible in the RAM
address space. */
};
/* Map architecture to its texinfo string. */
typedef struct
{
/* Architecture ID. */
enum avr_arch_id arch_id;
/* textinfo source to describe the architecture. */
const char *texinfo;
} avr_arch_info_t;
/* Preprocessor macros to define depending on MCU type. */
extern const avr_arch_t avr_arch_types[];
extern const avr_arch_t *avr_arch;
extern const avr_arch_t *avr_get_parch (const char *mcu);
extern const avr_mcu_t avr_mcu_types[];
extern void avr_inform_core_architectures (void);
#endif /* AVR_ARCH_H */