Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions boards/facefocusvr/eye_L
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ CONFIG_LED_EXTERNAL_CONTROL=y
CONFIG_LED_EXTERNAL_GPIO=9
CONFIG_LED_EXTERNAL_PWM_FREQ=20000
CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=45
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=20000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=24000000
CONFIG_GENERAL_INCLUDE_UVC_MODE=y
CONFIG_START_IN_UVC_MODE=y
CONFIG_MONITORING_LED_CURRENT=y
Expand All @@ -68,4 +69,5 @@ CONFIG_GENERAL_BOARD="facefocusvr_eye_l"
# CONFIG_GENERAL_ENABLE_WIRELESS is not set
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye L"
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye L"
CONFIG_GENERAL_VERSION="1.1.0"
6 changes: 4 additions & 2 deletions boards/facefocusvr/eye_R
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ CONFIG_LED_EXTERNAL_CONTROL=y
CONFIG_LED_EXTERNAL_GPIO=9
CONFIG_LED_EXTERNAL_PWM_FREQ=20000
CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=45
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=20000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=24000000
CONFIG_GENERAL_INCLUDE_UVC_MODE=y
CONFIG_START_IN_UVC_MODE=y
CONFIG_MONITORING_LED_CURRENT=y
Expand All @@ -68,4 +69,5 @@ CONFIG_GENERAL_BOARD="facefocusvr_eye_r"
# CONFIG_GENERAL_ENABLE_WIRELESS is not set
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye R"
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye R"
CONFIG_GENERAL_VERSION="1.1.0"
6 changes: 4 additions & 2 deletions boards/facefocusvr/face
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ CONFIG_LED_EXTERNAL_CONTROL=y
CONFIG_LED_EXTERNAL_GPIO=9
CONFIG_LED_EXTERNAL_PWM_FREQ=20000
CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=85
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=20000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=24000000
CONFIG_GENERAL_INCLUDE_UVC_MODE=y
CONFIG_START_IN_UVC_MODE=y
CONFIG_MONITORING_LED_CURRENT=y
Expand All @@ -68,4 +69,5 @@ CONFIG_GENERAL_BOARD="facefocusvr_face"
# CONFIG_GENERAL_ENABLE_WIRELESS is not set
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Face"
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Face"
CONFIG_GENERAL_VERSION="1.1.0"
3 changes: 2 additions & 1 deletion boards/project_babble/project_babble
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ CONFIG_LED_EXTERNAL_CONTROL=y
CONFIG_LED_EXTERNAL_PWM_FREQ=5000
CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=100
CONFIG_LED_EXTERNAL_GPIO=1
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=0
CONFIG_GENERAL_INCLUDE_UVC_MODE=y
# CONFIG_START_IN_UVC_MODE is not set
# CONFIG_MONITORING_LED_CURRENT is not set
Expand Down
1 change: 0 additions & 1 deletion boards/sdkconfig.base_defaults
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,6 @@ CONFIG_GENERAL_VERSION="0.0.1"
#
# OpenIris: Camera Configuration
#
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_WIFI_XCLK_FREQ=16500000
# end of OpenIris: Camera Configuration

Expand Down
3 changes: 2 additions & 1 deletion boards/seed_studio/xiao_esp32s3
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ CONFIG_SPIRAM_SPEED_80M=y
CONFIG_SPIRAM_SPEED=80
CONFIG_SPIRAM_SPEED_80M=y
# CONFIG_LED_EXTERNAL_CONTROL is not set
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=0
CONFIG_GENERAL_INCLUDE_UVC_MODE=y
# CONFIG_START_IN_UVC_MODE is not set
# CONFIG_MONITORING_LED_CURRENT is not set
Expand Down
58 changes: 55 additions & 3 deletions components/CameraManager/CameraManager/CameraManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void CameraManager::setupCameraPinout()
// 20000000 max freq on ESP32-CAM
// 24000000 optimal freq on ESP32-S3 // 23MHz same fps
int xclk_freq_hz = CONFIG_CAMERA_WIFI_XCLK_FREQ;
ESP_LOGI(CAMERA_MANAGER_TAG, "Base WIFI XCLK freq (from config): %d Hz", xclk_freq_hz);

