This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 00c8174587557f72631218d56e64b3a58116cce3
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Mon Sep 11 15:36:37 2023 +0200

    lvgl: Add da1469x LCD driver
    
    Signed-off-by: Jerzy Kasenberg <[email protected]>
---
 hw/drivers/display/lcd_itf/itf_lcd_da1469x/pkg.yml |  28 +++++
 .../lcd_itf/itf_lcd_da1469x/src/itf_lcd_da1469x.c  | 124 +++++++++++++++++++++
 .../display/lcd_itf/itf_lcd_da1469x/syscfg.yml     |  30 +++++
 3 files changed, 182 insertions(+)

diff --git a/hw/drivers/display/lcd_itf/itf_lcd_da1469x/pkg.yml 
b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/pkg.yml
new file mode 100644
index 000000000..4a8f28def
--- /dev/null
+++ b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/pkg.yml
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: hw/drivers/display/lcd_itf/itf_lcd_da1469x
+pkg.description: LCD controller
+pkg.keywords:
+    - display
+
+pkg.apis:
+    - lcd_interface
+
+pkg.deps:
diff --git a/hw/drivers/display/lcd_itf/itf_lcd_da1469x/src/itf_lcd_da1469x.c 
b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/src/itf_lcd_da1469x.c
new file mode 100644
index 000000000..522745d6c
--- /dev/null
+++ b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/src/itf_lcd_da1469x.c
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <bsp/bsp.h>
+#include <hal/hal_gpio.h>
+#include <bus/drivers/spi_common.h>
+
+#include <lv_conf.h>
+#include <misc/lv_color.h>
+#include <lcd_itf.h>
+
+static uint16_t display_resx;
+static uint16_t display_resy;
+
+void
+lcd_itf_write_color_data(uint16_t x1, uint16_t x2, uint16_t y1, uint16_t y2, 
const void *pixels)
+{
+    uint16_t width = 1 + x2 - x1;
+    uint16_t height = 1 + y2 - y1;
+
+    LCDC->LCDC_LAYER0_BASEADDR_REG = (uint32_t)pixels;
+    LCDC->LCDC_RESXY_REG = (width << 16) | height;
+    LCDC->LCDC_LAYER0_OFFSETX_REG = 0;
+    LCDC->LCDC_LAYER0_SIZEXY_REG = (width << 16) | height;
+    LCDC->LCDC_LAYER0_RESXY_REG = (width << 16) | height;
+    LCDC->LCDC_LAYER0_STRIDE_REG = width * sizeof(lv_color_t);
+    LCDC->LCDC_LAYER0_MODE_REG = LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_EN_Msk | 5;
+    LCDC->LCDC_MODE_REG |= LCDC_LCDC_MODE_REG_LCDC_SFRAME_UPD_Msk;
+    /* Dummy read, it looks like busy status may not be there on the first 
read */
+    (void)LCDC->LCDC_STATUS_REG;
+    while ((LCDC->LCDC_STATUS_REG & 
LCDC_LCDC_STATUS_REG_LCDC_FRAMEGEN_BUSY_Msk));
+}
+
+void
+lcd_ift_write_cmd(const uint8_t *cmd, int cmd_length)
+{
+    int i;
+    uint32_t cmd_bit = LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_SEND_Msk;
+
+    for (i = 0; i < cmd_length; ++i) {
+        if (((LCDC->LCDC_DBIB_CFG_REG & 
(LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_HOLD_Msk |
+                                         
LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI4_EN_Msk)) !=
+             LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI4_EN_Msk) ||
+            (LCDC->LCDC_DBIB_CMD_REG & 
LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_SEND_Msk) == cmd_bit) {
+            while (LCDC->LCDC_STATUS_REG & 
LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_FULL_Msk);
+        } else {
+            while (LCDC->LCDC_STATUS_REG & 
LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_PENDING_Msk);
+        }
+
+        LCDC->LCDC_DBIB_CMD_REG = cmd_bit | cmd[i];
+        cmd_bit = 0;
+    }
+}
+
+
+void
+lcd_itf_init(void)
+{
+    CRG_SYS->CLK_SYS_REG |= CRG_SYS_CLK_SYS_REG_LCD_ENABLE_Msk |
+                            CRG_SYS_CLK_SYS_REG_LCD_CLK_SEL_Msk;
+
+    /* Device without LCD controller DA14691 does not have magic number at 
this address */
+    if (LCDC->LCDC_IDREG_REG != 0x87452365) {
+        assert(0);
+        return;
+    }
+
+    display_resx = 240;
+    display_resy = 320;
+
+    if (MYNEWT_VAL(LCD_DC_PIN) >= 0) {
+        mcu_gpio_set_pin_function(MYNEWT_VAL(LCD_DC_PIN), 
MCU_GPIO_MODE_OUTPUT, MCU_GPIO_FUNC_LCD_SPI_DC);
+    }
+    if (MYNEWT_VAL(LCD_CS_PIN) >= 0) {
+        mcu_gpio_set_pin_function(MYNEWT_VAL(LCD_CS_PIN), 
MCU_GPIO_MODE_OUTPUT, MCU_GPIO_FUNC_LCD_SPI_EN);
+    }
+    if (MYNEWT_VAL(LCD_MOSI_PIN) >= 0) {
+        mcu_gpio_set_pin_function(MYNEWT_VAL(LCD_MOSI_PIN), 
MCU_GPIO_MODE_OUTPUT, MCU_GPIO_FUNC_LCD_SPI_DO);
+    }
+    if (MYNEWT_VAL(LCD_SCLK_PIN) >= 0) {
+        mcu_gpio_set_pin_function(MYNEWT_VAL(LCD_SCLK_PIN), 
MCU_GPIO_MODE_OUTPUT, MCU_GPIO_FUNC_LCD_SPI_CLK);
+    }
+
+    uint32_t clk_sys_reg = CRG_SYS->CLK_SYS_REG &
+                           ~(CRG_SYS_CLK_SYS_REG_LCD_RESET_REQ_Msk | 
CRG_SYS_CLK_SYS_REG_LCD_CLK_SEL_Msk |
+                             CRG_SYS_CLK_SYS_REG_LCD_ENABLE_Msk);
+    CRG_SYS->CLK_SYS_REG = clk_sys_reg | CRG_SYS_CLK_SYS_REG_LCD_RESET_REQ_Msk;
+    CRG_SYS->CLK_SYS_REG = clk_sys_reg | CRG_SYS_CLK_SYS_REG_LCD_ENABLE_Msk | 
CRG_SYS_CLK_SYS_REG_LCD_CLK_SEL_Msk;
+
+    LCDC->LCDC_CLKCTRL_REG = (4 << 8) | 2; /* TODO: calculate divider */
+    LCDC->LCDC_CLKCTRL_REG = 0x401;
+    LCDC->LCDC_MODE_REG = 0;
+    while (LCDC->LCDC_STATUS_REG & 
LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_FULL_Msk);
+    LCDC->LCDC_DBIB_CFG_REG =
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI4_EN_Msk |
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_DMA_EN_Msk |
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_TE_DIS_Msk |
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_RESX_Msk |
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPHA_Msk |
+        LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPOL_Msk |
+        0x12 /* RGB565 */;
+    /* RGB565 */
+    LCDC->LCDC_RESXY_REG = (240 << 16) | 320;
+    LCDC->LCDC_FRONTPORCHXY_REG = (240 << 16) | 320;
+    LCDC->LCDC_BLANKINGXY_REG = (240 << 16) | 321;
+    LCDC->LCDC_BACKPORCHXY_REG = (240 << 16) | 321;
+    LCDC->LCDC_LAYER0_MODE_REG = LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_EN_Msk | 5;
+}
diff --git a/hw/drivers/display/lcd_itf/itf_lcd_da1469x/syscfg.yml 
b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/syscfg.yml
new file mode 100644
index 000000000..7e0f2a5e5
--- /dev/null
+++ b/hw/drivers/display/lcd_itf/itf_lcd_da1469x/syscfg.yml
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+syscfg.defs:
+    LCD_MOSI_PIN:
+        description: >
+            LCD MOSI pin.
+        value: -1
+    LCD_SCLK_PIN:
+        description: >
+            LCD CLK pin.
+        value: -1
+
+syscfg.restrictions:
+    - LV_DISP_X_ALIGN == 1

Reply via email to