forked from xuos/xiuos
				
			Merge branch 'develop' of https://git.trustie.net/wwg666/xiuos into develop
This commit is contained in:
		
						commit
						4d20855da3
					
				| 
						 | 
					@ -1,12 +1,3 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2006-2021, RT-Thread Development Team
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: Apache-2.0
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Change Logs:
 | 
					 | 
				
			||||||
 * Date           Author        Notes
 | 
					 | 
				
			||||||
 * 2021-10-17     Meco Man      First version
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <lvgl.h>
 | 
					#include <lvgl.h>
 | 
				
			||||||
#include <lv_port_indev_template.h>
 | 
					#include <lv_port_indev_template.h>
 | 
				
			||||||
#include "lv_demo_calendar.h"
 | 
					#include "lv_demo_calendar.h"
 | 
				
			||||||
| 
						 | 
					@ -22,11 +13,11 @@ extern void lv_example_aoteman(void);
 | 
				
			||||||
void* lvgl_thread(void *parameter)
 | 
					void* lvgl_thread(void *parameter)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* display demo; you may replace with your LVGL application at here */
 | 
					    /* display demo; you may replace with your LVGL application at here */
 | 
				
			||||||
    // lv_demo_calendar();
 | 
					    lv_demo_calendar();
 | 
				
			||||||
    // lv_example_img_1();
 | 
					    // lv_example_img_1();
 | 
				
			||||||
    // lv_example_chart_2();
 | 
					    // lv_example_chart_2();
 | 
				
			||||||
    // lv_example_line_1();
 | 
					    // lv_example_line_1();
 | 
				
			||||||
    lv_example_aoteman();
 | 
					    // lv_example_aoteman();
 | 
				
			||||||
    /* handle the tasks of LVGL */
 | 
					    /* handle the tasks of LVGL */
 | 
				
			||||||
    while(1)
 | 
					    while(1)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ static void event_handler(lv_event_t * e)
 | 
				
			||||||
void lv_demo_calendar(void)
 | 
					void lv_demo_calendar(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    lv_obj_t  * calendar = lv_calendar_create(lv_scr_act());
 | 
					    lv_obj_t  * calendar = lv_calendar_create(lv_scr_act());
 | 
				
			||||||
    lv_obj_set_size(calendar, 320, 240);
 | 
					    lv_obj_set_size(calendar, 480, 272);
 | 
				
			||||||
    lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 0);
 | 
					    lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 0);
 | 
				
			||||||
    lv_obj_add_event_cb(calendar, event_handler, LV_EVENT_ALL, NULL);
 | 
					    lv_obj_add_event_cb(calendar, event_handler, LV_EVENT_ALL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,10 +183,21 @@ typedef struct
 | 
				
			||||||
    LcdStringParam string_info;
 | 
					    LcdStringParam string_info;
 | 
				
			||||||
}LcdWriteParam;
 | 
					}LcdWriteParam;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t x;
 | 
				
			||||||
 | 
					    uint16_t y;
 | 
				
			||||||
 | 
					    uint16_t press;
 | 
				
			||||||
 | 
					}TouchDataParam;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PRIV_SYSTICK_GET (CurrentTicksGain())
 | 
					#define PRIV_SYSTICK_GET (CurrentTicksGain())
 | 
				
			||||||
#define PRIV_LCD_DEV "/dev/lcd_dev"
 | 
					#define PRIV_LCD_DEV "/dev/lcd_dev"
 | 
				
			||||||
#define MY_DISP_HOR_RES BSP_LCD_Y_MAX
 | 
					#define MY_DISP_HOR_RES BSP_LCD_Y_MAX
 | 
				
			||||||
#define MY_DISP_VER_RES BSP_LCD_X_MAX
 | 
					#define MY_DISP_VER_RES BSP_LCD_X_MAX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PRIV_TOUCH_DEV "/dev/touch_dev"
 | 
				
			||||||
 | 
					#define MY_INDEV_X BSP_LCD_Y_MAX
 | 
				
			||||||
 | 
					#define MY_INDEV_Y BSP_LCD_X_MAX
 | 
				
			||||||
/**********************mutex**************************/
 | 
					/**********************mutex**************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PrivMutexCreate(pthread_mutex_t *p_mutex, const pthread_mutexattr_t *attr);
 | 
					int PrivMutexCreate(pthread_mutex_t *p_mutex, const pthread_mutexattr_t *attr);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,9 +81,9 @@ void lv_port_disp_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Example for 2) */
 | 
					    /* Example for 2) */
 | 
				
			||||||
    static lv_disp_draw_buf_t draw_buf_dsc_2;
 | 
					    static lv_disp_draw_buf_t draw_buf_dsc_2;
 | 
				
			||||||
    static lv_color_t buf_2_1[MY_DISP_HOR_RES *70];                        /*A buffer for 10 rows*/
 | 
					    static lv_color_t buf_2_1[MY_DISP_HOR_RES *10];                       /*A buffer for 10 rows*/
 | 
				
			||||||
    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 70];                        /*An other buffer for 10 rows*/
 | 
					    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10];                        /*An other buffer for 10 rows*/
 | 
				
			||||||
    lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 70);   /*Initialize the display buffer*/
 | 
					    lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 10);   /*Initialize the display buffer*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Example for 3) also set disp_drv.full_refresh = 1 below*/
 | 
					    /* Example for 3) also set disp_drv.full_refresh = 1 below*/
 | 
				
			||||||
    // static lv_disp_draw_buf_t draw_buf_dsc_3;
 | 
					    // static lv_disp_draw_buf_t draw_buf_dsc_3;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,9 +12,18 @@
 | 
				
			||||||
#include "lv_port_indev_template.h"
 | 
					#include "lv_port_indev_template.h"
 | 
				
			||||||
#include "../../lvgl.h"
 | 
					#include "../../lvgl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int touch_fd = 0;
 | 
				
			||||||
 | 
					static TouchDataParam touch_data;
 | 
				
			||||||
/*********************
 | 
					/*********************
 | 
				
			||||||
 *      DEFINES
 | 
					 *      DEFINES
 | 
				
			||||||
 *********************/
 | 
					 *********************/
 | 
				
			||||||
 | 
					#define LV_USE_INDEV_TOUCHPAD 0x1u
 | 
				
			||||||
 | 
					#define LV_USE_INDEV_MOUSE    0x2u
 | 
				
			||||||
 | 
					#define LV_USE_INDEV_KEYPAD   0x4u
 | 
				
			||||||
 | 
					#define LV_USE_INDEV_ENCODER  0x8u
 | 
				
			||||||
 | 
					#define LV_USE_INDEV_BUTTUN   0x10u
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LV_USE_INDEV  LV_USE_INDEV_TOUCHPAD  ///< modify this DEFINE to enable the indev device. e.g #define LV_USE_INDEV  LV_USE_INDEV_TOUCHPAD | LV_USE_INDEV_KEYPAD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**********************
 | 
					/**********************
 | 
				
			||||||
 *      TYPEDEFS
 | 
					 *      TYPEDEFS
 | 
				
			||||||
| 
						 | 
					@ -23,38 +32,61 @@
 | 
				
			||||||
/**********************
 | 
					/**********************
 | 
				
			||||||
 *  STATIC PROTOTYPES
 | 
					 *  STATIC PROTOTYPES
 | 
				
			||||||
 **********************/
 | 
					 **********************/
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
 | 
				
			||||||
static void touchpad_init(void);
 | 
					static void touchpad_init(void);
 | 
				
			||||||
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
					static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
				
			||||||
static bool touchpad_is_pressed(void);
 | 
					static bool touchpad_is_pressed(void);
 | 
				
			||||||
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
 | 
					static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
 | 
				
			||||||
static void mouse_init(void);
 | 
					static void mouse_init(void);
 | 
				
			||||||
static void mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
					static void mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
				
			||||||
static bool mouse_is_pressed(void);
 | 
					static bool mouse_is_pressed(void);
 | 
				
			||||||
static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y);
 | 
					static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
 | 
				
			||||||
static void keypad_init(void);
 | 
					static void keypad_init(void);
 | 
				
			||||||
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
					static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
				
			||||||
static uint32_t keypad_get_key(void);
 | 
					static uint32_t keypad_get_key(void);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
 | 
				
			||||||
static void encoder_init(void);
 | 
					static void encoder_init(void);
 | 
				
			||||||
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
					static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
				
			||||||
static void encoder_handler(void);
 | 
					static void encoder_handler(void);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
 | 
				
			||||||
static void button_init(void);
 | 
					static void button_init(void);
 | 
				
			||||||
static void button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
					static void button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
 | 
				
			||||||
static int8_t button_get_pressed_id(void);
 | 
					static int8_t button_get_pressed_id(void);
 | 
				
			||||||
static bool button_is_pressed(uint8_t id);
 | 
					static bool button_is_pressed(uint8_t id);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**********************
 | 
					/**********************
 | 
				
			||||||
 *  STATIC VARIABLES
 | 
					 *  STATIC VARIABLES
 | 
				
			||||||
 **********************/
 | 
					 **********************/
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
 | 
				
			||||||
lv_indev_t * indev_touchpad;
 | 
					lv_indev_t * indev_touchpad;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
 | 
				
			||||||
lv_indev_t * indev_mouse;
 | 
					lv_indev_t * indev_mouse;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
 | 
				
			||||||
lv_indev_t * indev_keypad;
 | 
					lv_indev_t * indev_keypad;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
 | 
				
			||||||
lv_indev_t * indev_encoder;
 | 
					lv_indev_t * indev_encoder;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
 | 
				
			||||||
lv_indev_t * indev_button;
 | 
					lv_indev_t * indev_button;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t encoder_diff;
 | 
					static int32_t encoder_diff;
 | 
				
			||||||
static lv_indev_state_t encoder_state;
 | 
					static lv_indev_state_t encoder_state;
 | 
				
			||||||
