I am getting an error message when trying to use a nRF5340 DK with a Waveshare 1.69inch Touch LCD Module on the Zephyr sample code with minimal modifications. When I flash/reset I get:
[00:00:01.159,332] <err> cst816s: failed reading chip id *** Booting nRF Connect SDK v3.5.99-ncs1-1 *** [00:00:01.163,635] <inf> app: Starting...
and when I touch the screen I get:
[00:00:42.109,527] <err> cst816s: Could not read x data
The pin settings are as follows:
|
Module Pin
|
nRF5340 Pin
|
|
VCC
|
VDD (3.3)
|
| GND | GND |
| LCD_DIN |
P0.25
|
| LCD_CLK |
P0.06
|
| LCD_CS |
P0.11
|
| LCD_DC |
P1.11
|
| LCS_RST |
P1.10
|
| LCS_BL |
VDD (3.3)
|
| TP_SDA |
P1.02
|
| TP_SCL |
P1.03
|
| TP_RST |
P0.20
|
| TP_IRQ |
P1.01
|
The nrf5340dk_nrf5340_cpuapp.overlay is:
&pinctrl {
spi4_default: spi4_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 6)>,
<NRF_PSEL(SPIM_MOSI, 0, 25)>;
};
};
spi4_sleep: spi4_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 6)>,
<NRF_PSEL(SPIM_MOSI, 0, 25)>;
low-power-enable;
};
};
// Set to I2C pins that the touch screen is connected to
i2c2_default: i2c2_default {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
<NRF_PSEL(TWIM_SCL, 1, 3)>;
};
};
i2c2_sleep: i2c2_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
<NRF_PSEL(TWIM_SCL, 1, 3)>;
low-power-enable;
};
};
};
&spi4 {
compatible = "nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi4_default>;
pinctrl-1 = <&spi4_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
st7789v_st7789v_tl019fqv01: st7789v@0 {
compatible = "sitronix,st7789v";
spi-max-frequency = <20000000>;
reg = <0>;
cmd-data-gpios = < &gpio1 11 GPIO_ACTIVE_LOW>;
reset-gpios = < &gpio1 10 GPIO_ACTIVE_LOW>;
width = <240>;
height = <280>;
x-offset = <0>;
y-offset = <20>;
vcom = <0x19>;
gctrl = <0x35>;
vrhs = <0x12>;
vdvs = <0x20>;
mdac = <0x00>;
gamma = <0x01>;
colmod = <0x05>;
lcm = <0x2c>;
porch-param = [0c 0c 00 33 33];
cmd2en-param = [5a 69 02 01];
pwctrl1-param = [a4 a1];
pvgam-param = [D0 04 0D 11 13 2B 3F 54 4C 18 0D 0B 1F 23];
nvgam-param = [D0 04 0C 11 13 2C 3F 44 51 2F 1F 1F 20 23];
ram-param = [00 F0];
rgb-param = [CD 08 14];
};
};
&i2c2 {
compatible = "nordic,nrf-twim";
status = "okay";
clock-frequency = <I2C_BITRATE_FAST>;
pinctrl-0 = <&i2c2_default>;
pinctrl-1 = <&i2c2_sleep>;
pinctrl-names = "default", "sleep";
cst816s: cst816s@15 {
compatible = "hynitron,cst816s";
reg = <0x15>;
irq-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
rst-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
};
};
/ {
fstab {
compatible = "zephyr,fstab";
lfs: lfs {
compatible = "zephyr,fstab,littlefs";
mount-point = "/lfs";
partition = <&littlefs_storage>;
automount;
read-size = <16>;
prog-size = <16>;
cache-size = <64>;
lookahead-size = <32>;
block-cycles = <512>;
};
};
};
/delete-node/ &storage_partition;
&mx25r64 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
littlefs_storage: partition@0 {
label = "littlefs_storage";
reg = <0x00000000 0x00200000>;
};
lvgl_raw_partition: partition@200000 {
label = "lvgl_raw_partition";
reg = <0x00200000 0x00200000>;
};
settings_partition: partition@400000 {
label = "settings_partition";
reg = <0x400000 0x100000 >;
};
};
};
/ {
chosen {
nordic,pm-ext-flash = &mx25r64;
zephyr,display = &st7789v_st7789v_tl019fqv01;
zephyr,keyboard-scan = &cst816s;
};
/*
aliases {
vibrator_pwm = &led0;
};
*/
lvgl_pointer_input: lvgl_pointer {
compatible = "zephyr,lvgl-pointer-input";
input = <&cst816s>;
swap-xy;
invert-x;
};
aliases {
input = &cst816s;
};
vib_pwr: vib-pwr-ctrl {
compatible = "regulator-fixed";
regulator-name = "vib-pwr-ctrl";
enable-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
};
};The prj.conf is:
CONFIG_LV_Z_MEM_POOL_SIZE=16384 CONFIG_LV_Z_SHELL=y CONFIG_MAIN_STACK_SIZE=2048 CONFIG_DISPLAY=y CONFIG_DISPLAY_LOG_LEVEL_ERR=y CONFIG_DISPLAY_LOG_LEVEL_INF=y CONFIG_LOG=y CONFIG_SHELL=y CONFIG_LVGL=y CONFIG_LV_MEM_CUSTOM=y CONFIG_LV_USE_LOG=y CONFIG_LV_USE_LABEL=y CONFIG_LV_USE_BTN=y CONFIG_LV_USE_ARC=y CONFIG_LV_USE_IMG=y CONFIG_LV_USE_MONKEY=y CONFIG_LV_FONT_MONTSERRAT_16=y #added to get touch working CONFIG_INPUT=y CONFIG_LV_Z_POINTER_INPUT=y #CONFIG_LV_Z_ENCODER_INPUT=y
and the main.c is:
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/display.h>
#include <zephyr/drivers/gpio.h>
#include <lvgl.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <lvgl_input_device.h>
#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(app);
static uint32_t count;
#ifdef CONFIG_GPIO
static struct gpio_dt_spec button_gpio = GPIO_DT_SPEC_GET_OR(
DT_ALIAS(sw0), gpios, {0});
static struct gpio_callback button_callback;
static void button_isr_callback(const struct device *port,
struct gpio_callback *cb,
uint32_t pins)
{
ARG_UNUSED(port);
ARG_UNUSED(cb);
ARG_UNUSED(pins);
count = 0;
}
#endif /* CONFIG_GPIO */
#ifdef CONFIG_LV_Z_ENCODER_INPUT
static const struct device *lvgl_encoder =
DEVICE_DT_GET(DT_COMPAT_GET_ANY_STATUS_OKAY(zephyr_lvgl_encoder_input));
#endif /* CONFIG_LV_Z_ENCODER_INPUT */
static void lv_btn_click_callback(lv_event_t *e)
{
LOG_INF("lv_btn_click_callback called");
ARG_UNUSED(e);
count = 0;
}
int main(void)
{
char count_str[11] = {0};
const struct device *display_dev;
lv_obj_t *hello_world_label;
lv_obj_t *count_label;
LOG_INF("Starting...");
display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display_dev)) {
LOG_ERR("Device not ready, aborting test");
return 0;
}
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_text_color(lv_scr_act(), lv_color_white(), LV_PART_MAIN);
#ifdef CONFIG_GPIO
if (gpio_is_ready_dt(&button_gpio)) {
int err;
err = gpio_pin_configure_dt(&button_gpio, GPIO_INPUT);
if (err) {
LOG_ERR("failed to configure button gpio: %d", err);
return 0;
}
gpio_init_callback(&button_callback, button_isr_callback,
BIT(button_gpio.pin));
err = gpio_add_callback(button_gpio.port, &button_callback);
if (err) {
LOG_ERR("failed to add button callback: %d", err);
return 0;
}
err = gpio_pin_interrupt_configure_dt(&button_gpio,
GPIO_INT_EDGE_TO_ACTIVE);
if (err) {
LOG_ERR("failed to enable button callback: %d", err);
return 0;
}
}
#endif /* CONFIG_GPIO */
#ifdef CONFIG_LV_Z_ENCODER_INPUT
lv_obj_t *arc;
lv_group_t *arc_group;
arc = lv_arc_create(lv_scr_act());
lv_obj_align(arc, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_size(arc, 150, 150);
arc_group = lv_group_create();
lv_group_add_obj(arc_group, arc);
lv_indev_set_group(lvgl_input_get_indev(lvgl_encoder), arc_group);
#endif /* CONFIG_LV_Z_ENCODER_INPUT */
if (IS_ENABLED(CONFIG_LV_Z_POINTER_KSCAN) || IS_ENABLED(CONFIG_LV_Z_POINTER_INPUT)) {
lv_obj_t *hello_world_button;
hello_world_button = lv_btn_create(lv_scr_act());
lv_obj_align(hello_world_button, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(hello_world_button, lv_btn_click_callback, LV_EVENT_CLICKED,
NULL);
hello_world_label = lv_label_create(hello_world_button);
} else {
hello_world_label = lv_label_create(lv_scr_act());
}
lv_label_set_text(hello_world_label, "Hello world!");
lv_obj_align(hello_world_label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_text_font(hello_world_label, &lv_font_montserrat_16, LV_PART_MAIN);
count_label = lv_label_create(lv_scr_act());
lv_obj_align(count_label, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_style_text_font(count_label, &lv_font_montserrat_16, LV_PART_MAIN);
lv_task_handler();
display_blanking_off(display_dev);
while (1) {
if ((count % 100) == 0U) {
sprintf(count_str, "%d", count/100U);
lv_label_set_text(count_label, count_str);
}
lv_task_handler();
++count;
k_sleep(K_MSEC(10));
}
}



