Running OpenBeken/OBK on ESP8266 devices
Running OpenBeken/OBK on ESP8266 devices
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamcommit 5a702ce796142bbde38aa30b4ffdc761811345ea
Author: NonPIayerCharacter <18557343+NonPIayerCharacter@users.noreply.github.com>
Date: Sun Aug 10 09:55:43 2025 +0300
index on bk7231t_alt_spiled: 0f9b07d6 Merge remote-tracking branch 'refs/remotes/origin/main' into bk7231t_alt_spiled
diff --git a/src/driver/drv_sm16703P.c b/src/driver/drv_sm16703P.c
index f000a40b33ca5b4a9240ef4248eb88a4004f173e..cd720cc37ceae3dea6ef5fe8a78165cf8f2165c4 100644
--- a/src/driver/drv_sm16703P.c
+++ b/src/driver/drv_sm16703P.c
@@ -13,23 +13,13 @@
#include "drv_local.h"
#include "drv_spiLED.h"
+#if PLATFORM_LN882H
+#define SEND_RAW_DATA 1
+#endif
+
// Number of pixels that can be addressed
uint32_t pixel_count;
-void SM16703P_GetPixel(uint32_t pixel, byte *dst) {
- int i;
- uint8_t *input;
-
- if (spiLED.msg == 0)
- return;
-
- input = spiLED.buf + spiLED.ofs + (pixel * 3 * 4);
-
- for (i = 0; i < 3; i++) {
- *dst++ = reverse_translate_byte(input + i * 4);
- }
-}
-
enum ColorChannel {
COLOR_CHANNEL_RED,
COLOR_CHANNEL_GREEN,
@@ -45,6 +35,30 @@ const enum ColorChannel default_color_channel_order[3] = {
enum ColorChannel *color_channel_order = default_color_channel_order;
int pixel_size = 3; // default is RGB -> 3 bytes per pixel
+void SM16703P_GetPixel(uint32_t pixel, byte* dst)
+{
+ int i;
+ uint8_t* input;
+
+ if(spiLED.msg == 0)
+ return;
+
+#if SEND_RAW_DATA
+ input = spiLED.buf + spiLED.ofs + (pixel * pixel_size);
+#else
+ input = spiLED.buf + spiLED.ofs + (pixel * 3 * 4);
+#endif
+
+ for(i = 0; i < 3; i++)
+ {
+#if SEND_RAW_DATA
+ * dst++ = input + i * pixel_count;
+#else
+ * dst++ = reverse_translate_byte(input + i * 4);
+#endif
+ }
+}
+
bool SM16703P_VerifyPixel(uint32_t pixel, byte r, byte g, byte b) {
byte real[3];
SM16703P_GetPixel(pixel, real);
@@ -86,7 +100,11 @@ void SM16703P_setPixel(int pixel, int r, int g, int b, int c, int w) {
ADDLOG_ERROR(LOG_FEATURE_CMD, "Unknown color channel %d at index %d", color_channel_order[i], i);
return;
}
+#if SEND_RAW_DATA
+ spiLED.buf[spiLED.ofs + i + (pixel * pixel_size)] = pcolor;
+#else
translate_byte(pcolor, spiLED.buf + (spiLED.ofs + i * 4 + (pixel * pixel_size * 4)));
+#endif
}
}
void SM16703P_setMultiplePixel(uint32_t pixel, uint8_t *data, bool push) {
@@ -135,10 +153,15 @@ void SM16703P_scaleAllPixels(int scale) {
for (pixel = 0; pixel < pixel_count; pixel++) {
for (ofs = 0; ofs < 3; ofs++) {
+#if SEND_RAW_DATA
+ data = spiLED.buf + (spiLED.ofs + ofs * 4 + (pixel * pixel_size));
+ b = SCALE8_PIXEL(*data, scale);
+#else
data = spiLED.buf + (spiLED.ofs + ofs * 4 + (pixel * 3 * 4));
b = reverse_translate_byte(data);
b = SCALE8_PIXEL(b, scale);
translate_byte(b, data);
+#endif
}
}
}
diff --git a/src/driver/drv_spiLED.c b/src/driver/drv_spiLED.c
index e88ea580d65f1e20fdc82dd92a312de3ee23bcbb..47e7cbcfee1ae2bb73a5292e153b4d1f1476ba4d 100644
--- a/src/driver/drv_spiLED.c
+++ b/src/driver/drv_spiLED.c
@@ -29,6 +29,11 @@ void SPIDMA_Deinit(void) {
}
#endif
+
+#if PLATFORM_LN882H
+#define SEND_RAW_DATA 1
+#endif
+
static uint8_t data_translate[4] = { 0b10001000, 0b10001110, 0b11101000, 0b11101110 };
@@ -88,7 +93,12 @@ void SPILED_InitDMA(int numBytes) {
spiLED.padding = 64;
// Prepare buffer
+#if SEND_RAW_DATA
+ uint32_t buffer_size = spiLED.ofs + (numBytes * 3);
+ spiLED.padding = 0;
+#else
uint32_t buffer_size = spiLED.ofs + (numBytes * 4) + spiLED.padding; //Add `spiLED.ofs` bytes for "Reset"
+#endif
#if PLATFORM_ESPIDF
spiLED.buf = heap_caps_malloc(sizeof(byte) * (buffer_size), MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA);
#else
diff --git a/src/driver/drv_spidma.c b/src/driver/drv_spidma.c
index 934809917d7bb56b203dad0ac0b5fe127542815d..8583435d9bd42afe82ad2d9a3f9b9b694f98e69e 100644
--- a/src/driver/drv_spidma.c
+++ b/src/driver/drv_spidma.c
@@ -607,7 +607,7 @@ void SPIDMA_Deinit(void)
#include "drv_spidma.h"
#include "../hal/ln882h/hal_pinmap_ln882h.h"
#include "hal/hal_dma.h"
-#include "hal/hal_spi.h"
+#include "hal/hal_ws2811.h"
extern int spidma_led_pin;
static int current_pin = 6;
@@ -617,50 +617,37 @@ void SPIDMA_Init(struct spi_message* msg)
current_pin = spidma_led_pin > 0 ? spidma_led_pin : 6;
lnPinMapping_t* pin = g_pins + current_pin;
- hal_gpio_pin_afio_select(pin->base, pin->pin, SPI0_MOSI);
- hal_gpio_pin_afio_en(pin->base, pin->pin, HAL_ENABLE);
-
- spi_init_type_def spi_init =
- {
- .spi_baud_rate_prescaler = SPI_BAUDRATEPRESCALER_16,
- .spi_mode = SPI_MODE_MASTER,
- .spi_data_size = SPI_DATASIZE_8B,
- .spi_first_bit = SPI_FIRST_BIT_MSB,
- .spi_cpol = SPI_CPOL_LOW,
- .spi_cpha = SPI_CPHA_1EDGE,
- };
-
- hal_spi_init(SPI0_BASE, &spi_init);
- hal_spi_en(SPI0_BASE, HAL_ENABLE);
- hal_spi_ssoe_en(SPI0_BASE, HAL_DISABLE);
-
+ hal_gpio_pin_afio_select(pin->base, pin->pin, WS2811_OUT);
+ sysc_cmp_ws2811_gate_en_setf(1);
+ ws2811_br_setf(WS2811_BASE, 16);
+ ws2811_ws_en_setf(WS2811_BASE, 1);
+ ws2811_dma_en_setf(WS2811_BASE, 1);
+ ws2811_int_en_setf(WS2811_BASE, 0);
+
dma_init_t_def dma_init =
{
- .dma_mem_addr = (uint32_t)msg->send_buf,
+ .dma_mem_addr = msg->send_buf,
.dma_data_num = msg->send_len,
.dma_dir = DMA_READ_FORM_MEM,
.dma_mem_inc_en = DMA_MEM_INC_EN,
- .dma_p_addr = SPI0_DATA_REG,
- .dma_p_size = DMA_P_SIZE_8_BIT,
- .dma_mem_size = DMA_MEM_SIZE_8_BIT,
+ .dma_p_addr = WS2811_DATA_REG,//SPI0_DATA_REG,
+ //.dma_p_size = DMA_P_SIZE_8_BIT,
+ //.dma_mem_size = DMA_MEM_SIZE_8_BIT,
};
-
- hal_dma_init(DMA_CH_4, &dma_init);
- hal_dma_en(DMA_CH_4, HAL_DISABLE);
-}
+ hal_dma_init(DMA_CH_2, &dma_init);
+ hal_dma_en(DMA_CH_2, HAL_DISABLE);
+}
void SPIDMA_StartTX(struct spi_message* msg)
{
- hal_dma_set_mem_addr(DMA_CH_4, (uint32_t)msg->send_buf);
- hal_dma_set_data_num(DMA_CH_4, msg->send_len);
-
- hal_spi_dma_en(SPI0_BASE, SPI_DMA_TX_EN, HAL_ENABLE);
- hal_dma_en(DMA_CH_4, HAL_ENABLE);
-
- while(hal_dma_get_data_num(DMA_CH_4) != 0);
-
- hal_dma_en(DMA_CH_4, HAL_DISABLE);
- hal_spi_dma_en(SPI0_BASE, SPI_DMA_TX_EN, HAL_DISABLE);
+ hal_dma_set_mem_addr(DMA_CH_2, (uint32_t)msg->send_buf);
+ hal_dma_set_data_num(DMA_CH_2, msg->send_len);
+
+ hal_dma_en(DMA_CH_2, HAL_ENABLE);
+
+ while(hal_dma_get_data_num(DMA_CH_2) != 0);
+
+ hal_dma_en(DMA_CH_2, HAL_DISABLE);
}
void SPIDMA_StopTX(void)
TL;DR: 4MB stało się domyślną bazą dla OpenESP32, a autor poprawki napisał: "Now configured with 4MB by default". Ten FAQ jest dla osób uruchamiających OpenBeken na ESP32 i wyjaśnia, jak dobrać build, rozwiązać błędy partycji, bootloadera, OTA, UART i Wi‑Fi na C2, C3, S2, S3 oraz klasycznym ESP32. [#21220790]
Dlaczego to ważne: Błędny rozmiar flash, zły offset bootloadera albo niewłaściwy typ obrazu potrafią dać „invalid header”, bootloop albo bezpieczny tryb AP mimo sprawnego sprzętu.
| Wariant | Typowy flash z wątku | Co działało najlepiej | Najczęstszy problem |
|---|---|---|---|
| ESP32-C3 | 4MB | Wi‑Fi, OTA, PWM, czujniki I2C | SuperMini miewa problemy z Wi‑Fi i DHCP |
| Klasyczny ESP32 | 4MB, czasem wykrywany jako 2MB | GPIO, OTA, Wi‑Fi po poprawnym flashu | błędy tabeli partycji i safe mode po reboocie |
| ESP32-S2/S3 | 4MB lub 16MB | DS1820, GPIO, AP/STA po poprawkach | stack overflow, problemy z temperaturą wewnętrzną |
| ESP32-C2 | 4MB | podstawowe funkcje, PWM | mało RAM, czułość na taktowanie i baud |
| ESP8266 | 1MB, 4MB, 8MB po swapie | eksperymenty po rozdzieleniu wątku | zbyt mały flash dla dual-OTA przy 8Mbit |
Najważniejszy wniosek: Na ESP32 najpierw dobierz właściwy obraz do realnego flashu i układu, a dopiero potem diagnozuj skrypty, UART lub Wi‑Fi. W wątku większość „magicznych” awarii okazała się skutkiem złego rozmiaru flash, złego offsetu bootloadera albo użycia factory.bin zamiast .img. [#21221363]
sdkconfig.defaults.esp32; to była kluczowa poprawka startowa całego portu. [#21220790]sdkconfig.defaults.esp32 i ustaw w nim wariant 4MB jako domyślny dla ESP32. To właśnie ta zmiana odblokowała poprawny start portu i autor podsumował ją krótko: „Now configured with 4MB by default”. Jeśli tworzysz także obraz scalony, dopasuj --flash_size 4MB, bo samo SDK nie naprawi błędnego merge bin. [#21220790]factory.bin został zmergowany z nagłówkiem 2MB, mimo że płytka ma fizycznie 4MB. W logu widać wtedy SPI Flash Size : 2MB, a zaraz potem błąd typu partition ... exceeds flash chip size 0x200000. W wątku poprawka polegała na zmianie polecenia esptool.py merge_bin z --flash_size 2MB na --flash_size 4MB, bez zmiany samej płyty. [#21221363]factory.bin to obraz scalony z bootloaderem, tabelą partycji i aplikacją, a .img to zwykle sam obraz aplikacji do istniejącego układu partycji. Gdy układ startuje od zera, po erase_flash, albo masz uszkodzone partycje, użyj factory.bin. Gdy bootloader i partycje już są poprawne, często bezpieczniej użyć .img; w wątku klasyczny ESP32 ruszył po przejściu z factory na non-factory. [#21221359]erase_flash, aby usunąć stare partycje, konfigurację i błędne autostarty. 2. Wgraj właściwy obraz dla układu i realnego flashu: factory.bin przy czystym starcie albo .img przy istniejących partycjach. 3. Na S2 wejdź w boot przez przyciski RST i 0, a potem sprawdź log i AP przed testem GPIO. Ten schemat przywrócił poprawne działanie LED-ów i factory.bin na kilku płytkach. [#21221622]invalid header. Na ESP32-C3 boot ROM oczekiwał bootloadera od 0x0, więc obraz z offsetem 0x1000 wyglądał jak uszkodzony mimo poprawnego flashowania. [#21221037]g_deltaTimeMS i z niepoprawnego użycia opóźnienia FreeRTOS. Poprawa miała dwa elementy: dla ESP-IDF czas zaczęto brać z esp_timer_get_time()/1000, a w wątku timera zmieniono vTaskDelay(QUICK_TMR_DURATION) na vTaskDelay(QUICK_TMR_DURATION / portTICK_RATE_MS). To ograniczyło dryf, który wcześniej dawał wynik około MAIN:Time 150 przy kanale zwiększonym tylko do 121. [#21221114]Flash Encryption: Enabled i nie startował jak zwykła płytka deweloperska. Po zmianie eFuse tak, by raport pokazywał Flash Encryption: Disabled oraz SPI_BOOT_CRYPT_CNT: 0x3, urządzenie zaczęło bootować OpenBeken poprawnie. [#21221080]lfs is absent oznacza zwykle brak zamontowanej partycji LFS lub jeszcze nieutworzony system plików. W wątku ten komunikat pojawiał się przy starcie, ale później testy pokazały, że skrypty i zapis zaczęły działać po dalszych poprawkach partycji i flashowania. [#21221088]TG0WDT_SYS_RESET lub TG1WDT_SYS_RESET, szukaj blokującego kodu, a nie problemu RTC WDT. Jeśli log mówi o stack overflow w sys_evt, quick albo IntTemp, zwiększ stack albo znajdź pętlę rekurencyjną. W wątku restart rozbijał się o nieskończoną pętlę: WIFI_STA_DISCONNECTED wywoływało HAL_DisconnectFromWifi, które generowało ten sam event ponownie. [#21224554]UART_AppendByteToReceiveRingBuffer dodał vTaskDelay(3), aby uniknąć crasha. To stabilizowało pracę, ale przy większym strumieniu danych nadal mogło przepełnić bufor, wywołać flush wejścia i reset kolejki. [#21222660]powersave 1 10, gdzie 10 oznacza 10 dBm, a w jednym przypadku urządzenie połączyło się dopiero przy 6 dBm. To pomogło przy wolnym DHCP, braku adresu IP i niestabilnych połączeniach, typowych właśnie dla SuperMini. [#21450298]esptool flash_id poprawnie raportował nowy rozmiar pamięci. Po wymianie zawsze sprawdź producenta układu, kod urządzenia i Detected flash size, bo to jedyny szybki sposób potwierdzenia, że lutowanie i konfiguracja SPI są poprawne. [#21238166]addChangeHandler, bez dalszej odpowiedzi z działającym rozwiązaniem. Jeśli chcesz pozostać zgodny z tym wątkiem, jedyną potwierdzoną ścieżką jest dalszy eksperyment ze skryptami lub Berry, ale bez gotowej recepty opisanej w podanych postach. [#21798097]