1# Core Components
2
3## Overview
4
5This document contains details about what the core components are, what they contain, and how they are organized.
6
7## Organization
8
9The core components are organized into two groups.
10
11The first group (referred to as `G0` from now on) contains `hal`, `xtensa` and `riscv` (referred to as `arch` components from now on), `esp_rom`, `esp_common`, and `soc`. This
12group contain information about and low-level access to underlying hardware; or in the case of `esp_common`, hardware-agnostic code and utilities.
13These components can depend on each other, but as much as possible have no dependencies outside the group. The reason for this is that, due to the
14nature of what these components contain, the likelihood is high that a lot of other components will require these. Ideally, then, the dependency
15relationship only goes one way. This makes it easier for these components, as a group, to be usable in another project. One can conceivably implement
16a competing SDK to ESP-IDF on top of these components.
17
18The second group (referred to as `G1` from now on) sits at a higher level than the first group. This group contains the components `esp_hw_support`, `esp_system`, `newlib`, `spi_flash`,
19`freertos`, `log`, and `heap`. Like the first group, circular dependencies within the group are allowed; and being at a higher level, dependency on the first group
20is allowed. These components represent software mechanisms essential to building other components.
21
22## Descriptions
23
24The following is a short description of the components mentioned above.
25
26### `G0` Components
27
28#### `hal`
29
30Contains the hardware abstraction layer and low-level operation implementations for the various peripherals. The low-level functions assign meaningful names to register-level manipulations; the hardware abstraction provide operations one level above this, grouping these low-level functions
31into routines that achieve a meaningful action or state of the peripheral.
32
33Example:
34
35- `spi_flash_ll_set_address` is a low-level function part of the hardware abstraction `spi_flash_hal_read_block`
36
37#### `arch`
38
39Contains low-level architecture operations and definitions, including those for customizations (can be thought of on the same level as the low-level functions of `hal`).
40This can also contain files provided by the architecture vendor.
41
42Example:
43
44- `xt_set_exception_handler`
45- `riscv_global_interrupts_enable`
46- `ERI_PERFMON_MAX`
47
48#### `esp_common`
49
50Contains hardware-agnostic definitions, constants, macros, utilities, 'pure' and/or algorithmic functions that is useable by all other components (that is, barring there being a more appropriate component to put them in).
51
52Example:
53
54- `BIT(nr)` and other bit manipulation utilities in the future
55- `IDF_DEPRECATED(REASON)`
56- `ESP_IDF_VERSION_MAJOR`
57
58#### `soc`
59
60Contains description of the underlying hardware: register structure, addresses, pins, capabilities, etc.
61
62Example:
63
64- `DR_REG_DPORT_BASE`
65- `SOC_MCPWM_SUPPORTED`
66- `uart_dev_s`
67
68#### `esp_rom`
69
70Contains headers, linker scripts, abstraction layer, patches, and other related files to ROM functions.
71
72Example:
73
74- `esp32.rom.eco3.ld`
75- `rom/aes.h`
76
77### `G1` Components
78
79#### `spi_flash`
80
81SPI flash device access implementation.
82
83#### `freertos`
84
85FreeRTOS port to targets supported by ESP-IDF.
86
87#### `log`
88
89Logging library.
90
91#### `heap`
92
93Heap implementation.
94
95#### `newlib`
96
97Some functions n the standard library are implemented here, especially those needing other `G1` components.
98
99Example:
100
101- `malloc` is implemented in terms of the component `heap`'s functions
102- `gettimeofday` is implemented in terms of system time in `esp_system`
103
104#### `esp_system`
105
106Contains implementation of system services and controls system behavior. The implementations
107here may take hardware resources and/or decide on a hardware state needed for support of a system service/feature/mechanism.
108Currently, this encompasses the following, but not limited to:
109
110- Startup and initialization
111- Panic and debug
112- Reset and reset reason
113- Task and interrupt watchdogs
114
115#### `esp_hw_support`
116
117Contains implementations that provide hardware operations, arbitration, or resource sharing, especially those that
118is used in the system. Unlike `esp_system`, implementations here do not decide on a hardware state or takes hardware resource, acting
119merely as facilitator to hardware access. Currently, this encompasses the following, but not limited to:
120
121- Interrupt allocation
122- Sleep functions
123- Memory functions (external SPIRAM, async memory, etc.)
124- Clock and clock control
125- Random generation
126- CPU utilities
127- MAC settings
128
129### `esp_hw_support` vs `esp_system`
130
131This section details list some implementations and the reason for placing it in either `esp_hw_support` or `esp_system`.
132
133#### `task_wdt.c` (`esp_system`) vs  `intr_alloc.c` (`esp_hw_support`)
134
135The task watchdog fits the definition of taking and configuring hardware resources (wdt, interrupt) for implementation of a system service/mechanism.
136
137This is in contrast with interrupt allocation that merely facilitates access to the underlying hardware for other implementations -
138drivers, user code, and even the task watchdog mentioned previously!
139
140#### `crosscore_int.c` (`esp_system`)
141
142The current implementation of crosscore interrupts is tightly coupled with a number of interrupt reasons
143associated with system services/mechanisms: REASON_YIELD (scheduler), REASON_FREQ_SWITCH (power management)
144REASON_PRINT_BACKTRACE (panic and debug).
145
146However, if an implementation exists that makes it possible to register an arbitrary interrupt reason - a
147lower level inter-processor call if you will, then this implementation is a good candidate for `esp_hw_support`.
148The current implementation in `esp_system` can then just register the interrupt reasons mentioned above.
149
150#### `esp_mac.h`, `esp_chip_info.h`, `esp_random.h` (`esp_hw_support`)
151
152The functions in these headers used to be in `esp_system.h`, but have been split-off.
153However, to maintain backward compatibility, `esp_system.h` includes these headers.
154
155The remaining functions in `esp_system.h` are those that deal with system behavior, such
156as `esp_register_shutdown_handler`, or are proxy for other system components's APIs such as
157`esp_get_free_heap_size`.
158
159The functions split-off from `esp_system.h` are much more hardware manipulation oriented such as:
160`esp_read_mac`, `esp_random` and `esp_chip_info`.