瀏覽代碼

Merge pull request #1359 from liu2guang/master

[BSP][RT1050] fix rt1050 bsp bug and update code. | 修复RT1050 BSP bug并…
ZYH 7 年之前
父節點
當前提交
3365c07c2a

+ 33 - 2
bsp/imxrt1052-evk/.config

@@ -317,6 +317,7 @@ CONFIG_LWIP_NETIF_LOOPBACK=0
 # CONFIG_PKG_USING_QUICKLZ is not set
 # CONFIG_PKG_USING_MULTIBUTTON is not set
 # CONFIG_PKG_USING_SAMPLES is not set
+# CONFIG_PKG_USING_CANFESTIVAL is not set
 
 #
 # example package: hello
@@ -343,14 +344,14 @@ CONFIG_RT_USING_UART1=y
 # CONFIG_RT_USING_UART8 is not set
 
 #
-# Select spi bus drivers
+# Select spi bus and dev drivers
 #
 CONFIG_LPSPI_CLK_SOURCE_FROM_PLL3PFD1=y
 # CONFIG_LPSPI_CLK_SOURCE_FROM_PLL3PFD0 is not set
 # CONFIG_LPSPI_CLK_SOURCE_FROM_PLL2 is not set
 # CONFIG_LPSPI_CLK_SOURCE_FROM_PLL2PFD2 is not set
 CONFIG_LPSPI_CLK_SOURCE=0
-CONFIG_LPSPI_CLK_SOURCE_DIVIDER=7
+CONFIG_LPSPI_CLK_SOURCE_DIVIDER=8
 # CONFIG_RT_USING_SPIBUS1 is not set
 # CONFIG_RT_USING_SPIBUS2 is not set
 # CONFIG_RT_USING_SPIBUS3 is not set
@@ -361,5 +362,35 @@ CONFIG_LPSPI4_SDO_GPIO_1=y
 # CONFIG_LPSPI4_SDO_GPIO_2 is not set
 CONFIG_LPSPI4_SDI_GPIO_1=y
 # CONFIG_LPSPI4_SDI_GPIO_2 is not set
+# CONFIG_RT_USING_SPI_FLASH is not set
+
+#
+# Select i2c bus drivers
+#
+CONFIG_LPI2C_CLOCK_SOURCE_DIVIDER=4
+CONFIG_RT_USING_I2C1=y
+# CONFIG_RT_USING_I2C1_BITOPS is not set
+# CONFIG_RT_USING_I2C2 is not set
+# CONFIG_RT_USING_I2C3 is not set
+# CONFIG_RT_USING_I2C4 is not set
+
+#
+# Select lcd driver
+#
+
+#
+# Notice: Evk Board para: 480*272 4 4 8 2 40 10 106 45
+#
+CONFIG_RT_USING_LCD=y
+CONFIG_LCD_WIDTH=480
+CONFIG_LCD_HEIGHT=272
+CONFIG_LCD_HFP=4
+CONFIG_LCD_VFP=4
+CONFIG_LCD_HBP=8
+CONFIG_LCD_VBP=2
+CONFIG_LCD_HSW=40
+CONFIG_LCD_VSW=10
+CONFIG_LCD_BL_PIN=106
+CONFIG_LCD_RST_PIN=45
 CONFIG_RT_USING_SDRAM=y
 CONFIG_RT_USING_RTC_HP=y

+ 133 - 26
bsp/imxrt1052-evk/Kconfig

@@ -70,7 +70,7 @@ menu "Select uart drivers"
         default n 
 endmenu
 
-menu "Select spi bus drivers"
+menu "Select spi bus and dev drivers"
     choice 
         prompt "SPI bus clock source"
         default LPSPI_CLK_SOURCE_FROM_PLL3PFD1
@@ -94,7 +94,7 @@ menu "Select spi bus drivers"
     config LPSPI_CLK_SOURCE_DIVIDER
         int "SPI bus clock source divider"
         range 1 8
-        default 7
+        default 8
 
     config RT_USING_SPIBUS1
         bool "Using spi1 bus"
@@ -223,67 +223,174 @@ menu "Select spi bus drivers"
         config LPSPI4_SDI_GPIO_2
             bool "GPIO_B1_05"
     endchoice
+
+    config RT_USING_SPI_FLASH
+        bool "Using spi flash with sfud"
+        default n 
+        select RT_USING_SPI
+        select RT_USING_SFUD
+        select RT_USING_PIN
+    choice 
+        prompt "SPI flash using spibus"
+        default SPI_FLASH_USING_SPIBUS4
+        depends on RT_USING_SPI_FLASH
+
+        config SPI_FLASH_USING_SPIBUS1
+            bool "spi1"
+            select RT_USING_SPIBUS1
+        config SPI_FLASH_USING_SPIBUS2
+            bool "spi2"
+            select RT_USING_SPIBUS2
+        config SPI_FLASH_USING_SPIBUS3
+            bool "spi3"
+            select RT_USING_SPIBUS3
+        config SPI_FLASH_USING_SPIBUS4
+            bool "spi4"
+            select RT_USING_SPIBUS4
+    endchoice
+    config SPI_FLASH_USING_SPIBUS_NAME
+        string
+        default "spi1" if SPI_FLASH_USING_SPIBUS1
+        default "spi2" if SPI_FLASH_USING_SPIBUS2
+        default "spi3" if SPI_FLASH_USING_SPIBUS3
+        default "spi4" if SPI_FLASH_USING_SPIBUS4
+
+    config SPI_FLASH_NAME
+        string "SPI flash device name"
+        default "flash0" 
+        depends on RT_USING_SPI_FLASH
+
+    config SPI_FLASH_USING_CS_PIN
+        int "SPI flash cs pin index"
+        default 79 
+        range 1 127
+        depends on RT_USING_SPI_FLASH
 endmenu
 
-menu "Select iic drivers"
+menu "Select i2c bus drivers"
 
     config LPI2C_CLOCK_SOURCE_DIVIDER
         int "lpi2c bus clock source divider"
         range 1 64
         default 4
