Hi All,
I am trying to write to "adafruit e-link 2.13 Featherwing colour dispaly" from nRF54L15DK running zephyr. With ESP32 i am able to write to the display. But with nRF54L15DK and Zephyr nothing changes in the display even though the ssd1680 driver returns success.
I am using the following device overlay file.
&spi00 {
compatible = "nordic,nrf-spim";
max-frequency = <8000000>;
status = "okay";
pinctrl-0 = <&spi00_default>;
pinctrl-1 = <&spi00_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>, // mx25r64
<&gpio2 10 GPIO_ACTIVE_LOW>; // FeatherWing CS pin on P2.10
};
&spi00_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 6)>, // FeatherWing SCK pin on P1.06
<NRF_PSEL(SPIM_MOSI, 1, 7)>; // FeatherWing MOSI pin on P1.07
// <NRF_PSEL(SPIM_MISO, 1, 13)>; // Uncomment if MISO is used
};
};
&spi00_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 6)>, // FeatherWing SCK pin on P1.06
<NRF_PSEL(SPIM_MOSI, 1, 7)>; // FeatherWing MOSI pin on P1.07
// <NRF_PSEL(SPIM_MISO, 1, 13)>; // Uncomment if MISO is used
};
};
/ {
mipi_dbi_featherwing_epaper {
compatible = "zephyr,mipi-dbi-spi";
spi-dev = <&spi00>;
dc-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>; // FeatherWing DC pin on P1.11
reset-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>; // FeatherWing RESET pin on P1.12
#address-cells = <1>;
#size-cells = <0>;
ssd16xx_featherwing_epaper: ssd16xxfb@1 {
compatible = "solomon,ssd1680"; // SSD1680 controller
mipi-max-frequency = <2000000>; // Adjust based on FeatherWing specs
reg = <1>;
width = <250>; // FeatherWing width
height = <122>; // FeatherWing height
busy-gpios = <&gpio2 8 GPIO_ACTIVE_HIGH>; // FeatherWing BUSY pin on P2.8, not connected, changed ssd 1680 to use delay instead.
tssv = <0x80>;
full {
border-waveform = <0x05>;
};
partial {
border-waveform = <0x3c>;
};
};
};
};
/ {
chosen {
nvs-storage = &storage_partition;
zephyr,display = &ssd16xx_featherwing_epaper;
};
};
My application is as below.
#include <zephyr/drivers/display.h>
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(main);
void main(void) {
const struct device *display_dev;
LOG_INF("Initializing eInk display...");
// Get the display device
display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
LOG_INF("eInk display init done");
LOG_INF("Device name: %s", display_dev->name);
LOG_INF("Device state: %d", display_dev->state);
while (!device_is_ready(display_dev))
{
LOG_ERR("Device not ready");
k_msleep(100);
}
LOG_INF("eInk display ready");
// Clear the display
display_blanking_off(display_dev);
uint8_t buf[250 * 120 / 8] = {0x0A}; // All white
struct display_buffer_descriptor desc = {
.buf_size = sizeof(buf),
.width = 250,
.height = 120,
.pitch = 250,
};
// Write buffer to the display
int ret = display_write(display_dev, 0, 0, &desc, buf);
if (ret) {
LOG_ERR("display_write failed: %d", ret);
} else {
LOG_INF("Buffer written to display!");
}
LOG_INF("Hello World written to display!");
}
Any advice would be very much appreciated!
Best regards,
Pradeep