diff --git a/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt b/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt index 9d08dd3..cc083b1 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt @@ -84,7 +84,6 @@ class MainActivity : AppCompatActivity() { val useCaseEnabledMap by mqttViewModel.useCaseEnabledMap.collectAsState() val obuHardware by mqttViewModel.obuHardware.collectAsState() val usbSerialState by mqttViewModel.usbSerialState.collectAsState() - val espRxMode by mqttViewModel.espRxMode.collectAsState() MicrOBUTheme(darkTheme = state.darkTheme) { val view = LocalView.current @@ -253,8 +252,6 @@ class MainActivity : AppCompatActivity() { onMqttPrefsChange = mqttViewModel::updatePrefs, obuHardware = obuHardware, onObuHardwareChange = mqttViewModel::setObuHardware, - espRxMode = espRxMode, - onEspRxModeChange = mqttViewModel::setEspRxMode, onBack = { navController.popBackStack() }, ) } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt index 8473d84..3cc0374 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt @@ -1,14 +1,16 @@ package com.hawhamburg.micr0bu.data.cam import android.content.Context +import android.util.Log import com.hawhamburg.micr0bu.data.GnssReading import com.hawhamburg.micr0bu.data.SensorRepository import com.hawhamburg.micr0bu.data.mqtt.MqttConnectionState import com.hawhamburg.micr0bu.data.mqtt.MqttRepository import com.hawhamburg.micr0bu.data.mqtt.ObuHardwarePreferences import com.hawhamburg.micr0bu.data.mqtt.UseCaseAlertPreferences -import com.hawhamburg.micr0bu.data.transport.EspRxMode +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.SerialFrameType +import com.hawhamburg.micr0bu.data.transport.UsbSerialState import com.hawhamburg.micr0bu.data.transport.UsbSerialTransport import com.hawhamburg.micr0bu.domain.asn1.RealAsn1UperCodec import com.hawhamburg.micr0bu.domain.cam.Cam @@ -36,6 +38,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Singleton +private const val TAG = "CamUseCaseRepo" private const val CAM_TOPIC = "v2x-uca/output/json/cam" private const val OBU_GNSS_TOPIC = "v2x/rx/obu_gnss" private const val PRUNE_INTERVAL_MS = 1_000L @@ -78,7 +81,8 @@ class CamUseCaseRepository @Inject constructor( private val engine = UseCaseDetectionEngine() private val sensorRepository = SensorRepository(context) - @Volatile private var espRxMode: EspRxMode = EspRxMode.SEND_AND_RECEIVE + /** Latest selected OBU hardware, so serial-link events only act on the ESP32-C5 path. */ + @Volatile private var currentHardware: ObuHardware = ObuHardware.CIT_ONE private val _ownStationId = MutableStateFlow(null) /** The ego OBU's own station ID, learned from `v2x/rx/obu_gnss`. Null until known. */ @@ -168,13 +172,26 @@ class CamUseCaseRepository @Inject constructor( scope.launch { usbSerialTransport.incomingFrames.collect { frame -> if (frame.type != SerialFrameType.CAM_RX) return@collect - if (espRxMode == EspRxMode.SEND_ONLY) return@collect + if (usbSerialTransport.state.value != UsbSerialState.CONNECTED) return@collect handleCamFromSerial(frame.payload) } } + // Drop everything the serial link taught us the moment it goes down. Without this, the + // last-seen positions and their alerts linger on the map and in the use-case panel after + // an unplug, which reads as live traffic - the worst kind of stale on a safety display. scope.launch { - obuHardwarePrefs.espRxModeFlow.collect { espRxMode = it } + usbSerialTransport.state.collect { state -> + // ESP32-only: on the CiT One path this transport is permanently DISCONNECTED and + // resetting here would wipe perfectly good MQTT-derived state. + if (currentHardware == ObuHardware.ESP32_C5 && state != UsbSerialState.CONNECTED) { + engine.reset() + } + } + } + + scope.launch { + obuHardwarePrefs.obuHardwareFlow.collect { currentHardware = it } } } @@ -253,9 +270,25 @@ class CamUseCaseRepository @Inject constructor( private fun handleCamFromSerial(payload: ByteArray) { if (payload.isEmpty()) return val camBytes = payload.copyOfRange(1, payload.size) // payload[0] is RSSI, not part of the CAM - val cam = camCodec.decodeCam(camBytes, System.currentTimeMillis()) ?: return + val cam = camCodec.decodeCam(camBytes, System.currentTimeMillis()) + if (cam == null) { + // Logged, not silently dropped: "the app shows nothing" has two completely different + // causes - frames not arriving at all, versus arriving and failing to decode - and + // without this line they're indistinguishable from the outside. rssi is signed. + Log.w( + TAG, + "handleCamFromSerial: decode FAILED for ${camBytes.size}-byte CAM " + + "(rssi=${payload[0].toInt()}) - first bytes: ${camBytes.toHexPreview()}", + ) + return + } + Log.d(TAG, "handleCamFromSerial: decoded station=${cam.stationId} " + + "lat=${cam.latitude} lon=${cam.longitude} speed=${cam.speedMps} rssi=${payload[0].toInt()}") if (_ownStationId.value != null && cam.stationId == _ownStationId.value) return // self-heard TX engine.onRemoteCam(cam) _processedCam.tryEmit(cam) } + + private fun ByteArray.toHexPreview(limit: Int = 16): String = + take(limit).joinToString(" ") { "%02x".format(it) } + if (size > limit) " ..." else "" } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt index 58c1ca7..8c4fb52 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt @@ -5,7 +5,6 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore -import com.hawhamburg.micr0bu.data.transport.EspRxMode import com.hawhamburg.micr0bu.data.transport.ObuHardware import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.Flow @@ -27,7 +26,6 @@ class ObuHardwarePreferences @Inject constructor( ) { private object Keys { val OBU_HARDWARE = stringPreferencesKey("obu_hardware") - val ESP_RX_MODE = stringPreferencesKey("esp_rx_mode") val OWN_STATION_ID = longPreferencesKey("own_station_id") } @@ -39,19 +37,6 @@ class ObuHardwarePreferences @Inject constructor( context.obuHardwareDataStore.edit { prefs -> prefs[Keys.OBU_HARDWARE] = hardware.id } } - /** - * Whether the ESP32-C5 path processes received CAM traffic or only transmits — see - * [EspRxMode]'s KDoc for what this does and doesn't actually control. Defaults to - * [EspRxMode.SEND_AND_RECEIVE] (full duplex, today's existing behavior). - */ - val espRxModeFlow: Flow = context.obuHardwareDataStore.data.map { prefs -> - EspRxMode.entries.firstOrNull { it.id == prefs[Keys.ESP_RX_MODE] } ?: EspRxMode.SEND_AND_RECEIVE - } - - suspend fun setEspRxMode(mode: EspRxMode) { - context.obuHardwareDataStore.edit { prefs -> prefs[Keys.ESP_RX_MODE] = mode.id } - } - /** This device's own CAM StationID, or null if one hasn't been assigned yet. */ val ownStationIdFlow: Flow = context.obuHardwareDataStore.data.map { prefs -> prefs[Keys.OWN_STATION_ID] diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/EspRxMode.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/EspRxMode.kt deleted file mode 100644 index 777eb58..0000000 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/EspRxMode.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.hawhamburg.micr0bu.data.transport - -/** - * Whether the ESP32-C5 path (Phase 03) processes remote CAM traffic it receives, or only ever - * transmits the phone's own CAM. - * - * **Important nuance:** this does NOT physically disable the ESP32's radio receiver. The - * firmware's own promiscuous-mode setup (`main.c`, see comments there) is required for its raw - * 802.11p TX path to work at all — ESP-IDF only allows `esp_wifi_80211_tx()` to emit frames when - * the MAC is promiscuous or associated to an AP. So the ESP32 always physically receives and - * forwards CAM_RX frames over the serial link regardless of this setting; what this setting - * actually controls is purely on the phone side — whether [SEND_ONLY] mode ignores those - * incoming frames (see [com.hawhamburg.micr0bu.data.cam.CamUseCaseRepository]) instead of - * feeding them into the detection engine / UI. Useful for isolating the TX path during bench - * testing (e.g. with the [com.hawhamburg.micr0bu.service.CamPinger]) without nearby test traffic - * cluttering the use-case alerts or live map. - */ -enum class EspRxMode(val id: String) { - /** Transmit the phone's own CAM only; incoming CAM_RX frames from the ESP32 are discarded. */ - SEND_ONLY("send_only"), - - /** Normal full-duplex operation: transmit own CAM and process received CAM traffic. */ - SEND_AND_RECEIVE("send_and_receive"), -} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt index 22dbabf..3d1b4d5 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt @@ -25,8 +25,9 @@ enum class ObuHardware(val id: String) { * * Real serial link + CAM UPER codec are implemented on both sides — see * [com.hawhamburg.micr0bu.data.transport.UsbSerialTransport] (phone) and - * `obu-firmware/main/serial_link.c` (firmware). See also [EspRxMode] for the send-only vs - * send-and-receive toggle (Settings > Connection). + * `obu-firmware/main/serial_link.c` (firmware). Reception is always on: the ESP32 must keep + * its receiver enabled for raw TX to work at all (ESP-IDF only emits raw 802.11 frames while + * promiscuous or associated), so there is nothing meaningful for the app to toggle. */ ESP32_C5("esp32_c5"), } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt index 6f00fb7..d3a2274 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt @@ -128,7 +128,17 @@ object CamUperCodec { bw.putBits(1023 - (-1023), 11) // curvatureValue: unavailable (not derived - see class KDoc) bw.putBits(7, 3) // curvatureConfidence: unavailable - bw.putBits(2, 2) // curvatureCalculationMode: unavailable + + // CurvatureCalculationMode is the ONE extensible ENUMERATED in this message: + // ENUMERATED {yawRateUsed(0), yawRateNotUsed(1), unavailable(2), ...} + // UPER encodes an extensible ENUMERATED as an extension bit followed by the index into + // the root list - 1 + 2 = 3 bits, not 2. Both this encoder and its `cam.c` ancestor wrote + // only the 2-bit index, which shifted yawRate and the whole low-frequency container one + // bit early for any standards-compliant receiver. It went unnoticed because both ends of + // this project shared the same mistake; phone <-> ESP32 agreed perfectly with each other + // and with nothing else. + bw.putBits(0, 1) // extension bit: value is in the root list + bw.putBits(2, 2) // curvatureCalculationMode: unavailable(2) val yawRateCentiDegS = cam.yawRateDps ?.let { (it * 100.0).roundToInt().coerceIn(-32766, 32766) } @@ -247,7 +257,13 @@ object CamUperCodec { br.getBits(11) // curvatureValue br.getBits(3) // curvatureConfidence - br.getBits(2) // curvatureCalculationMode + + // CurvatureCalculationMode: extensible ENUMERATED - extension bit, then the root index. + // See the matching comment in [encode]. If the extension bit is set the sender used a + // value added in a later spec revision, encoded as a length-prefixed extension addition + // this decoder can't skip reliably - bail rather than misread everything after it. + if (br.getBitsInt(1) != 0) return null + br.getBits(2) // curvatureCalculationMode root index val yawRateRaw = br.getBitsInt(16) + (-32766) br.getBits(3) // yawRateConfidence diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt index bfb5c1f..c0f1139 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt @@ -138,8 +138,15 @@ fun MqttTopicViewerScreen( viewModel.selectTopic(null) } - val isConnected = connectionState == MqttConnectionState.CONNECTED - val isConnecting = connectionState == MqttConnectionState.CONNECTING + val isEsp32 = obuHardware == ObuHardware.ESP32_C5 + + // On the ESP32-C5 path there is no MQTT broker, so `connectionState` is permanently + // DISCONNECTED and using it here made the screen report "offline" while CAMs streamed in over + // serial. Everything on this screen that means "is the OBU link up?" follows the serial link + // instead when that hardware is selected. + val effectiveState = if (isEsp32) usbSerialState.asConnectionState() else connectionState + val isConnected = effectiveState == MqttConnectionState.CONNECTED + val isConnecting = effectiveState == MqttConnectionState.CONNECTING Column(modifier = Modifier.fillMaxSize()) { @@ -175,10 +182,18 @@ fun MqttTopicViewerScreen( Spacer(Modifier.weight(1f)) } - ConnectionChip(connectionState) + ConnectionChip(effectiveState) Spacer(Modifier.width(2.dp)) IconButton( - onClick = { if (isConnected || isConnecting) viewModel.disconnect() else viewModel.connect() }, + onClick = { + // Route to whichever transport this hardware actually uses. + if (isEsp32) { + if (isConnected || isConnecting) viewModel.disconnectUsbSerial() + else viewModel.connectUsbSerial() + } else { + if (isConnected || isConnecting) viewModel.disconnect() else viewModel.connect() + } + }, colors = IconButtonDefaults.iconButtonColors( contentColor = if (isConnected) ErrorRed else ConnectedGreen, ), @@ -206,8 +221,8 @@ fun MqttTopicViewerScreen( activeDenmUseCase = activeDenmUseCase, useCaseAlerts = useCaseAlerts, showDenmTrigger = obuHardware == ObuHardware.CIT_ONE, - showCamPinger = obuHardware == ObuHardware.ESP32_C5, - isEsp32 = obuHardware == ObuHardware.ESP32_C5, + showCamPinger = isEsp32, + isEsp32 = isEsp32, denmEvents = denmEvents, usbSerialState = usbSerialState, camPingerActive = camPingerActive, @@ -1209,3 +1224,16 @@ private fun prettyPrintJson(raw: String): String { raw } } + +/** + * Maps the ESP32-C5 serial link's lifecycle onto the MQTT connection vocabulary the shared + * connection UI on this screen already speaks, so one indicator can serve both transports rather + * than duplicating the chip and its colours per hardware type. + */ +private fun UsbSerialState.asConnectionState(): MqttConnectionState = when (this) { + UsbSerialState.CONNECTED -> MqttConnectionState.CONNECTED + UsbSerialState.DEVICE_ATTACHED, + UsbSerialState.PERMISSION_REQUESTED -> MqttConnectionState.CONNECTING + UsbSerialState.ERROR -> MqttConnectionState.ERROR + UsbSerialState.DISCONNECTED -> MqttConnectionState.DISCONNECTED +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt index 897a8e2..a064d5f 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt @@ -47,7 +47,6 @@ import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.mqtt.MqttPrefs -import com.hawhamburg.micr0bu.data.transport.EspRxMode import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.domain.usecase.UseCaseDetectionConfig import com.hawhamburg.micr0bu.domain.usecase.UseCaseType @@ -166,8 +165,6 @@ fun ConnectionSettingsScreen( onMqttPrefsChange: (MqttPrefs) -> Unit, obuHardware: ObuHardware = ObuHardware.CIT_ONE, onObuHardwareChange: (ObuHardware) -> Unit = {}, - espRxMode: EspRxMode = EspRxMode.SEND_AND_RECEIVE, - onEspRxModeChange: (EspRxMode) -> Unit = {}, onBack: () -> Unit, ) { SubScreen(stringResource(R.string.settings_connection), onBack) { @@ -212,47 +209,6 @@ fun ConnectionSettingsScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(bottom = 8.dp), ) - - // CAM reception mode — see EspRxMode's KDoc for the caveat that this is purely - // an app-side filter, not a physical radio-receiver toggle (the ESP32 must keep - // its receiver on for TX to keep working at all). - Spacer(Modifier.height(4.dp)) - Text( - stringResource(R.string.settings_esp32_rx_mode), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 8.dp), - ) - Spacer(Modifier.height(6.dp)) - Row( - modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), - ) { - val isSendOnly = espRxMode == EspRxMode.SEND_ONLY - OutlinedButton( - onClick = { onEspRxModeChange(EspRxMode.SEND_ONLY) }, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.outlinedButtonColors( - containerColor = if (isSendOnly) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, - contentColor = if (isSendOnly) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, - ), - ) { Text(stringResource(R.string.settings_esp32_rx_mode_send_only), fontWeight = if (isSendOnly) FontWeight.Bold else FontWeight.Normal) } - - OutlinedButton( - onClick = { onEspRxModeChange(EspRxMode.SEND_AND_RECEIVE) }, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.outlinedButtonColors( - containerColor = if (!isSendOnly) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, - contentColor = if (!isSendOnly) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, - ), - ) { Text(stringResource(R.string.settings_esp32_rx_mode_send_and_receive), fontWeight = if (!isSendOnly) FontWeight.Bold else FontWeight.Normal) } - } - Text( - stringResource(R.string.settings_esp32_rx_mode_desc), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.8f), - modifier = Modifier.padding(bottom = 8.dp), - ) } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt b/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt index 8013617..b9a19cc 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt @@ -10,7 +10,6 @@ import com.hawhamburg.micr0bu.data.mqtt.MqttPrefs import com.hawhamburg.micr0bu.data.mqtt.MqttRepository import com.hawhamburg.micr0bu.data.mqtt.ObuHardwarePreferences import com.hawhamburg.micr0bu.data.transport.EspLinkStatus -import com.hawhamburg.micr0bu.data.transport.EspRxMode import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.TransportType import com.hawhamburg.micr0bu.data.transport.UsbNetworkDetector @@ -67,19 +66,6 @@ class MqttViewModel @Inject constructor( viewModelScope.launch { obuHardwarePrefs.setObuHardware(hardware) } } - /** - * ESP32-C5-only: whether received CAM traffic is processed or discarded — see [EspRxMode]'s - * KDoc for the important caveat that this doesn't actually disable the ESP32's receiver - * (it can't, without also breaking TX). - */ - val espRxMode: StateFlow = obuHardwarePrefs.espRxModeFlow.stateIn( - viewModelScope, SharingStarted.Eagerly, EspRxMode.SEND_AND_RECEIVE, - ) - - fun setEspRxMode(mode: EspRxMode) { - viewModelScope.launch { obuHardwarePrefs.setEspRxMode(mode) } - } - /** True when a 192.168.42.x USB-C tethering network is detected. */ val usbConnected: StateFlow = usbDetector.usbNetwork .map { it != null } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index db5306a..a7b71d7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -162,7 +162,7 @@ Nur Entwicklermodus — noch nicht implementiert Über App-Version - 0.4.0 (Phase 02 — USB-C + DENM TX) + 0.5.0 (Phase 03 — ESP32-C5-Seriellverbindung + CAM vom Smartphone) Verbindung OBU per USB-C automatisch erkennen OBU-IP (manuell) @@ -170,10 +170,6 @@ CiT One ESP32-C5 Der ESP32-C5 arbeitet als „dummer" Transceiver: CAM wird auf dem Smartphone erstellt und kodiert, über USB-Seriell an den ESP32 gesendet und über ITS-G5 gesendet. Auf diesem Pfad gibt es keinen MQTT-Broker und keine DENM-Use-Case-Engine — siehe den CAM-Pinger im V2X-Monitor für ein manuelles Testwerkzeug. - CAM-Empfang - Nur senden - Senden & Empfangen - „Nur senden" ignoriert von nahen Stationen empfangene CAM (der ESP32 empfängt sie physisch weiterhin — der Empfänger kann nicht abgeschaltet werden, ohne auch das Senden zu unterbrechen — sie werden nur nicht von der App verarbeitet). Nützlich, um den Sendepfad isoliert zu testen. Aktiver Transport USB-C WLAN @@ -270,7 +266,7 @@ Plattform Android / Kotlin / Jetpack Compose Projekt - MicrOBU — HAW Hamburg + MicrOBU — HAW Hamburg & consider it GmbH Fahrten diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6ea7fa1..c45bd94 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -163,7 +163,7 @@ Dev mode only — not implemented About App version - 0.4.0 (Phase 02 — USB-C + DENM TX) + 0.5.0 (Phase 03 — ESP32-C5 serial link + phone-built CAM) Connection Auto-detect OBU via USB-C Manual OBU IP @@ -171,10 +171,6 @@ CiT One ESP32-C5 ESP32-C5 acts as a "dumb" transceiver: CAM is built and encoded on the phone, sent to the ESP32 over USB serial, and broadcast over ITS-G5. No MQTT broker or DENM use-case engine on this path — see the V2X Monitor screen\'s CAM Pinger for a manual test tool. - CAM Reception - Send Only - Send & Receive - "Send Only" ignores CAM received from nearby stations (still physically received by the ESP32 — its receiver can\'t be turned off without also breaking transmit — just not processed by the app). Useful for isolating TX-path testing. Active transport USB-C Wi-Fi @@ -271,7 +267,7 @@ Platform Android / Kotlin / Jetpack Compose Project - MicrOBU — HAW Hamburg + MicrOBU — HAW Hamburg & consider it GmbH Trips diff --git a/obu-cam-transmistter/CMakeLists.txt b/obu-cam-transmistter/CMakeLists.txt new file mode 100644 index 0000000..e02013a --- /dev/null +++ b/obu-cam-transmistter/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +# No longer need -Wl,-zmuldefs here - that was only for main/wifi_patches.c's +# symbol-override attempt (which didn't work anyway; see docs/04-transmit-setup.md), +# and that file is no longer part of the build. Superseded by main/tx_custom.c, +# which bypasses the gate at a different layer instead of trying to override it. + +project(obu_firmware) diff --git a/obu-cam-transmistter/NOTES.md b/obu-cam-transmistter/NOTES.md new file mode 100644 index 0000000..c672494 --- /dev/null +++ b/obu-cam-transmistter/NOTES.md @@ -0,0 +1,53 @@ +# OBU transmit firmware - Phase 2 (in progress: HLN-SV DENM beacon) + +Started. See `docs/04-transmit-setup.md` in the project root for build/flash +steps and how to validate this against your own sniffer. + +## Toolchain: use a dedicated terminal (ESP-IDF 5.5.4) + +This project builds against the **global** ESP-IDF 5.5.4, NOT the 6.1 checkout +that `obu-firmware` uses. Keep one terminal per toolchain and never export both +in the same window - the second export inherits the first's +`IDF_PYTHON_ENV_PATH` and then fails every dependency check (`click`, +`esptool`, `cryptography`, ... "not met"). That is env-var bleed, not a broken +install: do **not** run `install.bat` to "fix" it, that damages one of the two +environments. + +| Terminal | Export | Project | +|---|---|---| +| Transmitter | `C:\Espressif\frameworks\esp-idf-v5.5.4\export.ps1` | this one | +| OBU | `...\micrOBU_workspace\its-g5-receiver-firmware\esp-idf\export.ps1` | `obu-firmware` | + +If a terminal has already been used for the other IDF, clear the state first: + +```powershell +$env:IDF_PYTHON_ENV_PATH = $null; $env:IDF_PATH = $null +``` + +Also note `build/` here was regenerated from scratch (its CMake cache still +referenced an older source path under `micrOBU_workspace/v2x-obu-esp32c5/`, +which makes `idf.py fullclean` refuse to run). If that error reappears, delete +`build/` manually rather than fighting it. + +## CAM encoding + +`main/cam.c` IS compiled here (unlike `obu-firmware`'s copy, which is a +reference only). It must stay bit-identical to `obu-firmware/main/cam.c` and +the app's `CamUperCodec.kt` - all three encode the same wire format, and a +one-bit divergence in any of them is invisible on the bench but wrong against +real equipment. See the `CurvatureCalculationMode` comment in that file. + +Implements one profile so far: **HLN-SV** (aftermarket stationary recovery +vehicle), causeCode 94 (stationaryVehicle), subCauseCode 0, active while the +hazard-light GPIO is grounded. No location/alacarte containers. + +- `main/main.c` - entry point, the `phy_11p_set`/`phy_change_channel(5900,...)` + register hack, GPIO polling, TX loop +- `main/denm.c` / `.h` - ASN.1 UPER encoding of a minimal DENM +- `main/geonet.c` / `.h` - GeoNetworking Basic/Common/SHB headers + BTP-B +- `main/dot11p.c` / `.h` - 802.11 OCB (QoS Data, broadcast) frame + LLC/SNAP + +Known gaps, tracked as TODOs in the source: no real GNSS (lat/long hardcoded +0), no real time source (detectionTime/referenceTime hardcoded 0, decodes as +2004-01-01), fixed (non-rotating) pseudonym MAC, SHB instead of GeoBroadcast +(no multi-hop forwarding), unsecured (no IEEE 1609.2 signing). diff --git a/obu-cam-transmistter/main/CMakeLists.txt b/obu-cam-transmistter/main/CMakeLists.txt new file mode 100644 index 0000000..805f53d --- /dev/null +++ b/obu-cam-transmistter/main/CMakeLists.txt @@ -0,0 +1,8 @@ +# wifi_patches.c is intentionally NOT in this list anymore - superseded by +# tx_custom.c (see that file for why). Left on disk, unused, for history. +idf_component_register( + SRCS "main.c" "denm.c" "cam.c" "geonet.c" "dot11p.c" "tx_custom.c" + INCLUDE_DIRS "." + REQUIRES esp_event esp_netif nvs_flash driver esp_phy + PRIV_REQUIRES esp_wifi +) diff --git a/obu-cam-transmistter/main/cam.c b/obu-cam-transmistter/main/cam.c new file mode 100644 index 0000000..8f4a148 --- /dev/null +++ b/obu-cam-transmistter/main/cam.c @@ -0,0 +1,137 @@ +#include "cam.h" +#include + +// MSB-first bit packer - identical approach to denm.c (ASN.1 UPER is a +// bitstream, not a byte stream). +typedef struct { + uint8_t *buf; + size_t buf_len; + size_t bit_pos; +} bitwriter_t; + +static void bw_init(bitwriter_t *bw, uint8_t *buf, size_t len) +{ + bw->buf = buf; + bw->buf_len = len; + bw->bit_pos = 0; + memset(buf, 0, len); +} + +static void bw_put_bits(bitwriter_t *bw, uint64_t value, int nbits) +{ + for (int i = nbits - 1; i >= 0; i--) { + size_t byte_idx = bw->bit_pos / 8; + int bit_idx = 7 - (int)(bw->bit_pos % 8); + if (byte_idx >= bw->buf_len) { + return; // overflow guard - check return value of cam_encode + } + uint8_t bit = (value >> i) & 1; + bw->buf[byte_idx] = (uint8_t)(bw->buf[byte_idx] | (bit << bit_idx)); + bw->bit_pos++; + } +} + +static size_t bw_byte_len(const bitwriter_t *bw) +{ + return (bw->bit_pos + 7) / 8; +} + +int cam_encode(const cam_fields_t *f, uint8_t *buf, size_t buf_len) +{ + bitwriter_t bw; + bw_init(&bw, buf, buf_len); + + // ---- ItsPduHeader ---- (SEQUENCE, no OPTIONALs, no "..." -> no preamble) + bw_put_bits(&bw, 2, 8); // protocolVersion INTEGER(0..255) = 2 + bw_put_bits(&bw, 2, 8); // messageID INTEGER(0..255) = cam(2) + bw_put_bits(&bw, f->station_id, 32); // stationID StationID INTEGER(0..4294967295) + + // ---- CoopAwareness ---- (SEQUENCE, no OPTIONALs, no "...") + // generationDeltaTime GenerationDeltaTime INTEGER(0..65535) -> 16 bits + bw_put_bits(&bw, f->generation_delta_time, 16); + + // ---- CamParameters ---- (SEQUENCE, EXTENSIBLE "...", 2 OPTIONALs: + // lowFrequencyContainer, specialVehicleContainer) + bw_put_bits(&bw, 0, 1); // extension bit: no extension additions + bw_put_bits(&bw, 1, 1); // lowFrequencyContainer present + bw_put_bits(&bw, 0, 1); // specialVehicleContainer absent + + // ---- BasicContainer ---- (SEQUENCE, EXTENSIBLE "...", no OPTIONALs) + bw_put_bits(&bw, 0, 1); // extension bit: none + bw_put_bits(&bw, f->station_type, 8); // stationType StationType INTEGER(0..255) + + // ReferencePosition (SEQUENCE, no OPTIONALs/"..."), identical widths to + // DENM eventPosition (see denm.c for the constraint derivations): + // Latitude INTEGER(-900000000..900000001) -> 31 bits, offset from -900000000 + uint32_t lat_offset = (uint32_t)((int64_t)f->latitude_tenmicrodeg - (-900000000)); + bw_put_bits(&bw, lat_offset, 31); + // Longitude INTEGER(-1800000000..1800000001) -> 32 bits, offset from -1800000000 + uint32_t lon_offset = (uint32_t)((int64_t)f->longitude_tenmicrodeg - (-1800000000)); + bw_put_bits(&bw, lon_offset, 32); + // PosConfidenceEllipse: SemiAxisLength(0..4095)->12, HeadingValue(0..3601)->12 + bw_put_bits(&bw, 4095, 12); // semiMajorConfidence: unavailable + bw_put_bits(&bw, 4095, 12); // semiMinorConfidence: unavailable + bw_put_bits(&bw, 3601, 12); // semiMajorOrientation: unavailable + // Altitude: AltitudeValue(-100000..800001)->20 (offset from -100000), + // AltitudeConfidence ENUM 16 values -> 4 bits + bw_put_bits(&bw, 900001, 20); // 800001 ("unavailable") - (-100000) = 900001 + bw_put_bits(&bw, 15, 4); // altitudeConfidence: unavailable(15) + + // ---- HighFrequencyContainer ---- CHOICE { basicVehicleContainerHighFrequency, + // rsuContainerHighFrequency, ... } - EXTENSIBLE, 2 root alternatives. + bw_put_bits(&bw, 0, 1); // CHOICE extension bit: value is in root + bw_put_bits(&bw, 0, 1); // index: 0 = basicVehicleContainerHighFrequency (1 bit for 2 alts) + + // BasicVehicleContainerHighFrequency (SEQUENCE, NOT extensible, 7 OPTIONALs + // accelerationControl..cenDsrcTollingZone - all absent). + bw_put_bits(&bw, 0, 7); // 7 optional-presence bits, all absent + + // Heading: HeadingValue(0..3601)->12, HeadingConfidence(1..127)->7 (offset from 1) + bw_put_bits(&bw, f->heading_ddeg, 12); + bw_put_bits(&bw, 127 - 1, 7); // headingConfidence: unavailable(127) + // Speed: SpeedValue(0..16383)->14, SpeedConfidence(1..127)->7 (offset from 1) + bw_put_bits(&bw, f->speed_cm_s, 14); + bw_put_bits(&bw, 127 - 1, 7); // speedConfidence: unavailable(127) + // DriveDirection ENUM {forward,backward,unavailable} -> 2 bits + bw_put_bits(&bw, 2, 2); // unavailable + // VehicleLength: VehicleLengthValue(1..1023)->10 (offset from 1), + // VehicleLengthConfidenceIndication ENUM 5 values -> 3 bits + bw_put_bits(&bw, (uint32_t)f->vehicle_length_dm - 1, 10); + bw_put_bits(&bw, 4, 3); // vehicleLengthConfidenceIndication: unavailable(4) + // VehicleWidth INTEGER(1..62) -> 6 bits (offset from 1) + bw_put_bits(&bw, (uint32_t)f->vehicle_width_dm - 1, 6); + // LongitudinalAcceleration: value(-160..161)->9 (offset from -160), + // AccelerationConfidence(0..102)->7 + bw_put_bits(&bw, 161 - (uint32_t)(-160), 9); // longitudinalAccelerationValue: unavailable(161) + bw_put_bits(&bw, 102, 7); // confidence: unavailable(102) + // Curvature: CurvatureValue(-1023..1023)->11 (offset from -1023), + // CurvatureConfidence ENUM 8 values -> 3 bits + bw_put_bits(&bw, 1023 - (uint32_t)(-1023), 11); // curvatureValue: unavailable(1023) + bw_put_bits(&bw, 7, 3); // curvatureConfidence: unavailable(7) + // CurvatureCalculationMode ENUM {yawRateUsed,yawRateNotUsed,unavailable, ...} - note the + // extension marker: UPER encodes an extensible ENUMERATED as an extension bit followed by + // the root-list index, so this is 1 + 2 = 3 bits, NOT 2. Writing only the 2-bit index shifted + // yawRate and the entire low-frequency container one bit early for any standards-compliant + // receiver - including, after its matching fix, the phone app's own decoder. + // Keep in lockstep with obu-firmware/main/cam.c and the app's CamUperCodec.kt. + bw_put_bits(&bw, 0, 1); // extension bit: value is in the root list + bw_put_bits(&bw, 2, 2); // unavailable(2) + // YawRate: YawRateValue(-32766..32767)->16 (offset from -32766), + // YawRateConfidence ENUM 8 values -> 3 bits + bw_put_bits(&bw, 32767 - (uint32_t)(-32766), 16); // yawRateValue: unavailable(32767) + bw_put_bits(&bw, 7, 3); // yawRateConfidence: unavailable(7) + + // ---- LowFrequencyContainer ---- CHOICE { basicVehicleContainerLowFrequency, + // ... } - EXTENSIBLE, 1 root alternative (index needs 0 bits). + bw_put_bits(&bw, 0, 1); // CHOICE extension bit: value is in root + + // BasicVehicleContainerLowFrequency (SEQUENCE, no OPTIONALs/"...") + // vehicleRole VehicleRole ENUM 16 values -> 4 bits + bw_put_bits(&bw, 0, 4); // default(0) + // exteriorLights ExteriorLights BIT STRING(SIZE(8)) -> 8 bits, all off + bw_put_bits(&bw, 0, 8); + // pathHistory PathHistory ::= SEQUENCE(SIZE(0..40)) OF PathPoint -> count 0..40 = 6 bits + bw_put_bits(&bw, 0, 6); // empty path history + + return (int)bw_byte_len(&bw); +} diff --git a/obu-cam-transmistter/main/cam.h b/obu-cam-transmistter/main/cam.h new file mode 100644 index 0000000..4d20e70 --- /dev/null +++ b/obu-cam-transmistter/main/cam.h @@ -0,0 +1,35 @@ +#ifndef CAM_H +#define CAM_H +#include +#include + +// Minimal CAM (Cooperative Awareness Message) per ETSI EN 302 637-2 v1.4.1 +// (CAM-PDU-Descriptions) + TS 102 894-2 v1.3.1 (CDD / ITS-Container), matching +// the field set the working Rust reference (esp32-c_its-companion, feat/tx-cam, +// src/applogic/cam_tx.rs) transmits: +// - ItsPduHeader (protocolVersion 2, messageID 2 = cam) +// - CoopAwareness { generationDeltaTime, camParameters } +// - CamParameters { +// basicContainer { stationType, referencePosition }, +// highFrequencyContainer = basicVehicleContainerHighFrequency { ... }, +// lowFrequencyContainer = basicVehicleContainerLowFrequency { ... } +// } +// All vehicle-dynamics fields we don't measure are encoded as their ASN.1 +// "unavailable" value. Speed is a real 0 (correct for a stationary station). + +typedef struct { + uint32_t station_id; + uint8_t station_type; // StationType(0..255): 5 = passengerCar + uint16_t generation_delta_time; // TimestampIts mod 65536 (ms); 0 until a real clock is wired + int32_t latitude_tenmicrodeg; // Latitude, 1/10 microdegree + int32_t longitude_tenmicrodeg; // Longitude, 1/10 microdegree + uint16_t speed_cm_s; // SpeedValue, 0.01 m/s units (0 = stationary) + uint16_t heading_ddeg; // HeadingValue, 0.1 deg units (0..3600), 3601 = unavailable + uint16_t vehicle_length_dm; // VehicleLengthValue(1..1023), 10cm steps + uint8_t vehicle_width_dm; // VehicleWidth(1..62), 10cm steps +} cam_fields_t; + +// Encodes the CAM as ASN.1 UPER. Returns bytes written, or -1 if buf too small. +int cam_encode(const cam_fields_t *f, uint8_t *buf, size_t buf_len); + +#endif diff --git a/obu-cam-transmistter/main/denm.c b/obu-cam-transmistter/main/denm.c new file mode 100644 index 0000000..9840894 --- /dev/null +++ b/obu-cam-transmistter/main/denm.c @@ -0,0 +1,153 @@ +#include "denm.h" +#include + +// Minimal MSB-first bit packer - ASN.1 UPER is a bitstream, not a byte +// stream, so we can't just memcpy structs. +typedef struct { + uint8_t *buf; + size_t buf_len; + size_t bit_pos; +} bitwriter_t; + +static void bw_init(bitwriter_t *bw, uint8_t *buf, size_t len) +{ + bw->buf = buf; + bw->buf_len = len; + bw->bit_pos = 0; + memset(buf, 0, len); +} + +static void bw_put_bits(bitwriter_t *bw, uint64_t value, int nbits) +{ + for (int i = nbits - 1; i >= 0; i--) { + size_t byte_idx = bw->bit_pos / 8; + int bit_idx = 7 - (int)(bw->bit_pos % 8); + if (byte_idx >= bw->buf_len) { + return; // overflow guard - silently truncates, check return value of denm_encode + } + uint8_t bit = (value >> i) & 1; + bw->buf[byte_idx] = (uint8_t)(bw->buf[byte_idx] | (bit << bit_idx)); + bw->bit_pos++; + } +} + +static size_t bw_byte_len(const bitwriter_t *bw) +{ + return (bw->bit_pos + 7) / 8; +} + +int denm_encode(const denm_fields_t *f, uint8_t *buf, size_t buf_len) +{ + bitwriter_t bw; + bw_init(&bw, buf, buf_len); + + // ---- ItsPduHeader ---- (SEQUENCE, no OPTIONALs, no "..." -> no preamble at all) + bw_put_bits(&bw, 2, 8); // protocolVersion INTEGER(0..255) = 2 + bw_put_bits(&bw, 1, 8); // messageID INTEGER(0..255) = denm(1) + bw_put_bits(&bw, f->station_id, 32); // stationID = StationID INTEGER(0..4294967295) = 32 bits + + // ---- DenmPayload (DecentralizedEnvironmentalNotificationMessage) ---- + // No "..." on this SEQUENCE -> no extension bit, just the 3-bit + // optional-component preamble in declared order: situation, location, + // alacarte. "No additional parameters" means location/alacarte stay + // absent. + bw_put_bits(&bw, 1, 1); // situation present + bw_put_bits(&bw, 0, 1); // location absent + bw_put_bits(&bw, 0, 1); // alacarte absent + + // ---- ManagementContainer ---- + // This SEQUENCE ends in "..." in the real ASN.1 module -> extensible, + // so it needs a leading 1-bit extension flag (0 = no extension + // additions used) BEFORE the 5-bit optional/default preamble + // (termination, relevanceDistance, relevanceTrafficDirection, + // validityDuration, transmissionInterval, in that declared order). An + // earlier version of this code omitted the extension bit entirely, + // which would shift every single bit after it and corrupt the whole + // rest of the message for any spec-compliant decoder. + bw_put_bits(&bw, 0, 1); // ManagementContainer extension bit: none used + bw_put_bits(&bw, f->terminate ? 1 : 0, 1); // termination present only when cancelling + bw_put_bits(&bw, 0, 1); // relevanceDistance absent + bw_put_bits(&bw, 0, 1); // relevanceTrafficDirection absent + bw_put_bits(&bw, 0, 1); // validityDuration absent -> default 600s applies + bw_put_bits(&bw, 0, 1); // transmissionInterval absent + + // actionID = ActionID{ originatingStationID StationID(32), sequenceNumber + // SequenceNumber(0..65535, 16 bits) } - no OPTIONALs/"..." -> no preamble. + // Keep sequenceNumber constant across repeats of the SAME event - it's + // the caller's job (see main.c) to only bump it on a genuinely new event + // and reuse it for that event's eventual termination message. + bw_put_bits(&bw, f->station_id, 32); + bw_put_bits(&bw, f->sequence_number, 16); + + // detectionTime / referenceTime: TimestampIts INTEGER(0..4398046511103) + // = exactly 42 bits (2^42), ms since 2004-01-01T00:00:00Z. NOT WIRED UP + // YET - there's no RTC/NTP sync in this skeleton, so this is 0 (decodes + // as 2004-01-01). Wire in SNTP or a GNSS UTC fix before this is real. + bw_put_bits(&bw, 0, 42); + bw_put_bits(&bw, 0, 42); + + // termination VALUE - only emitted when present (per the preamble bit + // above - UPER never encodes a value for an absent optional component). + // Termination ::= ENUMERATED{isCancellation(0), isNegation(1)}, no + // "...", 2 values -> 1 bit. + if (f->terminate) { + bw_put_bits(&bw, 0, 1); // isCancellation + } + + // eventPosition (ReferencePosition ::= SEQUENCE{latitude, longitude, + // positionConfidenceEllipse, altitude} - no OPTIONALs/"..." -> no + // preamble, straight concatenation). Widths below are each field's + // exact constrained-INTEGER range size from ITS-Container.asn, encoded + // as an unsigned offset from the type's declared minimum - NOT assumed + // to match neighboring fields (latitude and longitude are different + // widths, which is easy to miss). + // Latitude ::= INTEGER(-900000000..900000001) -> range 1800000002 -> 31 bits + uint32_t lat_offset = (uint32_t)(f->latitude_tenmicrodeg - (-900000000)); + bw_put_bits(&bw, lat_offset, 31); + // Longitude ::= INTEGER(-1800000000..1800000001) -> range 3600000002 -> 32 bits + uint32_t lon_offset = (uint32_t)(f->longitude_tenmicrodeg - (-1800000000)); + bw_put_bits(&bw, lon_offset, 32); + // PosConfidenceEllipse ::= SEQUENCE{semiMajorConfidence, semiMinorConfidence, + // semiMajorOrientation} - no preamble. + // SemiAxisLength ::= INTEGER(0..4095) -> 12 bits (not 16 - this was wrong before) + bw_put_bits(&bw, 4095, 12); // semiMajorConfidence: unavailable + bw_put_bits(&bw, 4095, 12); // semiMinorConfidence: unavailable + // HeadingValue ::= INTEGER(0..3601) -> 12 bits (not 16 - this was wrong before) + bw_put_bits(&bw, 3601, 12); // semiMajorOrientation: unavailable + // Altitude ::= SEQUENCE{altitudeValue, altitudeConfidence} - no preamble. + // AltitudeValue ::= INTEGER(-100000..800001) -> range 900002 -> 20 bits + // (not 24 - this was wrong before), offset-encoded from -100000. + bw_put_bits(&bw, 900001, 20); // 800001 ("unavailable") - (-100000) = 900001 + // AltitudeConfidence ::= ENUMERATED, 16 named values, no "..." -> 4 bits + bw_put_bits(&bw, 15, 4); // unavailable + + // stationType: StationType INTEGER(0..255) -> 8 bits fixed regardless of + // how sparse the named values are. + bw_put_bits(&bw, f->station_type, 8); + + // ---- SituationContainer ---- + // This SEQUENCE also ends in "..." -> its own 1-bit extension flag, + // THEN the 2-bit preamble (linkedCause, eventHistory), THEN the + // mandatory field values. An earlier version of this code put the + // linkedCause/eventHistory bits at the END instead of the start, and + // had no extension bit at all - both are structural bugs that would + // desync any spec-compliant decoder from this point on. + bw_put_bits(&bw, 0, 1); // SituationContainer extension bit: none used + bw_put_bits(&bw, 0, 1); // linkedCause absent + bw_put_bits(&bw, 0, 1); // eventHistory absent + + // informationQuality: InformationQuality INTEGER(0..7) -> 3 bits + bw_put_bits(&bw, 1, 3); // low quality - no real sensor input, just the hazard-light GPIO + + // eventType: CauseCode ::= SEQUENCE{causeCode, subCauseCode, ...} - this + // inner SEQUENCE is ALSO extensible ("..."), so it gets its own leading + // extension bit before its two mandatory fields. + bw_put_bits(&bw, 0, 1); // CauseCode extension bit: none used + bw_put_bits(&bw, f->cause_code, 8); // CauseCodeType INTEGER(0..255) -> 8 bits + bw_put_bits(&bw, f->sub_cause_code, 8); // SubCauseCodeType INTEGER(0..255) -> 8 bits + + // linkedCause / eventHistory: both absent, already signalled in the + // preamble above - UPER writes no value bits for them. + + return (int)bw_byte_len(&bw); +} diff --git a/obu-cam-transmistter/main/denm.h b/obu-cam-transmistter/main/denm.h new file mode 100644 index 0000000..692a1e6 --- /dev/null +++ b/obu-cam-transmistter/main/denm.h @@ -0,0 +1,67 @@ +#ifndef DENM_H +#define DENM_H +#include +#include +#include + +// Full CauseCodeType enumeration, straight from the authoritative source: +// ETSI TS 102 894-2 (CDD) ITS-Container.asn, CauseCodeType definition. +// (Values 1/2/3/14/26/27/91/94/95/97 were already cross-checked earlier +// against a real captured DENM; the rest are now confirmed the same way, +// from the actual ASN.1 module rather than guessed.) +#define DENM_CAUSE_RESERVED 0 +#define DENM_CAUSE_TRAFFIC_CONDITION 1 +#define DENM_CAUSE_ACCIDENT 2 +#define DENM_CAUSE_ROADWORKS 3 +#define DENM_CAUSE_IMPASSABILITY 5 +#define DENM_CAUSE_ADVERSE_WEATHER_ADHESION 6 +#define DENM_CAUSE_AQUAPLANNING 7 +#define DENM_CAUSE_HAZARDOUS_LOCATION_SURFACE_CONDITION 9 +#define DENM_CAUSE_HAZARDOUS_LOCATION_OBSTACLE_ON_ROAD 10 +#define DENM_CAUSE_HAZARDOUS_LOCATION_ANIMAL_ON_ROAD 11 +#define DENM_CAUSE_HUMAN_PRESENCE_ON_ROAD 12 +#define DENM_CAUSE_WRONG_WAY_DRIVING 14 +#define DENM_CAUSE_RESCUE_AND_RECOVERY_WORK_IN_PROGRESS 15 +#define DENM_CAUSE_ADVERSE_WEATHER_EXTREME 17 +#define DENM_CAUSE_ADVERSE_WEATHER_VISIBILITY 18 +#define DENM_CAUSE_ADVERSE_WEATHER_PRECIPITATION 19 +#define DENM_CAUSE_SLOW_VEHICLE 26 +#define DENM_CAUSE_DANGEROUS_END_OF_QUEUE 27 +#define DENM_CAUSE_VEHICLE_BREAKDOWN 91 +#define DENM_CAUSE_POST_CRASH 92 +#define DENM_CAUSE_HUMAN_PROBLEM 93 +#define DENM_CAUSE_STATIONARY_VEHICLE 94 +#define DENM_CAUSE_EMERGENCY_VEHICLE_APPROACHING 95 +#define DENM_CAUSE_HAZARDOUS_LOCATION_DANGEROUS_CURVE 96 +#define DENM_CAUSE_COLLISION_RISK 97 +#define DENM_CAUSE_SIGNAL_VIOLATION 98 +#define DENM_CAUSE_DANGEROUS_SITUATION 99 + +typedef struct { + uint32_t station_id; + uint16_t sequence_number; // keep constant across repeats of the SAME event; only bump on a genuinely new event + uint8_t cause_code; // e.g. 94 = stationaryVehicle + uint8_t sub_cause_code; // 0 = unspecified + uint8_t station_type; // StationType, e.g. 5 = passengerCar - match geonet_wrap_shb's station_type param + int32_t latitude_tenmicrodeg; // 1/10 microdegree; 0 = placeholder/unavailable + int32_t longitude_tenmicrodeg; // 1/10 microdegree; 0 = placeholder/unavailable + bool terminate; // true = encode this as a Termination(isCancellation) message instead of a normal update +} denm_fields_t; + +// Encodes a minimal DENM (ItsPduHeader + ManagementContainer + +// SituationContainer only - no location/alacarte containers) as ASN.1 UPER, +// per the actual ETSI EN 302 637-3 / TS 102 894-2 ASN.1 modules (fetched +// from forge.etsi.org, not reconstructed from memory). Returns bytes +// written, or -1 if buf too small. +// +// Two things worth knowing if you're reading this against the modules +// yourself: ManagementContainer, SituationContainer, and CauseCode are all +// declared with a trailing "..." (extensible), which means each needs its +// own leading extension bit in the UPER encoding - easy to miss, and this +// code got it wrong in an earlier version. Field bit-widths below (e.g. +// latitude=31 bits, longitude=32 bits, position-confidence fields=12 bits, +// altitudeValue=20 bits) are derived directly from each type's declared +// INTEGER constraint range, not assumed to match neighboring fields. +int denm_encode(const denm_fields_t *f, uint8_t *buf, size_t buf_len); + +#endif diff --git a/obu-cam-transmistter/main/dot11p.c b/obu-cam-transmistter/main/dot11p.c new file mode 100644 index 0000000..abdbfbc --- /dev/null +++ b/obu-cam-transmistter/main/dot11p.c @@ -0,0 +1,57 @@ +#include "dot11p.h" +#include + +int dot11p_build_frame(const uint8_t *gn_payload, int gn_len, + const uint8_t src_mac[6], + uint8_t *out, size_t out_len, bool qos) +{ + static const uint8_t broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + static const uint8_t llc_snap[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x89, 0x47}; + + int hdr_len = qos ? 26 : 24; // QoS Data adds a 2-byte QoS Control field + int total = hdr_len + 8 /* LLC/SNAP */ + gn_len; + if ((size_t)total > out_len) { + return -1; + } + + uint8_t *p = out; + + // Frame Control: version=0, type=Data(2), subtype=QoS Data(8) -> bytes + // 0x88 0x00. This is what real ITS-G5 hardware actually transmits. + // + // Back on QoS Data again (previously downgraded to non-QoS, subtype 0, + // as a working-but-nonstandard fallback - see git history / old comments + // here for that whole detour). What changed: main.c no longer calls + // esp_wifi_80211_tx() at all - it now goes through + // esp_wifi_80211_tx_custom() (tx_custom.c, pulled from + // opentrafficmap/its-g5-receiver-firmware_txenabled), which bypasses the + // frame-type sanity check entirely by never calling the code path that + // contains it. Frame subtype is no longer gated, so there's no reason + // left to avoid matching real hardware here. + // Frame Control byte 0: version=0, type=Data(2). Subtype: QoS Data(8)=0x88 + // for the tx_custom path, or plain Data(0)=0x08 for the standard + // esp_wifi_80211_tx() path (which rejects QoS Data outright). + *p++ = qos ? 0x88 : 0x08; *p++ = 0x00; + // Duration + *p++ = 0x00; *p++ = 0x00; + // Addr1 = destination = broadcast + memcpy(p, broadcast, 6); p += 6; + // Addr2 = source (our pseudonym) + memcpy(p, src_mac, 6); p += 6; + // Addr3 = BSSID = broadcast (no BSS exists in OCB mode) + memcpy(p, broadcast, 6); p += 6; + // Sequence control - left at 0; en_sys_seq=true fills this in for us + *p++ = 0x00; *p++ = 0x00; + // QoS Control field - only present in QoS Data frames + if (qos) { + *p++ = 0x00; *p++ = 0x00; // best-effort access category + } + + // LLC/SNAP (Ethertype 0x8947 = GeoNetworking) + memcpy(p, llc_snap, 8); p += 8; + + // GeoNetworking + BTP + DENM payload + memcpy(p, gn_payload, gn_len); p += gn_len; + + return (int)(p - out); +} diff --git a/obu-cam-transmistter/main/dot11p.h b/obu-cam-transmistter/main/dot11p.h new file mode 100644 index 0000000..3b9026a --- /dev/null +++ b/obu-cam-transmistter/main/dot11p.h @@ -0,0 +1,31 @@ +#ifndef DOT11P_H +#define DOT11P_H +#include +#include +#include + +// Wraps a GeoNetworking-layer payload in an 802.11 OCB frame: QoS Data +// (subtype 8, 26-byte header), matching real ITS-G5 hardware, broadcast, no +// BSS (Addr1=Addr3=broadcast), LLC/SNAP with Ethertype 0x8947 +// (GeoNetworking's registered Ethertype). Output is ready to hand straight +// to esp_wifi_80211_tx_custom() (tx_custom.c) - NOT esp_wifi_80211_tx(), +// which rejects this frame type outright. `src_mac` is used as Addr2 - pass +// the same 6 bytes you gave geonet_wrap_shb, since GN_ADDR's MID field is +// defined to be this same link-layer address. Returns bytes written, or -1 +// if out buffer too small. +// +// History: this used to be downgraded to non-QoS Data (subtype 0) because +// esp_wifi_80211_tx() rejects QoS Data ("unsupport QoS frame type" / esp_err +// 258) and an attempted linker-override bypass (old main/wifi_patches.c) +// didn't work. Restored to QoS Data now that main.c transmits via +// esp_wifi_80211_tx_custom() instead, which bypasses that gate entirely +// (see tx_custom.c) - so there's no longer a reason to deviate from the +// real frame format. +// qos=true -> QoS Data (subtype 8, 26-byte header) for esp_wifi_80211_tx_custom() +// qos=false -> plain Data (subtype 0, 24-byte header) which the STANDARD +// esp_wifi_80211_tx() accepts (used for the standard-TX isolation test) +int dot11p_build_frame(const uint8_t *gn_payload, int gn_len, + const uint8_t src_mac[6], + uint8_t *out, size_t out_len, bool qos); + +#endif diff --git a/obu-cam-transmistter/main/geonet.c b/obu-cam-transmistter/main/geonet.c new file mode 100644 index 0000000..9fd2555 --- /dev/null +++ b/obu-cam-transmistter/main/geonet.c @@ -0,0 +1,85 @@ +#include "geonet.h" +#include + +int geonet_wrap_shb(const uint8_t *its_payload, int its_len, + const uint8_t mac[6], uint8_t station_type, + int32_t latitude_tenmicrodeg, int32_t longitude_tenmicrodeg, + uint16_t btp_dest_port, + uint8_t *out, size_t out_len) +{ + // GN Basic Header (4) + GN Common Header (8) + SHB source LPV (24) + // + BTP-B header (4) + ITS payload + int total = 4 + 8 + 24 + 4 + its_len; + if ((size_t)total > out_len) { + return -1; + } + + uint8_t *p = out; + + // ---- GN Basic Header (4 bytes) ---- (EN 302 636-4-1 clause 9.6) + *p++ = (uint8_t)((1 << 4) | 1); // version=1, NextHeader=1 (Common Header, unsecured) + *p++ = 0x00; // reserved + *p++ = 0x83; // lifetime (~60s in the base/multiplier encoding) - tune if needed + *p++ = 1; // remaining hop limit = 1 (SHB single-hop; matches CAM in the Rust reference) + + // ---- GN Common Header (8 bytes) ---- (clause 9.7) + *p++ = (uint8_t)((2 << 4) | 0); // NextHeader=2 (BTP-B), reserved nibble + // HeaderType=5 (TSB), HeaderSubtype=0 (SINGLE_HOP) per table 9 - this is + // the actual encoding for single-hop broadcast. An earlier version of + // this code used (2,0), which is GEOUNICAST - wrong header type entirely + // for a broadcast frame; real receivers would try to match the + // destination-address extended header GeoUnicast expects and mishandle + // or reject the packet. + *p++ = (uint8_t)((5 << 4) | 0); + *p++ = 0x02; // traffic class: SCF=0, ChannelOffload=0, TC-ID=2 (clause 9.7.5) + *p++ = 0x80; // flags: bit0 = "is mobile" station (clause 9.7.2) + // Payload length = what follows the WHOLE GeoNetworking header + // (Basic+Common+Extended), i.e. BTP-B header + ITS payload only - does + // NOT include the 24-byte extended header itself. An earlier version of + // this code wrongly added the 24 bytes in here too. + uint16_t payload_len = (uint16_t)(4 + its_len); + *p++ = (uint8_t)(payload_len >> 8); + *p++ = (uint8_t)(payload_len & 0xFF); + *p++ = 1; // max hop limit = 1, matches basic header RHL (SHB single-hop) + *p++ = 0x00; // reserved + + // ---- SHB extended header: Source Long Position Vector (24 bytes) ---- + // (clause 9.5.2). GN_ADDR (8 bytes) is itself structured, not a raw + // pseudonym (clause 9.5.1): bit0 M-flag(0=auto-derived), bits1-5 ITS-S + // type (5-bit), bits6-15 reserved(=0), then octets2-7 = MID, which is + // defined to BE the link-layer (802.11) address - so this must match + // the source address dot11p_build_frame uses, not just "look similar." + uint8_t gn_addr[8]; + gn_addr[0] = (uint8_t)((0 << 7) | ((station_type & 0x1F) << 2)); // M=0, ST=station_type, top 2 reserved bits=0 + gn_addr[1] = 0x00; // remaining 8 reserved bits + memcpy(&gn_addr[2], mac, 6); // MID = link-layer address + memcpy(p, gn_addr, 8); p += 8; + // Timestamp (4 bytes, ms since 2004-01-01 mod 2^32) - placeholder 0, + // same caveat as detectionTime in denm.c. + memset(p, 0, 4); p += 4; + // Latitude/Longitude (4+4 bytes, signed, big-endian, 1/10 microdegree) - + // fixed-width binary fields, not UPER bit-packed. + uint32_t lat_u = (uint32_t)latitude_tenmicrodeg; + *p++ = (uint8_t)(lat_u >> 24); *p++ = (uint8_t)(lat_u >> 16); + *p++ = (uint8_t)(lat_u >> 8); *p++ = (uint8_t)(lat_u); + uint32_t lon_u = (uint32_t)longitude_tenmicrodeg; + *p++ = (uint8_t)(lon_u >> 24); *p++ = (uint8_t)(lon_u >> 16); + *p++ = (uint8_t)(lon_u >> 8); *p++ = (uint8_t)(lon_u); + // PAI(1 bit) + Speed(15 bits), packed into 2 bytes: 0 = PAI false, + // speed 0 - which is actually correct semantics for a STATIONARY + // vehicle beacon, not just a placeholder. + *p++ = 0x00; *p++ = 0x00; + // Heading (16 bits, 0.1 degree units): 0 = due north / unavailable + *p++ = 0x00; *p++ = 0x00; + + // ---- BTP-B header (4 bytes) ---- + *p++ = (uint8_t)(btp_dest_port >> 8); + *p++ = (uint8_t)(btp_dest_port & 0xFF); + *p++ = 0x00; *p++ = 0x00; // destination port info, unused for BTP-B + + // ---- ITS payload (DENM UPER bytes) ---- + memcpy(p, its_payload, its_len); + p += its_len; + + return (int)(p - out); +} diff --git a/obu-cam-transmistter/main/geonet.h b/obu-cam-transmistter/main/geonet.h new file mode 100644 index 0000000..22a5531 --- /dev/null +++ b/obu-cam-transmistter/main/geonet.h @@ -0,0 +1,44 @@ +#ifndef GEONET_H +#define GEONET_H +#include +#include + +// Wraps an ITS application payload (e.g. from denm_encode) with a minimal +// GeoNetworking Basic Header + Common Header + Single-Hop-Broadcast +// extended header (HeaderType=TSB(5), HeaderSubtype=SINGLE_HOP(0), per +// ETSI EN 302 636-4-1 table 9), then prepends a BTP-B header addressed to +// the DENM service port (2002). +// +// `mac` is the 6-byte pseudonym/link-layer address - pass the SAME address +// you hand to dot11p_build_frame's src address, since GN_ADDR's MID field +// (the last 6 bytes of the 8-byte GN_ADDR) is defined to BE that +// link-layer address (EN 302 636-4-1 clause 9.5.1). `station_type` is the +// 5-bit ITS-S type from the same clause (5 = passengerCar) and gets packed +// into GN_ADDR alongside the address. +// +// `latitude_tenmicrodeg`/`longitude_tenmicrodeg` go into the Source Long +// Position Vector (clause 9.5.2) as plain 32-bit signed big-endian fields - +// NOT UPER bit-packed like the DENM payload's position fields, this is a +// fixed-width binary protocol. Pass the SAME values you gave denm_encode's +// eventPosition, so the GN-layer position and the DENM's own claimed +// position agree. +// +// Deliberate simplification: real DENM dissemination normally uses +// GeoBroadcast (GBC, HeaderType=4) so RSUs/OBUs can forward it across an +// area - that needs a sequence number + geo-area fields this skeleton +// doesn't build yet. Single-hop broadcast is simpler and is the +// best-tested decode path in the receiver firmware you already have +// working (same extended header shape as CAM). Fine for a single-vehicle +// beacon; revisit if you need real multi-hop forwarding later. +// +// `btp_dest_port` is the BTP-B destination port for the service being carried +// (ETSI TS 103 248): 2001 = CAM, 2002 = DENM, 2003 = MAPEM, 2004 = SPATEM, ... +// +// Returns bytes written, or -1 if out buffer too small. +int geonet_wrap_shb(const uint8_t *its_payload, int its_len, + const uint8_t mac[6], uint8_t station_type, + int32_t latitude_tenmicrodeg, int32_t longitude_tenmicrodeg, + uint16_t btp_dest_port, + uint8_t *out, size_t out_len); + +#endif diff --git a/obu-cam-transmistter/main/main.c b/obu-cam-transmistter/main/main.c new file mode 100644 index 0000000..8fa708c --- /dev/null +++ b/obu-cam-transmistter/main/main.c @@ -0,0 +1,262 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "nvs_flash.h" +#include "esp_log.h" +#include "hal/modem_syscon_ll.h" // modem_syscon_ll_enable_fe_40m_clock() - see initialize_wifi +#include "denm.h" +#include "cam.h" +#include "geonet.h" +#include "dot11p.h" +#include "tx_custom.h" + +static const char *TAG = "obu-tx"; + +// CAM beacon: transmit a Cooperative Awareness Message every TX_INTERVAL_MS, +// unconditionally (no hazard-light gating - CAM is a continuous beacon, unlike +// the event-triggered DENM). Matches the working Rust reference +// (esp32-c_its-companion, feat/tx-cam), which beacons CAM on 5900 MHz. + +// ISOLATION TEST for whether tx_custom.c is the blocker. +// 1 = transmit via the STANDARD, well-tested esp_wifi_80211_tx() using a +// plain (non-QoS) Data frame, which that API accepts. This path is known +// to actually key the PA. If the sniffer sees frames with this = 1 but +// not with = 0, then tx_custom.c (its reverse-engineered driver-struct +// offsets) is the problem, not the RF/channel/regulatory setup. +// 0 = original path: QoS Data frame via esp_wifi_80211_tx_custom(). +// Non-QoS Data is non-standard for ITS-G5, but this is purely a "does any RF +// leave the chip" test - your capture-all sniffer logs it regardless. +// +// A/B TEST for the bursty-SDR symptom. Console is stable and tx_custom returns +// OK every second, but the SDR only sees sporadic bursts - the fingerprint of +// tx_custom.c's reverse-engineered driver-struct offsets not matching THIS IDF +// (v5.5.4) as opposed to the reference's bundled IDF. Setting this to 1 routes +// TX through the official, well-tested esp_wifi_80211_tx() (non-QoS Data), which +// uses NO reverse-engineered structs. If the SDR becomes a steady 1 Hz with +// this = 1, tx_custom's struct layout is confirmed as the culprit. +#define USE_STANDARD_TX 1 + +// Target frequency: 5900 MHz (ITS-G5 G5-CCH, channel 180). This is what the +// working Rust reference transmits on, proving the C5 PA reaches it despite the +// 5885 datasheet max. The reference sets band-mode 5G, then phy_11p_set + +// phy_change_channel(5900) directly - it does NOT call esp_wifi_set_channel at +// all, so we don't either (channel 180 isn't a normal Wi-Fi channel anyway). +#define TX_FREQ_MHZ 5900 +// ---------------------------------------------------------------------------- + +// ---- CAM beacon profile ---- +#define STATION_ID 0x0BADC0DE // placeholder 32-bit station id - pick your own +#define STATION_TYPE 5 // passengerCar (TS 102 894-2 StationType) +#define VEHICLE_LENGTH_DM 40 // VehicleLengthValue, 10cm steps (4.0 m) +#define VEHICLE_WIDTH_DM 18 // VehicleWidth, 10cm steps (1.8 m) +#define BTP_PORT_CAM 2001 // BTP-B destination port for CAM (ETSI TS 103 248) +#define TX_INTERVAL_MS 1000 // CAM beacon period (1 Hz; ITS allows 1-10 Hz) + +// Bench location, hardcoded since there's no GNSS module wired in yet and +// the unit is genuinely stationary here: 53°33'16.8"N 10°01'20.6"E, in +// 1/10-microdegree units (decimal_degrees * 10,000,000). Replace with real +// GNSS output once you have a fix source; until then this beats 0/0 +// ("Null Island"), which is an obvious placeholder-tell on any map. +#define BENCH_LATITUDE_TENMICRODEG 535546667 +#define BENCH_LONGITUDE_TENMICRODEG 100223889 + +// Single source of truth for the pseudonym/link-layer address: used both as +// the 802.11 source MAC (Addr2) and as GN_ADDR's MID field, since the GN +// spec defines those as being the same address. Locally-administered bit +// set (0x02) per normal MAC convention. Fixed/non-rotating for now - real +// stacks rotate this every 5-15 min for privacy. +static const uint8_t pseudonym_mac[6] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x01}; + +// Undocumented libphy.a calls that push the radio into 802.11p OCB mode on +// the 5.9 GHz ITS-G5 band. See docs/04-transmit-setup.md for source + what +// to do if the linker can't find these symbols in your ESP-IDF version. +extern void phy_11p_set(int enable, int unused); +extern void phy_change_channel(int freq_mhz, int bw_mode, int sec_chan_offset, int unused); + +static void send_cam(void) +{ + // GenerationDeltaTime is TimestampIts mod 65536 (ms). No RTC/GNSS time here, + // so use a free-running ms counter that advances one beacon-interval per + // send. It wraps at 65536, which is exactly the field's defined behaviour. + static uint16_t gen_delta = 0; + + uint8_t frame[300]; + cam_fields_t fields = { + .station_id = STATION_ID, + .station_type = STATION_TYPE, + .generation_delta_time = gen_delta, + .latitude_tenmicrodeg = BENCH_LATITUDE_TENMICRODEG, + .longitude_tenmicrodeg = BENCH_LONGITUDE_TENMICRODEG, + .speed_cm_s = 0, // stationary + .heading_ddeg = 3601, // HeadingValue unavailable (no heading source) + .vehicle_length_dm = VEHICLE_LENGTH_DM, + .vehicle_width_dm = VEHICLE_WIDTH_DM, + }; + gen_delta += TX_INTERVAL_MS; + + uint8_t cam_payload[96]; + int cam_len = cam_encode(&fields, cam_payload, sizeof(cam_payload)); + + uint8_t gn_payload[160]; + int gn_len = geonet_wrap_shb(cam_payload, cam_len, pseudonym_mac, STATION_TYPE, + BENCH_LATITUDE_TENMICRODEG, BENCH_LONGITUDE_TENMICRODEG, + BTP_PORT_CAM, gn_payload, sizeof(gn_payload)); + + // qos=false for the standard-TX path (esp_wifi_80211_tx accepts only non-QoS + // Data - which is exactly what the Rust reference transmits); qos=true would + // be a real ITS-G5 QoS Data frame for the tx_custom path. + int frame_len = dot11p_build_frame(gn_payload, gn_len, pseudonym_mac, frame, sizeof(frame), + USE_STANDARD_TX ? false : true); + + // PHY/OCB/channel is configured ONCE at boot in app_main and left alone, + // matching the working Rust reference (band-mode 5G + phy_11p_set + + // phy_change_channel(5900), set once). + + if (frame_len > 0) { +#if USE_STANDARD_TX + // Standard, well-tested raw-TX API with a non-QoS Data frame - the same + // transmit path the Rust reference uses (esp-radio send_raw_frame wraps + // esp_wifi_80211_tx). err 258 ("unsupport QoS frame type") would mean the + // frame wasn't built as non-QoS. + esp_err_t err = esp_wifi_80211_tx(WIFI_IF_STA, frame, frame_len, true); + if (err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_80211_tx (standard) failed: %d", err); + } else { + ESP_LOGI(TAG, "CAM sent via STANDARD tx (%d bytes) @ %d MHz genDeltaT=%u", frame_len, TX_FREQ_MHZ, gen_delta); + } +#else + // tx_custom path: submits to the driver's internal HMAC TX path, + // bypassing the QoS-frame gate. 11A legacy OFDM, 12M rate. + wifi_tx_rate_config_t tx_rate_cfg = { + .phymode = WIFI_PHY_MODE_11A, + .rate = WIFI_PHY_RATE_12M, + .ersu = false, + .dcm = false, + }; + esp_err_t err = esp_wifi_80211_tx_custom(WIFI_IF_STA, frame, frame_len, true, + &tx_rate_cfg, WIFI_BAND_5G, WIFI_BW20); + if (err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_80211_tx_custom failed: %d", err); + } else { + ESP_LOGI(TAG, "CAM sent (%d bytes) @ %d MHz genDeltaT=%u", frame_len, TX_FREQ_MHZ, gen_delta); + } +#endif + } else { + ESP_LOGE(TAG, "CAM frame build failed (cam_len=%d gn_len=%d)", cam_len, gn_len); + } +} + +static void tx_task(void *arg) +{ + while (1) { + // CAM is a continuous beacon - send every interval, unconditionally. + send_cam(); + vTaskDelay(pdMS_TO_TICKS(TX_INTERVAL_MS)); + } +} + +void app_main(void) +{ + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // Enable the modem FRONT-END 40 MHz clock BEFORE esp_wifi_init(). This is + // the one step the proven-working receiver firmware + // (its-g5-receiver-firmware_txenabled, main/main.c -> initialize_wifi()) + // performs that this OBU was missing. Without the FE clock enabled the + // 5 GHz front-end / transmit chain is not fully clocked - which matches the + // exact symptom here: the radio calibrates (boot RF ping) and receives + // fine, but data frames are accepted by the API and never actually key the + // PA. This is a low-level modem_syscon register write via the HAL LL layer, + // copied verbatim from the reference firmware. + modem_syscon_ll_enable_fe_40m_clock(&MODEM_SYSCON, 1); + + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&wifi_cfg)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); // match reference initialize_wifi() + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + + // ---- Regulatory / TX-authorization override ----------------------------- + // THE fix for "RX works but TX is silent". By default the driver uses + // WIFI_COUNTRY_POLICY_AUTO, whose 5 GHz regulatory table does NOT authorize + // transmit on the 5.9 GHz ITS band (and treats DFS channels as no-IR / + // radar-gated). Receiving is never gated - which is exactly why the sniffer + // hears traffic but our own frames never key the PA, and why the only RF + // seen from this board is the uninhibited PHY-calibration burst at boot. + // + // Switching to WIFI_COUNTRY_POLICY_MANUAL with an explicit 5 GHz channel + // mask (wifi_5g_channel_mask, which only takes effect under manual policy) + // tells the driver these channels are permitted and lifts the transmit + // gate. WIFI_CHANNEL_177 (BIT(28)) = 5885 MHz; we enable the full 5 GHz set + // (bits 1..28) so both the primer channel and the target are authorized. + // Manual policy = the operator asserts regulatory responsibility, which is + // appropriate for licensed/university research on the ITS band. + wifi_country_t ctry = { + .cc = "US", // nominal under manual policy + .schan = 1, + .nchan = 11, + .policy = WIFI_COUNTRY_POLICY_MANUAL, + .wifi_5g_channel_mask = 0x1FFFFFFE, // all 5 GHz channels, bits 1..28 (incl. 140 and 177) + }; + esp_err_t ctry_err = esp_wifi_set_country(&ctry); + if (ctry_err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_set_country(MANUAL) failed: %d (continuing)", ctry_err); + } + // Ensure the PA runs at full configured power (not a reduced regulatory + // default). Units are 0.25 dBm; 80 = 20 dBm. + esp_wifi_set_max_tx_power(80); + // ------------------------------------------------------------------------- + + // Force the dual-band C5 onto its 5 GHz PHY. This MUST be called after + // esp_wifi_start() - calling it before returns ESP_ERR_WIFI_NOT_STARTED + // (0x3002 / 12290). Locking the band to 5G explicitly keeps the driver + // from ever falling back to 2.4 GHz ch1 (the old "stuck at primary=1" + // symptom), which would key the wrong PHY and make us inaudible to a + // 5.9 GHz sniffer. Valid 5 GHz channels on the C5 are 36..177. Not + // ESP_ERROR_CHECK'd: log and continue if a given IDF build differs. + esp_err_t band_err = esp_wifi_set_band_mode(WIFI_BAND_MODE_5G_ONLY); + if (band_err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_set_band_mode(5G_ONLY) failed: %d (continuing)", band_err); + } + + // Disable Wi-Fi power save. An unassociated STA with the default + // WIFI_PS_MIN_MODEM power save sleeps its radio between beacons it will + // never receive (we're not joined to any AP), and drops outbound raw + // frames while asleep - the classic "esp_wifi_80211_tx returns OK but + // nothing goes on air". Must be called after esp_wifi_start(). + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); + + // Enable promiscuous mode. This is the single most important change: our + // *receiver* firmware (V2X2MAP) - which demonstrably works at 5.9 GHz, + // 13k+ frames captured - runs promiscuous, and ESP-IDF documents that the + // raw-frame TX path only actually emits when the MAC is in promiscuous + // mode or associated to an AP. Plain STA (what this firmware used before) + // is neither, so frames were being accepted by the API and then dropped + // by the driver. Putting the OBU in the same radio state as the working + // sniffer, then injecting, is the whole fix. Must be after start. + ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true)); + + // Force 802.11p OCB mode on the ITS-G5 channel, exactly like the working + // Rust reference (esp32-c_its-companion, src/radio.rs setup_wifi_sniffer): + // enable 802.11p, then jump straight to the target frequency. With band-mode + // already locked to 5 GHz above, NO esp_wifi_set_channel priming is needed - + // the reference doesn't call it, and channel 180 (5900 MHz) isn't a normal + // Wi-Fi channel anyway. phy_change_channel takes the frequency in MHz. + ESP_LOGI(TAG, "about to call phy_11p_set..."); + phy_11p_set(1, 0); + ESP_LOGI(TAG, "phy_11p_set returned, about to call phy_change_channel(%d)...", TX_FREQ_MHZ); + phy_change_channel(TX_FREQ_MHZ, 1, 0, 0); + ESP_LOGI(TAG, "phy_change_channel returned"); + + ESP_LOGW(TAG, "OCB @ %d MHz - CAM beacon armed, transmitting every %d ms", + TX_FREQ_MHZ, TX_INTERVAL_MS); + + xTaskCreate(tx_task, "tx_task", 4096, NULL, 5, NULL); +} diff --git a/obu-cam-transmistter/main/tx_custom.c b/obu-cam-transmistter/main/tx_custom.c new file mode 100644 index 0000000..24c8bd1 --- /dev/null +++ b/obu-cam-transmistter/main/tx_custom.c @@ -0,0 +1,196 @@ +// Copied verbatim (no logic changes) from opentrafficmap/its-g5-receiver-firmware_txenabled, +// main/tx_custom.c (https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled), +// same authors as the receiver firmware (V2X2MAP) already used on the RX side of this +// project. Same chip (ESP32-C5), same class of problem (getting a raw 802.11 frame past +// esp_wifi_80211_tx()'s built-in frame-type gate), and a proven-different approach from our +// own abandoned main/wifi_patches.c attempt - see docs/04-transmit-setup.md for why that one +// didn't work and why this one is expected to. +// +// WHAT THIS DOES DIFFERENTLY FROM esp_wifi_80211_tx(): it doesn't call the public API at all. +// It reaches one layer deeper into the closed WiFi driver - ic_ebuf_alloc() (allocates an +// internal driver buffer), ieee80211_post_hmac_tx() (submits that buffer straight to the MAC +// for transmission) - and never goes through the code path that contains the QoS-frame-type +// sanity check that was rejecting us. Notice line "esp_err_t result = 0;//ieee80211_raw_frame_ +// sanity_check(...)" below: the upstream authors don't override that check (like our old +// wifi_patches.c tried to), they just never call the function that calls it. +// +// REAL RISK, carried over from upstream, not introduced by us: this skips ALL frame-type and +// sanity validation, same caveat as our old override attempt. A malformed frame from a bug +// elsewhere in our own code could behave worse (silent corruption, crash) than a clean +// rejection. +// +// UNVERIFIED FOR OUR EXACT TOOLCHAIN - things worth checking before trusting this blindly: +// 1. The symbols this depends on (ieee80211_post_hmac_tx, ic_ebuf_alloc, ic_get_default_sched, +// g_osi_funcs_p, g_wifi_global_lock) are undocumented/internal. We confirmed via `nm` +// earlier that ieee80211_raw_frame_sanity_check exists in OUR esp32c5/IDF libnet80211.a - +// we have NOT yet independently confirmed these other four/five symbols exist in our +// exact ESP-IDF version (as opposed to whatever version the upstream repo's pinned +// esp-idf submodule uses). If the linker can't find one of these, that's the first thing +// to check - see docs/04-transmit-setup.md for the nm command. +// 2. x_eb_txdesc_t / x_middle_data_t / x_ebuf_t below are REVERSE-ENGINEERED struct layouts +// of closed-source internal WiFi driver types, pinned only by a sizeof() static_assert - +// that assert catches a total-size mismatch but NOT a field-order/semantic mismatch if a +// different IDF version shuffled internal fields while keeping the same total size. If our +// ESP-IDF version differs meaningfully from upstream's, this could compile and link fine +// but write to the wrong offsets internally. Worth checking `idf.py --version` against +// whatever esp-idf commit opentrafficmap's repo has pinned as a submodule, as a rough +// compatibility signal (not a guarantee either way). +#include "esp_private/wifi_os_adapter.h" +#include "esp_wifi.h" + +#include "tx_custom.h" + +esp_err_t ieee80211_raw_frame_sanity_check(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq); +esp_err_t ieee80211_post_hmac_tx(void *ebuf); +void *ic_ebuf_alloc(const void *packet, uint32_t unknown, uint32_t len); +void *ic_get_default_sched(void); + +extern wifi_osi_funcs_t *g_osi_funcs_p; +extern void *g_wifi_global_lock; + +typedef struct x_eb_txdesc +{ + uint32_t flags; + uint32_t field_4; + uint32_t field_8; + uint8_t rate; + uint8_t field_d; + uint8_t field_e; + uint8_t field_f; + uint32_t field_10; + uint32_t field_14; + uint32_t timestamp; + void* sched; + uint32_t field_20; + uint32_t field_24; + uint32_t field_28; + union { + uint32_t field_2c_32; + struct { + uint8_t field_2c; + uint8_t field_2d; + uint8_t field_2e; + uint8_t field_2f; + }; + }; + union { + uint32_t field_30_32; + struct { + uint8_t field_30; + uint8_t field_31; + uint8_t field_32; + uint8_t field_33; + }; + }; + uint32_t field_34; + uint32_t field_38; + uint32_t field_3c; + uint32_t field_40; + uint32_t field_44; +} x_eb_txdesc_t; +static_assert(sizeof(x_eb_txdesc_t) == 0x48); + +typedef struct x_middle_data +{ + uint32_t field_40; + uint8_t* buf; + uint32_t field_48; + uint32_t field_4c; +} x_middle_data_t; +static_assert(sizeof(x_middle_data_t) == 0x10); + +typedef struct x_ebuf +{ + uint32_t field_0; + x_middle_data_t* ds_head; + x_middle_data_t* ds_tail; + uint16_t field_c; + uint16_t field_e; + uint32_t extra_data_start; + uint16_t header_length; + uint32_t data_length; + uint16_t field_1c; + uint8_t alloc_type; + uint8_t field_1f; + uint32_t field_20; + uint8_t field_24; + uint8_t field_25; + uint8_t field_26; + uint8_t field_27; + uint32_t field_28; + uint8_t field_2c; + uint32_t field_30; + uint32_t next_free; + x_eb_txdesc_t* txdesc; + uint16_t field_3c; + uint8_t field_3e; + uint8_t field_3f; +} x_ebuf_t; +static_assert(sizeof(x_ebuf_t) == 0x40); + +esp_err_t esp_wifi_80211_tx_custom(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq, wifi_tx_rate_config_t *tx_rate_config, wifi_band_t band, wifi_bandwidth_t bw) +{ + esp_err_t result = 0;//ieee80211_raw_frame_sanity_check(ifx, buffer, len, en_sys_seq); + + if (!result) + { + g_osi_funcs_p->_mutex_lock(g_wifi_global_lock); + x_ebuf_t* eb = ic_ebuf_alloc(buffer, 1, len); + + if (eb) + { + //eb->data_length = len - 0x1a; + eb->data_length = 0; + x_eb_txdesc_t *txdesc_1 = eb->txdesc; + //eb->header_length = 0x1a; + eb->header_length = len; + txdesc_1->flags |= 0x4000; + txdesc_1->sched = ic_get_default_sched(); + wifi_phy_rate_t rate = tx_rate_config->rate; + x_eb_txdesc_t *txdesc = eb->txdesc; + + if (rate) + txdesc->rate = (char)rate; + else if (band != WIFI_BAND_5G) + txdesc->rate = 0; + else + txdesc->rate = (char)WIFI_PHY_RATE_6M; + + wifi_phy_mode_t phymode = tx_rate_config->phymode; + + if (phymode == WIFI_PHY_MODE_HE20) + { + txdesc->flags |= 0x80000000; + txdesc->field_2f = + (char)((((uint32_t)tx_rate_config->ersu + 6) & 0xf) << 3) + | (txdesc->field_2f & 0x87); + + if ((uint32_t)tx_rate_config->dcm) + txdesc->field_31 |= 0x80; + } + else if (phymode == WIFI_PHY_MODE_VHT20) + txdesc->flags |= 0x1000000; + + // No idea if this is correct, but this is what the original code does... + uint32_t bw_is_bw40 = bw == WIFI_BW40; + txdesc->field_8 = (bw_is_bw40 << 0xf) | (txdesc->field_8 & 0xffff7fff); + + if (en_sys_seq) + txdesc->flags |= 1; + + txdesc->field_10 = + (txdesc->field_10 & 0xfff3ffff) | ((ifx & WIFI_IF_MAX) << 0x12); + txdesc->field_14 = 0x100; + + ieee80211_post_hmac_tx(eb); + g_osi_funcs_p->_mutex_unlock(g_wifi_global_lock); + } + else + { + result = ESP_ERR_NO_MEM; + g_osi_funcs_p->_mutex_unlock(g_wifi_global_lock); + } + } + + return result; +} diff --git a/obu-cam-transmistter/main/tx_custom.h b/obu-cam-transmistter/main/tx_custom.h new file mode 100644 index 0000000..c310401 --- /dev/null +++ b/obu-cam-transmistter/main/tx_custom.h @@ -0,0 +1,15 @@ +// Copied from opentrafficmap/its-g5-receiver-firmware_txenabled, main/tx_custom.h. +// See tx_custom.c for what this does and why we pulled it in. +#pragma once + +#include "esp_wifi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +esp_err_t esp_wifi_80211_tx_custom(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq, wifi_tx_rate_config_t *tx_rate_config, wifi_band_t band, wifi_bandwidth_t bw); + +#ifdef __cplusplus +} +#endif diff --git a/obu-cam-transmistter/main/wifi_patches.c b/obu-cam-transmistter/main/wifi_patches.c new file mode 100644 index 0000000..9c317db --- /dev/null +++ b/obu-cam-transmistter/main/wifi_patches.c @@ -0,0 +1,49 @@ +#include + +// RETIRED - no longer built (removed from main/CMakeLists.txt SRCS), kept only +// for history. Confirmed not to work: linked cleanly with -Wl,-zmuldefs but +// the QoS-frame rejection persisted identically. Also turned out to be based +// on the wrong function signature - the real ieee80211_raw_frame_sanity_check +// takes (wifi_interface_t ifx, const void *buffer, int32_t len, bool +// en_sys_seq), confirmed from opentrafficmap/its-g5-receiver-firmware_txenabled's +// main/tx_custom.c, not the 3x int32_t guessed below. Superseded by +// tx_custom.c, which bypasses esp_wifi_80211_tx() (and the function that +// calls this check) entirely instead of trying to neutralize the check. +// See docs/04-transmit-setup.md. + +// Overrides a function inside the closed-source WiFi library that gates +// which raw 802.11 frame types esp_wifi_80211_tx() will accept. By default +// it only allows beacon/probe-request/probe-response/action and non-QoS +// data frames - it explicitly rejects QoS Data (subtype 8), which is what +// real ITS-G5/802.11p hardware actually transmits and expects. +// +// This is the same technique used by ESP32 WiFi-security tools (deauther/ +// injection projects) to unlock raw frame injection: define a function with +// the exact same name as the library's gate, and link with -Wl,-zmuldefs +// (see CMakeLists.txt) so the linker accepts having two definitions of the +// same symbol instead of erroring with "multiple definition of +// `ieee80211_raw_frame_sanity_check'" - and takes this one instead of the +// library's. +// +// Confirmed present for THIS target/IDF version: `nm` on +// components/esp_wifi/lib/esp32c5/libnet80211.a (IDF v5.5.4) shows +// `ieee80211_raw_frame_sanity_check` as a normal (non-weak) global text +// symbol in ieee80211_node.o. The exact argument count/meaning is +// reverse-engineered from community ESP32 (Xtensa) deauther tools, not +// confirmed byte-for-byte against esp32c5's actual implementation - if +// frames still get rejected, or this crashes, the real signature may take +// different arguments than assumed here. +// +// Real risk, not just an inconvenience: this disables ALL sanity checking +// on raw frames going through esp_wifi_80211_tx(), not just the QoS-type +// gate. Whatever else that check validates (frame length bounds, etc.) is +// now unchecked. Malformed frames from a bug elsewhere in this codebase +// could behave worse (silent corruption, crash) than they would have with +// the check in place, where they'd have just been rejected cleanly. +int ieee80211_raw_frame_sanity_check(int32_t arg1, int32_t arg2, int32_t arg3) +{ + (void)arg1; + (void)arg2; + (void)arg3; + return 0; // 0 = "frame is sane" - always pass +} diff --git a/obu-cam-transmistter/sdkconfig b/obu-cam-transmistter/sdkconfig new file mode 100644 index 0000000..18aaa07 --- /dev/null +++ b/obu-cam-transmistter/sdkconfig @@ -0,0 +1,2509 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.4 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_ANA_CMPR_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_ETM_SUPPORTED=y +CONFIG_SOC_PARLIO_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_LP_CORE_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_RSA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_ECC_SUPPORTED=y +CONFIG_SOC_ECC_EXTENDED_MODES_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_IEEE802154_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_APM_SUPPORTED=y +CONFIG_SOC_PMU_SUPPORTED=y +CONFIG_SOC_PAU_SUPPORTED=y +CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y +CONFIG_SOC_LP_PERIPHERALS_SUPPORTED=y +CONFIG_SOC_LP_I2C_SUPPORTED=y +CONFIG_SOC_ULP_LP_UART_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_ECDSA_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_KEY_MANAGER_SUPPORTED=y +CONFIG_SOC_HUK_SUPPORTED=y +CONFIG_SOC_MODEM_CLOCK_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_CLOCK_TREE_MANAGEMENT_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_BITSCRAMBLER_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_48M=y +CONFIG_SOC_XTAL_CLOCK_PATH_DEPENDS_ON_TOP_DOMAIN=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_AES_SUPPORT_PSEUDO_ROUND_FUNCTION=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=1 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=6 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y +CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_CPU_SUPPORT_WFE=y +CONFIG_SOC_INT_CLIC_SUPPORTED=y +CONFIG_SOC_INT_HW_NESTED_SUPPORTED=y +CONFIG_SOC_BRANCH_PREDICTOR_SUPPORTED=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x100 +CONFIG_SOC_CPU_HAS_PMA=y +CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y +CONFIG_SOC_CPU_PMP_REGION_GRANULARITY=128 +CONFIG_SOC_CPU_HAS_LOCKUP_RESET=y +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_DMA_CAN_ACCESS_FLASH=y +CONFIG_SOC_AHB_GDMA_VERSION=2 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GDMA_SUPPORT_ETM=y +CONFIG_SOC_GDMA_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GDMA_EXT_MEM_ENC_ALIGNMENT=16 +CONFIG_SOC_ETM_GROUPS=1 +CONFIG_SOC_ETM_CHANNELS_PER_GROUP=50 +CONFIG_SOC_ETM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=29 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 +CONFIG_SOC_GPIO_SUPPORT_PIN_HYS_FILTER=y +CONFIG_SOC_GPIO_SUPPORT_ETM=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=28 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=28 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=7 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0000000001FFFF80 +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_CLOCKOUT_HAS_SOURCE_GATE=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_RTCIO_PIN_COUNT=7 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_RTCIO_EDGE_WAKE_SUPPORTED=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_ANA_CMPR_NUM=1 +CONFIG_SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE=y +CONFIG_SOC_ANA_CMPR_SUPPORT_ETM=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_FSM_RST=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH=y +CONFIG_SOC_I2C_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LP_I2C_NUM=1 +CONFIG_SOC_LP_I2C_FIFO_LEN=16 +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_ETM=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F240M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_TX_SYNC_CNT=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_I2S_TDM_FULL_DATA_WIDTH=y +CONFIG_SOC_I2S_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LEDC_SUPPORT_PLL_DIV_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX=16 +CONFIG_SOC_LEDC_FADE_PARAMS_BIT_WIDTH=10 +CONFIG_SOC_LEDC_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_DI_VADDR_SHARED=y +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE=y +CONFIG_SOC_PCNT_SUPPORT_CLEAR_SIGNAL=y +CONFIG_SOC_PCNT_SUPPORT_STEP_NOTIFY=y +CONFIG_SOC_PCNT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MCPWM_GROUPS=1 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_EVENT_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MCPWM_SUPPORT_ETM=y +CONFIG_SOC_MCPWM_SUPPORT_EVENT_COMPARATOR=y +CONFIG_SOC_MCPWM_CAPTURE_CLK_FROM_GROUP=y +CONFIG_SOC_MCPWM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_GROUPS=1 +CONFIG_SOC_PARLIO_TX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_RX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_TX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT=y +CONFIG_SOC_PARLIO_TRANS_BIT_ALIGN=y +CONFIG_SOC_PARLIO_TX_SUPPORT_LOOP_TRANSMISSION=y +CONFIG_SOC_PARLIO_TX_SUPPORT_EOF_FROM_DMA=y +CONFIG_SOC_PARLIO_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_SUPPORT_SPI_LCD=y +CONFIG_SOC_PARLIO_SUPPORT_I80_LCD=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_ECC_CONSTANT_TIME_POINT_MUL=y +CONFIG_SOC_ECC_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_EXPORT_PUBKEY=y +CONFIG_SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE=y +CONFIG_SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_SPECIFIC_KEY_PURPOSES=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_PLL_F80M=y +CONFIG_SOC_SDM_CLK_SUPPORT_XTAL=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_SUPPORT_CLK_PLL_F160M=y +CONFIG_SOC_SPI_SUPPORT_CLK_RC_FAST=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR=y +CONFIG_SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED=y +CONFIG_SOC_SPI_MEM_FLASH_SUPPORT_HPM=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_SUPPORT_RC_FAST=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_SYSTIMER_SUPPORT_ETM=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_TIMER_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MWDT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=2 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=3 +CONFIG_SOC_TWAI_RANGE_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=1 +CONFIG_SOC_TWAI_BRP_MAX=255 +CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_TWAI_SUPPORT_FD=y +CONFIG_SOC_TWAI_SUPPORT_TIMESTAMP=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_ECDSA_KEY=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P192=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P384=y +CONFIG_SOC_HUK_MEM_NEEDS_RECHARGE=y +CONFIG_SOC_KEY_MANAGER_SUPPORT_KEY_DEPLOYMENT=y +CONFIG_SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_256=y +CONFIG_SOC_KEY_MANAGER_HMAC_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_DS_KEY_DEPLOY=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_SECURE_BOOT_V2_ECC=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND=y +CONFIG_SOC_PSRAM_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_RECOVERY_BOOTLOADER_SUPPORTED=y +CONFIG_SOC_BOOTLOADER_ANTI_ROLLBACK_SUPPORTED=y +CONFIG_SOC_APM_CTRL_FILTER_SUPPORTED=y +CONFIG_SOC_APM_LP_APM0_SUPPORTED=y +CONFIG_SOC_APM_CPU_APM_SUPPORTED=y +CONFIG_SOC_APM_SUPPORT_LP_TEE_CTRL=y +CONFIG_SOC_APM_SUPPORT_CTRL_CFG_LOCK=y +CONFIG_SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL=y +CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y +CONFIG_SOC_RNG_BUF_CHAIN_ENTROPY_SOURCE=y +CONFIG_SOC_RNG_RTC_TIMER_ENTROPY_SOURCE=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_LP_NUM=1 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_LP_UART_FIFO_LEN=16 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_PLL_F80M_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_HAS_LP_UART=y +CONFIG_SOC_UART_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_WAKEUP_CHARS_SEQ_MAX_LEN=5 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_FIFO_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_START_BIT_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_CHAR_SEQ_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_RTC_MEM_SUPPORT_SPEED_MODE_SWITCH=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BEACON_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_TOP_PD=y +CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y +CONFIG_SOC_PM_SUPPORT_PMU_CLK_ICG=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y +CONFIG_SOC_EXT_MEM_CACHE_TAG_IN_CPU_DOMAIN=y +CONFIG_SOC_PM_PAU_LINK_NUM=5 +CONFIG_SOC_PM_PAU_REGDMA_LINK_CONFIGURABLE=y +CONFIG_SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC=4 +CONFIG_SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY=y +CONFIG_SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED=y +CONFIG_SOC_PM_RETENTION_MODULE_NUM=32 +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_RNG_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_RCC_IS_INDEPENDENT=y +CONFIG_SOC_CLK_ANA_I2C_MST_HAS_ROOT_GATE=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TEMPERATURE_SENSOR_UNDER_PD_TOP_DOMAIN=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_TXOP_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_HE_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_5G=y +CONFIG_SOC_WIFI_MAC_VERSION_NUM=3 +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_ESP_NIMBLE_CONTROLLER=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_BLE_CTE_SUPPORTED=y +CONFIG_SOC_BLE_SUBRATE_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_WITH_RESPONSE=y +CONFIG_SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR=y +CONFIG_SOC_LP_CORE_SUPPORT_ETM=y +CONFIG_SOC_LP_CORE_SUPPORT_STORE_LOAD_EXCEPTIONS=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_ENV_BRINGUP=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c5" +CONFIG_IDF_INIT_VERSION="5.5.4" +CONFIG_IDF_TARGET_ESP32C5=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0017 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# CONFIG_BOOTLOADER_RECOVERY_ENABLE is not set +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x2000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_ECC_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_RVFPLIB=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_HAS_HAL_SYSTIMER=y +CONFIG_ESP_ROM_SYSTIMER_INIT_PATCH=y +CONFIG_ESP_ROM_HAS_HEAP_TLSF=y +CONFIG_ESP_ROM_TLSF_CHECK_PATCH=y +CONFIG_ESP_ROM_MULTI_HEAP_WALK_PATCH=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_WITHOUT_REGI2C=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_WDT_INIT_PATCH=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CLIC_INT_THRESH_PATCH=y +CONFIG_ESP_ROM_HAS_SUBOPTIMAL_NEWLIB_ON_MISALIGNED_MEMORY=y +CONFIG_ESP_ROM_DELAY_US_PATCH=y +CONFIG_ESP_ROM_SUPPORT_SECURE_BOOT_FAST_WAKEUP=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# ESP-TEE (Trusted Execution Environment) +# +# CONFIG_SECURE_ENABLE_TEE is not set +CONFIG_SECURE_TEE_LOG_LEVEL=0 +# end of ESP-TEE (Trusted Execution Environment) + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_NO_STUB=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +# CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_RVFPLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:Analog Comparator Configurations +# +CONFIG_ANA_CMPR_ISR_HANDLER_IN_IRAM=y +# CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ANA_CMPR_ISR_CACHE_SAFE is not set +CONFIG_ANA_CMPR_OBJ_CACHE_SAFE=y +# CONFIG_ANA_CMPR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Analog Comparator Configurations + +# +# ESP-Driver:BitScrambler Configurations +# +# CONFIG_BITSCRAMBLER_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:BitScrambler Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:Parallel IO Configurations +# +CONFIG_PARLIO_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_PARLIO_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_PARLIO_TX_ISR_CACHE_SAFE is not set +# CONFIG_PARLIO_RX_ISR_CACHE_SAFE is not set +CONFIG_PARLIO_OBJ_CACHE_SAFE=y +# CONFIG_PARLIO_ENABLE_DEBUG_LOG is not set +# CONFIG_PARLIO_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Parallel IO Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# CONFIG_TEMP_SENSOR_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# +CONFIG_ESP_HW_SUPPORT_FUNC_IN_IRAM=y + +# +# Chip revision +# +CONFIG_ESP32C5_REV_MIN_100=y +# CONFIG_ESP32C5_REV_MIN_102 is not set +CONFIG_ESP32C5_REV_MIN_FULL=100 +CONFIG_ESP_REV_MIN_FULL=100 + +# +# Maximum Supported ESP32-C5 Revision (Rev v1.99) +# +CONFIG_ESP32C5_REV_MAX_FULL=199 +CONFIG_ESP_REV_MAX_FULL=199 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32-C5 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_IEEE802154=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +CONFIG_RTC_FAST_CLK_SRC_RC_FAST=y +# CONFIG_RTC_FAST_CLK_SRC_XTAL is not set +CONFIG_RTC_CLK_FUNC_IN_IRAM=y +CONFIG_RTC_TIME_FUNC_IN_IRAM=y +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# ETM Configuration +# +# CONFIG_ETM_ENABLE_DEBUG_LOG is not set +# end of ETM Configuration + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_AUTO=y +CONFIG_XTAL_FREQ=0 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_CLK_RC32K_NOT_TO_USE=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS=y +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_SLP_DEFAULT_PARAMS_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +CONFIG_PM_WORKAROUND_FREQ_LIMIT_ENABLED=y +# end of Power Management + +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# + +# +# Crypto DPA Protection +# +CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1 +# end of Crypto DPA Protection + +# CONFIG_ESP_CRYPTO_FORCE_ECC_CONSTANT_TIME_POINT_MUL is not set +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_CACHE_L1_CACHE_SIZE=0x8000 +CONFIG_CACHE_L1_CACHE_LINE_SIZE=32 +# end of Cache config + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +CONFIG_ESP_SYSTEM_NO_BACKTRACE=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set +# CONFIG_ESP_SYSTEM_USE_FRAME_POINTER is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=y +# CONFIG_ESP_SYSTEM_PMP_LP_CORE_RESERVE_MEM_EXECUTABLE is not set +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS is not set +CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 +# CONFIG_ESP_WIFI_ENABLE_DUMP_HESIGB is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_MU_CFO is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_NDPA is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_BFRP is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=1 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SYSTIMER_USE_ROM_IMPL=y +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +CONFIG_HEAP_TLSF_USE_ROM_IMPL=y +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +CONFIG_IEEE802154_RX_BUFFER_SIZE=20 +# CONFIG_IEEE802154_CCA_CARRIER is not set +CONFIG_IEEE802154_CCA_ED=y +# CONFIG_IEEE802154_CCA_CARRIER_OR_ED is not set +# CONFIG_IEEE802154_CCA_CARRIER_AND_ED is not set +CONFIG_IEEE802154_CCA_MODE=1 +CONFIG_IEEE802154_CCA_THRESHOLD=-75 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 +# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set +CONFIG_IEEE802154_INTERFACE_NUM=1 +CONFIG_IEEE802154_TIMING_OPTIMIZATION=y +# CONFIG_IEEE802154_DEBUG is not set +# end of IEEE 802.15.4 + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +# CONFIG_MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC is not set +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_HARDWARE_ECC=y +CONFIG_MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN is not set +CONFIG_MBEDTLS_HARDWARE_ECDSA_VERIFY=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +# CONFIG_LIBC_PICOLIBC is not set +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS=y +CONFIG_LIBC_ASSERT_BUFFER_SIZE=200 +# end of LibC + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +CONFIG_SPI_FLASH_SUSPEND_TRS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ANA_CMPR_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/obu-cam-transmistter/sdkconfig.defaults b/obu-cam-transmistter/sdkconfig.defaults new file mode 100644 index 0000000..164b924 --- /dev/null +++ b/obu-cam-transmistter/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_IDF_TARGET="esp32c5" diff --git a/obu-firmware/FLASHING.md b/obu-firmware/FLASHING.md index e236465..54287d4 100644 --- a/obu-firmware/FLASHING.md +++ b/obu-firmware/FLASHING.md @@ -1,5 +1,14 @@ # obu-firmware — setup & flashing notes +## Two toolchains - use a dedicated terminal for each + +This project builds against the receiver-firmware's pinned ESP-IDF **6.1**. +The separate `obu-cam-transmistter` project builds against the global ESP-IDF +**5.5.4**. Exporting both in one PowerShell window fails: the second export +inherits the first's `IDF_PYTHON_ENV_PATH` and reports every Python dependency +as unmet. Don't run `install.bat` to "fix" that - open a fresh terminal, or +clear the state with `$env:IDF_PYTHON_ENV_PATH = $null; $env:IDF_PATH = $null`. + ## Every new PowerShell session Activate the toolchain (obu-firmware has no esp-idf of its own — reuse the diff --git a/obu-firmware/main/cam.c b/obu-firmware/main/cam.c index ac9674f..14cb8a3 100644 --- a/obu-firmware/main/cam.c +++ b/obu-firmware/main/cam.c @@ -1,3 +1,8 @@ +// NOT COMPILED - deliberately absent from main/CMakeLists.txt's SRCS. This firmware no longer +// encodes CAM at all: the phone builds and UPER-encodes it and sends the bytes down serial_link, +// and this side only GeoNetworking-wraps opaque payloads. The file is kept as the byte-exact +// reference the Kotlin encoder (app CamUperCodec.kt) was ported from, so fixes must be applied +// here too or the next person porting from it reintroduces the bug. #include "cam.h" #include @@ -108,8 +113,14 @@ int cam_encode(const cam_fields_t *f, uint8_t *buf, size_t buf_len) // CurvatureConfidence ENUM 8 values -> 3 bits bw_put_bits(&bw, 1023 - (uint32_t)(-1023), 11); // curvatureValue: unavailable(1023) bw_put_bits(&bw, 7, 3); // curvatureConfidence: unavailable(7) - // CurvatureCalculationMode ENUM {yawRateUsed,yawRateNotUsed,unavailable} -> 2 bits - bw_put_bits(&bw, 2, 2); // unavailable + // CurvatureCalculationMode ENUM {yawRateUsed,yawRateNotUsed,unavailable, ...} - note the + // extension marker: UPER encodes an extensible ENUMERATED as an extension bit followed by + // the root-list index, so this is 1 + 2 = 3 bits, NOT 2. This file previously wrote only the + // 2-bit index, which shifted yawRate and the entire low-frequency container one bit early for + // any standards-compliant receiver. Harmless between this project's own encoder and decoder + // (both had the same error); wrong against every third-party station. + bw_put_bits(&bw, 0, 1); // extension bit: value is in the root list + bw_put_bits(&bw, 2, 2); // unavailable(2) // YawRate: YawRateValue(-32766..32767)->16 (offset from -32766), // YawRateConfidence ENUM 8 values -> 3 bits bw_put_bits(&bw, 32767 - (uint32_t)(-32766), 16); // yawRateValue: unavailable(32767) diff --git a/obu-firmware/main/serial_link.c b/obu-firmware/main/serial_link.c index b35c67e..42d95cf 100644 --- a/obu-firmware/main/serial_link.c +++ b/obu-firmware/main/serial_link.c @@ -72,7 +72,18 @@ static bool send_frame(uint8_t type, const uint8_t *payload, int len) // so the shared buffer (and the four-part write) can't interleave between callers. static uint8_t s_crc_buf[3 + SERIAL_LINK_MAX_PAYLOAD]; - if (s_tx_mutex && xSemaphoreTake(s_tx_mutex, pdMS_TO_TICKS(200)) != pdTRUE) { + // No host on the other end: the TX buffer never drains, so every write below would block its + // full timeout and this frame is going nowhere regardless. Bail before taking the mutex - + // otherwise a burst of promiscuously-captured CAMs holds the lock for hundreds of ms each and + // starves the heartbeat, which is exactly what "tx mutex timeout, dropping frame" was. + if (!usb_serial_jtag_is_connected()) { + return false; + } + + // Timeout must exceed the worst-case hold below (4 writes x SERIAL_LINK_WRITE_TIMEOUT_MS), + // or a legitimately slow-but-working host makes contending senders drop frames instead of + // waiting their turn. + if (s_tx_mutex && xSemaphoreTake(s_tx_mutex, pdMS_TO_TICKS(SERIAL_LINK_TX_LOCK_TIMEOUT_MS)) != pdTRUE) { ESP_LOGW(TAG, "send_frame: tx mutex timeout, dropping frame"); return false; } @@ -87,9 +98,9 @@ static bool send_frame(uint8_t type, const uint8_t *payload, int len) // Four separate writes rather than one assembled buffer - simplest given payload is // already wherever the caller has it (avoids a second copy of up to 160 bytes). // usb_serial_jtag_write_bytes() blocks up to the given tick timeout if the host isn't - // reading fast enough; 100ms is generous for a ~160-byte frame at USB full-speed and keeps - // a wedged/disconnected host from hanging the radio TX/RX tasks indefinitely. - const TickType_t write_timeout = pdMS_TO_TICKS(100); + // reading fast enough; generous for a single frame at USB full-speed, and keeps a wedged + // host from hanging the radio TX/RX tasks indefinitely. + const TickType_t write_timeout = pdMS_TO_TICKS(SERIAL_LINK_WRITE_TIMEOUT_MS); int wrote = 0; wrote += usb_serial_jtag_write_bytes(sync, sizeof(sync), write_timeout); wrote += usb_serial_jtag_write_bytes(head, sizeof(head), write_timeout); diff --git a/obu-firmware/main/serial_link.h b/obu-firmware/main/serial_link.h index f80f5be..6d0be8e 100644 --- a/obu-firmware/main/serial_link.h +++ b/obu-firmware/main/serial_link.h @@ -51,6 +51,13 @@ // to SERIAL_LINK_MAX_PAYLOAD below. #define SERIAL_LINK_USB_BUF_SIZE 1024 +// Per-write block ceiling, and the mutex acquire timeout that must comfortably exceed the +// worst case of one frame (4 writes: sync, head, payload, crc). Keep that relationship if you +// change either number - a lock timeout below the max hold turns normal contention into +// dropped frames, which is how the heartbeat was being starved by forwarded CAM_RX traffic. +#define SERIAL_LINK_WRITE_TIMEOUT_MS 100 +#define SERIAL_LINK_TX_LOCK_TIMEOUT_MS 600 + // Max CAM payload this link will carry. MUST match SERIAL_LINK_MAX_PAYLOAD in the app's // SerialFrame.kt - a mismatch means every frame above the smaller of the two is rejected by that // side's "length exceeds max, resync" branch, silently.