forked from xuos/xiuos
1、add i2c driver for xidatong;2、add touch driver for xidatong;3、add input device for lvgl;4、repair interrupt for m7;5、repair startup sequence for xidatong
This commit is contained in:
parent
0267668149
commit
2bd07aa244
|
@ -183,8 +183,16 @@ 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 PRIV_TOUCH_DEV "/dev/touch_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
|
||||||
/**********************mutex**************************/
|
/**********************mutex**************************/
|
||||||
|
|
|
@ -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,8 @@ 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);
|
||||||
|
printf("touch fd = %d\n",touch_fd);
|
||||||
/*Your code comes here*/
|
/*Your code comes here*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +252,14 @@ 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 <= 480 && touch_data.y >= 0 && touch_data.y <= 272)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -217,10 +269,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 +315,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 +377,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 +408,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 +466,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
|
||||||
|
@ -71,6 +75,10 @@ extern int ETH_BSP_Config();
|
||||||
extern int Imxrt1052HwLcdInit(void);
|
extern int Imxrt1052HwLcdInit(void);
|
||||||
#endif
|
#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,
|
||||||
|
@ -281,29 +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);
|
||||||
|
|
||||||
|
@ -323,29 +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_LCD
|
|
||||||
Imxrt1052HwLcdInit();
|
|
||||||
#endif
|
|
||||||
#ifdef BSP_USING_WDT
|
|
||||||
Imxrt1052HwWdgInit();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
@ -47,6 +56,16 @@ menuconfig BSP_USING_LCD
|
||||||
if BSP_USING_LCD
|
if BSP_USING_LCD
|
||||||
source "$BSP_DIR/third_party_driver/lcd/Kconfig"
|
source "$BSP_DIR/third_party_driver/lcd/Kconfig"
|
||||||
endif
|
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"
|
||||||
default n
|
default n
|
||||||
|
|
|
@ -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
|
||||||
|
@ -27,6 +30,11 @@ endif
|
||||||
ifeq ($(CONFIG_BSP_USING_LCD),y)
|
ifeq ($(CONFIG_BSP_USING_LCD),y)
|
||||||
SRC_DIR += lcd
|
SRC_DIR += lcd
|
||||||
endif
|
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
|
||||||
|
|
|
@ -1018,6 +1018,84 @@ void Lcd_InitPins(void)
|
||||||
Pull Up / Down Config. Field: 100K Ohm Pull Down
|
Pull Up / Down Config. Field: 100K Ohm Pull Down
|
||||||
Hyst. Enable Field: Hysteresis Disabled */
|
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 ************************************************************************************************************
|
||||||
*
|
*
|
||||||
* Function Name : BOARD_InitPins
|
* Function Name : BOARD_InitPins
|
||||||
|
@ -1029,7 +1107,19 @@ 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();
|
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 */
|
||||||
|
@ -1227,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,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
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @file connect_lcd.c
|
* @file connect_lcd.c
|
||||||
* @brief support aiit-arm32-board lcd function and register to bus framework
|
* @brief support xidatong lcd function and register to bus framework
|
||||||
* @version 2.0
|
* @version 2.0
|
||||||
* @author AIIT XiUOS Lab
|
* @author AIIT XiUOS Lab
|
||||||
* @date 2022-04-25
|
* @date 2022-04-25
|
||||||
|
|
|
@ -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,451 @@
|
||||||
|
/*
|
||||||
|
* 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 failed, errcode: %d! Process reset.\n", (((uint16_t)(buf[0] << 8)) | buf[1]), len-2, 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) //没有数据,退出
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((finger & 0x80) == 0)//判断buffer status位
|
||||||
|
{
|
||||||
|
goto exit_work_func;//坐标未就绪,数据无效
|
||||||
|
}
|
||||||
|
|
||||||
|
touch_num = finger & 0x0f;//坐标点数
|
||||||
|
if (touch_num > GTP_MAX_TOUCH)
|
||||||
|
{
|
||||||
|
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!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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);
|
||||||
|
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
SemReleaseFlag = 0;
|
||||||
|
|
||||||
|
read_param->read_length = read_param->size;
|
||||||
|
ret = EOK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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,356 @@
|
||||||
|
|
||||||
|
// #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;
|
||||||
|
|
||||||
|
reVal = LPI2C_MasterTransferNonBlocking(GTP_I2C_MASTER, &g_m_handle, &masterXfer);
|
||||||
|
if (reVal != kStatus_Success)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* 复位传输完成标志 */
|
||||||
|
g_MasterCompletionFlag = false;
|
||||||
|
|
||||||
|
/* 等待传输完成 */
|
||||||
|
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;
|
||||||
|
|
||||||
|
reVal = LPI2C_MasterTransferNonBlocking(GTP_I2C_MASTER, &g_m_handle, &masterXfer);
|
||||||
|
if (reVal != kStatus_Success)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* 复位传输完成标志 */
|
||||||
|
g_MasterCompletionFlag = false;
|
||||||
|
|
||||||
|
/* 等待传输完成 */
|
||||||
|
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",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 */
|
Loading…
Reference in New Issue