-		
+        
     config RT_USING_I2C1
         bool "USING I2C1"
         select RT_USING_I2C
         default y 
-		if RT_USING_I2C1
-		config RT_USING_I2C1_BITOPS
-		select RT_USING_I2C_BITOPS
-		default n
+        if RT_USING_I2C1
+        config RT_USING_I2C1_BITOPS
+        select RT_USING_I2C_BITOPS
+        default n
         bool "using simulate I2C1"
-		endif
+        endif
 
     config RT_USING_I2C2
         bool "USING I2C2"
         select RT_USING_I2C
         default n 
-		if RT_USING_I2C2
-		config RT_USING_I2C2_BITOPS
-		select RT_USING_I2C_BITOPS
-		default n
+        if RT_USING_I2C2
+        config RT_USING_I2C2_BITOPS
+        select RT_USING_I2C_BITOPS
+        default n
         bool "using simulate I2C2"
-		endif
+        endif
 
     config RT_USING_I2C3
         bool "USING I2C3"
         select RT_USING_I2C
         default n 
-		if RT_USING_I2C3
-		config RT_USING_I2C3_BITOPS
-		select RT_USING_I2C_BITOPS
-		default n
+        if RT_USING_I2C3
+        config RT_USING_I2C3_BITOPS
+        select RT_USING_I2C_BITOPS
+        default n
         bool "using simulate I2C3"
-		endif
+        endif
 
     config RT_USING_I2C4
         bool "USING I2C4"
         select RT_USING_I2C
         default n 
-		if RT_USING_I2C4
-		config RT_USING_I2C4_BITOPS
-		select RT_USING_I2C_BITOPS
-		default n
+        if RT_USING_I2C4
+        config RT_USING_I2C4_BITOPS
+        select RT_USING_I2C_BITOPS
+        default n
         bool "using simulate I2C4"
-		endif
+        endif
+endmenu
+
+menu "Select lcd driver"
+    if RT_USING_LCD && BOARD_RT1050_EVK
+    comment "Notice: Evk Board para: 480*272 4 4 8 2 40 10 106 45" 
+    endif
+
+    if RT_USING_LCD && BOARD_RT1050_FIRE
+    comment "Notice: Fire Board para: 800*480 4 4 8 2 40 10 58 45" 
+    endif
+
+    config RT_USING_LCD
+        bool "Using lcd"
+        default n 
+
+    config LCD_WIDTH
+        int "Width pixel num"
+        default 480 if BOARD_RT1050_EVK
+        default 800 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_HEIGHT
+        int "Height pixel num" 
+        default 272 if BOARD_RT1050_EVK
+        default 480 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_HFP
+        int "HFP"
+        default 4 if BOARD_RT1050_EVK
+        default 4 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_VFP
+        int "VFP"
+        default 4 if BOARD_RT1050_EVK
+        default 4 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_HBP
+        int "HBP"
+        default 8 if BOARD_RT1050_EVK
+        default 8 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_VBP
+        int "VBP"
+        default 2 if BOARD_RT1050_EVK
+        default 2 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_HSW
+        int "HSW"
+        default 40 if BOARD_RT1050_EVK
+        default 40 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD
+    config LCD_VSW
+        int "VSW"
+        default 10 if BOARD_RT1050_EVK
+        default 10 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD 
+    config LCD_BL_PIN
+        int "Backlight pin index"
+        default 106 if BOARD_RT1050_EVK
+        default 58  if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD 
+    config LCD_RST_PIN
+        int "Reset pin index"
+        default 45 if BOARD_RT1050_EVK
+        default 45 if BOARD_RT1050_FIRE
+        depends on RT_USING_LCD 
 endmenu
 
-#menu "SDRAM driver support"
+#menu "Select SDRAM driver"
     config RT_USING_SDRAM
         bool "Using sdram"
         default y 
 #endmenu
 
-#menu "RTC driver support"
+#menu "Select RTC driver"
     config RT_USING_RTC_HP
         bool "Using hp rtc"
         select RT_USING_RTC

+ 5 - 1
bsp/imxrt1052-evk/Libraries/SConscript

@@ -5,7 +5,11 @@ Import('RTT_ROOT')
 from building import *
 
 cwd = GetCurrentDir()
-src  = Glob('drivers/*.c')
+src = Glob('drivers/*.c')
+
+if GetDepend('BOARD_RT1050_FIRE'): 
+    SrcRemove(src, r'drivers\fsl_enet.c')
+
 SrcRemove(src, 'drivers/dataqueue.c')
 src += Glob('common/chip/*.c')
 src += [cwd + '/system_MIMXRT1052.c']

+ 15 - 9
bsp/imxrt1052-evk/drivers/SConscript

@@ -2,7 +2,7 @@ Import('RTT_ROOT')
 Import('rtconfig')
 from building import *
 