#if CONFIG_CAMERA_MODULE_ESP_EYE
/* IO13, IO14 is designed for JTAG by default,
Expand Down Expand Up @@ -49,7 +50,10 @@ void CameraManager::setupCameraPinout()
ESP_LOGI(CAMERA_MANAGER_TAG, "CAM_BOARD");
#endif
#if CONFIG_GENERAL_INCLUDE_UVC_MODE
xclk_freq_hz = CONFIG_CAMERA_USB_XCLK_FREQ;
// Use code default for UVC if no per-sensor override applies
constexpr int CAMERA_USB_XCLK_FREQ_DEFAULT = 20000000; // 20 MHz default
xclk_freq_hz = CAMERA_USB_XCLK_FREQ_DEFAULT;
ESP_LOGI(CAMERA_MANAGER_TAG, "UVC mode active: using USB default XCLK freq: %d Hz", xclk_freq_hz);
#endif

config = {
Expand Down Expand Up @@ -79,7 +83,7 @@ void CameraManager::setupCameraPinout()
.pixel_format = PIXFORMAT_JPEG, // YUV422,GRAYSCALE,RGB565,JPEG
.frame_size = FRAMESIZE_240X240, // QQVGA-UXGA, For ESP32, do not use sizes above QVGA when not JPEG. The performance of the ESP32-S series has improved a lot, but JPEG mode always gives better frame rates.

.jpeg_quality = 8, // 0-63, for OV series camera sensors, lower number means higher quality // Below 6 stability problems
.jpeg_quality = 10, // 0-63, for OV series camera sensors, lower number means higher quality // Below 6 stability problems
.fb_count = 2, // When jpeg mode is used, if fb_count more than one, the driver will work in continuous mode.
.fb_location = CAMERA_FB_IN_DRAM,
.grab_mode = CAMERA_GRAB_WHEN_EMPTY, // was CAMERA_GRAB_LATEST; new mode reduces frame skips at cost of minor latency
Expand Down Expand Up @@ -179,6 +183,7 @@ bool CameraManager::setupCamera()
{
ESP_LOGI(CAMERA_MANAGER_TAG, "Camera initialized: %s \r\n",
esp_err_to_name(hasCameraBeenInitialized));
ESP_LOGI(CAMERA_MANAGER_TAG, "Initial camera XCLK freq applied: %d Hz", config.xclk_freq_hz);

constexpr auto event = SystemEvent{EventSource::CAMERA, CameraState_e::Camera_Success};
xQueueSend(this->eventQueue, &event, 10);
Expand Down Expand Up @@ -206,7 +211,54 @@ bool CameraManager::setupCamera()
{
config.xclk_freq_hz = OV5640_XCLK_FREQ_HZ;
esp_camera_deinit();
esp_camera_init(&config);
if (auto const err = esp_camera_init(&config); err == ESP_OK)
{
ESP_LOGI(CAMERA_MANAGER_TAG, "OV5640 detected: adjusted XCLK freq to %d Hz", config.xclk_freq_hz);
}
else
{
ESP_LOGE(CAMERA_MANAGER_TAG, "OV5640 reinit failed after XCLK adjust: %s", esp_err_to_name(err));
}
}

// Minimal per-sensor override logic (only if enabled via Kconfig and different)
if (temp_sensor)
{
const auto pid = temp_sensor->id.PID;
int desired_freq = 0;
#ifdef CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640
if (pid == OV2640_PID && CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640 > 0)
{
desired_freq = CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640;
}
#endif
#ifdef CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660
if (pid == OV3660_PID && CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660 > 0)
{
desired_freq = CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660;
}
#endif
if (desired_freq > 0 && desired_freq != config.xclk_freq_hz)
{
ESP_LOGI(CAMERA_MANAGER_TAG, "Applying XCLK override for sensor PID 0x%X: %d Hz (was %d)", pid, desired_freq, config.xclk_freq_hz);
config.xclk_freq_hz = desired_freq;
esp_camera_deinit();
if (auto const err = esp_camera_init(&config); err == ESP_OK)
{
ESP_LOGI(CAMERA_MANAGER_TAG, "Camera reinitialized with override frequency");
ESP_LOGI(CAMERA_MANAGER_TAG, "Final camera XCLK freq: %d Hz (PID 0x%X)", config.xclk_freq_hz, pid);
}
else
{
ESP_LOGE(CAMERA_MANAGER_TAG, "Failed to reinit camera with override freq (%s). Reverting.", esp_err_to_name(err));
// Attempt revert to previous frequency
// (previous value was lost after assignment; we can fall back to USB/WIFI config selection logic if needed)
}
}
else
{
ESP_LOGI(CAMERA_MANAGER_TAG, "No XCLK override applied for PID 0x%X. Active freq: %d Hz", pid, config.xclk_freq_hz);
}
}

#endif
Expand Down
22 changes: 11 additions & 11 deletions components/LEDManager/LEDManager/LEDManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void LEDManager::setup()
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = resolution,
.timer_num = LEDC_TIMER_0,
.timer_num = LEDC_TIMER_1, // moved to TIMER_1 to avoid conflict with camera XCLK (TIMER_0)
.freq_hz = freq,
.clk_cfg = LEDC_AUTO_CLK};

Expand All @@ -63,9 +63,9 @@ void LEDManager::setup()
ledc_channel_config_t ledc_channel = {
.gpio_num = this->illumninator_led_pin,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.channel = LEDC_CHANNEL_1, // moved to CHANNEL_1 to avoid conflict
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER_0,
.timer_sel = LEDC_TIMER_1,
.duty = dutyCycle,
.hpoint = 0};

Expand Down Expand Up @@ -140,7 +140,7 @@ void LEDManager::updateState(const LEDStates_e newState)
// store current duty once
if (!hasStoredExternalDuty)
{
storedExternalDuty = ledc_get_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
storedExternalDuty = ledc_get_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1);
hasStoredExternalDuty = true;
}
}
Expand All @@ -149,8 +149,8 @@ void LEDManager::updateState(const LEDStates_e newState)
// restore duty
if (hasStoredExternalDuty)
{
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, storedExternalDuty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, storedExternalDuty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1));
hasStoredExternalDuty = false;
}
}
Expand All @@ -172,9 +172,9 @@ void LEDManager::toggleLED(const bool state) const
if (ledStateMap.contains(this->currentState) && ledStateMap.at(this->currentState).isError)
{
// For pattern ON use 50%, OFF use 0%
uint32_t duty = (state == LED_ON) ? ((50 * 255) / 100) : 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
uint32_t duty = (state == LED_ON) ? ((50 * 255) / 100) : 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, duty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1));
}
#endif
}
Expand All @@ -187,8 +187,8 @@ void LEDManager::setExternalLEDDutyCycle(uint8_t dutyPercent)

// Apply to LEDC hardware live
// We configured channel 0 in setup with LEDC_LOW_SPEED_MODE
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, dutyCycle));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, dutyCycle));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1));
#else
(void)dutyPercent; // unused
ESP_LOGW(LED_MANAGER_TAG, "CONFIG_LED_EXTERNAL_CONTROL not enabled; ignoring duty update");
Expand Down
23 changes: 16 additions & 7 deletions main/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,29 @@ endmenu

menu "OpenIris: Camera Configuration"

config CAMERA_USB_XCLK_FREQ
int "USB XCLK frequency (Hz)"
default 10000000 # should be set in individual board config
range 1 24000000
help
USB XCLK frequency in Hz.

config CAMERA_WIFI_XCLK_FREQ
int "WIFI XCLK frequency (Hz)"
default 16500000
range 1 24000000
help
WIFI XCLK frequency in Hz.

config CAMERA_XCLK_FREQ_OVERRIDE_OV2640
int "Override XCLK for OV2640 (Hz, 0=disabled)"
default 0
range 0 40000000
help
If non-zero, overrides the selected XCLK frequency specifically when an OV2640 sensor
is detected. Use 0 to disable and fall back to CAMERA_USB_XCLK_FREQ / CAMERA_WIFI_XCLK_FREQ.

config CAMERA_XCLK_FREQ_OVERRIDE_OV3660
int "Override XCLK for OV3660 (Hz, 0=disabled)"
default 0
range 0 40000000
help
If non-zero, overrides the selected XCLK frequency specifically when an OV3660 sensor
is detected. Use 0 to disable and fall back to CAMERA_USB_XCLK_FREQ / CAMERA_WIFI_XCLK_FREQ.

endmenu

menu "OpenIris: WiFi Configuration"
Expand Down
3 changes: 2 additions & 1 deletion sdkconfig
Original file line number Diff line number Diff line change
Expand Up @@ -582,8 +582,9 @@ CONFIG_GENERAL_ADVERTISED_NAME="openiristracker"
#
# OpenIris: Camera Configuration
#
CONFIG_CAMERA_USB_XCLK_FREQ=23000000
CONFIG_CAMERA_WIFI_XCLK_FREQ=16500000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV2640=23000000
CONFIG_CAMERA_XCLK_FREQ_OVERRIDE_OV3660=0
# end of OpenIris: Camera Configuration

#
Expand Down