| 
						 | 
					@ -82,7 +114,7 @@ void lv_port_indev_init(void)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static lv_indev_drv_t indev_drv;
 | 
					    static lv_indev_drv_t indev_drv;
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
 | 
				
			||||||
    /*------------------
 | 
					    /*------------------
 | 
				
			||||||
     * Touchpad
 | 
					     * Touchpad
 | 
				
			||||||
     * -----------------*/
 | 
					     * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -95,7 +127,9 @@ void lv_port_indev_init(void)
 | 
				
			||||||
    indev_drv.type = LV_INDEV_TYPE_POINTER;
 | 
					    indev_drv.type = LV_INDEV_TYPE_POINTER;
 | 
				
			||||||
    indev_drv.read_cb = touchpad_read;
 | 
					    indev_drv.read_cb = touchpad_read;
 | 
				
			||||||
    indev_touchpad = lv_indev_drv_register(&indev_drv);
 | 
					    indev_touchpad = lv_indev_drv_register(&indev_drv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
 | 
				
			||||||
    /*------------------
 | 
					    /*------------------
 | 
				
			||||||
     * Mouse
 | 
					     * Mouse
 | 
				
			||||||
     * -----------------*/
 | 
					     * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -113,7 +147,9 @@ void lv_port_indev_init(void)
 | 
				
			||||||
    lv_obj_t * mouse_cursor = lv_img_create(lv_scr_act());
 | 
					    lv_obj_t * mouse_cursor = lv_img_create(lv_scr_act());
 | 
				
			||||||
    lv_img_set_src(mouse_cursor, LV_SYMBOL_HOME);
 | 
					    lv_img_set_src(mouse_cursor, LV_SYMBOL_HOME);
 | 
				
			||||||
    lv_indev_set_cursor(indev_mouse, mouse_cursor);
 | 
					    lv_indev_set_cursor(indev_mouse, mouse_cursor);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
 | 
				
			||||||
    /*------------------
 | 
					    /*------------------
 | 
				
			||||||
     * Keypad
 | 
					     * Keypad
 | 
				
			||||||
     * -----------------*/
 | 
					     * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -131,7 +167,11 @@ void lv_port_indev_init(void)
 | 
				
			||||||
     *add objects to the group with `lv_group_add_obj(group, obj)`
 | 
					     *add objects to the group with `lv_group_add_obj(group, obj)`
 | 
				
			||||||
     *and assign this input device to group to navigate in it:
 | 
					     *and assign this input device to group to navigate in it:
 | 
				
			||||||
     *`lv_indev_set_group(indev_keypad, group);`*/
 | 
					     *`lv_indev_set_group(indev_keypad, group);`*/
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
 | 
				
			||||||
    /*------------------
 | 
					    /*------------------
 | 
				
			||||||
     * Encoder
 | 
					     * Encoder
 | 
				
			||||||
     * -----------------*/
 | 
					     * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -149,7 +189,9 @@ void lv_port_indev_init(void)
 | 
				
			||||||
     *add objects to the group with `lv_group_add_obj(group, obj)`
 | 
					     *add objects to the group with `lv_group_add_obj(group, obj)`
 | 
				
			||||||
     *and assign this input device to group to navigate in it:
 | 
					     *and assign this input device to group to navigate in it:
 | 
				
			||||||
     *`lv_indev_set_group(indev_encoder, group);`*/
 | 
					     *`lv_indev_set_group(indev_encoder, group);`*/
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
 | 
				
			||||||
    /*------------------
 | 
					    /*------------------
 | 
				
			||||||
     * Button
 | 
					     * Button
 | 
				
			||||||
     * -----------------*/
 | 
					     * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -169,12 +211,13 @@ void lv_port_indev_init(void)
 | 
				
			||||||
            {40, 100},  /*Button 1 -> x:40; y:100*/
 | 
					            {40, 100},  /*Button 1 -> x:40; y:100*/
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    lv_indev_set_button_points(indev_button, btn_points);
 | 
					    lv_indev_set_button_points(indev_button, btn_points);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**********************
 | 
					/**********************
 | 
				
			||||||
 *   STATIC FUNCTIONS
 | 
					 *   STATIC FUNCTIONS
 | 
				
			||||||
 **********************/
 | 
					 **********************/
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
 | 
				
			||||||
/*------------------
 | 
					/*------------------
 | 
				
			||||||
 * Touchpad
 | 
					 * Touchpad
 | 
				
			||||||
 * -----------------*/
 | 
					 * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -182,6 +225,13 @@ void lv_port_indev_init(void)
 | 
				
			||||||
/*Initialize your touchpad*/
 | 
					/*Initialize your touchpad*/
 | 
				
			||||||
static void touchpad_init(void)
 | 
					static void touchpad_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    touch_fd = PrivOpen(PRIV_TOUCH_DEV,O_RDWR);
 | 
				
			||||||
 | 
					    if(touch_fd >= 0) {
 | 
				
			||||||
 | 
					        printf("touch fd = %d\n",touch_fd);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        printf("open %s touch fd = %d\n",PRIV_TOUCH_DEV,touch_fd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    /*Your code comes here*/
 | 
					    /*Your code comes here*/
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,7 +257,15 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
 | 
				
			||||||
/*Return true is the touchpad is pressed*/
 | 
					/*Return true is the touchpad is pressed*/
 | 
				
			||||||
static bool touchpad_is_pressed(void)
 | 
					static bool touchpad_is_pressed(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
    /*Your code comes here*/
 | 
					    /*Your code comes here*/
 | 
				
			||||||
 | 
					    memset(&touch_data, 0 ,sizeof(TouchDataParam));
 | 
				
			||||||
 | 
					    ret = PrivRead(touch_fd, &touch_data, 1);
 | 
				
			||||||
 | 
					    if(ret && touch_data.x >= 0 && touch_data.x < MY_INDEV_X && touch_data.y >= 0 && touch_data.y < MY_INDEV_Y)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // printf("touch x %d touch y %d\n",touch_data.x,touch_data.y);
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -217,10 +275,12 @@ static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /*Your code comes here*/
 | 
					    /*Your code comes here*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (*x) = 0;
 | 
					    (*x) = touch_data.x;
 | 
				
			||||||
    (*y) = 0;
 | 
					    (*y) = touch_data.y;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
 | 
				
			||||||
/*------------------
 | 
					/*------------------
 | 
				
			||||||
 * Mouse
 | 
					 * Mouse
 | 
				
			||||||
 * -----------------*/
 | 
					 * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -261,7 +321,11 @@ static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y)
 | 
				
			||||||
    (*x) = 0;
 | 
					    (*x) = 0;
 | 
				
			||||||
    (*y) = 0;
 | 
					    (*y) = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
 | 
				
			||||||
/*------------------
 | 
					/*------------------
 | 
				
			||||||
 * Keypad
 | 
					 * Keypad
 | 
				
			||||||
 * -----------------*/
 | 
					 * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -319,7 +383,11 @@ static uint32_t keypad_get_key(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
 | 
				
			||||||
/*------------------
 | 
					/*------------------
 | 
				
			||||||
 * Encoder
 | 
					 * Encoder
 | 
				
			||||||
 * -----------------*/
 | 
					 * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -346,7 +414,9 @@ static void encoder_handler(void)
 | 
				
			||||||
    encoder_diff += 0;
 | 
					    encoder_diff += 0;
 | 
				
			||||||
    encoder_state = LV_INDEV_STATE_REL;
 | 
					    encoder_state = LV_INDEV_STATE_REL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
 | 
				
			||||||
/*------------------
 | 
					/*------------------
 | 
				
			||||||
 * Button
 | 
					 * Button
 | 
				
			||||||
 * -----------------*/
 | 
					 * -----------------*/
 | 
				
			||||||
| 
						 | 
					@ -402,7 +472,7 @@ static bool button_is_pressed(uint8_t id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#else /*Enable this file at the top*/
 | 
					#else /*Enable this file at the top*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*This dummy typedef exists purely to silence -Wpedantic.*/
 | 
					/*This dummy typedef exists purely to silence -Wpedantic.*/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xs_base.h>
 | 
					#include <xs_base.h>
 | 
				
			||||||
#include <xs_isr.h>
 | 
					#include <xs_isr.h>
 | 
				
			||||||
 | 
					#include "fsl_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_base __attribute__((naked)) DisableLocalInterrupt()
 | 
					x_base __attribute__((naked)) DisableLocalInterrupt()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -37,11 +37,13 @@ void __attribute__((naked)) EnableLocalInterrupt(x_base level)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32 ArchEnableHwIrq(uint32 irq_num)
 | 
					int32 ArchEnableHwIrq(uint32 irq_num)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    EnableIRQ(irq_num);
 | 
				
			||||||
    return EOK;
 | 
					    return EOK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32 ArchDisableHwIrq(uint32 irq_num)
 | 
					int32 ArchDisableHwIrq(uint32 irq_num)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    DisableIRQ(irq_num);
 | 
				
			||||||
    return EOK;
 | 
					    return EOK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,10 @@ Modification:
 | 
				
			||||||
#include <connect_uart.h>
 | 
					#include <connect_uart.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_I2C
 | 
				
			||||||
 | 
					#include <connect_i2c.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSP_USING_CH438
 | 
					#ifdef BSP_USING_CH438
 | 
				
			||||||
#include <connect_ch438.h>
 | 
					#include <connect_ch438.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -67,6 +71,14 @@ extern int ExtSramInit(void);
 | 
				
			||||||
extern int ETH_BSP_Config();
 | 
					extern int ETH_BSP_Config();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LCD
 | 
				
			||||||
 | 
					extern int Imxrt1052HwLcdInit(void);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_TOUCH
 | 
				
			||||||
 | 
					extern int HwTouchInit();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BOARD_SD_Pin_Config(uint32_t speed, uint32_t strength)
 | 
					void BOARD_SD_Pin_Config(uint32_t speed, uint32_t strength)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD,
 | 
					    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD,
 | 
				
			||||||
| 
						 | 
					@ -277,27 +289,56 @@ void SysTick_Handler(int irqn, void *arg)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
DECLARE_HW_IRQ(SYSTICK_IRQN, SysTick_Handler, NONE);
 | 
					DECLARE_HW_IRQ(SYSTICK_IRQN, SysTick_Handler, NONE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct InitSequenceDesc _board_init[] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef BSP_USING_GPIO
 | 
				
			||||||
 | 
					    { "hw_pin", Imxrt1052HwGpioInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_CH438
 | 
				
			||||||
 | 
					    {"ch438", Imxrt1052HwCh438Init()},
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_SDIO
 | 
				
			||||||
 | 
						{ "sdio", Imxrt1052HwSdioInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_I2C
 | 
				
			||||||
 | 
					    { "hw_i2c", Imxrt1052HwI2cInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LCD
 | 
				
			||||||
 | 
						{ "hw_lcd", Imxrt1052HwLcdInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_TOUCH
 | 
				
			||||||
 | 
					    {"touch", HwTouchInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LWIP
 | 
				
			||||||
 | 
					    {"ETH_BSP", ETH_BSP_Config},
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_WDT
 | 
				
			||||||
 | 
					    { "hw_wdt", Imxrt1052HwWdgInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						{ " NONE ",NONE },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * This function will initial imxrt1050 board.
 | 
					 * This function will initial imxrt1050 board.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void InitBoardHardware()
 | 
					void InitBoardHardware()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    int i = 0;
 | 
				
			||||||
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BOARD_ConfigMPU();
 | 
					    BOARD_ConfigMPU();
 | 
				
			||||||
    BOARD_InitPins();
 | 
					    BOARD_InitPins();
 | 
				
			||||||
    BOARD_BootClockRUN();
 | 
					    BOARD_BootClockRUN();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef BSP_USING_LWIP
 | 
					 | 
				
			||||||
    NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 | 
					    NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 | 
				
			||||||
    SysTick_Config(SystemCoreClock / TICK_PER_SECOND);
 | 
					    SysTick_Config(SystemCoreClock / TICK_PER_SECOND);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef BSP_USING_GPIO
 | 
					 | 
				
			||||||
    Imxrt1052HwGpioInit();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef BSP_USING_LPUART
 | 
					 | 
				
			||||||
    BOARD_InitUartPins();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InitBoardMemory((void *)HEAP_BEGIN, (void *)HEAP_END);
 | 
					    InitBoardMemory((void *)HEAP_BEGIN, (void *)HEAP_END);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -317,26 +358,19 @@ void InitBoardHardware()
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSP_USING_LWIP
 | 
					 | 
				
			||||||
    ETH_BSP_Config();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef BSP_USING_LPUART
 | 
					#ifdef BSP_USING_LPUART
 | 
				
			||||||
    Imxrt1052HwUartInit();
 | 
					    Imxrt1052HwUartInit();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
 | 
					    InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
 | 
				
			||||||
 | 
					    KPrintf("\nconsole init completed.\n");
 | 
				
			||||||
 | 
					    KPrintf("board initialization......\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSP_USING_CH438
 | 
					    for(i = 0; _board_init[i].fn != NONE; i++) {
 | 
				
			||||||
    Imxrt1052HwCh438Init();
 | 
							ret = _board_init[i].fn();
 | 
				
			||||||
#endif
 | 
							KPrintf("initialize %s %s\n",_board_init[i].fn_name, ret == 0 ? "success" : "failed");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
#ifdef BSP_USING_SDIO
 | 
					    KPrintf("board init done.\n");
 | 
				
			||||||
    Imxrt1052HwSdioInit();
 | 
						KPrintf("start kernel...\n");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef BSP_USING_WDT 
 | 
					 | 
				
			||||||
    Imxrt1052HwWdgInit();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,9 @@ MEMORY
 | 
				
			||||||
  m_text                (RX)  : ORIGIN = 0x60002400, LENGTH = 0x03FFDC00
 | 
					  m_text                (RX)  : ORIGIN = 0x60002400, LENGTH = 0x03FFDC00
 | 
				
			||||||
  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00020000
 | 
					  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00020000
 | 
				
			||||||
  m_data2               (RW)  : ORIGIN = 0x20200000, LENGTH = 0x00060000
 | 
					  m_data2               (RW)  : ORIGIN = 0x20200000, LENGTH = 0x00060000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m_sdram               (RW)  : ORIGIN = 0x80000000, LENGTH = 0x01E00000
 | 
				
			||||||
 | 
					  m_nocache             (RW)  : ORIGIN = 0x81E00000, LENGTH = 0x00200000
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define output sections */
 | 
					/* Define output sections */
 | 
				
			||||||
| 
						 | 
					@ -217,14 +220,14 @@ SECTIONS
 | 
				
			||||||
    *(NonCacheable.init)
 | 
					    *(NonCacheable.init)
 | 
				
			||||||
    . = ALIGN(4);
 | 
					    . = ALIGN(4);
 | 
				
			||||||
    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */
 | 
					    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */
 | 
				
			||||||
  } > m_data
 | 
					  } > m_nocache
 | 
				
			||||||
  . = __noncachedata_init_end__;
 | 
					  . = __noncachedata_init_end__;
 | 
				
			||||||
  .ncache :
 | 
					  .ncache :
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    *(NonCacheable)
 | 
					    *(NonCacheable)
 | 
				
			||||||
    . = ALIGN(4);
 | 
					    . = ALIGN(4);
 | 
				
			||||||
    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */
 | 
					    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */
 | 
				
			||||||
  } > m_data
 | 
					  } > m_nocache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
 | 
					  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
 | 
				
			||||||
  text_end = ORIGIN(m_text) + LENGTH(m_text);
 | 
					  text_end = ORIGIN(m_text) + LENGTH(m_text);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,15 @@ menuconfig BSP_USING_GPIO
 | 
				
			||||||
        source "$BSP_DIR/third_party_driver/gpio/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/gpio/Kconfig"
 | 
				
			||||||
    endif
 | 
					    endif
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					menuconfig BSP_USING_I2C
 | 
				
			||||||
 | 
					    bool "Using I2C device"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					    select RESOURCES_I2C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if BSP_USING_I2C
 | 
				
			||||||
 | 
					        source "$BSP_DIR/third_party_driver/i2c/Kconfig"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_LWIP
 | 
					menuconfig BSP_USING_LWIP
 | 
				
			||||||
    bool "Using LwIP device"
 | 
					    bool "Using LwIP device"
 | 
				
			||||||
    default n
 | 
					    default n
 | 
				
			||||||
| 
						 | 
					@ -40,6 +49,22 @@ menuconfig BSP_USING_SDIO
 | 
				
			||||||
    if BSP_USING_SDIO
 | 
					    if BSP_USING_SDIO
 | 
				
			||||||
        source "$BSP_DIR/third_party_driver/sdio/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/sdio/Kconfig"
 | 
				
			||||||
    endif
 | 
					    endif
 | 
				
			||||||
 | 
					menuconfig BSP_USING_LCD
 | 
				
			||||||
 | 
					    bool "Using LCD device"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					    select RESOURCES_LCD
 | 
				
			||||||
 | 
					    if BSP_USING_LCD
 | 
				
			||||||
 | 
					        source "$BSP_DIR/third_party_driver/lcd/Kconfig"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					menuconfig BSP_USING_TOUCH
 | 
				
			||||||
 | 
					    bool "Using TOUCH device"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					    select RESOURCES_TOUCH
 | 
				
			||||||
 | 
					    select BSP_USING_I2C
 | 
				
			||||||
 | 
					    select BSP_USING_LCD
 | 
				
			||||||
 | 
					    if BSP_USING_TOUCH
 | 
				
			||||||
 | 
					        source "$BSP_DIR/third_party_driver/touch/Kconfig"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_USB
 | 
					menuconfig BSP_USING_USB
 | 
				
			||||||
    bool "Using USB device"
 | 
					    bool "Using USB device"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,9 @@ endif
 | 
				
			||||||
ifeq ($(CONFIG_BSP_USING_SEMC),y)
 | 
					ifeq ($(CONFIG_BSP_USING_SEMC),y)
 | 
				
			||||||
  SRC_DIR += semc
 | 
					  SRC_DIR += semc
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_BSP_USING_I2C),y)
 | 
				
			||||||
 | 
					  SRC_DIR += i2c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_BSP_USING_LPUART),y)
 | 
					ifeq ($(CONFIG_BSP_USING_LPUART),y)
 | 
				
			||||||
  SRC_DIR += uart
 | 
					  SRC_DIR += uart
 | 
				
			||||||
| 
						 | 
					@ -24,6 +27,14 @@ ifeq ($(CONFIG_BSP_USING_USB),y)
 | 
				
			||||||
  SRC_DIR += usb
 | 
					  SRC_DIR += usb
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_BSP_USING_LCD),y)
 | 
				
			||||||
 | 
					  SRC_DIR += lcd
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_BSP_USING_TOUCH),y)
 | 
				
			||||||
 | 
					  SRC_DIR += touch
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_BSP_USING_WDT),y)
 | 
					ifeq ($(CONFIG_BSP_USING_WDT),y)
 | 
				
			||||||
  SRC_DIR += wdt
 | 
					  SRC_DIR += wdt
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -742,6 +742,359 @@ BOARD_InitPins:
 | 
				
			||||||
    pull_keeper_select: Pull, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_4, slew_rate: Fast}
 | 
					    pull_keeper_select: Pull, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_4, slew_rate: Fast}
 | 
				
			||||||
 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
 | 
					 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					void Lcd_InitPins(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    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_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 */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BOARD_InitI2C1Pins(void) {
 | 
				
			||||||
 | 
					  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03u */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,        /* GPIO_AD_B1_00 is configured as LPI2C1_SCL */
 | 
				
			||||||
 | 
					      1U);                                    /* Software Input On Field: Force input path of pad GPIO_AD_B1_00 */
 | 
				
			||||||
 | 
					  IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA,        /* GPIO_AD_B1_01 is configured as LPI2C1_SDA */
 | 
				
			||||||
 | 
					      1U);                                    /* Software Input On Field: Force input path of pad GPIO_AD_B1_01 */
 | 
				
			||||||
 | 
					  IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,        /* GPIO_AD_B1_00 PAD functional properties : */
 | 
				
			||||||
 | 
					      0xD8B0u);                               /* Slew Rate Field: Slow Slew Rate
 | 
				
			||||||
 | 
					                                                 Drive Strength Field: R0/6
 | 
				
			||||||
 | 
					                                                 Speed Field: medium(100MHz)
 | 
				
			||||||
 | 
					                                                 Open Drain Enable Field: Open Drain Enabled
 | 
				
			||||||
 | 
					                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
 | 
				
			||||||
 | 
					                                                 Pull / Keep Select Field: Keeper
 | 
				
			||||||
 | 
					                                                 Pull Up / Down Config. Field: 22K Ohm Pull Up
 | 
				
			||||||
 | 
					                                                 Hyst. Enable Field: Hysteresis Disabled */
 | 
				
			||||||
 | 
					  IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA,        /* GPIO_AD_B1_01 PAD functional properties : */
 | 
				
			||||||
 | 
					      0xD8B0u);                               /* Slew Rate Field: Slow Slew Rate
 | 
				
			||||||
 | 
					                                                 Drive Strength Field: R0/6
 | 
				
			||||||
 | 
					                                                 Speed Field: medium(100MHz)
 | 
				
			||||||
 | 
					                                                 Open Drain Enable Field: Open Drain Enabled
 | 
				
			||||||
 | 
					                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
 | 
				
			||||||
 | 
					                                                 Pull / Keep Select Field: Keeper
 | 
				
			||||||
 | 
					                                                 Pull Up / Down Config. Field: 22K Ohm Pull Up
 | 
				
			||||||
 | 
					                                                 Hyst. Enable Field: Hysteresis Disabled */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BOARD_InitUartPins(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LPUART1
 | 
				
			||||||
 | 
					    IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 is configured as LPUART1_TX */
 | 
				
			||||||
 | 
					        0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
				
			||||||
 | 
					    IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 is configured as LPUART1_RX */
 | 
				
			||||||
 | 
					        0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
				
			||||||
 | 
					    IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 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_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 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 */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LPUART2
 | 
				
			||||||
 | 
					    IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B1_02_LPUART2_TX,
 | 
				
			||||||
 | 
					        0U);
 | 
				
			||||||
 | 
					    IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B1_03_LPUART2_RX,
 | 
				
			||||||
 | 
					        0U);
 | 
				
			||||||
 | 
					    IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B1_02_LPUART2_TX,
 | 
				
			||||||
 | 
					        0x10B0u);
 | 
				
			||||||
 | 
					    IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					        IOMUXC_GPIO_AD_B1_03_LPUART2_RX,
 | 
				
			||||||
 | 
					        0x10B0u);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* FUNCTION ************************************************************************************************************
 | 
					/* FUNCTION ************************************************************************************************************
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -749,11 +1102,24 @@ BOARD_InitPins:
 | 
				
			||||||
 * Description   : Configures pin routing and optionally pin electrical features.
 | 
					 * Description   : Configures pin routing and optionally pin electrical features.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * END ****************************************************************************************************************/
 | 
					 * END ****************************************************************************************************************/
 | 
				
			||||||