-cwd     = os.path.join(str(Dir('#')), 'drivers')
+cwd = os.path.join(str(Dir('#')), 'drivers')
 
 # add the general drivers.
 src = Split("""
@@ -16,7 +16,7 @@ CPPDEFINES = []
 
 # add sdram driver code
 if GetDepend('RT_USING_SDRAM'):
-    src = src + ['./drv_sdram.c'] 
+    src = src + ['drv_sdram.c'] 
 
 # add pin driver code
 if GetDepend('RT_USING_PIN'):
@@ -24,25 +24,34 @@ if GetDepend('RT_USING_PIN'):
 
 # add rtc driver code
 if GetDepend('RT_USING_RTC_HP'):
-    src = src + ['./drv_rtc.c'] 
+    src = src + ['drv_rtc.c'] 
 
 # add spibus driver code
 if GetDepend('RT_USING_SPI'):
     src += ['drv_spi_bus.c']
 
+# add spi flash driver code
+if GetDepend('RT_USING_SPI_FLASH'):
+    src += ['drv_spi_flash.c']
+
 # add i2cbus driver code
 if GetDepend('RT_USING_I2C'):
     src += ['drv_i2c.c']
 
+# add lcd driver code
+if GetDepend('RT_USING_LCD'):
+    src += ['drv_lcd.c']
+
+# add sdio driver code
+if GetDepend('RT_USING_SDIO'):
+    src += ['drv_sdio.c']
+
 if GetDepend('BOARD_RT1050_EVK'):
     src += ['hyper_flash_boot.c']
 
     if GetDepend('RT_USING_LWIP'):
         src += ['drv_eth.c', 'fsl_phy.c']
         CPPDEFINES += ['FSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE']
-        
-    if GetDepend('RT_USING_SDIO'):
-        src += ['drv_sdio.c']
 
     if GetDepend('RT_USING_USB_DEVICE'):
         src += Glob('usb/phy/*.c')
@@ -52,9 +61,6 @@ if GetDepend('BOARD_RT1050_EVK'):
         src += ['drv_usbd.c']
         src += Glob('usb/device/*.c')
 
-    if GetDepend('RT_USING_RTGUI') or GetDepend('PKG_USING_GUIENGINE'):
-        src += ['drv_lcd.c', 'drv_ft5406.c', 'drv_i2c.c']
-
 group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)
 
 Return('group')

+ 0 - 20
bsp/imxrt1052-evk/drivers/board.c

@@ -202,24 +202,4 @@ void rt_hw_board_init()
 #endif
 }
 
-#ifdef PKG_USING_GUIENGINE
-#include <rtgui/driver.h>
-#include "drv_lcd.h"
-
-/* initialize for gui driver */
-int rtgui_lcd_init(void)
-{
-    rt_device_t device;
-
-    imxrt_hw_lcd_init();
-
-    device = rt_device_find("lcd");
-    /* set graphic device */
-    rtgui_graphic_set_device(device);
-
-    return 0;
-}
-INIT_DEVICE_EXPORT(rtgui_lcd_init);
-#endif
-
 /*@}*/

+ 1 - 1
bsp/imxrt1052-evk/drivers/drv_ft5406.c

@@ -40,7 +40,7 @@
 
 #define BSP_TOUCH_SAMPLE_HZ     30
 
-#define I2CBUS_NAME  "i2c0"
+#define I2CBUS_NAME  "i2c1"
 
 #if 0
 #define FTDEBUG      rt_kprintf

+ 149 - 639
bsp/imxrt1052-evk/drivers/drv_lcd.c

@@ -1,7 +1,7 @@
 /*
- * File      : usart.c
+ * File      : drv_lcd.c
  * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2009, RT-Thread Development Team
+ * COPYRIGHT (C) 2006-2013, RT-Thread Development Team
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -10,510 +10,164 @@
  * Change Logs:
  * Date           Author       Notes
  * 2017-10-30     Tanek        the first version
+ * 2018-04-05     Liu2guang    export LCD config parameters.
  */
-
-#include <board.h>
-#include <rtthread.h>
+ 
+#include "drv_lcd.h" 
 
 #include "fsl_common.h"
+#include "fsl_iomuxc.h" 
 #include "fsl_elcdif.h"
-#include "fsl_gpio.h"
-
-//#define LCD_DEBUG
-
-#ifdef PKG_USING_GUIENGINE
-
-#define APP_HSW 41
-#define APP_HFP 4
-#define APP_HBP 8
-#define APP_VSW 10
-#define APP_VFP 4
-#define APP_VBP 2
-#define APP_POL_FLAGS \
-    (kELCDIF_DataEnableActiveHigh | kELCDIF_VsyncActiveLow | kELCDIF_HsyncActiveLow | kELCDIF_DriveDataOnRisingClkEdge)
-
-#define FRAME_BUFFER_ALIGN              64
-        
-#define LCD_PIXEL_T                     uint16_t
-#define LCD_BITS_PER_PIXEL              (sizeof(LCD_PIXEL_T) * 8)
-
-#define LCD_INIT_DATA                   (0x00)
-
-        
-/* Display. */
-#define LCD_DISP_GPIO                   GPIO1
-#define LCD_DISP_GPIO_PIN               2
-/* Back light. */
-#define LCD_BL_GPIO                     GPIO2
-#define LCD_BL_GPIO_PIN                 31
-        
-#define APP_ELCDIF LCDIF
-#define APP_LCDIF_DATA_BUS              kELCDIF_DataBus16Bit
-#define FRAME_BUFFER_COUNT              2
-
-#define RT_HW_LCD_WIDTH                 ((uint16_t)800)     /* LCD PIXEL WIDTH            */
-#define RT_HW_LCD_HEIGHT                ((uint16_t)480)     /* LCD PIXEL HEIGHT           */
-        
-ALIGN(FRAME_BUFFER_ALIGN)
-static LCD_PIXEL_T lcdif_frame_buffer[FRAME_BUFFER_COUNT][RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH] SECTION("NonCacheable");
 
-
-#ifdef LCD_DEBUG
-static volatile bool s_frameDone = false;
+#if !defined(LCD_WIDTH) || !defined(LCD_HEIGHT) 
+#error "Please config lcd pixel parameters." 
 #endif
 
-struct imxrt_lcd_t
-{
-    struct rt_device_graphic_info lcd_info;
-    struct rt_device lcd;
-    struct rt_semaphore lcd_sem;
-    rt_uint32_t index;              //lcd buffer
-    LCD_PIXEL_T * framebuffer;
-    bool update;
-};
-
-static struct imxrt_lcd_t imxrt_lcd;
-
-static void _lcd_gpio_config(void) 
-{
-  CLOCK_EnableClock(kCLOCK_Iomuxc);          /* iomuxc clock (iomuxc_clk_enable): 0x03u */
-
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_AD_B0_02_GPIO1_IO02,        /* GPIO_AD_B0_02 is configured as GPIO1_IO02 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_00_LCD_CLK,              /* GPIO_B0_00 is configured as LCD_CLK */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_01_LCD_ENABLE,           /* GPIO_B0_01 is configured as LCD_ENABLE */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_02_LCD_HSYNC,            /* GPIO_B0_02 is configured as LCD_HSYNC */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_03_LCD_VSYNC,            /* GPIO_B0_03 is configured as LCD_VSYNC */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_04_LCD_DATA00,           /* GPIO_B0_04 is configured as LCD_DATA00 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_05_LCD_DATA01,           /* GPIO_B0_05 is configured as LCD_DATA01 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_06_LCD_DATA02,           /* GPIO_B0_06 is configured as LCD_DATA02 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_07_LCD_DATA03,           /* GPIO_B0_07 is configured as LCD_DATA03 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_08_LCD_DATA04,           /* GPIO_B0_08 is configured as LCD_DATA04 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_09_LCD_DATA05,           /* GPIO_B0_09 is configured as LCD_DATA05 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_10_LCD_DATA06,           /* GPIO_B0_10 is configured as LCD_DATA06 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_11_LCD_DATA07,           /* GPIO_B0_11 is configured as LCD_DATA07 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_12_LCD_DATA08,           /* GPIO_B0_12 is configured as LCD_DATA08 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_13_LCD_DATA09,           /* GPIO_B0_13 is configured as LCD_DATA09 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_14_LCD_DATA10,           /* GPIO_B0_14 is configured as LCD_DATA10 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B0_15_LCD_DATA11,           /* GPIO_B0_15 is configured as LCD_DATA11 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B1_00_LCD_DATA12,           /* GPIO_B1_00 is configured as LCD_DATA12 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B1_01_LCD_DATA13,           /* GPIO_B1_01 is configured as LCD_DATA13 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B1_02_LCD_DATA14,           /* GPIO_B1_02 is configured as LCD_DATA14 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B1_03_LCD_DATA15,           /* GPIO_B1_03 is configured as LCD_DATA15 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinMux(
-      IOMUXC_GPIO_B1_15_GPIO2_IO31,           /* GPIO_B1_15 is configured as GPIO2_IO31 */
-      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_AD_B0_02_GPIO1_IO02,        /* GPIO_AD_B0_02 PAD functional properties : */
-      0x10B0u);                               /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Keeper
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Down
-                                                 Hyst. Enable Field: Hysteresis Disabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_00_LCD_CLK,              /* GPIO_B0_00 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_01_LCD_ENABLE,           /* GPIO_B0_01 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_02_LCD_HSYNC,            /* GPIO_B0_02 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_03_LCD_VSYNC,            /* GPIO_B0_03 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_04_LCD_DATA00,           /* GPIO_B0_04 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_05_LCD_DATA01,           /* GPIO_B0_05 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_06_LCD_DATA02,           /* GPIO_B0_06 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_07_LCD_DATA03,           /* GPIO_B0_07 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_08_LCD_DATA04,           /* GPIO_B0_08 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_09_LCD_DATA05,           /* GPIO_B0_09 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_10_LCD_DATA06,           /* GPIO_B0_10 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_11_LCD_DATA07,           /* GPIO_B0_11 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_12_LCD_DATA08,           /* GPIO_B0_12 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_13_LCD_DATA09,           /* GPIO_B0_13 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_14_LCD_DATA10,           /* GPIO_B0_14 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B0_15_LCD_DATA11,           /* GPIO_B0_15 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B1_00_LCD_DATA12,           /* GPIO_B1_00 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B1_01_LCD_DATA13,           /* GPIO_B1_01 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B1_02_LCD_DATA14,           /* GPIO_B1_02 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B1_03_LCD_DATA15,           /* GPIO_B1_03 PAD functional properties : */
-      0x01B0B0u);                             /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Pull
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Up
-                                                 Hyst. Enable Field: Hysteresis Enabled */
-  IOMUXC_SetPinConfig(
-      IOMUXC_GPIO_B1_15_GPIO2_IO31,           /* GPIO_B1_15 PAD functional properties : */
-      0x10B0u);                               /* Slew Rate Field: Slow Slew Rate
-                                                 Drive Strength Field: R0/6
-                                                 Speed Field: medium(100MHz)
-                                                 Open Drain Enable Field: Open Drain Disabled
-                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
-                                                 Pull / Keep Select Field: Keeper
-                                                 Pull Up / Down Config. Field: 100K Ohm Pull Down
-                                                 Hyst. Enable Field: Hysteresis Disabled */
-}
-
-static void _lcd_clock_config(void)
-{
-    /*
-     * The desired output frame rate is 60Hz. So the pixel clock frequency is:
-     * (480 + 41 + 4 + 18) * (272 + 10 + 4 + 2) * 60 = 9.2M.
-     * Here set the LCDIF pixel clock to 9.3M.
-     */
-
-    /*
-     * Initialize the Video PLL.
-     * Video PLL output clock is OSC24M * (loopDivider + (denominator / numerator)) / postDivider = 93MHz.
-     */
-    clock_video_pll_config_t config = {
-        .loopDivider = 31, .postDivider = 8, .numerator = 0, .denominator = 0,
-    };
-
-    CLOCK_InitVideoPll(&config);
-
-    /*
-     * 000 derive clock from PLL2
-     * 001 derive clock from PLL3 PFD3
-     * 010 derive clock from PLL5
-     * 011 derive clock from PLL2 PFD0
-     * 100 derive clock from PLL2 PFD1
-     * 101 derive clock from PLL3 PFD1
-     */
-    CLOCK_SetMux(kCLOCK_Lcdif1PreMux, 2);
-
-    CLOCK_SetDiv(kCLOCK_Lcdif1PreDiv, 4);
-
-    CLOCK_SetDiv(kCLOCK_Lcdif1Div, 1);
-
-    /*
-     * 000 derive clock from divided pre-muxed lcdif1 clock
-     * 001 derive clock from ipp_di0_clk
-     * 010 derive clock from ipp_di1_clk
-     * 011 derive clock from ldb_di0_clk
-     * 100 derive clock from ldb_di1_clk
-     */
-    CLOCK_SetMux(kCLOCK_Lcdif1Mux, 0);
-}
-
-/* Initialize the LCD_DISP. */
-static void _lcd_hardware_reset(void)
-{
-    volatile uint32_t i = 0x100U;
-
-    gpio_pin_config_t config = {
-        kGPIO_DigitalOutput, 0,
-    };
-
-    /* Reset the LCD. */
-    GPIO_PinInit(LCD_DISP_GPIO, LCD_DISP_GPIO_PIN, &config);
-
-    GPIO_PinWrite(LCD_DISP_GPIO, LCD_DISP_GPIO_PIN, 0);
-
-    while (i--)
-    {
-    }
-
-    GPIO_PinWrite(LCD_DISP_GPIO, LCD_DISP_GPIO_PIN, 1);
-
-    /* Backlight. */
-    config.outputLogic = 1;
-    GPIO_PinInit(LCD_BL_GPIO, LCD_BL_GPIO_PIN, &config);
-}
-
-static void _lcdif_init(void)
-{
-    const elcdif_rgb_mode_config_t config = {
-        .panelWidth = RT_HW_LCD_WIDTH,
-        .panelHeight = RT_HW_LCD_HEIGHT,
-        .hsw = APP_HSW,
-        .hfp = APP_HFP,
-        .hbp = APP_HBP,
-        .vsw = APP_VSW,
-        .vfp = APP_VFP,
-        .vbp = APP_VBP,
-        .polarityFlags = APP_POL_FLAGS,
-        .bufferAddr = (uint32_t)lcdif_frame_buffer[0],
-        .pixelFormat = kELCDIF_PixelFormatRGB565,
-        .dataBus = APP_LCDIF_DATA_BUS,
-    };
+#if !defined(LCD_HFP) || !defined(LCD_HBP) || !defined(LCD_HSW) || \
+    !defined(LCD_VFP) || !defined(LCD_VBP) || !defined(LCD_VSW)
+#error "Please config lcd timing parameters." 
+#endif
 
-    ELCDIF_RgbModeInit(LCDIF, &config);
-}
+#if !defined(LCD_BL_PIN) || !defined(LCD_RST_PIN) 
+#error "Please config lcd backlight or reset pin." 
+#endif
 
-static void _lcd_interrupt_init(void)
+struct rt1050_lcd
 {
-    EnableIRQ(LCDIF_IRQn);
-    ELCDIF_EnableInterrupts(LCDIF, kELCDIF_CurFrameDoneInterruptEnable);
-}
+    struct rt_device device; 
+    struct rt_device_graphic_info info; 
+}; 
 
-static void _lcd_start(void)
-{
-    ELCDIF_RgbModeStart(LCDIF);
-}
+static struct rt1050_lcd lcd; 
+ALIGN(64) static uint16_t frame_buffer[LCD_HEIGHT][LCD_WIDTH] SECTION("NonCacheable"); 
 
-void LCDIF_IRQHandler(void)
+static rt_err_t rt1050_lcd_init(rt_device_t device)
 {
-    uint32_t intStatus;
-
-    intStatus = ELCDIF_GetInterruptStatus(LCDIF);
-
-    ELCDIF_ClearInterruptStatus(LCDIF, intStatus);
-
-    if (intStatus & kELCDIF_CurFrameDone)
-    {
-#ifdef LCD_DEBUG
-        s_frameDone = true;  
-#endif
+    RT_ASSERT(device != RT_NULL); 
+    
+    rt_memset(frame_buffer, 0x00, sizeof(frame_buffer)); 
 
-        if (imxrt_lcd.update)
-        {
-            ELCDIF_SetNextBufferAddr(LCDIF, (uint32_t)lcdif_frame_buffer[imxrt_lcd.index]);
-            imxrt_lcd.update = false;
-            rt_sem_release(&imxrt_lcd.lcd_sem);
-        }
+    /* CLK */
+    clock_video_pll_config_t pll_config;
+    
+    pll_config.loopDivider = 43;
+    pll_config.postDivider = 4;
+    pll_config.numerator   = 0;
+    pll_config.denominator = 0;
+    
+    CLOCK_InitVideoPll(&pll_config); 
 
-    }
+    CLOCK_SetMux(kCLOCK_Lcdif1PreMux, 2); 
+    CLOCK_SetDiv(kCLOCK_Lcdif1PreDiv, 4); 
+    CLOCK_SetMux(kCLOCK_Lcdif1Mux, 0); 
+    CLOCK_SetDiv(kCLOCK_Lcdif1Div, 1); 
+    
+    /* GPIO */ 
+    CLOCK_EnableClock(kCLOCK_Iomuxc); 
+    
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_04_LCD_DATA00, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, 0x01B0B0U); /* LCD_B3 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_05_LCD_DATA01, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, 0x01B0B0U); /* LCD_B4 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_06_LCD_DATA02, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, 0x01B0B0U); /* LCD_B5 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_07_LCD_DATA03, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, 0x01B0B0U); /* LCD_B6 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_08_LCD_DATA04, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, 0x01B0B0U); /* LCD_B7 */ 
+    
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_09_LCD_DATA05, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, 0x01B0B0U); /* LCD_G2 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_10_LCD_DATA06, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, 0x01B0B0U); /* LCD_G3 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_11_LCD_DATA07, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, 0x01B0B0U); /* LCD_G4 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_12_LCD_DATA08, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, 0x01B0B0U); /* LCD_G5 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_13_LCD_DATA09, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, 0x01B0B0U); /* LCD_G6 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_14_LCD_DATA10, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, 0x01B0B0U); /* LCD_G7 */ 
+    
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_15_LCD_DATA11, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, 0x01B0B0U); /* LCD_R3 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B1_00_LCD_DATA12, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, 0x01B0B0U); /* LCD_R4 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B1_01_LCD_DATA13, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, 0x01B0B0U); /* LCD_R5 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B1_02_LCD_DATA14, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, 0x01B0B0U); /* LCD_R6 */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B1_03_LCD_DATA15, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, 0x01B0B0U); /* LCD_R7 */ 
+    
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_00_LCD_CLK,    0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK,    0x01B0B0u); /* LCD_CLK */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_02_LCD_HSYNC,  0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC,  0x01B0B0u); /* LCD_HSYNC */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_03_LCD_VSYNC,  0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC,  0x01B0B0u); /* LCD_VSYNC */ 
+    IOMUXC_SetPinMux   (IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U); 
+    IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0x01B0B0u); /* LCD_ENABLE */ 
+    
+    rt_pin_mode(LCD_RST_PIN, PIN_MODE_OUTPUT); /* LCD_RESET */ 
+    rt_pin_write(LCD_RST_PIN, PIN_LOW); 
+    rt_thread_delay(RT_TICK_PER_SECOND/100); 
+    rt_pin_write(LCD_RST_PIN, PIN_HIGH); 
+    
+    rt_pin_mode (LCD_BL_PIN, PIN_MODE_OUTPUT);  /* LCD_BL */ 
+    rt_pin_write(LCD_BL_PIN, PIN_HIGH); 
+    
+    /* LCD */ 
+    elcdif_rgb_mode_config_t lcd_config; 
+    
+    lcd_config.hfp           = LCD_HFP; 
+    lcd_config.vfp           = LCD_VFP; 
+    lcd_config.hbp           = LCD_HBP; 
+    lcd_config.vbp           = LCD_VBP; 
+    lcd_config.hsw           = LCD_HSW; 
+    lcd_config.vsw           = LCD_VSW; 
+    
+    lcd_config.polarityFlags = kELCDIF_DataEnableActiveHigh | 
+                               kELCDIF_VsyncActiveHigh      | 
+                               kELCDIF_HsyncActiveLow       | 
+                               kELCDIF_DriveDataOnRisingClkEdge;
+    
+    lcd_config.panelWidth    = LCD_WIDTH; 
+    lcd_config.panelHeight   = LCD_HEIGHT; 
+    lcd_config.pixelFormat   = kELCDIF_PixelFormatRGB565; 
+    lcd_config.dataBus       = kELCDIF_DataBus16Bit; 
+    lcd_config.bufferAddr    = (uint32_t)frame_buffer; 
+    
+    ELCDIF_RgbModeInit (LCDIF, &lcd_config);
+    ELCDIF_RgbModeStart(LCDIF); 
+    
+    /* LCD DEVICE */
+    lcd.info.width          = LCD_WIDTH;
+    lcd.info.height         = LCD_HEIGHT;
+    lcd.info.pixel_format   = RTGRAPHIC_PIXEL_FORMAT_RGB565;
+    lcd.info.bits_per_pixel = 16; 
+    lcd.info.framebuffer    = (void *)frame_buffer;
+
+    return RT_EOK; 
 }
 
-static rt_err_t rt_lcd_control(rt_device_t dev, int cmd, void *args)
+static rt_err_t rt1050_lcd_control(rt_device_t device, int cmd, void *args)
 {
-    switch (cmd)
+    switch(cmd)
     {
-    case RTGRAPHIC_CTRL_RECT_UPDATE:
-    {        
-        if(rt_sem_take(&imxrt_lcd.lcd_sem, RT_TICK_PER_SECOND/20) != RT_EOK)
-        {
-            rt_kprintf("lcdtimeout!\n");
-        }
-        
-        imxrt_lcd.index = (imxrt_lcd.index + 1) % FRAME_BUFFER_COUNT;
-        memcpy(lcdif_frame_buffer[imxrt_lcd.index], imxrt_lcd.framebuffer, 
-               sizeof(LCD_PIXEL_T) * RT_HW_LCD_WIDTH * RT_HW_LCD_HEIGHT);
-        imxrt_lcd.update = true;
-    }
-    break;
+    case RTGRAPHIC_CTRL_RECT_UPDATE: 
+        break;
     
-    case RTGRAPHIC_CTRL_POWERON:
+    case RTGRAPHIC_CTRL_POWERON: 
+        rt_pin_write(LCD_BL_PIN, PIN_HIGH); 
         break;
     
-    case RTGRAPHIC_CTRL_POWEROFF:
+    case RTGRAPHIC_CTRL_POWEROFF: 
+        rt_pin_write(LCD_BL_PIN, PIN_LOW); 
         break;
     
     case RTGRAPHIC_CTRL_GET_INFO:
-        memcpy(args, &imxrt_lcd.lcd_info, sizeof(imxrt_lcd.lcd_info));
+        rt_memcpy(args, &lcd.info, sizeof(lcd.info)); 
         break;
     
     case RTGRAPHIC_CTRL_SET_MODE:
@@ -523,166 +177,22 @@ static rt_err_t rt_lcd_control(rt_device_t dev, int cmd, void *args)
     return RT_EOK;
 }
 
-int imxrt_hw_lcd_init(void)
+int rt_hw_lcd_init(void)
 {
-    LCD_PIXEL_T * framebuffer;
-    
-    framebuffer = rt_malloc_align(sizeof(LCD_PIXEL_T) * RT_HW_LCD_WIDTH * RT_HW_LCD_HEIGHT, FRAME_BUFFER_ALIGN);
-    if(!framebuffer)
-    {
-        rt_kprintf("malloc framebuffer fail\n");
-        return -1;
-    }
-    imxrt_lcd.framebuffer = framebuffer;
-    
-    memset(framebuffer,         LCD_INIT_DATA, sizeof(LCD_PIXEL_T) * RT_HW_LCD_WIDTH * RT_HW_LCD_HEIGHT);
-    memset(lcdif_frame_buffer,  LCD_INIT_DATA, sizeof(lcdif_frame_buffer));
-    
-    rt_kprintf("framebuffer: %p, lcdif_frame_buffer: %p, lcdif_frame_buffer[0]: %p, lcdif_frame_buffer[1]: %p\n", \
-        framebuffer, lcdif_frame_buffer, lcdif_frame_buffer[0], lcdif_frame_buffer[1]);
-
-    _lcd_gpio_config();
-    _lcd_clock_config();
-    _lcd_hardware_reset();
-    _lcdif_init();
-    _lcd_interrupt_init();
-    _lcd_start();
-        
-    imxrt_lcd.index = 0;
-    imxrt_lcd.update = false;
-    
-    imxrt_lcd.lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL;
-    imxrt_lcd.lcd_info.pixel_format   = RTGRAPHIC_PIXEL_FORMAT_RGB565;
-    imxrt_lcd.lcd_info.framebuffer    = (void *)framebuffer;
-    imxrt_lcd.lcd_info.width          = RT_HW_LCD_WIDTH;
-    imxrt_lcd.lcd_info.height         = RT_HW_LCD_HEIGHT;
+    rt_err_t ret; 
+
+    lcd.device.type    = RT_Device_Class_Graphic; 
+    lcd.device.init    = rt1050_lcd_init; 
+    lcd.device.open    = RT_NULL;
+    lcd.device.close   = RT_NULL;
+    lcd.device.read    = RT_NULL;
+    lcd.device.write   = RT_NULL;
+    lcd.device.control = rt1050_lcd_control; 
     
-    imxrt_lcd.lcd.type    = RT_Device_Class_Graphic;
-    imxrt_lcd.lcd.init    = NULL;
-    imxrt_lcd.lcd.open    = NULL;
-    imxrt_lcd.lcd.close   = NULL;
-    imxrt_lcd.lcd.read    = NULL;
-    imxrt_lcd.lcd.write   = NULL;
-    imxrt_lcd.lcd.control = rt_lcd_control;
-    imxrt_lcd.lcd.user_data = (void *)&imxrt_lcd.lcd_info;
+    lcd.device.user_data = (void *)&lcd.info; 
     
-    rt_sem_init(&imxrt_lcd.lcd_sem, "lcd_sem", 1, RT_IPC_FLAG_FIFO);
-    
-    /* register lcd device to RT-Thread */
-    rt_device_register(&imxrt_lcd.lcd, "lcd", RT_DEVICE_FLAG_RDWR);
-    
-
-    return 0;
-}
-//INIT_DEVICE_EXPORT(imxrt_hw_lcd_init);
-
-#ifdef LCD_DEBUG
-#include <finsh.h>
-
-void APP_FillFrameBuffer(uint32_t frameBuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH])
-{
-    /* Background color. */
-    static const uint32_t bgColor = 0U;
-    /* Foreground color. */
-    static uint8_t fgColorIndex = 0U;
-    static const uint32_t fgColorTable[] = {0x000000FFU, 0x0000FF00U, 0x0000FFFFU, 0x00FF0000U,
-                                            0x00FF00FFU, 0x00FFFF00U, 0x00FFFFFFU};
-    uint32_t fgColor = fgColorTable[fgColorIndex];
-
-    /* Position of the foreground rectangle. */
-    static uint16_t upperLeftX = 0U;
-    static uint16_t upperLeftY = 0U;
-    static uint16_t lowerRightX = (RT_HW_LCD_WIDTH - 1U) / 2U;
-    static uint16_t lowerRightY = (RT_HW_LCD_HEIGHT - 1U) / 2U;
-
-    static int8_t incX = 1;
-    static int8_t incY = 1;
-
-    /* Change color in next forame or not. */
-    static bool changeColor = false;
-
-    uint32_t i, j;
-
-    /* Background color. */
-    for (i = 0; i < RT_HW_LCD_HEIGHT; i++)
-    {
-        for (j = 0; j < RT_HW_LCD_WIDTH; j++)
-        {
-            frameBuffer[i][j] = bgColor;
-        }
-    }
-
-    /* Foreground color. */
-    for (i = upperLeftY; i < lowerRightY; i++)
-    {
-        for (j = upperLeftX; j < lowerRightX; j++)
-        {
-            frameBuffer[i][j] = fgColor;
-        }
-    }
-
-    /* Update the format: color and rectangle position. */
-    upperLeftX += incX;
-    upperLeftY += incY;
-    lowerRightX += incX;
-    lowerRightY += incY;
-
-    changeColor = false;
-
-    if (0U == upperLeftX)
-    {
-        incX = 1;
-        changeColor = true;
-    }
-    else if (RT_HW_LCD_WIDTH - 1 == lowerRightX)
-    {
-        incX = -1;
-        changeColor = true;
-    }
-
-    if (0U == upperLeftY)
-    {
-        incY = 1;
-        changeColor = true;
-    }
-    else if (RT_HW_LCD_HEIGHT - 1 == lowerRightY)
-    {
-        incY = -1;
-        changeColor = true;
-    }
-
-    if (changeColor)
-    {
-        fgColorIndex++;
-
-        if (ARRAY_SIZE(fgColorTable) == fgColorIndex)
-        {
-            fgColorIndex = 0U;
-        }
-    }
-}
-
-void lcd_test(void)
-{
-    uint32_t frameBufferIndex = 0;
+    ret = rt_device_register(&lcd.device, "lcd", RT_DEVICE_FLAG_RDWR); 
     
-    APP_FillFrameBuffer(lcdif_frame_buffer[frameBufferIndex]);
-     
-    while (1)
-    {
-        frameBufferIndex ^= 1U;
-
-        APP_FillFrameBuffer(lcdif_frame_buffer[frameBufferIndex]);
-
-        ELCDIF_SetNextBufferAddr(LCDIF, (uint32_t)lcdif_frame_buffer[frameBufferIndex]);
-
-        s_frameDone = false;
-        /* Wait for previous frame complete. */
-        while (!s_frameDone)
-        {
-        }
-    }
+    return ret; 
 }
-FINSH_FUNCTION_EXPORT(lcd_test, lcd test);
-#endif
-#endif
+INIT_DEVICE_EXPORT(rt_hw_lcd_init); 

+ 11 - 17
bsp/imxrt1052-evk/drivers/drv_lcd.h

@@ -1,29 +1,23 @@
 /*
- * File      : drv_i2c.c
- * COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team
+ * File      : drv_lcd2.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006-2013, RT-Thread Development Team
  *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
  *
  * Change Logs:
  * Date           Author       Notes
- * 2017-12-15     Tanek        the first version
+ * 2018-04-05     Liuguang     the first version.
  */
  
 #ifndef __DRV_LCD_H__
 #define __DRV_LCD_H__
 
-extern int imxrt_hw_lcd_init(void);
+#include <rtthread.h> 
+#include <rtdevice.h> 
+
+int rt_hw_lcd_init(void);
 
 #endif

+ 4 - 7
bsp/imxrt1052-evk/drivers/drv_spi_bus.c

@@ -18,7 +18,8 @@
 #include "fsl_iomuxc.h" 
 #include "fsl_lpspi.h" 
 
-#ifdef RT_USING_SPI
+#if defined(RT_USING_SPIBUS1) || defined(RT_USING_SPIBUS2) || \
+    defined(RT_USING_SPIBUS3) || defined(RT_USING_SPIBUS4)
 
 #if defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL
     #error "Please don't define 'FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL'!"
@@ -28,7 +29,7 @@
 #define LPSPI_CLK_SOURCE         (1U) /* PLL3 PFD0 */ 
 #endif
 #if !defined(LPSPI_CLK_SOURCE_DIVIDER)
-#define LPSPI_CLK_SOURCE_DIVIDER (7U) /* 8div */
+#define LPSPI_CLK_SOURCE_DIVIDER (8U) /* 8div */
 #endif
 
 /* LPSPI1 SCK SDO SDI IOMUX Config */
@@ -399,14 +400,10 @@ static struct rt_spi_ops rt1050_spi_ops =
  
 int rt_hw_spi_bus_init(void)
 {
-#if defined(RT_USING_SPIBUS1) || defined(RT_USING_SPIBUS2) || \
-    defined(RT_USING_SPIBUS3) || defined(RT_USING_SPIBUS4)
-    
     CLOCK_SetMux(kCLOCK_LpspiMux, LPSPI_CLK_SOURCE);
-    CLOCK_SetDiv(kCLOCK_LpspiDiv, LPSPI_CLK_SOURCE_DIVIDER); 
+    CLOCK_SetDiv(kCLOCK_LpspiDiv, LPSPI_CLK_SOURCE_DIVIDER-1); 
     
     CLOCK_EnableClock(kCLOCK_Iomuxc); 
-#endif
     
 #if defined(RT_USING_SPIBUS1)
     rt_spi_bus_register(&spi1_bus, "spi1", &rt1050_spi_ops); 

+ 51 - 0
bsp/imxrt1052-evk/drivers/drv_spi_flash.c

@@ -0,0 +1,51 @@
+/*
+ * File      : drv_spi_flash.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006-2013, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-04-02     Liuguang     the first version.
+ */
+ 
+#include "drv_spi_flash.h" 
+
+#include "spi_flash.h" 
+#include "spi_flash_sfud.h" 
+
+#ifndef SPI_FLASH_USING_SPIBUS_NAME 
+#define SPI_FLASH_USING_SPIBUS_NAME "spi4" 
+#endif
+#ifndef SPI_FLASH_NAME 
+#define SPI_FLASH_NAME "flash0" 
+#endif
+#ifndef SPI_FLASH_USING_CS_PIN 
+#define SPI_FLASH_USING_CS_PIN (79) 
+#endif
+
+int rt_hw_spi_flash_init(void)
+{
+    rt_err_t ret; 
+    
+    extern rt_err_t rt1050_spi_bus_attach_device(const char *bus_name, 
+        const char *device_name, rt_uint32_t pin); 
+    
+    ret = rt1050_spi_bus_attach_device(SPI_FLASH_USING_SPIBUS_NAME, 
+        SPI_FLASH_USING_SPIBUS_NAME "0", SPI_FLASH_USING_CS_PIN); 
+    if(ret != RT_EOK) 
+    {
+        return ret; 
+    }
+    
+    if(rt_sfud_flash_probe(SPI_FLASH_NAME, SPI_FLASH_USING_SPIBUS_NAME "0") == RT_NULL) 
+    {
+        return RT_ERROR;
+    }
+
+    return RT_EOK; 
+}
+INIT_DEVICE_EXPORT(rt_hw_spi_flash_init); 

+ 23 - 0
bsp/imxrt1052-evk/drivers/drv_spi_flash.h

@@ -0,0 +1,23 @@
+/*
+ * File      : drv_spi_flash.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006-2013, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-04-02     Liuguang     the first version.
+ */
+ 
+#ifndef __DRV_SPI_FLASH_H_ 
+#define __DRV_SPI_FLASH_H_ 
+
+#include <rtthread.h> 
+#include <rtdevice.h> 
+
+int rt_hw_spi_flash_init(void); 
+
+#endif /* __DRV_SPI_FLASH_H_ */ 

文件差異過大導致無法顯示
+ 129 - 290
bsp/imxrt1052-evk/project.uvprojx


+ 19 - 3
bsp/imxrt1052-evk/rtconfig.h

@@ -200,20 +200,36 @@
 
 #define RT_USING_UART1
 
-/* Select spi bus drivers */
+/* Select spi bus and dev drivers */
 
 #define LPSPI_CLK_SOURCE_FROM_PLL3PFD1
 #define LPSPI_CLK_SOURCE 0
-#define LPSPI_CLK_SOURCE_DIVIDER 7
+#define LPSPI_CLK_SOURCE_DIVIDER 8
 #define RT_USING_SPIBUS4
 #define LPSPI4_SCK_GPIO_1
 #define LPSPI4_SDO_GPIO_1
 #define LPSPI4_SDI_GPIO_1
 
-/* Select iic drivers */
+/* Select i2c bus drivers */
 
 #define LPI2C_CLOCK_SOURCE_DIVIDER 4
 #define RT_USING_I2C1
+
+/* Select lcd driver */
+
+/* Notice: Evk Board para: 480*272 4 4 8 2 40 10 106 45 */
+
+#define RT_USING_LCD
+#define LCD_WIDTH 480
+#define LCD_HEIGHT 272
+#define LCD_HFP 4
+#define LCD_VFP 4
+#define LCD_HBP 8
+#define LCD_VBP 2
+#define LCD_HSW 40
+#define LCD_VSW 10
+#define LCD_BL_PIN 106
+#define LCD_RST_PIN 45
 #define RT_USING_SDRAM
 #define RT_USING_RTC_HP
 

部分文件因文件數量過多而無法顯示