UPDATE: I moved ESP8266 discussion to separate topic. OBK can now run on ESP8266.
Running OpenBeken/OBK on ESP8266 devices
Helpful post? Buy me a coffee.
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)