void BOARD_InitPins(void) {
 | 
					void BOARD_InitPins(void) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03u */
 | 
					  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03u */
 | 
				
			||||||
                               /* Software Input On Field: Input Path is determined by functionality */
 | 
					                               /* Software Input On Field: Input Path is determined by functionality */
 | 
				
			||||||
  SemcPinmuxConfig();
 | 
					  SemcPinmuxConfig();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LPUART
 | 
				
			||||||
 | 
					    BOARD_InitUartPins();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LCD
 | 
				
			||||||
 | 
					  Lcd_InitPins();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_I2C
 | 
				
			||||||
 | 
					  BOARD_InitI2C1Pins();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IOMUXC_SetPinMux(
 | 
					  IOMUXC_SetPinMux(
 | 
				
			||||||
      IOMUXC_GPIO_AD_B0_03_GPIO1_IO03,        /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */
 | 
					      IOMUXC_GPIO_AD_B0_03_GPIO1_IO03,        /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */
 | 
				
			||||||
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
					      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
				
			||||||
| 
						 | 
					@ -951,51 +1317,7 @@ void BOARD_InitPins(void) {
 | 
				
			||||||
                                                 Hyst. Enable Field: Hysteresis Disabled */
 | 
					                                                 Hyst. Enable Field: Hysteresis Disabled */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BOARD_InitUartPins(void)
 | 
					
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef BSP_USING_LPUART1
 | 
					 | 
				
			||||||
    IOMUXC_SetPinMux(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 is configured as LPUART1_TX */
 | 
					 | 
				
			||||||
        0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
					 | 
				
			||||||
    IOMUXC_SetPinMux(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 is configured as LPUART1_RX */
 | 
					 | 
				
			||||||
        0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
					 | 
				
			||||||
    IOMUXC_SetPinConfig(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 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_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 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 */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef BSP_USING_LPUART2
 | 
					 | 
				
			||||||
    IOMUXC_SetPinMux(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B1_02_LPUART2_TX,
 | 
					 | 
				
			||||||
        0U);
 | 
					 | 
				
			||||||
    IOMUXC_SetPinMux(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B1_03_LPUART2_RX,
 | 
					 | 
				
			||||||
        0U);
 | 
					 | 
				
			||||||
    IOMUXC_SetPinConfig(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B1_02_LPUART2_TX,
 | 
					 | 
				
			||||||
        0x10B0u);
 | 
					 | 
				
			||||||
    IOMUXC_SetPinConfig(
 | 
					 | 
				
			||||||
        IOMUXC_GPIO_AD_B1_03_LPUART2_RX,
 | 
					 | 
				
			||||||
        0x10B0u);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***********************************************************************************************************************
 | 
					/***********************************************************************************************************************
 | 
				
			||||||
 * EOF
 | 
					 * EOF
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,6 @@ void ethernetif_clk_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const clock_enet_pll_config_t config = {.enableClkOutput = true, .enableClkOutput25M = false, .loopDivider = 1};
 | 
					    const clock_enet_pll_config_t config = {.enableClkOutput = true, .enableClkOutput25M = false, .loopDivider = 1};
 | 
				
			||||||
    CLOCK_InitEnetPll(&config);
 | 
					    CLOCK_InitEnetPll(&config);
 | 
				
			||||||
    SysTick_Config(USEC_TO_COUNT(1000U, CLOCK_GetFreq(kCLOCK_CoreSysClk)));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ethernetif_gpio_init(void)
 | 
					void ethernetif_gpio_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					if BSP_USING_I2C
 | 
				
			||||||
 | 
					    config I2C_BUS_NAME_1
 | 
				
			||||||
 | 
					        string "i2c bus 1 name"
 | 
				
			||||||
 | 
					        default "i2c1"
 | 
				
			||||||
 | 
					    config I2C_DRV_NAME_1
 | 
				
			||||||
 | 
					        string "i2c bus 1 driver name"
 | 
				
			||||||
 | 
					        default "i2c1_drv"
 | 
				
			||||||
 | 
					    config I2C_1_DEVICE_NAME_0
 | 
				
			||||||
 | 
					        string "i2c bus 1 device 0 name"
 | 
				
			||||||
 | 
					        default "i2c1_dev0"
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					SRC_FILES := connect_i2c.c hardware_i2c.c fsl_lpi2c.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,179 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2022 AIIT XUOS Lab
 | 
				
			||||||
 | 
					* XiUOS is licensed under Mulan PSL v2.
 | 
				
			||||||
 | 
					* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
				
			||||||
 | 
					* You may obtain a copy of Mulan PSL v2 at:
 | 
				
			||||||
 | 
					*        http://license.coscl.org.cn/MulanPSL2
 | 
				
			||||||
 | 
					* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					* See the Mulan PSL v2 for more details.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_i2c.c
 | 
				
			||||||
 | 
					* @brief support ok1052-c board i2c function and register to bus framework
 | 
				
			||||||
 | 
					* @version 1.0
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-03-01
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <board.h>
 | 
				
			||||||
 | 
					#include "bus_serial.h"
 | 
				
			||||||
 | 
					#include "connect_i2c.h"
 | 
				
			||||||
 | 
					#include "fsl_lpi2c.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 I2cWriteData(struct I2cHardwareDevice *i2c_dev, struct I2cDataStandard *msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    status_t ret;
 | 
				
			||||||
 | 
					    Stm32I2cType *param = (Stm32I2cType *)i2c_dev->haldev.private_data;
 | 
				
			||||||
 | 
					    ret = I2cHardwareWrite(param->base, param->slave_addr, param->sub_addr, msg->buf, msg->len);
 | 
				
			||||||
 | 
					    if(kStatus_Success == ret)
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 I2cReadData(struct I2cHardwareDevice *i2c_dev, struct I2cDataStandard *msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    status_t ret;
 | 
				
			||||||
 | 
					    Stm32I2cType *param = (Stm32I2cType *)i2c_dev->haldev.private_data;
 | 
				
			||||||
 | 
					    ret = I2cHardwareRead(param->base, i2c_dev->i2c_dev_addr, param->sub_addr, msg->buf, msg->len);
 | 
				
			||||||
 | 
					    if(kStatus_Success == ret)
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 I2cInit(struct I2cDriver *i2c_drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(i2c_drv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)i2c_drv->driver.owner_bus->owner_haldev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (configure_info->private_data) {
 | 
				
			||||||
 | 
					        i2c_dev->i2c_dev_addr = *((uint16 *)configure_info->private_data);
 | 
				
			||||||
 | 
					        return EOK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    i2c_print("I2cInit need set i2c dev addr\n");
 | 
				
			||||||
 | 
					    return ERROR;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 I2cDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(drv);
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(configure_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    struct I2cDriver *i2c_drv = (struct I2cDriver *)drv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (configure_info->configure_cmd)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case OPE_INT:
 | 
				
			||||||
 | 
					            ret = I2cInit(i2c_drv, configure_info);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*manage the i2c device operations*/
 | 
				
			||||||
 | 
					static const struct I2cDevDone i2c_dev_done =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    .dev_open = NONE,
 | 
				
			||||||
 | 
					    .dev_close = NONE,
 | 
				
			||||||
 | 
					    .dev_write = I2cWriteData,
 | 
				
			||||||
 | 
					    .dev_read = I2cReadData,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Init i2c bus*/
 | 
				
			||||||
 | 
					static int BoardI2cBusInit(struct I2cBus *i2c_bus, struct I2cDriver *i2c_driver)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the i2c bus */
 | 
				
			||||||
 | 
					    i2c_bus->private_data = (void *)NULL;
 | 
				
			||||||
 | 
					    ret = I2cBusInit(i2c_bus, I2C_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("BoardI2cBusInit I2cBusInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the i2c driver*/
 | 
				
			||||||
 | 
					    i2c_driver->private_data = (void *)NULL;
 | 
				
			||||||
 | 
					    ret = I2cDriverInit(i2c_driver, I2C_DRV_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("BoardI2cBusInit I2cDriverInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Attach the i2c driver to the i2c bus*/
 | 
				
			||||||
 | 
					    ret = I2cDriverAttachToBus(I2C_DRV_NAME_1, I2C_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("BoardI2cBusInit I2cDriverAttachToBus error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Attach the i2c device to the i2c bus*/
 | 
				
			||||||
 | 
					static int BoardI2cDevBend(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    static struct I2cHardwareDevice i2c_device0;
 | 
				
			||||||
 | 
					    memset(&i2c_device0, 0, sizeof(struct I2cHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    i2c_device0.i2c_dev_done = &i2c_dev_done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = I2cDeviceRegister(&i2c_device0, NONE, I2C_1_DEVICE_NAME_0);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("BoardI2cDevBend I2cDeviceInit device %s error %d\n", I2C_1_DEVICE_NAME_0, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = I2cDeviceAttachToBus(I2C_1_DEVICE_NAME_0, I2C_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("BoardI2cDevBend I2cDeviceAttachToBus device %s error %d\n", I2C_1_DEVICE_NAME_0, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*BOARD I2C INIT*/
 | 
				
			||||||
 | 
					int Imxrt1052HwI2cInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static int init_flag = 0;
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(init_flag)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    init_flag = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct I2cBus i2c_bus;
 | 
				
			||||||
 | 
					    memset(&i2c_bus, 0, sizeof(struct I2cBus));
 | 
				
			||||||
 | 
					    static struct I2cDriver i2c_driver;
 | 
				
			||||||
 | 
					    memset(&i2c_driver, 0, sizeof(struct I2cDriver));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_I2C
 | 
				
			||||||
 | 
					    i2c_driver.configure = I2cDrvConfigure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("board_i2c_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardI2cDevBend();
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        i2c_print("board_i2c_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2022 AIIT XUOS Lab
 | 
				
			||||||
 | 
					* XiUOS is licensed under Mulan PSL v2.
 | 
				
			||||||
 | 
					* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
				
			||||||
 | 
					* You may obtain a copy of Mulan PSL v2 at:
 | 
				
			||||||
 | 
					*        http://license.coscl.org.cn/MulanPSL2
 | 
				
			||||||
 | 
					* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					* See the Mulan PSL v2 for more details.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_i2c_eeprom.h
 | 
				
			||||||
 | 
					* @brief ok1052-c board eeprom relative codes
 | 
				
			||||||
 | 
					* @version 1.0
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-03-01
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "board.h"
 | 
				
			||||||
 | 
					#include "connect_i2c.h"
 | 
				
			||||||
 | 
					#include "fsl_lpi2c.h"
 | 
				
			||||||
 | 
					#include "pin_mux.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Definitions
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define I2C_EEPROM_BASE  LPI2C1
 | 
				
			||||||
 | 
					#define I2C_EEPROM_ADDR (0xA0 >> 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Code
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void I2cEEpromTestWrite(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t dat[8] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(I2cHardwareRead(I2C_EEPROM_BASE, I2C_EEPROM_ADDR, 0, dat, 8) == kStatus_Success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        i2c_print("Read from EEPROM %d %d %d %d %d %d %d %d\r\n",
 | 
				
			||||||
 | 
					            dat[0], dat[1], dat[2], dat[3], dat[4], dat[5], dat[6], dat[7]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(uint8_t i = 0; i < 8; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        dat[i] ++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(I2cHardwareWrite(I2C_EEPROM_BASE, I2C_EEPROM_ADDR, 0, dat, 8) == kStatus_Success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        i2c_print("Write  to EEPROM %d %d %d %d %d %d %d %d\r\n",
 | 
				
			||||||
 | 
					            dat[0], dat[1], dat[2], dat[3], dat[4], dat[5], dat[6], dat[7]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(dat, 0, 8);
 | 
				
			||||||
 | 
					    if(I2cHardwareRead(I2C_EEPROM_BASE, I2C_EEPROM_ADDR, 0, dat, 8) == kStatus_Success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        i2c_print("Read from EEPROM %d %d %d %d %d %d %d %d\r\n",
 | 
				
			||||||
 | 
					            dat[0], dat[1], dat[2], dat[3], dat[4], dat[5], dat[6], dat[7]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int I2cEEpromTest(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    BOARD_InitI2C1Pins();
 | 
				
			||||||
 | 
					    I2cHardwareInit();
 | 
				
			||||||
 | 
					    I2cEEpromTestWrite();
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)| SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)| SHELL_CMD_PARAM_NUM(0),
 | 
				
			||||||
 | 
					                   eeprom, I2cEEpromTest, test i2c eeprom);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,94 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The Clear BSD License
 | 
				
			||||||
 | 
					 * Copyright (c) 2016, Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					 * Copyright 2016-2017 NXP
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without modification,
 | 
				
			||||||
 | 
					 * are permitted (subject to the limitations in the disclaimer below) provided
 | 
				
			||||||
 | 
					 *  that the following conditions are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * o Redistributions of source code must retain the above copyright notice, this list
 | 
				
			||||||
 | 
					 *   of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * o Redistributions in binary form must reproduce the above copyright notice, this
 | 
				
			||||||
 | 
					 *   list of conditions and the following disclaimer in the documentation and/or
 | 
				
			||||||
 | 
					 *   other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * o Neither the name of the copyright holder nor the names of its
 | 
				
			||||||
 | 
					 *   contributors may be used to endorse or promote products derived from this
 | 
				
			||||||
 | 
					 *   software without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
				
			||||||
 | 
					 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
				
			||||||
 | 
					 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file hardware_i2c.c
 | 
				
			||||||
 | 
					* @brief ok1052-c i2c board relative codes
 | 
				
			||||||
 | 
					* @version 1.0
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-03-01
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fsl_common.h"
 | 
				
			||||||
 | 
					#include "fsl_lpi2c.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define I2C_BASE  LPI2C1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Select USB1 PLL (480 MHz) as master lpi2c clock source */
 | 
				
			||||||
 | 
					#define LPI2C_CLOCK_SOURCE_SELECT (0U)
 | 
				
			||||||
 | 
					/* Clock divider for master lpi2c clock source */
 | 
				
			||||||
 | 
					#define LPI2C_CLOCK_SOURCE_DIVIDER (5U)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define I2C_CLOCK_FREQ ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 8) / (LPI2C_CLOCK_SOURCE_DIVIDER + 1U))
 | 
				
			||||||
 | 
					#define I2C_BAUDRATE 100000U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void I2cHardwareInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    lpi2c_master_config_t masterConfig = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LPI2C_MasterGetDefaultConfig(&masterConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Change the default baudrate configuration */
 | 
				
			||||||
 | 
					    masterConfig.baudRate_Hz = I2C_BAUDRATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Initialize the LPI2C master peripheral */
 | 
				
			||||||
 | 
					    LPI2C_MasterInit(I2C_BASE, &masterConfig, I2C_CLOCK_FREQ);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					status_t I2cHardwareWrite(LPI2C_Type* base, uint16_t slave_addr, uint32_t subAdd, uint8_t* dataBuff, uint16_t dataLen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    lpi2c_master_transfer_t xfer;
 | 
				
			||||||
 | 
					    xfer.slaveAddress = slave_addr;
 | 
				
			||||||
 | 
					    xfer.direction = kLPI2C_Write;
 | 
				
			||||||
 | 
					    xfer.subaddress = subAdd;
 | 
				
			||||||
 | 
					    xfer.subaddressSize = 0x01;
 | 
				
			||||||
 | 
					    xfer.data = dataBuff;
 | 
				
			||||||
 | 
					    xfer.dataSize = dataLen;
 | 
				
			||||||
 | 
					    xfer.flags = kLPI2C_TransferDefaultFlag;
 | 
				
			||||||
 | 
					    return LPI2C_MasterTransferBlocking(base, &xfer);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					status_t I2cHardwareRead(LPI2C_Type* base, uint16_t slave_addr, uint32_t subAdd, uint8_t* dataBuffer, uint16_t dataLen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    lpi2c_master_transfer_t masterXfer = {0};
 | 
				
			||||||
 | 
					    masterXfer.slaveAddress = slave_addr;
 | 
				
			||||||
 | 
					    masterXfer.direction = kLPI2C_Read;
 | 
				
			||||||
 | 
					    masterXfer.subaddress = subAdd;
 | 
				
			||||||
 | 
					    masterXfer.subaddressSize = 0x01;
 | 
				
			||||||
 | 
					    masterXfer.data = dataBuffer;
 | 
				
			||||||
 | 
					    masterXfer.dataSize = dataLen;
 | 
				
			||||||
 | 
					    masterXfer.flags = kLPI2C_TransferDefaultFlag;
 | 
				
			||||||
 | 
					    return LPI2C_MasterTransferBlocking(base, &masterXfer);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,46 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2021 AIIT XUOS Lab
 | 
				
			||||||
 | 
					* XiUOS is licensed under Mulan PSL v2.
 | 
				
			||||||
 | 
					* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
				
			||||||
 | 
					* You may obtain a copy of Mulan PSL v2 at:
 | 
				
			||||||
 | 
					*        http://license.coscl.org.cn/MulanPSL2
 | 
				
			||||||
 | 
					* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					* See the Mulan PSL v2 for more details.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_i2c.h
 | 
				
			||||||
 | 
					* @brief define ok1052-c board i2c function and struct
 | 
				
			||||||
 | 
					* @version 1.0
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONNECT_I2C_H
 | 
				
			||||||
 | 
					#define CONNECT_I2C_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <device.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct Stm32I2c
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    LPI2C_Type* base;
 | 
				
			||||||
 | 
					    uint16_t slave_addr;
 | 
				
			||||||
 | 
					    uint32_t sub_addr;
 | 
				
			||||||
 | 
					}Stm32I2cType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define i2c_print KPrintf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Imxrt1052HwI2cInit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_lcd.h
 | 
				
			||||||
 | 
					* @brief define xidatong lcd function
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XiUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONNECT_LCD_H
 | 
				
			||||||
 | 
					#define CONNECT_LCD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <device.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_TOUCH
 | 
				
			||||||
 | 
					#include "connect_touch.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Imxrt1052HwLcdInit(void);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_touch.c
 | 
				
			||||||
 | 
					* @brief support xidatong touch function and register to bus framework
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONNECT_TOUCH_H
 | 
				
			||||||
 | 
					#define CONNECT_TOUCH_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <device.h>	 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 表示读数据 */ 
 | 
				
			||||||
 | 
					#define I2C_M_RD		0x0001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct i2c_msg {
 | 
				
			||||||
 | 
						uint8_t addr;		/*从设备的I2C设备地址 */
 | 
				
			||||||
 | 
						uint16_t flags;	    /*控制标志 */
 | 
				
			||||||
 | 
						uint16_t len;		/*读写数据的长度	*/
 | 
				
			||||||
 | 
						uint8_t *buf;		/*存储读写数据的指针 */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int  X;
 | 
				
			||||||
 | 
					  int  Y;
 | 
				
			||||||
 | 
					}POINT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _touch_event
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kTouch_Down = 0,    /*!< The state changed to touched. */
 | 
				
			||||||
 | 
					    kTouch_Up = 1,      /*!< The state changed to not touched. */
 | 
				
			||||||
 | 
					    kTouch_Contact = 2, /*!< There is a continuous touch being detected. */
 | 
				
			||||||
 | 
					    kTouch_Reserved = 3 /*!< No touch information available. */
 | 
				
			||||||
 | 
					} touch_event_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*设定使用的电容屏IIC设备地址*/
 | 
				
			||||||
 | 
					#define GTP_ADDRESS            0xBA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GTP_MAX_HEIGHT   272
 | 
				
			||||||
 | 
					#define GTP_MAX_WIDTH    480
 | 
				
			||||||
 | 
					#define GTP_INT_TRIGGER  0
 | 
				
			||||||
 | 
					#define GTP_MAX_TOUCH    5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GTP_CONFIG_MAX_LENGTH 240
 | 
				
			||||||
 | 
					#define GTP_ADDR_LENGTH       2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Registers define
 | 
				
			||||||
 | 
					#define GTP_READ_COOR_ADDR    0x814E
 | 
				
			||||||
 | 
					#define GTP_REG_SLEEP         0x8040
 | 
				
			||||||
 | 
					#define GTP_REG_SENSOR_ID     0x814A
 | 
				
			||||||
 | 
					#define GTP_REG_CONFIG_DATA   0x8047
 | 
				
			||||||
 | 
					#define GTP_REG_VERSION       0x8140
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CFG_GROUP_LEN(p_cfg_grp)  (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int HwTouchInit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,750 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright  2017 NXP
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: BSD-3-Clause
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _FSL_ELCDIF_H_
 | 
				
			||||||
 | 
					#define _FSL_ELCDIF_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fsl_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @addtogroup elcdif
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Definitions
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! @name Driver version */
 | 
				
			||||||
 | 
					/*@{*/
 | 
				
			||||||
 | 
					/*! @brief eLCDIF driver version */
 | 
				
			||||||
 | 
					#define FSL_ELCDIF_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) /*!< Version 2.0.1. */
 | 
				
			||||||
 | 
					/*@}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* All IRQ flags in CTRL1 register. */
 | 
				
			||||||
 | 
					#define ELCDIF_CTRL1_IRQ_MASK                                                                         \
 | 
				
			||||||
 | 
					    (LCDIF_CTRL1_BM_ERROR_IRQ_MASK | LCDIF_CTRL1_OVERFLOW_IRQ_MASK | LCDIF_CTRL1_UNDERFLOW_IRQ_MASK | \
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK | LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* All IRQ enable control bits in CTRL1 register. */
 | 
				
			||||||
 | 
					#define ELCDIF_CTRL1_IRQ_EN_MASK                                                                               \
 | 
				
			||||||
 | 
					    (LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK | LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK | LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK | \
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK | LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* All IRQ flags in AS_CTRL register. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK)
 | 
				
			||||||
 | 
					#define ELCDIF_AS_CTRL_IRQ_MASK (LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define ELCDIF_AS_CTRL_IRQ_MASK 0U
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* All IRQ enable control bits in AS_CTRL register. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK)
 | 
				
			||||||
 | 
					#define ELCDIF_AS_CTRL_IRQ_EN_MASK (LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define ELCDIF_AS_CTRL_IRQ_EN_MASK 0U
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if ((ELCDIF_CTRL1_IRQ_MASK & ELCDIF_AS_CTRL_IRQ_MASK) || (ELCDIF_AS_CTRL_IRQ_MASK & ELCDIF_AS_CTRL_IRQ_EN_MASK))
 | 
				
			||||||
 | 
					#error Interrupt bits overlap, need to update the interrupt functions.
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* LUT memory entery number. */
 | 
				
			||||||
 | 
					#define ELCDIF_LUT_ENTRY_NUM 256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF signal polarity flags
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum _elcdif_polarity_flags
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_VsyncActiveLow            = 0U,                            /*!< VSYNC active low. */
 | 
				
			||||||
 | 
					    kELCDIF_VsyncActiveHigh           = LCDIF_VDCTRL0_VSYNC_POL_MASK,  /*!< VSYNC active high. */
 | 
				
			||||||
 | 
					    kELCDIF_HsyncActiveLow            = 0U,                            /*!< HSYNC active low. */
 | 
				
			||||||
 | 
					    kELCDIF_HsyncActiveHigh           = LCDIF_VDCTRL0_HSYNC_POL_MASK,  /*!< HSYNC active high. */
 | 
				
			||||||
 | 
					    kELCDIF_DataEnableActiveLow       = 0U,                            /*!< Data enable line active low. */
 | 
				
			||||||
 | 
					    kELCDIF_DataEnableActiveHigh      = LCDIF_VDCTRL0_ENABLE_POL_MASK, /*!< Data enable line active high. */
 | 
				
			||||||
 | 
					    kELCDIF_DriveDataOnFallingClkEdge = 0U, /*!< Drive data on falling clock edge, capture data
 | 
				
			||||||
 | 
					                                                 on rising clock edge. */
 | 
				
			||||||
 | 
					    kELCDIF_DriveDataOnRisingClkEdge = LCDIF_VDCTRL0_DOTCLK_POL_MASK, /*!< Drive data on falling
 | 
				
			||||||
 | 
					                                                                        clock edge, capture data
 | 
				
			||||||
 | 
					                                                                        on rising clock edge. */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief The eLCDIF interrupts to enable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum _elcdif_interrupt_enable
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_BusMasterErrorInterruptEnable  = LCDIF_CTRL1_BM_ERROR_IRQ_EN_MASK,  /*!< Bus master error interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoOverflowInterruptEnable  = LCDIF_CTRL1_OVERFLOW_IRQ_EN_MASK,  /*!< TXFIFO overflow interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoUnderflowInterruptEnable = LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK, /*!< TXFIFO underflow interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_CurFrameDoneInterruptEnable =
 | 
				
			||||||
 | 
					        LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN_MASK, /*!< Interrupt when hardware enters vertical blanking state. */
 | 
				
			||||||
 | 
					    kELCDIF_VsyncEdgeInterruptEnable =
 | 
				
			||||||
 | 
					        LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN_MASK, /*!< Interrupt when hardware encounters VSYNC edge. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK)
 | 
				
			||||||
 | 
					    kELCDIF_SciSyncOnInterruptEnable =
 | 
				
			||||||
 | 
					        LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_EN_MASK, /*!< Interrupt when eLCDIF lock with CSI input. */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief The eLCDIF interrupt status flags.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum _elcdif_interrupt_flags
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_BusMasterError  = LCDIF_CTRL1_BM_ERROR_IRQ_MASK,  /*!< Bus master error interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoOverflow  = LCDIF_CTRL1_OVERFLOW_IRQ_MASK,  /*!< TXFIFO overflow interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoUnderflow = LCDIF_CTRL1_UNDERFLOW_IRQ_MASK, /*!< TXFIFO underflow interrupt. */
 | 
				
			||||||
 | 
					    kELCDIF_CurFrameDone =
 | 
				
			||||||
 | 
					        LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_MASK,             /*!< Interrupt when hardware enters vertical blanking state. */
 | 
				
			||||||
 | 
					    kELCDIF_VsyncEdge = LCDIF_CTRL1_VSYNC_EDGE_IRQ_MASK, /*!< Interrupt when hardware encounters VSYNC edge. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK)
 | 
				
			||||||
 | 
					    kELCDIF_SciSyncOn = LCDIF_AS_CTRL_CSI_SYNC_ON_IRQ_MASK, /*!< Interrupt when eLCDIF lock with CSI input. */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF status flags
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum _elcdif_status_flags
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_LFifoFull   = LCDIF_STAT_LFIFO_FULL_MASK,   /*!< LFIFO full. */
 | 
				
			||||||
 | 
					    kELCDIF_LFifoEmpty  = LCDIF_STAT_LFIFO_EMPTY_MASK,  /*!< LFIFO empty. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoFull  = LCDIF_STAT_TXFIFO_FULL_MASK,  /*!< TXFIFO full. */
 | 
				
			||||||
 | 
					    kELCDIF_TxFifoEmpty = LCDIF_STAT_TXFIFO_EMPTY_MASK, /*!< TXFIFO empty. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_STAT_BUSY_MASK)
 | 
				
			||||||
 | 
					    kELCDIF_LcdControllerBusy = LCDIF_STAT_BUSY_MASK, /*!< The external LCD controller busy signal. */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(LCDIF_STAT_DVI_CURRENT_FIELD_MASK)
 | 
				
			||||||
 | 
					    kELCDIF_CurDviField2 = LCDIF_STAT_DVI_CURRENT_FIELD_MASK, /*!< Current DVI filed, if set, then current filed is 2,
 | 
				
			||||||
 | 
					                                                               otherwise current filed is 1. */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief The pixel format.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This enumerator should be defined together with the array s_pixelFormatReg.
 | 
				
			||||||
 | 
					 * To support new pixel format, enhance this enumerator and s_pixelFormatReg.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum _elcdif_pixel_format
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_PixelFormatRAW8   = 0,   /*!< RAW 8 bit, four data use 32 bits. */
 | 
				
			||||||
 | 
					    kELCDIF_PixelFormatRGB565 = 1,   /*!< RGB565, two pixel use 32 bits. */
 | 
				
			||||||
 | 
					    kELCDIF_PixelFormatRGB666 = 2,   /*!< RGB666 unpacked, one pixel uses 32 bits, high byte unused,
 | 
				
			||||||
 | 
					                                          upper 2 bits of other bytes unused. */
 | 
				
			||||||
 | 
					    kELCDIF_PixelFormatXRGB8888 = 3, /*!< XRGB8888 unpacked, one pixel uses 32 bits, high byte unused. */
 | 
				
			||||||
 | 
					    kELCDIF_PixelFormatRGB888   = 4, /*!< RGB888 packed, one pixel uses 24 bits. */
 | 
				
			||||||
 | 
					} elcdif_pixel_format_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! @brief The LCD data bus type.  */
 | 
				
			||||||
 | 
					typedef enum _elcdif_lcd_data_bus
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_DataBus8Bit  = LCDIF_CTRL_LCD_DATABUS_WIDTH(1), /*!< 8-bit data bus. */
 | 
				
			||||||
 | 
					    kELCDIF_DataBus16Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(0), /*!< 16-bit data bus, support RGB565. */
 | 
				
			||||||
 | 
					    kELCDIF_DataBus18Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(2), /*!< 18-bit data bus, support RGB666. */
 | 
				
			||||||
 | 
					    kELCDIF_DataBus24Bit = LCDIF_CTRL_LCD_DATABUS_WIDTH(3), /*!< 24-bit data bus, support RGB888. */
 | 
				
			||||||
 | 
					} elcdif_lcd_data_bus_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief The register value when using different pixel format.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * These register bits control the pixel format:
 | 
				
			||||||
 | 
					 * - CTRL[DATA_FORMAT_24_BIT]
 | 
				
			||||||
 | 
					 * - CTRL[DATA_FORMAT_18_BIT]
 | 
				
			||||||
 | 
					 * - CTRL[DATA_FORMAT_16_BIT]
 | 
				
			||||||
 | 
					 * - CTRL[WORD_LENGTH]
 | 
				
			||||||
 | 
					 * - CTRL1[BYTE_PACKING_FORMAT]
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef struct _elcdif_pixel_format_reg
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t regCtrl;  /*!< Value of register CTRL. */
 | 
				
			||||||
 | 
					    uint32_t regCtrl1; /*!< Value of register CTRL1. */
 | 
				
			||||||
 | 
					} elcdif_pixel_format_reg_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF configure structure for RGB mode (DOTCLK mode).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef struct _elcdif_rgb_mode_config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t panelWidth;    /*!< Display panel width, pixels per line. */
 | 
				
			||||||
 | 
					    uint16_t panelHeight;   /*!< Display panel height, how many lines per panel. */
 | 
				
			||||||
 | 
					    uint8_t hsw;            /*!< HSYNC pulse width. */
 | 
				
			||||||
 | 
					    uint8_t hfp;            /*!< Horizontal front porch. */
 | 
				
			||||||
 | 
					    uint8_t hbp;            /*!< Horizontal back porch. */
 | 
				
			||||||
 | 
					    uint8_t vsw;            /*!< VSYNC pulse width. */
 | 
				
			||||||
 | 
					    uint8_t vfp;            /*!< Vrtical front porch. */
 | 
				
			||||||
 | 
					    uint8_t vbp;            /*!< Vertical back porch. */
 | 
				
			||||||
 | 
					    uint32_t polarityFlags; /*!< OR'ed value of @ref _elcdif_polarity_flags, used to contol the signal polarity. */
 | 
				
			||||||
 | 
					    uint32_t bufferAddr;    /*!< Frame buffer address. */
 | 
				
			||||||
 | 
					    elcdif_pixel_format_t pixelFormat; /*!< Pixel format. */
 | 
				
			||||||
 | 
					    elcdif_lcd_data_bus_t dataBus;     /*!< LCD data bus. */
 | 
				
			||||||
 | 
					} elcdif_rgb_mode_config_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF alpha surface pixel format.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum _elcdif_as_pixel_format
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatARGB8888 = 0x0, /*!< 32-bit pixels with alpha. */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatRGB888   = 0x4, /*!< 32-bit pixels without alpha (unpacked 24-bit format) */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatARGB1555 = 0x8, /*!< 16-bit pixels with alpha. */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatARGB4444 = 0x9, /*!< 16-bit pixels with alpha. */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatRGB555   = 0xC, /*!< 16-bit pixels without alpha. */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatRGB444   = 0xD, /*!< 16-bit pixels without alpha. */
 | 
				
			||||||
 | 
					    kELCDIF_AsPixelFormatRGB565   = 0xE, /*!< 16-bit pixels without alpha. */
 | 
				
			||||||
 | 
					} elcdif_as_pixel_format_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF alpha surface buffer configuration.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef struct _elcdif_as_buffer_config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t bufferAddr;                  /*!< Buffer address. */
 | 
				
			||||||
 | 
					    elcdif_as_pixel_format_t pixelFormat; /*!< Pixel format. */
 | 
				
			||||||
 | 
					} elcdif_as_buffer_config_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF alpha mode during blending.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum _elcdif_alpha_mode
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_AlphaEmbedded, /*!< The alpha surface pixel alpha value will be used for blend. */
 | 
				
			||||||
 | 
					    kELCDIF_AlphaOverride, /*!< The user defined alpha value will be used for blend directly. */
 | 
				
			||||||
 | 
					    kELCDIF_AlphaMultiply, /*!< The alpha surface pixel alpha value scaled the user defined
 | 
				
			||||||
 | 
					                             alpha value will be used for blend, for example, pixel alpha set
 | 
				
			||||||
 | 
					                             set to 200, user defined alpha set to 100, then the reault alpha
 | 
				
			||||||
 | 
					                             is 200 * 100 / 255. */
 | 
				
			||||||
 | 
					    kELCDIF_AlphaRop       /*!< Raster operation. */
 | 
				
			||||||
 | 
					} elcdif_alpha_mode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF ROP mode during blending.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Explanation:
 | 
				
			||||||
 | 
					 * - AS: Alpha surface
 | 
				
			||||||
 | 
					 * - PS: Process surface
 | 
				
			||||||
 | 
					 * - nAS: Alpha surface NOT value
 | 
				
			||||||
 | 
					 * - nPS: Process surface NOT value
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum _elcdif_rop_mode
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_RopMaskAs     = 0x0, /*!< AS AND PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopMaskNotAs  = 0x1, /*!< nAS AND PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopMaskAsNot  = 0x2, /*!< AS AND nPS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopMergeAs    = 0x3, /*!< AS OR PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopMergeNotAs = 0x4, /*!< nAS OR PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopMergeAsNot = 0x5, /*!< AS OR nPS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopNotCopyAs  = 0x6, /*!< nAS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopNot        = 0x7, /*!< nPS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopNotMaskAs  = 0x8, /*!< AS NAND PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopNotMergeAs = 0x9, /*!< AS NOR PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopXorAs      = 0xA, /*!< AS XOR PS. */
 | 
				
			||||||
 | 
					    kELCDIF_RopNotXorAs   = 0xB  /*!< AS XNOR PS. */
 | 
				
			||||||
 | 
					} elcdif_rop_mode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF alpha surface blending configuration.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef struct _elcdif_as_blend_config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t alpha;    /*!< User defined alpha value, only used when @ref alphaMode is @ref kELCDIF_AlphaOverride or @ref
 | 
				
			||||||
 | 
					                         kELCDIF_AlphaRop. */
 | 
				
			||||||
 | 
					    bool invertAlpha; /*!< Set true to invert the alpha. */
 | 
				
			||||||
 | 
					    elcdif_alpha_mode_t alphaMode; /*!< Alpha mode. */
 | 
				
			||||||
 | 
					    elcdif_rop_mode_t ropMode;     /*!< ROP mode, only valid when @ref alphaMode is @ref kELCDIF_AlphaRop. */
 | 
				
			||||||
 | 
					} elcdif_as_blend_config_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief eLCDIF LUT
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The Lookup Table (LUT) is used to expand the 8 bits pixel to 24 bits pixel
 | 
				
			||||||
 | 
					 * before output to external displayer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * There are two 256x24 bits LUT memory in LCDIF, the LSB of frame buffer address
 | 
				
			||||||
 | 
					 * determins which memory to use.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum _elcdif_lut
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kELCDIF_Lut0 = 0, /*!< LUT 0. */
 | 
				
			||||||
 | 
					    kELCDIF_Lut1,     /*!< LUT 1. */
 | 
				
			||||||
 | 
					} elcdif_lut_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * APIs
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__cplusplus)
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif /* __cplusplus */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name eLCDIF initialization and de-initialization
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Initializes the eLCDIF to work in RGB mode (DOTCLK mode).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function ungates the eLCDIF clock and configures the eLCDIF peripheral according
 | 
				
			||||||
 | 
					 * to the configuration structure.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeInit(LCDIF_Type *base, const elcdif_rgb_mode_config_t *config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Gets the eLCDIF default configuration structure for RGB (DOTCLK) mode.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function sets the configuration structure to default values.
 | 
				
			||||||
 | 
					 * The default configuration is set to the following values.
 | 
				
			||||||
 | 
					 * @code
 | 
				
			||||||
 | 
					    config->panelWidth = 480U;
 | 
				
			||||||
 | 
					    config->panelHeight = 272U;
 | 
				
			||||||
 | 
					    config->hsw = 41;
 | 
				
			||||||
 | 
					    config->hfp = 4;
 | 
				
			||||||
 | 
					    config->hbp = 8;
 | 
				
			||||||
 | 
					    config->vsw = 10;
 | 
				
			||||||
 | 
					    config->vfp = 4;
 | 
				
			||||||
 | 
					    config->vbp = 2;
 | 
				
			||||||
 | 
					    config->polarityFlags = kELCDIF_VsyncActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_HsyncActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_DataEnableActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_DriveDataOnFallingClkEdge;
 | 
				
			||||||
 | 
					    config->bufferAddr = 0U;
 | 
				
			||||||
 | 
					    config->pixelFormat = kELCDIF_PixelFormatRGB888;
 | 
				
			||||||
 | 
					    config->dataBus = kELCDIF_DataBus24Bit;
 | 
				
			||||||
 | 
					    @code
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param config Pointer to the eLCDIF configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeGetDefaultConfig(elcdif_rgb_mode_config_t *config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Deinitializes the eLCDIF peripheral.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_Deinit(LCDIF_Type *base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name Module operation
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the pixel format in RGB (DOTCLK) mode.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param pixelFormat The pixel format.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeSetPixelFormat(LCDIF_Type *base, elcdif_pixel_format_t pixelFormat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Start to display in RGB (DOTCLK) mode.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_RgbModeStart(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->CTRL_SET = LCDIF_CTRL_RUN_MASK | LCDIF_CTRL_DOTCLK_MODE_MASK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Stop display in RGB (DOTCLK) mode and wait until finished.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeStop(LCDIF_Type *base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the next frame buffer address to display.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param bufferAddr The frame buffer address to set.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_SetNextBufferAddr(LCDIF_Type *base, uint32_t bufferAddr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->NEXT_BUF = bufferAddr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Reset the eLCDIF peripheral.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_Reset(LCDIF_Type *base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_RESET_PIN) && FSL_FEATURE_LCDIF_HAS_NO_RESET_PIN)
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Pull up or down the reset pin for the externel LCD controller.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param pullUp True to pull up reset pin, false to pull down.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_PullUpResetPin(LCDIF_Type *base, bool pullUp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (pullUp)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->CTRL1_SET = LCDIF_CTRL1_RESET_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->CTRL1_CLR = LCDIF_CTRL1_RESET_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enable or disable the hand shake with PXP.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param enable True to enable, false to disable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnablePxpHandShake(LCDIF_Type *base, bool enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (enable)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->CTRL_SET = LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->CTRL_CLR = LCDIF_CTRL_ENABLE_PXP_HANDSHAKE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name Status
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get the CRC value of the frame sent out.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * When a frame is sent complete (the interrupt @ref kELCDIF_CurFrameDone assert), this function
 | 
				
			||||||
 | 
					 * can be used to get the CRC value of the frame sent.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @return The CRC value.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note The CRC value is dependent on the LCD_DATABUS_WIDTH.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t ELCDIF_GetCrcValue(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return base->CRC_STAT;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get the bus master error virtual address.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * When bus master error occurs (the interrupt kELCDIF_BusMasterError assert), this function
 | 
				
			||||||
 | 
					 * can get the virtual address at which the AXI master received an error
 | 
				
			||||||
 | 
					 * response from the slave.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @return The error virtual address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t ELCDIF_GetBusMasterErrorAddr(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return base->BM_ERROR_STAT;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get the eLCDIF status.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The status flags are returned as a mask value, application could check the
 | 
				
			||||||
 | 
					 * corresponding bit. Example:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @code
 | 
				
			||||||
 | 
					   uint32_t statusFlags;
 | 
				
			||||||
 | 
					   statusFlags = ELCDIF_GetStatus(LCDIF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   // If LFIFO is full.
 | 
				
			||||||
 | 
					   if (kELCDIF_LFifoFull & statusFlags)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       // ...;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   // If TXFIFO is empty.
 | 
				
			||||||
 | 
					   if (kELCDIF_TxFifoEmpty & statusFlags)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       // ...;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   @endcode
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @return The mask value of status flags, it is OR'ed value of @ref _elcdif_status_flags.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t ELCDIF_GetStatus(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return base->STAT & (LCDIF_STAT_LFIFO_FULL_MASK | LCDIF_STAT_LFIFO_EMPTY_MASK | LCDIF_STAT_TXFIFO_FULL_MASK |
 | 
				
			||||||
 | 
					                         LCDIF_STAT_TXFIFO_EMPTY_MASK
 | 
				
			||||||
 | 
					#if defined(LCDIF_STAT_BUSY_MASK)
 | 
				
			||||||
 | 
					                         | LCDIF_STAT_BUSY_MASK
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(LCDIF_STAT_DVI_CURRENT_FIELD_MASK)
 | 
				
			||||||
 | 
					                         | LCDIF_STAT_DVI_CURRENT_FIELD_MASK
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get current count in Latency buffer (LFIFO).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @return The LFIFO current count
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t ELCDIF_GetLFifoCount(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (base->STAT & LCDIF_STAT_LFIFO_COUNT_MASK) >> LCDIF_STAT_LFIFO_COUNT_SHIFT;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name Interrupts
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enables eLCDIF interrupt requests.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param mask interrupt source, OR'ed value of _elcdif_interrupt_enable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnableInterrupts(LCDIF_Type *base, uint32_t mask)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->CTRL1_SET = (mask & ELCDIF_CTRL1_IRQ_EN_MASK);
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					    base->AS_CTRL |= (mask & ELCDIF_AS_CTRL_IRQ_EN_MASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Disables eLCDIF interrupt requests.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param mask interrupt source, OR'ed value of _elcdif_interrupt_enable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_DisableInterrupts(LCDIF_Type *base, uint32_t mask)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->CTRL1_CLR = (mask & ELCDIF_CTRL1_IRQ_EN_MASK);
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					    base->AS_CTRL &= ~(mask & ELCDIF_AS_CTRL_IRQ_EN_MASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get eLCDIF interrupt peding status.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @return Interrupt pending status, OR'ed value of _elcdif_interrupt_flags.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline uint32_t ELCDIF_GetInterruptStatus(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    flags = (base->CTRL1 & ELCDIF_CTRL1_IRQ_MASK);
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					    flags |= (base->AS_CTRL & ELCDIF_AS_CTRL_IRQ_MASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return flags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Clear eLCDIF interrupt peding status.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param mask of the flags to clear, OR'ed value of _elcdif_interrupt_flags.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_ClearInterruptStatus(LCDIF_Type *base, uint32_t mask)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->CTRL1_CLR = (mask & ELCDIF_CTRL1_IRQ_MASK);
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					    base->AS_CTRL &= ~(mask & ELCDIF_AS_CTRL_IRQ_MASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name Alpha surface
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the configuration for alpha surface buffer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_SetAlphaSurfaceBufferConfig(LCDIF_Type *base, const elcdif_as_buffer_config_t *config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the alpha surface blending configuration.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_SetAlphaSurfaceBlendConfig(LCDIF_Type *base, const elcdif_as_blend_config_t *config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the next alpha surface buffer address.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param bufferAddr Alpha surface buffer address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_SetNextAlphaSurfaceBufferAddr(LCDIF_Type *base, uint32_t bufferAddr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->AS_NEXT_BUF = bufferAddr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Set the overlay color key.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If a pixel in the current overlay image with a color that falls in the range
 | 
				
			||||||
 | 
					 * from the @p colorKeyLow to @p colorKeyHigh range, it will use the process surface
 | 
				
			||||||
 | 
					 * pixel value for that location.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param colorKeyLow Color key low range.
 | 
				
			||||||
 | 
					 * @param colorKeyHigh Color key high range.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note Colorkey operations are higher priority than alpha or ROP operations
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_SetOverlayColorKey(LCDIF_Type *base, uint32_t colorKeyLow, uint32_t colorKeyHigh)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->AS_CLRKEYLOW  = colorKeyLow;
 | 
				
			||||||
 | 
					    base->AS_CLRKEYHIGH = colorKeyHigh;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enable or disable the color key.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param enable True to enable, false to disable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnableOverlayColorKey(LCDIF_Type *base, bool enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (enable)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL |= LCDIF_AS_CTRL_ENABLE_COLORKEY_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL &= ~LCDIF_AS_CTRL_ENABLE_COLORKEY_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enable or disable the alpha surface.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param enable True to enable, false to disable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnableAlphaSurface(LCDIF_Type *base, bool enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (enable)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL |= LCDIF_AS_CTRL_AS_ENABLE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL &= ~LCDIF_AS_CTRL_AS_ENABLE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enable or disable the process surface.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Process surface is the normal frame buffer. The process surface content
 | 
				
			||||||
 | 
					 * is controlled by @ref ELCDIF_SetNextBufferAddr.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param enable True to enable, false to disable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnableProcessSurface(LCDIF_Type *base, bool enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (enable)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL &= ~LCDIF_AS_CTRL_PS_DISABLE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->AS_CTRL |= LCDIF_AS_CTRL_PS_DISABLE_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					#endif /* FSL_FEATURE_LCDIF_HAS_NO_AS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (defined(FSL_FEATURE_LCDIF_HAS_LUT) && FSL_FEATURE_LCDIF_HAS_LUT)
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @name LUT
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The Lookup Table (LUT) is used to expand the 8 bits pixel to 24 bits pixel
 | 
				
			||||||
 | 
					 * before output to external displayer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * There are two 256x24 bits LUT memory in LCDIF, the LSB of frame buffer address
 | 
				
			||||||
 | 
					 * determins which memory to use.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Enable or disable the LUT.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param enable True to enable, false to disable.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void ELCDIF_EnableLut(LCDIF_Type *base, bool enable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (enable)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->LUT_CTRL &= ~LCDIF_LUT_CTRL_LUT_BYPASS_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base->LUT_CTRL |= LCDIF_LUT_CTRL_LUT_BYPASS_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Load the LUT value.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function loads the LUT value to the specific LUT memory, user can
 | 
				
			||||||
 | 
					 * specify the start entry index.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * @param lut Which LUT to load.
 | 
				
			||||||
 | 
					 * @param startIndex The start index of the LUT entry to update.
 | 
				
			||||||
 | 
					 * @param lutData The LUT data to load.
 | 
				
			||||||
 | 
					 * @param count Count of @p lutData.
 | 
				
			||||||
 | 
					 * @retval kStatus_Success Initialization success.
 | 
				
			||||||
 | 
					 * @retval kStatus_InvalidArgument Wrong argument.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					status_t ELCDIF_UpdateLut(
 | 
				
			||||||
 | 
					    LCDIF_Type *base, elcdif_lut_t lut, uint16_t startIndex, const uint32_t *lutData, uint16_t count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					#endif /* FSL_FEATURE_LCDIF_HAS_LUT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__cplusplus)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* __cplusplus */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @} */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /*_FSL_ELCDIF_H_*/
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					if BSP_USING_LCD
 | 
				
			||||||
 | 
					    config LCD_BUS_NAME
 | 
				
			||||||
 | 
					        string "lcd bus name"
 | 
				
			||||||
 | 
					        default "lcd"
 | 
				
			||||||
 | 
					    config LCD_DRV_NAME
 | 
				
			||||||
 | 
					        string "lcd bus driver name"
 | 
				
			||||||
 | 
					        default "lcd_drv"
 | 
				
			||||||
 | 
					    config LCD_DEVICE_NAME
 | 
				
			||||||
 | 
					        string "lcd bus device name"
 | 
				
			||||||
 | 
					        default "lcd_dev"  
 | 
				
			||||||
 | 
					    config LCD_BL_GPIO_PIN
 | 
				
			||||||
 | 
					        int "BackLight pin number of rgb565 interface"
 | 
				
			||||||
 | 
					        default 31
 | 
				
			||||||
 | 
					    config BSP_LCD_X_MAX
 | 
				
			||||||
 | 
					        int "LCD Height"
 | 
				
			||||||
 | 
					        default 272
 | 
				
			||||||
 | 
					    config BSP_LCD_Y_MAX
 | 
				
			||||||
 | 
					        int "LCD Width"
 | 
				
			||||||
 | 
					        default 480
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					SRC_FILES := connect_lcd.c fsl_elcdif.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,248 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_lcd.c
 | 
				
			||||||
 | 
					* @brief support xidatong lcd function and register to bus framework
 | 
				
			||||||
 | 
					* @version 2.0 
 | 
				
			||||||
 | 
					* @author AIIT XiUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <connect_lcd.h>
 | 
				
			||||||
 | 
					#include "fsl_common.h"
 | 
				
			||||||
 | 
					#include "fsl_iomuxc.h"
 | 
				
			||||||
 | 
					#include "fsl_elcdif.h"
 | 
				
			||||||
 | 
					#include "fsl_gpio.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Back light. */
 | 
				
			||||||
 | 
					#define LCD_BL_GPIO     GPIO2
 | 
				
			||||||
 | 
					#define LCD_HSW 41
 | 
				
			||||||
 | 
					#define LCD_HFP 8
 | 
				
			||||||
 | 
					#define LCD_HBP 8
 | 
				
			||||||
 | 
					#define LCD_VSW 10
 | 
				
			||||||
 | 
					#define LCD_VFP 4
 | 
				
			||||||
 | 
					#define LCD_VBP 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LCD_HEIGHT  BSP_LCD_X_MAX
 | 
				
			||||||
 | 
					#define LCD_WIDTH   BSP_LCD_Y_MAX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint16_t frame_buffer[LCD_HEIGHT][LCD_WIDTH] SECTION("NonCacheable.init");
 | 
				
			||||||
 | 
					static void InitLcdifPixelClock(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 pll_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pll_config.loopDivider = 31;
 | 
				
			||||||
 | 
					    pll_config.postDivider = 8;
 | 
				
			||||||
 | 
					    pll_config.numerator   = 0;
 | 
				
			||||||
 | 
					    pll_config.denominator = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CLOCK_InitVideoPll(&pll_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_LcdifPreMux, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CLOCK_SetDiv(kCLOCK_LcdifDiv, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void InitLcdBacklight(uint8_t level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpio_pin_config_t config = {
 | 
				
			||||||
 | 
					        kGPIO_DigitalOutput,
 | 
				
			||||||
 | 
					        0,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Backlight. */
 | 
				
			||||||
 | 
					    config.outputLogic = level;
 | 
				
			||||||
 | 
					    GPIO_PinInit(LCD_BL_GPIO, LCD_BL_GPIO_PIN, &config);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ELCDFramebuffSet(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* LCD */
 | 
				
			||||||
 | 
					    elcdif_rgb_mode_config_t lcd_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_config.panelWidth    = LCD_WIDTH;
 | 
				
			||||||
 | 
					    lcd_config.panelHeight   = LCD_HEIGHT;
 | 
				
			||||||
 | 
					    lcd_config.hsw           = LCD_HSW;
 | 
				
			||||||
 | 
					    lcd_config.hfp           = LCD_HFP;
 | 
				
			||||||
 | 
					    lcd_config.hbp           = LCD_HBP;
 | 
				
			||||||
 | 
					    lcd_config.vsw           = LCD_VSW;
 | 
				
			||||||
 | 
					    lcd_config.vfp           = LCD_VFP;
 | 
				
			||||||
 | 
					    lcd_config.vbp           = LCD_VBP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_config.polarityFlags = kELCDIF_DataEnableActiveHigh |
 | 
				
			||||||
 | 
					                               kELCDIF_VsyncActiveLow       |
 | 
				
			||||||
 | 
					                               kELCDIF_HsyncActiveLow       |
 | 
				
			||||||
 | 
					                               kELCDIF_DriveDataOnRisingClkEdge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_config.bufferAddr    = (uint32_t)frame_buffer;
 | 
				
			||||||
 | 
					    lcd_config.pixelFormat   = kELCDIF_PixelFormatRGB565;
 | 
				
			||||||
 | 
					    lcd_config.dataBus       = kELCDIF_DataBus16Bit; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ELCDIF_RgbModeInit (LCDIF, &lcd_config);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void HwLcdInit()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    memset(frame_buffer, 0, sizeof(frame_buffer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*step1: config PLL clock */
 | 
				
			||||||
 | 
					    InitLcdifPixelClock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*step2: config backlight gpio*/
 | 
				
			||||||
 | 
					    InitLcdBacklight(GPIO_HIGH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*step3: fill framebuff*/
 | 
				
			||||||
 | 
					    ELCDFramebuffSet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ELCDIF_RgbModeStart(LCDIF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void DrvLcdSetPixelDot(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, void* color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t i = 0;
 | 
				
			||||||
 | 
					    uint16_t j = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(i = y1; i <= y2; i++) {
 | 
				
			||||||
 | 
					        for(j = x1; j <= x2; j++) {
 | 
				
			||||||
 | 
					            frame_buffer[i][j] =(*(uint16_t*)color);
 | 
				
			||||||
 | 
					            color += sizeof(uint16_t);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 LcdWrite(void *dev, struct BusBlockWriteParam *write_param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (write_param->buffer) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LcdWriteParam *show = (LcdWriteParam *)write_param->buffer;
 | 
				
			||||||
 | 
					        //output string
 | 
				
			||||||
 | 
					        if(0 == show->type) {
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        } 
 | 
				
			||||||
 | 
					        //output dot
 | 
				
			||||||
 | 
					        else if (1 == show->type) {
 | 
				
			||||||
 | 
					            DrvLcdSetPixelDot(show->pixel_info.x_startpos,show->pixel_info.y_startpos, show->pixel_info.x_endpos, show->pixel_info.y_endpos,show->pixel_info.pixel_color);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            KPrintf("LcdWrite donnot support show type(0 string; 1 dot) %u\n", show->type);
 | 
				
			||||||
 | 
					            ret = -ERROR;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 LcdControl(void* drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct LcdDevDone dev_done  = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NONE,
 | 
				
			||||||
 | 
					    NONE,
 | 
				
			||||||
 | 
					    LcdWrite,
 | 
				
			||||||
 | 
					    NONE,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int BoardLcdBusInit(struct LcdBus * lcd_bus, struct LcdDriver * lcd_driver,const char *bus_name, const char *drv_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the lcd bus */
 | 
				
			||||||
 | 
					    ret = LcdBusInit( lcd_bus, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_lcd_init LcdBusInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the lcd driver*/
 | 
				
			||||||
 | 
					    ret = LcdDriverInit( lcd_driver, drv_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDriverInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Attach the lcd driver to the lcd bus*/
 | 
				
			||||||
 | 
					    ret = LcdDriverAttachToBus(drv_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDriverAttachToBus error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Attach the lcd device to the lcd bus*/
 | 
				
			||||||
 | 
					static int BoardLcdDevBend(struct LcdHardwareDevice *lcd_device, void *param, const char *bus_name, const char *dev_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = LcdDeviceRegister(lcd_device, param, dev_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDeviceInit device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = LcdDeviceAttachToBus(dev_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDeviceAttachToBus device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return  ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Imxrt1052HwLcdInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct LcdBus lcd_bus;
 | 
				
			||||||
 | 
					    static struct LcdDriver lcd_drv;
 | 
				
			||||||
 | 
					    static struct LcdHardwareDevice lcd_dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&lcd_bus, 0, sizeof(struct LcdBus));
 | 
				
			||||||
 | 
					    memset(&lcd_drv, 0, sizeof(struct LcdDriver));
 | 
				
			||||||
 | 
					    memset(&lcd_dev, 0, sizeof(struct LcdHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_drv.configure = LcdControl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardLcdBusInit(&lcd_bus, &lcd_drv, LCD_BUS_NAME, LCD_DRV_NAME);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("HwLcdInit BoardLcdBusInit error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_dev.dev_done = &dev_done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardLcdDevBend(&lcd_dev, NONE, LCD_BUS_NAME, LCD_DEVICE_NAME);                             //init  lcd device
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("HwLcdInit BoardLcdDevBend error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HwLcdInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,371 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright  2017 NXP
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: BSD-3-Clause
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fsl_elcdif.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Component ID definition, used by tools. */
 | 
				
			||||||
 | 
					#ifndef FSL_COMPONENT_ID
 | 
				
			||||||
 | 
					#define FSL_COMPONENT_ID "platform.drivers.elcdif"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Prototypes
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * @brief Get instance number for ELCDIF module.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param base ELCDIF peripheral base address
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static uint32_t ELCDIF_GetInstance(LCDIF_Type *base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Variables
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! @brief Pointers to ELCDIF bases for each instance. */
 | 
				
			||||||
 | 
					static LCDIF_Type *const s_elcdifBases[] = LCDIF_BASE_PTRS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
 | 
				
			||||||
 | 
					/*! @brief Pointers to eLCDIF apb_clk for each instance. */
 | 
				
			||||||
 | 
					static const clock_ip_name_t s_elcdifApbClocks[] = LCDIF_CLOCKS;
 | 
				
			||||||
 | 
					#if defined(LCDIF_PERIPH_CLOCKS)
 | 
				
			||||||
 | 
					/*! @brief Pointers to eLCDIF pix_clk for each instance. */
 | 
				
			||||||
 | 
					static const clock_ip_name_t s_elcdifPixClocks[] = LCDIF_PERIPH_CLOCKS;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! @brief The control register value to select different pixel format. */
 | 
				
			||||||
 | 
					elcdif_pixel_format_reg_t s_pixelFormatReg[] = {
 | 
				
			||||||
 | 
					    /* kELCDIF_PixelFormatRAW8 */
 | 
				
			||||||
 | 
					    {/* Register CTRL. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL_WORD_LENGTH(1U),
 | 
				
			||||||
 | 
					     /* Register CTRL1. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)},
 | 
				
			||||||
 | 
					    /* kELCDIF_PixelFormatRGB565 */
 | 
				
			||||||
 | 
					    {/* Register CTRL. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL_WORD_LENGTH(0U),
 | 
				
			||||||
 | 
					     /* Register CTRL1. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)},
 | 
				
			||||||
 | 
					    /* kELCDIF_PixelFormatRGB666 */
 | 
				
			||||||
 | 
					    {/* Register CTRL. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL_WORD_LENGTH(3U) | LCDIF_CTRL_DATA_FORMAT_24_BIT(1U),
 | 
				
			||||||
 | 
					     /* Register CTRL1. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x07U)},
 | 
				
			||||||
 | 
					    /* kELCDIF_PixelFormatXRGB8888 */
 | 
				
			||||||
 | 
					    {/* Register CTRL. 24-bit. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL_WORD_LENGTH(3U),
 | 
				
			||||||
 | 
					     /* Register CTRL1. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x07U)},
 | 
				
			||||||
 | 
					    /* kELCDIF_PixelFormatRGB888 */
 | 
				
			||||||
 | 
					    {/* Register CTRL. 24-bit. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL_WORD_LENGTH(3U),
 | 
				
			||||||
 | 
					     /* Register CTRL1. */
 | 
				
			||||||
 | 
					     LCDIF_CTRL1_BYTE_PACKING_FORMAT(0x0FU)},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Codes
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					static uint32_t ELCDIF_GetInstance(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Find the instance index from base address mappings. */
 | 
				
			||||||
 | 
					    for (instance = 0; instance < ARRAY_SIZE(s_elcdifBases); instance++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (s_elcdifBases[instance] == base)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(instance < ARRAY_SIZE(s_elcdifBases));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return instance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Initializes the eLCDIF to work in RGB mode (DOTCLK mode).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function ungates the eLCDIF clock and configures the eLCDIF peripheral according
 | 
				
			||||||
 | 
					 * to the configuration structure.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeInit(LCDIF_Type *base, const elcdif_rgb_mode_config_t *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(config);
 | 
				
			||||||
 | 
					    assert(config->pixelFormat < ARRAY_SIZE(s_pixelFormatReg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
 | 
				
			||||||
 | 
					    uint32_t instance = ELCDIF_GetInstance(base);
 | 
				
			||||||
 | 
					    /* Enable the clock. */
 | 
				
			||||||
 | 
					    CLOCK_EnableClock(s_elcdifApbClocks[instance]);
 | 
				
			||||||
 | 
					#if defined(LCDIF_PERIPH_CLOCKS)
 | 
				
			||||||
 | 
					    CLOCK_EnableClock(s_elcdifPixClocks[instance]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Reset. */
 | 
				
			||||||
 | 
					    ELCDIF_Reset(base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->CTRL = s_pixelFormatReg[(uint32_t)config->pixelFormat].regCtrl | (uint32_t)(config->dataBus) |
 | 
				
			||||||
 | 
					                 LCDIF_CTRL_DOTCLK_MODE_MASK |  /* RGB mode. */
 | 
				
			||||||
 | 
					                 LCDIF_CTRL_BYPASS_COUNT_MASK | /* Keep RUN bit set. */
 | 
				
			||||||
 | 
					                 LCDIF_CTRL_MASTER_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->CTRL1 = s_pixelFormatReg[(uint32_t)config->pixelFormat].regCtrl1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->TRANSFER_COUNT = ((uint32_t)config->panelHeight << LCDIF_TRANSFER_COUNT_V_COUNT_SHIFT) |
 | 
				
			||||||
 | 
					                           ((uint32_t)config->panelWidth << LCDIF_TRANSFER_COUNT_H_COUNT_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->VDCTRL0 = LCDIF_VDCTRL0_ENABLE_PRESENT_MASK |         /* Data enable signal. */
 | 
				
			||||||
 | 
					                    LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT_MASK |      /* VSYNC period in the unit of display clock. */
 | 
				
			||||||
 | 
					                    LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT_MASK | /* VSYNC pulse width in the unit of display clock. */
 | 
				
			||||||
 | 
					                    (uint32_t)config->polarityFlags | (uint32_t)config->vsw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->VDCTRL1 = config->vsw + config->panelHeight + config->vfp + config->vbp;
 | 
				
			||||||
 | 
					    base->VDCTRL2 = ((uint32_t)config->hsw << LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_SHIFT) |
 | 
				
			||||||
 | 
					                    ((uint32_t)(config->hfp + config->hbp + config->panelWidth + config->hsw))
 | 
				
			||||||
 | 
					                        << LCDIF_VDCTRL2_HSYNC_PERIOD_SHIFT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->VDCTRL3 = (((uint32_t)config->hbp + config->hsw) << LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_SHIFT) |
 | 
				
			||||||
 | 
					                    (((uint32_t)config->vbp + config->vsw) << LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->VDCTRL4 = LCDIF_VDCTRL4_SYNC_SIGNALS_ON_MASK |
 | 
				
			||||||
 | 
					                    ((uint32_t)config->panelWidth << LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->CUR_BUF  = config->bufferAddr;
 | 
				
			||||||
 | 
					    base->NEXT_BUF = config->bufferAddr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Gets the eLCDIF default configuration structure for RGB (DOTCLK) mode.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function sets the configuration structure to default values.
 | 
				
			||||||
 | 
					 * The default configuration is set to the following values.
 | 
				
			||||||
 | 
					 * code
 | 
				
			||||||
 | 
					    config->panelWidth = 480U;
 | 
				
			||||||
 | 
					    config->panelHeight = 272U;
 | 
				
			||||||
 | 
					    config->hsw = 41;
 | 
				
			||||||
 | 
					    config->hfp = 4;
 | 
				
			||||||
 | 
					    config->hbp = 8;
 | 
				
			||||||
 | 
					    config->vsw = 10;
 | 
				
			||||||
 | 
					    config->vfp = 4;
 | 
				
			||||||
 | 
					    config->vbp = 2;
 | 
				
			||||||
 | 
					    config->polarityFlags = kELCDIF_VsyncActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_HsyncActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_DataEnableActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_DriveDataOnFallingClkEdge;
 | 
				
			||||||
 | 
					    config->bufferAddr = 0U;
 | 
				
			||||||
 | 
					    config->pixelFormat = kELCDIF_PixelFormatRGB888;
 | 
				
			||||||
 | 
					    config->dataBus = kELCDIF_DataBus24Bit;
 | 
				
			||||||
 | 
					    code
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param config Pointer to the eLCDIF configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeGetDefaultConfig(elcdif_rgb_mode_config_t *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Initializes the configure structure to zero. */
 | 
				
			||||||
 | 
					    memset(config, 0, sizeof(*config));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    config->panelWidth    = 480U;
 | 
				
			||||||
 | 
					    config->panelHeight   = 272U;
 | 
				
			||||||
 | 
					    config->hsw           = 41;
 | 
				
			||||||
 | 
					    config->hfp           = 4;
 | 
				
			||||||
 | 
					    config->hbp           = 8;
 | 
				
			||||||
 | 
					    config->vsw           = 10;
 | 
				
			||||||
 | 
					    config->vfp           = 4;
 | 
				
			||||||
 | 
					    config->vbp           = 2;
 | 
				
			||||||
 | 
					    config->polarityFlags = kELCDIF_VsyncActiveLow | kELCDIF_HsyncActiveLow | kELCDIF_DataEnableActiveLow |
 | 
				
			||||||
 | 
					                            kELCDIF_DriveDataOnFallingClkEdge;
 | 
				
			||||||
 | 
					    config->bufferAddr  = 0U;
 | 
				
			||||||
 | 
					    config->pixelFormat = kELCDIF_PixelFormatRGB888;
 | 
				
			||||||
 | 
					    config->dataBus     = kELCDIF_DataBus24Bit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Set the pixel format in RGB (DOTCLK) mode.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * param pixelFormat The pixel format.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeSetPixelFormat(LCDIF_Type *base, elcdif_pixel_format_t pixelFormat)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(pixelFormat < ARRAY_SIZE(s_pixelFormatReg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->CTRL = (base->CTRL & ~(LCDIF_CTRL_WORD_LENGTH_MASK | LCDIF_CTRL_DATA_FORMAT_24_BIT_MASK |
 | 
				
			||||||
 | 
					                                 LCDIF_CTRL_DATA_FORMAT_18_BIT_MASK | LCDIF_CTRL_DATA_FORMAT_16_BIT_MASK)) |
 | 
				
			||||||
 | 
					                 s_pixelFormatReg[(uint32_t)pixelFormat].regCtrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->CTRL1 = s_pixelFormatReg[(uint32_t)pixelFormat].regCtrl1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Deinitializes the eLCDIF peripheral.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_Deinit(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ELCDIF_Reset(base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
 | 
				
			||||||
 | 
					    uint32_t instance = ELCDIF_GetInstance(base);
 | 
				
			||||||
 | 
					/* Disable the clock. */
 | 
				
			||||||
 | 
					#if defined(LCDIF_PERIPH_CLOCKS)
 | 
				
			||||||
 | 
					    CLOCK_DisableClock(s_elcdifPixClocks[instance]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    CLOCK_DisableClock(s_elcdifApbClocks[instance]);
 | 
				
			||||||
 | 
					#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Stop display in RGB (DOTCLK) mode and wait until finished.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_RgbModeStop(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    base->CTRL_CLR = LCDIF_CTRL_DOTCLK_MODE_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Wait for data transfer finished. */
 | 
				
			||||||
 | 
					    while (base->CTRL & LCDIF_CTRL_DOTCLK_MODE_MASK)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Reset the eLCDIF peripheral.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_Reset(LCDIF_Type *base)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    volatile uint32_t i = 0x100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Disable the clock gate. */
 | 
				
			||||||
 | 
					    base->CTRL_CLR = LCDIF_CTRL_CLKGATE_MASK;
 | 
				
			||||||
 | 
					    /* Confirm the clock gate is disabled. */
 | 
				
			||||||
 | 
					    while (base->CTRL & LCDIF_CTRL_CLKGATE_MASK)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Reset the block. */
 | 
				
			||||||
 | 
					    base->CTRL_SET = LCDIF_CTRL_SFTRST_MASK;
 | 
				
			||||||
 | 
					    /* Confirm the reset bit is set. */
 | 
				
			||||||
 | 
					    while (!(base->CTRL & LCDIF_CTRL_SFTRST_MASK))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Delay for the reset. */
 | 
				
			||||||
 | 
					    while (i--)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Bring the module out of reset. */
 | 
				
			||||||
 | 
					    base->CTRL_CLR = LCDIF_CTRL_SFTRST_MASK;
 | 
				
			||||||
 | 
					    /* Disable the clock gate. */
 | 
				
			||||||
 | 
					    base->CTRL_CLR = LCDIF_CTRL_CLKGATE_MASK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !(defined(FSL_FEATURE_LCDIF_HAS_NO_AS) && FSL_FEATURE_LCDIF_HAS_NO_AS)
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Set the configuration for alpha surface buffer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_SetAlphaSurfaceBufferConfig(LCDIF_Type *base, const elcdif_as_buffer_config_t *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->AS_CTRL     = (base->AS_CTRL & ~LCDIF_AS_CTRL_FORMAT_MASK) | LCDIF_AS_CTRL_FORMAT(config->pixelFormat);
 | 
				
			||||||
 | 
					    base->AS_BUF      = config->bufferAddr;
 | 
				
			||||||
 | 
					    base->AS_NEXT_BUF = config->bufferAddr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Set the alpha surface blending configuration.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * param config Pointer to the configuration structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void ELCDIF_SetAlphaSurfaceBlendConfig(LCDIF_Type *base, const elcdif_as_blend_config_t *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(config);
 | 
				
			||||||
 | 
					    uint32_t reg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    reg = base->AS_CTRL;
 | 
				
			||||||
 | 
					    reg &= ~(LCDIF_AS_CTRL_ALPHA_INVERT_MASK | LCDIF_AS_CTRL_ROP_MASK | LCDIF_AS_CTRL_ALPHA_MASK |
 | 
				
			||||||
 | 
					             LCDIF_AS_CTRL_ALPHA_CTRL_MASK);
 | 
				
			||||||
 | 
					    reg |= (LCDIF_AS_CTRL_ROP(config->ropMode) | LCDIF_AS_CTRL_ALPHA(config->alpha) |
 | 
				
			||||||
 | 
					            LCDIF_AS_CTRL_ALPHA_CTRL(config->alphaMode));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config->invertAlpha)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        reg |= LCDIF_AS_CTRL_ALPHA_INVERT_MASK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base->AS_CTRL = reg;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* FSL_FEATURE_LCDIF_HAS_NO_AS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (defined(FSL_FEATURE_LCDIF_HAS_LUT) && FSL_FEATURE_LCDIF_HAS_LUT)
 | 
				
			||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * brief Load the LUT value.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function loads the LUT value to the specific LUT memory, user can
 | 
				
			||||||
 | 
					 * specify the start entry index.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * param base eLCDIF peripheral base address.
 | 
				
			||||||
 | 
					 * param lut Which LUT to load.
 | 
				
			||||||
 | 
					 * param startIndex The start index of the LUT entry to update.
 | 
				
			||||||
 | 
					 * param lutData The LUT data to load.
 | 
				
			||||||
 | 
					 * param count Count of p lutData.
 | 
				
			||||||
 | 
					 * retval kStatus_Success Initialization success.
 | 
				
			||||||
 | 
					 * retval kStatus_InvalidArgument Wrong argument.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					status_t ELCDIF_UpdateLut(
 | 
				
			||||||
 | 
					    LCDIF_Type *base, elcdif_lut_t lut, uint16_t startIndex, const uint32_t *lutData, uint16_t count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    volatile uint32_t *regLutAddr;
 | 
				
			||||||
 | 
					    volatile uint32_t *regLutData;
 | 
				
			||||||
 | 
					    uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Only has 256 entries. */
 | 
				
			||||||
 | 
					    if (startIndex + count > ELCDIF_LUT_ENTRY_NUM)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return kStatus_InvalidArgument;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (kELCDIF_Lut0 == lut)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        regLutAddr = &(base->LUT0_ADDR);
 | 
				
			||||||
 | 
					        regLutData = &(base->LUT0_DATA);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        regLutAddr = &(base->LUT1_ADDR);
 | 
				
			||||||
 | 
					        regLutData = &(base->LUT1_DATA);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *regLutAddr = startIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < count; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        *regLutData = lutData[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return kStatus_Success;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* FSL_FEATURE_LCDIF_HAS_LUT */
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
#define EXAMPLE_SEMC SEMC
 | 
					#define EXAMPLE_SEMC SEMC
 | 
				
			||||||
#define EXAMPLE_SEMC_START_ADDRESS (0x80000000U)
 | 
					#define EXAMPLE_SEMC_START_ADDRESS (0x80000000U)
 | 
				
			||||||
#define EXAMPLE_SEMC_CLK_FREQ CLOCK_GetFreq(kCLOCK_SemcClk)
 | 
					#define EXAMPLE_SEMC_CLK_FREQ CLOCK_GetFreq(kCLOCK_SemcClk)
 | 
				
			||||||
#define SEMC_SRAM_SIZE (32 * 1024 * 1024)
 | 
					#define SEMC_SRAM_SIZE (30 * 1024 * 1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
status_t BOARD_InitSEMC(void)
 | 
					status_t BOARD_InitSEMC(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					if BSP_USING_TOUCH
 | 
				
			||||||
 | 
					    config TOUCH_BUS_NAME
 | 
				
			||||||
 | 
					        string "touch bus name"
 | 
				
			||||||
 | 
					        default "touch"
 | 
				
			||||||
 | 
					    config TOUCH_DRV_NAME
 | 
				
			||||||
 | 
					        string "touch bus driver name"
 | 
				
			||||||
 | 
					        default "touch_drv"
 | 
				
			||||||
 | 
					    config TOUCH_DEVICE_NAME
 | 
				
			||||||
 | 
					        string "touch bus device name"
 | 
				
			||||||
 | 
					        default "touch_dev" 
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					SRC_FILES := connect_touch.c i2c_touch.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,462 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2020 AIIT XUOS Lab
 | 
				
			||||||
 | 
					* XiUOS is licensed under Mulan PSL v2.
 | 
				
			||||||
 | 
					* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
				
			||||||
 | 
					* You may obtain a copy of Mulan PSL v2 at:
 | 
				
			||||||
 | 
					*        http://license.coscl.org.cn/MulanPSL2
 | 
				
			||||||
 | 
					* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					* See the Mulan PSL v2 for more details.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_touch.c
 | 
				
			||||||
 | 
					* @brief support xidatong touch function and register to bus framework
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-05-15
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <board.h>
 | 
				
			||||||
 | 
					#include <connect_touch.h>
 | 
				
			||||||
 | 
					#include "i2c_touch.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LCD_HEIGHT  BSP_LCD_X_MAX
 | 
				
			||||||
 | 
					#define LCD_WIDTH   BSP_LCD_Y_MAX
 | 
				
			||||||
 | 
					#define DEFAULT_NUM 0x0D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t CTP_CFG_GT911[] =  {
 | 
				
			||||||
 | 
					    0x5B,0xE0,0x01,0x10,0x01,0x0A,0x0D,0x00,0x01,0x0A,
 | 
				
			||||||
 | 
					    0x28,0x0F,0x5A,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x28,0x09,
 | 
				
			||||||
 | 
					    0x32,0x34,0x0C,0x08,0x00,0x00,0x00,0x02,0x02,0x1D,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x28,0x55,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
 | 
				
			||||||
 | 
					    0x8D,0x2B,0x00,0x80,0x32,0x00,0x75,0x3A,0x00,0x6C,
 | 
				
			||||||
 | 
					    0x43,0x00,0x64,0x4F,0x00,0x64,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0xF0,0x4A,0x3A,0xFF,0xFF,0x27,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,
 | 
				
			||||||
 | 
					    0x14,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x26,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,
 | 
				
			||||||
 | 
					    0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0xFF,0xFF,0xFF,
 | 
				
			||||||
 | 
					    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 | 
				
			||||||
 | 
					    0x00,0x00,0x00,0x00,0x81,0x01
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					uint8_t config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]
 | 
				
			||||||
 | 
					                = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int touch_sem = 0;
 | 
				
			||||||
 | 
					POINT Pre_Touch_Point;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t GtpI2cWrite(uint8_t client_addr,uint8_t *buf,int32_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct i2c_msg msg;
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					    int32_t retries = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // GTP_DEBUG_FUNC();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    msg.flags = !I2C_M_RD;
 | 
				
			||||||
 | 
					    msg.addr  = client_addr;
 | 
				
			||||||
 | 
					    msg.len   = len;
 | 
				
			||||||
 | 
					    msg.buf   = buf;
 | 
				
			||||||
 | 
					    //msg.scl_rate = 300 * 1000;    // for Rockchip, etc
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    while(retries < 5)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = I2C_Transfer(&msg, 1);
 | 
				
			||||||
 | 
					        if (ret == 1)break;
 | 
				
			||||||
 | 
					        retries++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if((retries >= 5))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((uint16_t)(buf[0] << 8)) | buf[1]), len-2, ret);
 | 
				
			||||||
 | 
					        ret = -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static int32_t GtpI2cRead(uint8_t client_addr, uint8_t *buf, int32_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct i2c_msg msgs[2];
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					    int32_t retries = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msgs[0].flags = !I2C_M_RD;
 | 
				
			||||||
 | 
					    msgs[0].addr  = client_addr;
 | 
				
			||||||
 | 
					    msgs[0].len   = GTP_ADDR_LENGTH;
 | 
				
			||||||
 | 
					    msgs[0].buf   = &buf[0];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    msgs[1].flags = I2C_M_RD;
 | 
				
			||||||
 | 
					    msgs[1].addr  = client_addr;
 | 
				
			||||||
 | 
					    msgs[1].len   = len - GTP_ADDR_LENGTH;
 | 
				
			||||||
 | 
					    msgs[1].buf   = &buf[GTP_ADDR_LENGTH];
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    while(retries < 5)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = I2C_Transfer( msgs, 2);
 | 
				
			||||||
 | 
					        if(ret == 2)break;
 | 
				
			||||||
 | 
					        retries++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if((retries >= 5))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("I2C Read: 0x%04X, %d bytes %d times failed, errcode: %d! Process reset.\n", (((uint16_t)(buf[0] << 8)) | buf[1]), len-2, retries,ret);
 | 
				
			||||||
 | 
					        ret = -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static int32_t gt91xx_Config_Write_Proc()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int32_t i = 0;
 | 
				
			||||||
 | 
					    uint8_t check_sum = 0;
 | 
				
			||||||
 | 
					    int32_t retry = 0;
 | 
				
			||||||
 | 
					    uint8_t cfg_num =0x80FE - 0x8047+1 ;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    const uint8_t* cfg_info = CTP_CFG_GT911;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    uint8_t cfg_info_len = CFG_GROUP_LEN(CTP_CFG_GT911) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
 | 
				
			||||||
 | 
					    memcpy(&config[GTP_ADDR_LENGTH], cfg_info,cfg_info_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    check_sum = 0;
 | 
				
			||||||
 | 
					    for (i = GTP_ADDR_LENGTH; i < cfg_num+GTP_ADDR_LENGTH; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        check_sum += config[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    config[ cfg_num+GTP_ADDR_LENGTH] = (~check_sum) + 1; 	//checksum
 | 
				
			||||||
 | 
					    config[ cfg_num+GTP_ADDR_LENGTH+1] =  1; 				//refresh ??????
 | 
				
			||||||
 | 
					    KPrintf("Driver send config check_sum 0x%x\n",check_sum);
 | 
				
			||||||
 | 
					    for (retry = 0; retry < 5; retry++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = GtpI2cWrite(GTP_ADDRESS, config , cfg_num + GTP_ADDR_LENGTH+2);
 | 
				
			||||||
 | 
					        if (ret > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  * @brief   触屏处理函数,轮询或者在触摸中断调用
 | 
				
			||||||
 | 
					  * @param 无
 | 
				
			||||||
 | 
					  * @retval 无
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					bool GetTouchEvent(POINT *touch_point,touch_event_t *touch_event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t  end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0};
 | 
				
			||||||
 | 
					    uint8_t  point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1]={GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF};
 | 
				
			||||||
 | 
					    uint8_t  touch_num = 0;
 | 
				
			||||||
 | 
					    uint8_t  finger = 0;
 | 
				
			||||||
 | 
					    static uint16_t pre_touch = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t client_addr=GTP_ADDRESS;
 | 
				
			||||||
 | 
					    uint8_t* coor_data = NULL;
 | 
				
			||||||
 | 
					    int32_t input_x = 0;
 | 
				
			||||||
 | 
					    int32_t input_y = 0;
 | 
				
			||||||
 | 
					    int32_t input_w = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = GtpI2cRead(client_addr, point_data, 12);//10字节寄存器加2字节地址
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("I2C transfer error. errno:%d\n ", ret);
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    finger = point_data[GTP_ADDR_LENGTH];//状态寄存器数据
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (finger == 0x00)		//没有数据,退出
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = 0;
 | 
				
			||||||
 | 
					        goto exit_work_func;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if((finger & 0x80) == 0)//判断buffer status位
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = 0;
 | 
				
			||||||
 | 
					        goto exit_work_func;//坐标未就绪,数据无效
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    touch_num = finger & 0x0f;//坐标点数
 | 
				
			||||||
 | 
					    if (touch_num > GTP_MAX_TOUCH)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = 0;
 | 
				
			||||||
 | 
					        goto exit_work_func;//大于最大支持点数,错误退出
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (touch_num)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        coor_data = &point_data[0 * 8 + 3];
 | 
				
			||||||
 | 
					        input_x  = coor_data[1] | (coor_data[2] << 8);	//x坐标
 | 
				
			||||||
 | 
					        input_y  = coor_data[3] | (coor_data[4] << 8);	//y坐标
 | 
				
			||||||
 | 
					        input_w  = coor_data[5] | (coor_data[6] << 8);	//size
 | 
				
			||||||
 | 
									touch_point->X = input_x;
 | 
				
			||||||
 | 
									touch_point->Y = input_y;
 | 
				
			||||||
 | 
									*touch_event = kTouch_Down; 
 | 
				
			||||||
 | 
									Pre_Touch_Point = *touch_point;
 | 
				
			||||||
 | 
												
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (pre_touch)		//touch_ num=0 且pre_touch!=0
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        *touch_point = Pre_Touch_Point;
 | 
				
			||||||
 | 
									*touch_event = kTouch_Up;
 | 
				
			||||||
 | 
								  Pre_Touch_Point.X = -1;
 | 
				
			||||||
 | 
								  Pre_Touch_Point.Y = -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pre_touch = touch_num;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					exit_work_func:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = GtpI2cWrite(client_addr, end_cmd, 3);
 | 
				
			||||||
 | 
					        if (ret < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            KPrintf("I2C write end_cmd error!\n");
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t GtpReadVersion(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					    uint8_t buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = GtpI2cRead(GTP_ADDRESS, buf, sizeof(buf));
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("GTP read version failed.\n");
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (buf[5] == 0x00)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("IC1 Version: %c%c%c_%02x%02x\n", buf[2], buf[3], buf[4], buf[7], buf[6]);		
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("IC2 Version: %c%c%c%c_%02x%02x\n", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]);		
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t GtpGetInfo(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0};
 | 
				
			||||||
 | 
					    uint8_t opr_buf[6] = {0};
 | 
				
			||||||
 | 
					    int32_t ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t abs_x_max = GTP_MAX_WIDTH;
 | 
				
			||||||
 | 
					    uint16_t abs_y_max = GTP_MAX_HEIGHT;
 | 
				
			||||||
 | 
					    uint8_t int_trigger_type = GTP_INT_TRIGGER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* config the touch as 480*272 size */
 | 
				
			||||||
 | 
					    gt91xx_Config_Write_Proc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    opr_buf[0] = (uint8_t)((GTP_REG_CONFIG_DATA+1) >> 8);
 | 
				
			||||||
 | 
					    opr_buf[1] = (uint8_t)((GTP_REG_CONFIG_DATA+1) & 0xFF);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ret = GtpI2cRead(GTP_ADDRESS, opr_buf, 6);
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    abs_x_max = (opr_buf[3] << 8) + opr_buf[2];
 | 
				
			||||||
 | 
					    abs_y_max = (opr_buf[5] << 8) + opr_buf[4];
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    opr_buf[0] = (uint8_t)((GTP_REG_CONFIG_DATA+6) >> 8);
 | 
				
			||||||
 | 
					    opr_buf[1] = (uint8_t)((GTP_REG_CONFIG_DATA+6) & 0xFF);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ret = GtpI2cRead(GTP_ADDRESS, opr_buf, 3);
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    int_trigger_type = opr_buf[2] & 0x03;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    KPrintf("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x\n",
 | 
				
			||||||
 | 
					            abs_x_max,abs_y_max,int_trigger_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = GtpI2cWrite(GTP_ADDRESS, end_cmd, 3);
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("I2C write end_cmd error!\n");
 | 
				
			||||||
 | 
					        ret = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 0;    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 TouchOpen(void *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int32_t ret = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    I2C_Touch_Init();
 | 
				
			||||||
 | 
					    ret = GtpReadVersion();
 | 
				
			||||||
 | 
					    if(ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("gtp read version error\n");
 | 
				
			||||||
 | 
					        GtpI2cDeinit();
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = GtpGetInfo();
 | 
				
			||||||
 | 
					    if(ret < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("gtp read info error\n");
 | 
				
			||||||
 | 
					        GtpI2cDeinit();
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    touch_sem = KSemaphoreCreate(0);
 | 
				
			||||||
 | 
						if (touch_sem < 0) {
 | 
				
			||||||
 | 
							KPrintf("touch create sem failed .\n");
 | 
				
			||||||
 | 
					        GtpI2cDeinit();
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GTP_IRQEnable();
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static uint32 TouchClose(void *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GTP_IRQDisable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KSemaphoreDelete(touch_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GtpI2cDeinit();
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 TouchRead(void *dev, struct BusBlockReadParam *read_param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32  ret  = -1;
 | 
				
			||||||
 | 
					    x_err_t result;
 | 
				
			||||||
 | 
					    POINT  touch_point; 
 | 
				
			||||||
 | 
						touch_event_t touch_event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct TouchDataStandard *data = (struct TouchDataStandard*)read_param->buffer;
 | 
				
			||||||
 | 
					    read_param->read_length = 0;
 | 
				
			||||||
 | 
					    result = KSemaphoreObtain(touch_sem, 1000);
 | 
				
			||||||
 | 
					    if (EOK == result)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(GetTouchEvent(&touch_point, &touch_event))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            data->x = abs(LCD_WIDTH - touch_point.X);
 | 
				
			||||||
 | 
					            data->y = abs(LCD_HEIGHT - touch_point.Y);
 | 
				
			||||||
 | 
					            data->x = touch_point.X;
 | 
				
			||||||
 | 
					            data->y = touch_point.Y;
 | 
				
			||||||
 | 
					            g_TouchPadInputSignal = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            read_param->read_length = read_param->size;
 | 
				
			||||||
 | 
					            ret = EOK;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        SemReleaseFlag = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					static uint32 TouchConfigure(void *drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{                           
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct TouchDevDone touch_dev_done  =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    .open  = TouchOpen,
 | 
				
			||||||
 | 
					    .close  = TouchClose,
 | 
				
			||||||
 | 
					    .write  =  NONE,
 | 
				
			||||||
 | 
					    .read  =  TouchRead
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int BoardTouchBusInit(struct TouchBus * touch_bus, struct TouchDriver * touch_driver,const char *bus_name, const char *drv_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the touch bus */
 | 
				
			||||||
 | 
					    ret = TouchBusInit(touch_bus, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_touch_init touchBusInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the touch driver*/
 | 
				
			||||||
 | 
					    ret = TouchDriverInit(touch_driver, drv_name);
 | 
				
			||||||
 | 
					    if (EOK != ret){
 | 
				
			||||||
 | 
					        KPrintf("Board_touch_init touchDriverInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Attach the touch driver to the touch bus*/
 | 
				
			||||||
 | 
					    ret = TouchDriverAttachToBus(drv_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret){
 | 
				
			||||||
 | 
					        KPrintf("Board_touch_init TouchDriverAttachToBus error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Attach the touch device to the touch bus*/
 | 
				
			||||||
 | 
					static int BoardTouchDevBend(struct TouchHardwareDevice *touch_device, void *param, const char *bus_name, const char *dev_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = TouchDeviceRegister(touch_device, param, dev_name);
 | 
				
			||||||
 | 
					    if (EOK != ret){
 | 
				
			||||||
 | 
					        KPrintf("TouchDeviceRegister  device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = TouchDeviceAttachToBus(dev_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("TouchDeviceAttachToBus  device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int HwTouchInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct TouchBus touch_bus;
 | 
				
			||||||
 | 
					    static struct TouchDriver touch_driver;
 | 
				
			||||||
 | 
					    static struct TouchHardwareDevice touch_dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&touch_bus, 0, sizeof(struct TouchBus));
 | 
				
			||||||
 | 
					    memset(&touch_driver, 0, sizeof(struct TouchDriver));
 | 
				
			||||||
 | 
					    memset(&touch_dev, 0, sizeof(struct TouchHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    touch_driver.configure = TouchConfigure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardTouchBusInit(&touch_bus, &touch_driver,TOUCH_BUS_NAME,TOUCH_DRV_NAME);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					      return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    touch_dev.dev_done = &touch_dev_done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardTouchDevBend(&touch_dev, NONE, TOUCH_BUS_NAME, TOUCH_DEVICE_NAME);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("board_touch_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return EOK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,360 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// #include "fsl_debug_console.h"	
 | 
				
			||||||
 | 
					#include <board.h>
 | 
				
			||||||
 | 
					#include "fsl_iomuxc.h"
 | 
				
			||||||
 | 
					#include "pin_mux.h"
 | 
				
			||||||
 | 
					#include "fsl_gpio.h"
 | 
				
			||||||
 | 
					#include "fsl_lpi2c.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "i2c_touch.h"
 | 
				
			||||||
 | 
					#include <connect_touch.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Definitions
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Prototypes
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					static void GTP_I2C_ModeInit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void I2C_Master_Callback(LPI2C_Type *base, lpi2c_master_handle_t *handle, status_t status, void *userData);
 | 
				
			||||||
 | 
					static  uint32_t I2C_Timeout_Callback(uint8_t errorCode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Variables
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lpi2c_master_handle_t g_m_handle;
 | 
				
			||||||
 | 
					volatile bool g_MasterCompletionFlag = false;
 | 
				
			||||||
 | 
					volatile bool g_TouchPadInputSignal = false;
 | 
				
			||||||
 | 
					volatile bool SemReleaseFlag = false;
 | 
				
			||||||
 | 
					/*******************************************************************************
 | 
				
			||||||
 | 
					 * Code
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  * @brief  对GT91xx芯片进行复位
 | 
				
			||||||
 | 
					  * @param  无
 | 
				
			||||||
 | 
					  * @retval 无
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					void GTP_ResetChip(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* 先把RST INT配置为输出模式 */
 | 
				
			||||||
 | 
						gpio_pin_config_t rst_int_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GPIO_PinInit(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, &rst_int_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*初始化GT9157,INT为低电平,则gt9157的设备地址被配置为0xBA*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*复位为低电平,为初始化做准备*/
 | 
				
			||||||
 | 
						GPIO_PinWrite(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, 0U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//INT配置成中断输入
 | 
				
			||||||
 | 
						rst_int_config.direction = kGPIO_DigitalInput;
 | 
				
			||||||
 | 
						rst_int_config.outputLogic = 0;
 | 
				
			||||||
 | 
						rst_int_config.interruptMode = kGPIO_IntFallingEdge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GPIO_PinInit(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, &rst_int_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 使能引脚中断 */  
 | 
				
			||||||
 | 
						GPIO_PortEnableInterrupts(TOUCH_PAD_INT_GPIO, 1U << TOUCH_PAD_INT_GPIO_PIN);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  禁止触摸芯片的中断
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					void GTP_IRQDisable(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DisableIRQ(GT9xx_PEN_IRQ);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  使能触摸芯片的中断
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					void GTP_IRQEnable(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						 IOMUXC_SetPinMux(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_B1_14_GPIO2_IO30,          /* WAKEUP is configured as GPIO5_IO00 */
 | 
				
			||||||
 | 
					      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						  IOMUXC_SetPinConfig(
 | 
				
			||||||
 | 
					      IOMUXC_GPIO_B1_14_GPIO2_IO30,           
 | 
				
			||||||
 | 
					      0x10B0u); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  gpio_pin_config_t rst_int_config;
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  //INT配置成中断输入
 | 
				
			||||||
 | 
						rst_int_config.direction = kGPIO_DigitalInput;
 | 
				
			||||||
 | 
						rst_int_config.outputLogic = 0;
 | 
				
			||||||
 | 
						rst_int_config.interruptMode = kGPIO_IntFallingEdge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GPIO_PinInit(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, &rst_int_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 使能引脚中断 */  
 | 
				
			||||||
 | 
						GPIO_PortEnableInterrupts(TOUCH_PAD_INT_GPIO, 1U << TOUCH_PAD_INT_GPIO_PIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* 使能中断IRQ */  
 | 
				
			||||||
 | 
						EnableIRQ(GT9xx_PEN_IRQ);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  初始化触摸芯片使用的I2C外设
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/	
 | 
				
			||||||
 | 
					void GTP_I2C_ModeInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						lpi2c_master_config_t masterConfig;	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * masterConfig.debugEnable = false;
 | 
				
			||||||
 | 
						 * masterConfig.ignoreAck = false;
 | 
				
			||||||
 | 
						 * masterConfig.pinConfig = kLPI2C_2PinOpenDrain;
 | 
				
			||||||
 | 
						 * masterConfig.baudRate_Hz = 100000U;
 | 
				
			||||||
 | 
						 * masterConfig.busIdleTimeout_ns = 0;
 | 
				
			||||||
 | 
						 * masterConfig.pinLowTimeout_ns = 0;
 | 
				
			||||||
 | 
						 * masterConfig.sdaGlitchFilterWidth_ns = 0;
 | 
				
			||||||
 | 
						 * masterConfig.sclGlitchFilterWidth_ns = 0;
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						LPI2C_MasterGetDefaultConfig(&masterConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						masterConfig.baudRate_Hz = GTP_I2C_BAUDRATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LPI2C_MasterInit(GTP_I2C_MASTER, &masterConfig, LPI2C_MASTER_CLOCK_FREQUENCY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LPI2C_MasterTransferCreateHandle(GTP_I2C_MASTER, &g_m_handle, I2C_Master_Callback, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GtpI2cDeinit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						LPI2C_MasterDeinit(GTP_I2C_MASTER);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  * @brief   使用IIC读取数据
 | 
				
			||||||
 | 
					  * @param   
 | 
				
			||||||
 | 
					  * 	@arg ClientAddr:从设备地址
 | 
				
			||||||
 | 
					  *		@arg pBuffer:存放由从机读取的数据的缓冲区指针
 | 
				
			||||||
 | 
					  *		@arg NumByteToRead:读取的数据长度
 | 
				
			||||||
 | 
					  * @retval  无
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					uint32_t I2C_ReadBytes(uint8_t ClientAddr,uint8_t* pBuffer, uint16_t NumByteToRead)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						lpi2c_master_transfer_t masterXfer = {0};
 | 
				
			||||||
 | 
						status_t reVal = kStatus_Fail;
 | 
				
			||||||
 | 
					    uint32_t i2c_timeout = I2CT_LONG_TIMEOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* subAddress = 0x00, data = pBuffer 自从机处接收
 | 
				
			||||||
 | 
							起始信号start + 设备地址slaveaddress(w 写方向) + 子地址subAddress + 
 | 
				
			||||||
 | 
					    重复起始信号repeated start + 设备地址slaveaddress(r 读方向) + 
 | 
				
			||||||
 | 
					    接收缓冲数据rx data buffer + 停止信号stop */
 | 
				
			||||||
 | 
						masterXfer.slaveAddress = (ClientAddr>>1);
 | 
				
			||||||
 | 
						masterXfer.direction = kLPI2C_Read;
 | 
				
			||||||
 | 
						masterXfer.subaddress = (uint32_t)0;
 | 
				
			||||||
 | 
						masterXfer.subaddressSize = 0;
 | 
				
			||||||
 | 
						masterXfer.data = pBuffer;
 | 
				
			||||||
 | 
						masterXfer.dataSize = NumByteToRead;
 | 
				
			||||||
 | 
						masterXfer.flags = kLPI2C_TransferDefaultFlag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 复位传输完成标志 */
 | 
				
			||||||
 | 
						g_MasterCompletionFlag = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reVal = LPI2C_MasterTransferNonBlocking(GTP_I2C_MASTER, &g_m_handle, &masterXfer);
 | 
				
			||||||
 | 
						if (reVal != kStatus_Success)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* 等待传输完成 */
 | 
				
			||||||
 | 
						while (!g_MasterCompletionFlag)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if((i2c_timeout--) == 0) 
 | 
				
			||||||
 | 
								return I2C_Timeout_Callback(0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						g_MasterCompletionFlag = false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  * @brief   使用IIC写入数据
 | 
				
			||||||
 | 
					  * @param   
 | 
				
			||||||
 | 
					  * 	@arg ClientAddr:从设备地址
 | 
				
			||||||
 | 
					  *		@arg pBuffer:缓冲区指针
 | 
				
			||||||
 | 
					  *     @arg NumByteToWrite:写的字节数
 | 
				
			||||||
 | 
					  * @retval  无
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					uint32_t I2C_WriteBytes(uint8_t ClientAddr,uint8_t* pBuffer,  uint8_t NumByteToWrite)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						lpi2c_master_transfer_t masterXfer = {0};
 | 
				
			||||||
 | 
						status_t reVal = kStatus_Fail;
 | 
				
			||||||
 | 
					    uint32_t i2c_timeout = I2CT_LONG_TIMEOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* subAddress = 0x00, data = pBuffer 发送至从机
 | 
				
			||||||
 | 
							起始信号start + 设备地址slaveaddress(w 写方向) + 
 | 
				
			||||||
 | 
					    发送缓冲数据tx data buffer + 停止信号stop */
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
						masterXfer.slaveAddress = (ClientAddr>>1);
 | 
				
			||||||
 | 
						masterXfer.direction = kLPI2C_Write;
 | 
				
			||||||
 | 
						masterXfer.subaddress = (uint32_t)0;
 | 
				
			||||||
 | 
						masterXfer.subaddressSize = 0;
 | 
				
			||||||
 | 
						masterXfer.data = pBuffer;
 | 
				
			||||||
 | 
						masterXfer.dataSize = NumByteToWrite;
 | 
				
			||||||
 | 
						masterXfer.flags = kLPI2C_TransferDefaultFlag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 复位传输完成标志 */
 | 
				
			||||||
 | 
						g_MasterCompletionFlag = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reVal = LPI2C_MasterTransferNonBlocking(GTP_I2C_MASTER, &g_m_handle, &masterXfer);
 | 
				
			||||||
 | 
						if (reVal != kStatus_Success)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 等待传输完成 */
 | 
				
			||||||
 | 
						while (!g_MasterCompletionFlag)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					    	if((i2c_timeout--) == 0)
 | 
				
			||||||
 | 
								return I2C_Timeout_Callback(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g_MasterCompletionFlag = false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  * @brief  IIC等待超时调用本函数输出调试信息
 | 
				
			||||||
 | 
					  * @param  None.
 | 
				
			||||||
 | 
					  * @retval 返回0xff,表示IIC读取数据失败
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					static  uint32_t I2C_Timeout_Callback(uint8_t errorCode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* Block communication and all processes */
 | 
				
			||||||
 | 
						KPrintf("I2C timeout!errorCode = %d\n",errorCode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0xFF;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  I2C外设传输完成的回调函数
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static void I2C_Master_Callback(LPI2C_Type *base, lpi2c_master_handle_t *handle, status_t status, void *userData)
 | 
				
			||||||
 | 
					{		
 | 
				
			||||||
 | 
					    /* 接收到kStatus_Success标志后,
 | 
				
			||||||
 | 
					       设置g_MasterCompletionFlag标志表明传输成功 */
 | 
				
			||||||
 | 
					    if (status == kStatus_Success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        g_MasterCompletionFlag = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  触摸引脚及芯片初始化
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					void I2C_Touch_Init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//  /* 初始化I2C外设工作模式 */
 | 
				
			||||||
 | 
					  GTP_I2C_ModeInit(); 
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  /* 复位触摸芯片,配置地址 */
 | 
				
			||||||
 | 
					  GTP_ResetChip();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***************************中断相关******************************/
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @brief  触摸芯片TOUCH_PAD_INT_GPIO_PIN引脚的中断服务函数
 | 
				
			||||||
 | 
					* @param  无
 | 
				
			||||||
 | 
					* @retval 无
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					//void TOUCH_PAD_IRQHANDLER(void)
 | 
				
			||||||
 | 
					extern int touch_sem;
 | 
				
			||||||
 | 
					void GT9xx_PEN_IRQHandler(int irqn, void *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DisableIRQ(GT9xx_PEN_IRQ);
 | 
				
			||||||
 | 
					    /* 确认是触摸芯片的中断 */
 | 
				
			||||||
 | 
					    if(GPIO_GetPinsInterruptFlags(TOUCH_PAD_INT_GPIO) & 1U << TOUCH_PAD_INT_GPIO_PIN)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       /* 清除中断标志 */
 | 
				
			||||||
 | 
					      GPIO_PortClearInterruptFlags(TOUCH_PAD_INT_GPIO, 1U << TOUCH_PAD_INT_GPIO_PIN);
 | 
				
			||||||
 | 
					      /* 切换触摸输入状态标志 */
 | 
				
			||||||
 | 
					      g_TouchPadInputSignal = true;
 | 
				
			||||||
 | 
						  if(!SemReleaseFlag) 
 | 
				
			||||||
 | 
						  {
 | 
				
			||||||
 | 
							KSemaphoreAbandon(touch_sem);
 | 
				
			||||||
 | 
							SemReleaseFlag = true;
 | 
				
			||||||
 | 
						  }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
						EnableIRQ(GT9xx_PEN_IRQ);
 | 
				
			||||||
 | 
					#if defined __CORTEX_M && (__CORTEX_M == 4U)
 | 
				
			||||||
 | 
					    __DSB();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					DECLARE_HW_IRQ(GT9xx_PEN_IRQ, GT9xx_PEN_IRQHandler, NONE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * i2c_transfer - execute a single or combined I2C message
 | 
				
			||||||
 | 
					 * @msgs: One or more messages to execute before STOP is issued to
 | 
				
			||||||
 | 
					 *	terminate the operation; each message begins with a START.
 | 
				
			||||||
 | 
					 * @num: Number of messages to be executed.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int I2C_Transfer( struct i2c_msg *msgs,int num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int im = 0;
 | 
				
			||||||
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//GTP_DEBUG_FUNC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (im = 0; ret == 0 && im != num; im++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ((msgs[im].flags&I2C_M_RD))																//根据flag判断是读数据还是写数据
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ret = I2C_ReadBytes(msgs[im].addr, msgs[im].buf, msgs[im].len);		//IIC读取数据
 | 
				
			||||||
 | 
							} else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ret = I2C_WriteBytes(msgs[im].addr,  msgs[im].buf, msgs[im].len);	//IIC写入数据
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(ret)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return im;   													//正常完成的传输结构个数
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*********************************************END OF FILE**********************/
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,67 @@
 | 
				
			||||||
 | 
					#ifndef __I2C_TOUCH_H
 | 
				
			||||||
 | 
					#define	__I2C_TOUCH_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fsl_common.h"
 | 
				
			||||||
 | 
					#include "fsl_lpi2c.h"
 | 
				
			||||||
 | 
					#include "board.h"
 | 
				
			||||||
 | 
					#include <connect_touch.h>
 | 
				
			||||||
 | 
					extern lpi2c_master_handle_t g_m_handle;
 | 
				
			||||||
 | 
					extern volatile bool g_MasterCompletionFlag ;
 | 
				
			||||||
 | 
					extern volatile bool g_TouchPadInputSignal;
 | 
				
			||||||
 | 
					extern volatile bool SemReleaseFlag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Select USB1 PLL (480 MHz) as master lpi2c clock source */
 | 
				
			||||||
 | 
					#define LPI2C_CLOCK_SOURCE_SELECT (0U)
 | 
				
			||||||
 | 
					/* Clock divider for master lpi2c clock source */
 | 
				
			||||||
 | 
					#define LPI2C_CLOCK_SOURCE_DIVIDER (5U)
 | 
				
			||||||
 | 
					/* Get frequency of lpi2c clock */
 | 
				
			||||||
 | 
					#define LPI2C_CLOCK_FREQUENCY ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 8) / (LPI2C_CLOCK_SOURCE_DIVIDER + 1U))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LPI2C_MASTER_CLOCK_FREQUENCY  LPI2C_CLOCK_FREQUENCY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GTP_I2C_MASTER_BASE   (LPI2C1_BASE)
 | 
				
			||||||
 | 
					#define GTP_I2C_MASTER        ((LPI2C_Type *)GTP_I2C_MASTER_BASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GTP_I2C_BAUDRATE 400000U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 等待超时时间 */
 | 
				
			||||||
 | 
					#define I2CT_FLAG_TIMEOUT         ((uint32_t)0x10000)
 | 
				
			||||||
 | 
					#define I2CT_LONG_TIMEOUT         ((uint32_t)(10 * I2CT_FLAG_TIMEOUT))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! @brief 触摸芯片引脚定义 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TOUCH_PAD_SCL_IOMUXC			  IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL
 | 
				
			||||||
 | 
					#define TOUCH_PAD_SDA_IOMUXC			  IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TOUCH_PAD_RST_GPIO 			    GPIO1
 | 
				
			||||||
 | 
					#define TOUCH_PAD_RST_GPIO_PIN 	    (27U)
 | 
				
			||||||
 | 
					#define TOUCH_PAD_RST_IOMUXC			  IOMUXC_GPIO_AD_B1_11_GPIO1_IO27//IOMUXC_GPIO_AD_B1_11_GPIO1_IO27
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TOUCH_PAD_INT_GPIO 			    GPIO2
 | 
				
			||||||
 | 
					#define TOUCH_PAD_INT_GPIO_PIN 	    (30U)
 | 
				
			||||||
 | 
					#define TOUCH_PAD_INT_IOMUXC			  IOMUXC_GPIO_AD_B0_11_GPIO1_IO11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GT9xx_PEN_IRQ           GPIO2_Combined_16_31_IRQn
 | 
				
			||||||
 | 
					#define GT9xx_PEN_IRQHandler    GPIO2_Combined_16_31_IRQHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//函数接口
 | 
				
			||||||
 | 
					int32_t GTP_I2C_ReadBytes(uint8_t client_addr, uint8_t *buf, int32_t len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void I2C_Touch_Init(void);
 | 
				
			||||||
 | 
					void GtpI2cDeinit(void);
 | 
				
			||||||
 | 
					uint32_t I2C_WriteBytes(uint8_t ClientAddr,uint8_t* pBuffer,  uint8_t NumByteToWrite);
 | 
				
			||||||
 | 
					uint32_t I2C_ReadBytes(uint8_t ClientAddr,uint8_t* pBuffer, uint16_t NumByteToRead);
 | 
				
			||||||
 | 
					void GTP_ResetChip(void);
 | 
				
			||||||
 | 
					void GTP_IRQDisable(void);
 | 
				
			||||||
 | 
					void GTP_IRQEnable(void);
 | 
				
			||||||
 | 
					int I2C_Transfer( struct i2c_msg *msgs,int num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __I2C_TOUCH_H */
 | 
				
			||||||
| 
						 | 
					@ -96,7 +96,6 @@ static x_err_t _MsgQueueSend(struct MsgQueue *mq,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tick_delta = 0;
 | 
					    tick_delta = 0;
 | 
				
			||||||
    task = GetKTaskDescriptor();
 | 
					    task = GetKTaskDescriptor();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(WAITING_FOREVER == msec)
 | 
					    if(WAITING_FOREVER == msec)
 | 
				
			||||||
        timeout = WAITING_FOREVER;
 | 
					        timeout = WAITING_FOREVER;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,12 +94,10 @@ static int32 _SemaphoreObtain(struct Semaphore *sem, int32 msec)
 | 
				
			||||||
    struct TaskDescriptor *task = NONE;
 | 
					    struct TaskDescriptor *task = NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    NULL_PARAM_CHECK(sem);
 | 
					    NULL_PARAM_CHECK(sem);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(WAITING_FOREVER == msec)
 | 
					    if(WAITING_FOREVER == msec)
 | 
				
			||||||
        wait_time = WAITING_FOREVER;
 | 
					        wait_time = WAITING_FOREVER;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        wait_time = CalculteTickFromTimeMs(msec);
 | 
					        wait_time = CalculteTickFromTimeMs(msec);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    lock = CriticalAreaLock();
 | 
					    lock = CriticalAreaLock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SYS_KDEBUG_LOG(KDBG_IPC, ("obtain semaphore: id %d, value %d, by task %s\n",
 | 
					    SYS_KDEBUG_LOG(KDBG_IPC, ("obtain semaphore: id %d, value %d, by task %s\n",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue