forked from xuos/xiuos
add softspi in xidatong-riscv64
This commit is contained in:
parent
987fd6c798
commit
49df162734
|
@ -150,6 +150,9 @@ menu "test app"
|
|||
config TOUCH_DEV_DRIVER
|
||||
string "Set touch dev path"
|
||||
default "/dev/touch_dev"
|
||||
config TOUCH_LCD_DEV_DRIVER
|
||||
string "Set lcd dev path"
|
||||
default "/dev/lcd_dev"
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -46,6 +46,9 @@ void TestTouch(void)
|
|||
#include <transform.h>
|
||||
|
||||
#define NULL_PARAMETER 0
|
||||
#define LCD_DOT_TYPE 1
|
||||
#define LCD_SIZE 320
|
||||
|
||||
|
||||
void TestTouch(void)
|
||||
{
|
||||
|
@ -55,17 +58,52 @@ void TestTouch(void)
|
|||
printf("open touch fd error:%d\n", touch_fd);
|
||||
return;
|
||||
}
|
||||
int lcd_fd = PrivOpen(TOUCH_LCD_DEV_DRIVER, O_RDWR);
|
||||
if (lcd_fd < 0)
|
||||
{
|
||||
printf("open lcd fd error:%d\n", lcd_fd);
|
||||
return;
|
||||
}
|
||||
|
||||
// draw text
|
||||
struct TouchDataStandard touch_pixel;
|
||||
memset(&touch_pixel,0,sizeof(touch_pixel));
|
||||
LcdWriteParam graph_param;
|
||||
|
||||
|
||||
graph_param.type = LCD_DOT_TYPE;
|
||||
|
||||
uint16_t back_color[LCD_SIZE];
|
||||
memset(back_color,0x00,sizeof(back_color));
|
||||
for (int i = 0; i < LCD_SIZE; i++)
|
||||
{
|
||||
graph_param.pixel_info.pixel_color = &back_color;
|
||||
graph_param.pixel_info.x_startpos = 0;
|
||||
graph_param.pixel_info.y_startpos = i;
|
||||
graph_param.pixel_info.x_endpos = LCD_SIZE -1;
|
||||
graph_param.pixel_info.y_endpos = i;
|
||||
PrivWrite(lcd_fd, &graph_param, NULL_PARAMETER);
|
||||
}
|
||||
|
||||
uint16 color_select[20];
|
||||
memset(color_select,0xff,sizeof(color_select));
|
||||
graph_param.pixel_info.pixel_color = &color_select;
|
||||
while(1){
|
||||
if(0 > PrivRead(touch_fd, &touch_pixel, NULL_PARAMETER)){
|
||||
printf("read touch error\n");
|
||||
return;
|
||||
}
|
||||
printf("touch pixel position x:%d,y:%d\n",touch_pixel.x,touch_pixel.y);
|
||||
graph_param.pixel_info.x_startpos = touch_pixel.x-10>0?touch_pixel.x-10:0;
|
||||
graph_param.pixel_info.y_startpos = touch_pixel.y;
|
||||
graph_param.pixel_info.x_endpos = touch_pixel.x+10;
|
||||
graph_param.pixel_info.y_endpos = touch_pixel.y;
|
||||
PrivWrite(lcd_fd, &graph_param, NULL_PARAMETER);
|
||||
graph_param.pixel_info.x_startpos = touch_pixel.x;
|
||||
graph_param.pixel_info.y_startpos = touch_pixel.y-10>0?touch_pixel.y-10:0;
|
||||
graph_param.pixel_info.x_endpos = touch_pixel.x;
|
||||
graph_param.pixel_info.y_endpos = touch_pixel.y+10;
|
||||
PrivWrite(lcd_fd, &graph_param, NULL_PARAMETER);
|
||||
}
|
||||
PrivClose(touch_fd);
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
|
||||
/*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/
|
||||
#if 1
|
||||
|
||||
/*********************
|
||||
|
@ -12,8 +12,7 @@
|
|||
#include "lv_port_indev_template.h"
|
||||
#include "../../lvgl.h"
|
||||
|
||||
static int touch_fd = -1;
|
||||
static TouchDataParam touch_data;
|
||||
static int touch_fd = 0;
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
@ -23,6 +22,7 @@ static TouchDataParam touch_data;
|
|||
#define LV_USE_INDEV_ENCODER 0x8u
|
||||
#define LV_USE_INDEV_BUTTUN 0x10u
|
||||
|
||||
#define PRESS_FAILED_LIMIT 15
|
||||
#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
|
||||
|
||||
/**********************
|
||||
|
@ -34,33 +34,36 @@ static TouchDataParam touch_data;
|
|||
**********************/
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
|
||||
static void touchpad_init(void);
|
||||
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
|
||||
static bool touchpad_is_pressed(void);
|
||||
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
|
||||
static void touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data);
|
||||
// static bool touchpad_is_pressed(void);
|
||||
// static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
|
||||
static bool touchpad_is_pressed(struct TouchDataStandard *touch_data_ptr);
|
||||
static void touchpad_get_xy(struct TouchDataStandard *touch_data_ptr,
|
||||
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_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 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_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);
|
||||
#endif
|
||||
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||
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);
|
||||
#endif
|
||||
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
|
||||
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 bool button_is_pressed(uint8_t id);
|
||||
#endif
|
||||
|
@ -69,23 +72,23 @@ static bool button_is_pressed(uint8_t id);
|
|||
* 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;
|
||||
|
@ -144,7 +147,7 @@ void lv_port_indev_init(void)
|
|||
indev_mouse = lv_indev_drv_register(&indev_drv);
|
||||
|
||||
/*Set cursor. For simplicity set a HOME symbol now.*/
|
||||
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_indev_set_cursor(indev_mouse, mouse_cursor);
|
||||
#endif
|
||||
|
@ -169,8 +172,6 @@ void lv_port_indev_init(void)
|
|||
*`lv_indev_set_group(indev_keypad, group);`*/
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||
/*------------------
|
||||
* Encoder
|
||||
|
@ -225,27 +226,37 @@ void lv_port_indev_init(void)
|
|||
/*Initialize your touchpad*/
|
||||
static void touchpad_init(void)
|
||||
{
|
||||
touch_fd = PrivOpen(PRIV_TOUCH_DEV,O_RDWR);
|
||||
if(touch_fd >= 0) {
|
||||
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 failed.\n",PRIV_TOUCH_DEV,touch_fd);
|
||||
touch_fd = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("open %s touch fd = %d failed.\n", PRIV_TOUCH_DEV, touch_fd);
|
||||
}
|
||||
|
||||
/*Your code comes here*/
|
||||
}
|
||||
|
||||
// static struct TouchDataStandard touch_data;
|
||||
|
||||
/*Will be called by the library to read the touchpad*/
|
||||
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 lv_coord_t last_x = 0;
|
||||
static lv_coord_t last_y = 0;
|
||||
|
||||
static struct TouchDataStandard touch_data;
|
||||
|
||||
/*Save the pressed coordinates and the state*/
|
||||
if(touchpad_is_pressed()) {
|
||||
touchpad_get_xy(&last_x, &last_y);
|
||||
if (touchpad_is_pressed(&touch_data))
|
||||
{
|
||||
touchpad_get_xy(&touch_data, &last_x, &last_y);
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
|
||||
|
@ -255,34 +266,68 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
|||
}
|
||||
|
||||
/*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*/
|
||||
// // memset(&touch_data, 0 ,sizeof(TouchDataParam));
|
||||
// memset(&touch_data, 0 ,sizeof(struct TouchDataStandard));
|
||||
// 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;
|
||||
// }
|
||||
|
||||
uint32_t press_failed_cnt = 0;
|
||||
static bool touchpad_is_pressed(struct TouchDataStandard *touch_data_ptr)
|
||||
{
|
||||
int ret;
|
||||
/*Your code comes here*/
|
||||
memset(&touch_data, 0 ,sizeof(TouchDataParam));
|
||||
|
||||
if (touch_fd < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
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)
|
||||
memset(touch_data_ptr, 0, sizeof(struct TouchDataStandard));
|
||||
ret = PrivRead(touch_fd, touch_data_ptr, 1);
|
||||
if (ret)
|
||||
{
|
||||
printf("touch x %d touch y %d\n",touch_data.x,touch_data.y);
|
||||
if (touch_data_ptr->x > 0 && touch_data_ptr->x < MY_INDEV_X && touch_data_ptr->y > 0 && touch_data_ptr->y < MY_INDEV_Y)
|
||||
{
|
||||
press_failed_cnt = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
press_failed_cnt++;
|
||||
if (press_failed_cnt >= PRESS_FAILED_LIMIT)
|
||||
{
|
||||
PrivClose(touch_fd);
|
||||
touchpad_init();
|
||||
press_failed_cnt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*Get the x and y coordinates if the touchpad is pressed*/
|
||||
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
|
||||
static void touchpad_get_xy(struct TouchDataStandard *touch_data_ptr,
|
||||
lv_coord_t *x, lv_coord_t *y)
|
||||
{
|
||||
/*Your code comes here*/
|
||||
|
||||
(*x) = touch_data.x;
|
||||
(*y) = touch_data.y;
|
||||
(*x) = touch_data_ptr->x;
|
||||
(*y) = touch_data_ptr->y;
|
||||
}
|
||||
|
||||
// static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
|
||||
// {
|
||||
// /*Your code comes here*/
|
||||
|
||||
// (*x) = touch_data.x;
|
||||
// (*y) = touch_data.y;
|
||||
// }
|
||||
#endif
|
||||
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
|
||||
|
@ -297,15 +342,18 @@ static void mouse_init(void)
|
|||
}
|
||||
|
||||
/*Will be called by the library to read the mouse*/
|
||||
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)
|
||||
{
|
||||
/*Get the current x and y coordinates*/
|
||||
mouse_get_xy(&data->point.x, &data->point.y);
|
||||
|
||||
/*Get whether the mouse button is pressed or released*/
|
||||
if(mouse_is_pressed()) {
|
||||
if (mouse_is_pressed())
|
||||
{
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
}
|
||||
|
@ -319,7 +367,7 @@ static bool mouse_is_pressed(void)
|
|||
}
|
||||
|
||||
/*Get the x and y coordinates if the mouse is pressed*/
|
||||
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)
|
||||
{
|
||||
/*Your code comes here*/
|
||||
|
||||
|
@ -328,8 +376,6 @@ 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
|
||||
/*------------------
|
||||
* Keypad
|
||||
|
@ -342,7 +388,7 @@ static void keypad_init(void)
|
|||
}
|
||||
|
||||
/*Will be called by the library to read the mouse*/
|
||||
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 last_key = 0;
|
||||
|
||||
|
@ -351,11 +397,13 @@ static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
|||
|
||||
/*Get whether the a key is pressed and save the pressed key*/
|
||||
uint32_t act_key = keypad_get_key();
|
||||
if(act_key != 0) {
|
||||
if (act_key != 0)
|
||||
{
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
|
||||
/*Translate the keys to LVGL control characters according to your key definitions*/
|
||||
switch(act_key) {
|
||||
switch (act_key)
|
||||
{
|
||||
case 1:
|
||||
act_key = LV_KEY_NEXT;
|
||||
break;
|
||||
|
@ -374,7 +422,9 @@ static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
|||
}
|
||||
|
||||
last_key = act_key;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
|
||||
|
@ -390,8 +440,6 @@ static uint32_t keypad_get_key(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||
/*------------------
|
||||
* Encoder
|
||||
|
@ -404,7 +452,7 @@ static void encoder_init(void)
|
|||
}
|
||||
|
||||
/*Will be called by the library to read the encoder*/
|
||||
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)
|
||||
{
|
||||
|
||||
data->enc_diff = encoder_diff;
|
||||
|
@ -433,7 +481,7 @@ static void button_init(void)
|
|||
}
|
||||
|
||||
/*Will be called by the library to read the button*/
|
||||
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 uint8_t last_btn = 0;
|
||||
|
@ -441,10 +489,13 @@ static void button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
|||
/*Get the pressed button's ID*/
|
||||
int8_t btn_act = button_get_pressed_id();
|
||||
|
||||
if(btn_act >= 0) {
|
||||
if (btn_act >= 0)
|
||||
{
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
last_btn = btn_act;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
data->state = LV_INDEV_STATE_REL;
|
||||
}
|
||||
|
||||
|
@ -458,9 +509,11 @@ static int8_t button_get_pressed_id(void)
|
|||
uint8_t i;
|
||||
|
||||
/*Check to buttons see which is being pressed (assume there are 2 buttons)*/
|
||||
for(i = 0; i < 2; i++) {
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
/*Return the pressed button's ID*/
|
||||
if(button_is_pressed(i)) {
|
||||
if (button_is_pressed(i))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "lv_port_indev_template.h"
|
||||
#include "../lvgl.h"
|
||||
|
||||
#include <dev_touch.h>
|
||||
|
||||
static int touch_fd = 0;
|
||||
/*********************
|
||||
|
|
|
@ -121,8 +121,8 @@ static uint32 dvpRead(void *dev, struct BusBlockReadParam *read_param)
|
|||
|
||||
static uint32 dvpDrvConfigure(void *drv, struct BusConfigureInfo *args)
|
||||
{
|
||||
|
||||
x_err_t ret = EOK;
|
||||
|
||||
int cmd_type = args->configure_cmd;
|
||||
struct CameraCfg* tmp_cfg;
|
||||
switch (cmd_type)
|
||||
|
|
|
@ -65,8 +65,8 @@ typedef enum _touch_event
|
|||
#define GTP_REG_VERSION 0x8140
|
||||
|
||||
#define LCD_SIZE 320
|
||||
#define TOUCH_WIDTH 1080
|
||||
#define TOUCH_HEIGHT 720
|
||||
#define TOUCH_WIDTH 1000
|
||||
#define TOUCH_HEIGHT 660
|
||||
|
||||
#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0]))
|
||||
|
||||
|
|
|
@ -278,7 +278,7 @@ static uint32 TouchRead(void* dev, struct BusBlockReadParam* read_param)
|
|||
|
||||
struct TouchDataStandard* data = (struct TouchDataStandard*)read_param->buffer;
|
||||
|
||||
result = KSemaphoreObtain(touch_sem, 10);
|
||||
result = KSemaphoreObtain(touch_sem, 100);
|
||||
// if (EOK == result)
|
||||
// {
|
||||
memset(TOUCHRECDATA, 0, 24);
|
||||
|
@ -292,8 +292,8 @@ static uint32 TouchRead(void* dev, struct BusBlockReadParam* read_param)
|
|||
{
|
||||
ts_event.fingers[i].x = ((((uint32_t)TOUCHRECDATA[(i * 4) + 5]) << 8) | (uint32_t)TOUCHRECDATA[(i * 4) + 4]) & 0x00000FFF; // 12 bits of X coord
|
||||
ts_event.fingers[i].y = ((((uint32_t)TOUCHRECDATA[(i * 4) + 7]) << 8) | (uint32_t)TOUCHRECDATA[(i * 4) + 6]) & 0x00000FFF;
|
||||
uint32_t pos_y = 308 - ts_event.fingers[i].x *LCD_SIZE/TOUCH_WIDTH;
|
||||
ts_event.fingers[i].x = ts_event.fingers[i].y *LCD_SIZE/TOUCH_HEIGHT;
|
||||
uint32_t pos_y = 320 > ts_event.fingers[i].x *LCD_SIZE/TOUCH_WIDTH?320 - ts_event.fingers[i].x *LCD_SIZE/TOUCH_WIDTH:0;
|
||||
ts_event.fingers[i].x = ts_event.fingers[i].y *LCD_SIZE/TOUCH_HEIGHT>6?ts_event.fingers[i].y *LCD_SIZE/TOUCH_HEIGHT-6:0;
|
||||
ts_event.fingers[i].y = pos_y;
|
||||
ts_event.fingers[i].fingerID = (uint32_t)TOUCHRECDATA[(i * 4) + 7] >> 4; // finger that did the touch
|
||||
// printf("fingers[%d] x %d y %d id %d\n",i,ts_event.fingers[i].x,ts_event.fingers[i].y,ts_event.fingers[i].fingerID);
|
||||
|
|
|
@ -359,7 +359,8 @@ static uint32 TouchRead(void *dev, struct BusBlockReadParam *read_param)
|
|||
result = KSemaphoreObtain(touch_sem, 1000);
|
||||
if (EOK == result)
|
||||
{
|
||||
if(GetTouchEvent(&touch_point, &touch_event))
|
||||
ret = GetTouchEvent(&touch_point, &touch_event);
|
||||
if(ret > 0)
|
||||
{
|
||||
data->x = abs(LCD_WIDTH - touch_point.X);
|
||||
data->y = abs(LCD_HEIGHT - touch_point.Y);
|
||||
|
@ -370,6 +371,11 @@ static uint32 TouchRead(void *dev, struct BusBlockReadParam *read_param)
|
|||
read_param->read_length = read_param->size;
|
||||
ret = EOK;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = -ERROR;
|
||||
read_param->read_length = -ERROR;
|
||||
}
|
||||
SemReleaseFlag = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -91,3 +91,19 @@ select RESOURCES_WDT
|
|||
if BSP_USING_WDT
|
||||
source "$BSP_DIR/third_party_driver/watchdog/Kconfig"
|
||||
endif
|
||||
|
||||
menuconfig BSP_USING_WDT
|
||||
bool "Using WATCHDOG device"
|
||||
default n
|
||||
select RESOURCES_WDT
|
||||
if BSP_USING_WDT
|
||||
source "$BSP_DIR/third_party_driver/watchdog/Kconfig"
|
||||
endif
|
||||
|
||||
menuconfig BSP_USING_SOFT_SPI
|
||||
bool "Using SOFT_SPI device"
|
||||
default n
|
||||
select RESOURCES_SOFT_SPI
|
||||
if BSP_USING_SOFT_SPI
|
||||
source "$BSP_DIR/third_party_driver/soft_spi/Kconfig"
|
||||
endif
|
||||
|
|
|
@ -48,4 +48,8 @@ ifeq ($(CONFIG_BSP_USING_WDT),y)
|
|||
SRC_DIR += watchdog
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BSP_USING_SOFT_SPI),y)
|
||||
SRC_DIR += soft_spi
|
||||
endif
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef CONNECT_TF_H
|
||||
#define CONNECT_TF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int HwSoftSPIInit(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,43 @@
|
|||
if BSP_USING_SOFT_SPI
|
||||
config SOFT_SPI_BUS_NAME
|
||||
string "soft spi bus 1 name"
|
||||
default "soft_spi1_bus1"
|
||||
|
||||
config SOFT_SPI_DEVICE_NAME
|
||||
string "soft spi dev 1 name"
|
||||
default "soft_spi1_dev1"
|
||||
|
||||
config SOFT_SPI_DRV_NAME
|
||||
string "soft spi drv 1 name"
|
||||
default "soft_spi1_drv1"
|
||||
|
||||
config SOFT_SPI_SCK
|
||||
int "soft spi sck pin"
|
||||
default 26
|
||||
|
||||
config SOFT_SPI_MOSI
|
||||
int "soft spi mosi pin"
|
||||
default 27
|
||||
|
||||
config SOFT_SPI_MISO
|
||||
int "soft spi miso pin"
|
||||
default 25
|
||||
|
||||
config SOFT_SPI_CS0_PIN
|
||||
int "soft spi cs pin"
|
||||
default 28
|
||||
|
||||
config SOFT_SPI_DEVICE_SLAVE_ID
|
||||
int "soft spi slave id"
|
||||
default 0
|
||||
|
||||
config SOFT_SPI_CHIP_SELECT
|
||||
int "soft spi chip selected"
|
||||
default 0
|
||||
|
||||
config SOFT_SPI_CLK_DELAY
|
||||
int "clk in microsecond"
|
||||
default 0
|
||||
|
||||
endif
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
SRC_FILES := connect_soft_spi.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -0,0 +1,295 @@
|
|||
#include <xizi.h>
|
||||
#include <device.h>
|
||||
#include <fpioa.h>
|
||||
#include <gpiohs.h>
|
||||
#include "drv_io_config.h"
|
||||
#include <plic.h>
|
||||
#include <utils.h>
|
||||
#include <connect_soft_spi.h>
|
||||
#include <sleep.h>
|
||||
|
||||
#include <sd_spi.h>
|
||||
#include <dev_spi.h>
|
||||
#include <bus_spi.h>
|
||||
|
||||
static x_err_t softSPIinit(struct SpiDriver *spi_drv, struct BusConfigureInfo *cfg)
|
||||
{
|
||||
NULL_PARAM_CHECK(spi_drv);
|
||||
NULL_PARAM_CHECK(cfg);
|
||||
|
||||
// mode CPOL = 0 CPHA = 0
|
||||
gpiohs_set_drive_mode(SOFT_SPI_CS0_PIN, GPIO_DM_OUTPUT);
|
||||
gpiohs_set_pin(SOFT_SPI_CS0_PIN, GPIO_PV_HIGH); // set the cs gpio high
|
||||
gpiohs_set_drive_mode(SOFT_SPI_SCK, GPIO_DM_OUTPUT);
|
||||
gpiohs_set_drive_mode(SOFT_SPI_MOSI, GPIO_DM_OUTPUT);
|
||||
gpiohs_set_drive_mode(SOFT_SPI_MISO, GPIO_DM_INPUT);
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_LOW);
|
||||
KPrintf("%s init done\n", SOFT_SPI_BUS_NAME);
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
||||
static uint32 softSpiDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
|
||||
{
|
||||
NULL_PARAM_CHECK(drv);
|
||||
NULL_PARAM_CHECK(configure_info);
|
||||
|
||||
x_err_t ret = EOK;
|
||||
struct SpiDriver *spi_drv = (struct SpiDriver *)drv;
|
||||
struct SpiMasterParam *spi_param;
|
||||
|
||||
switch (configure_info->configure_cmd)
|
||||
{
|
||||
case OPE_INT:
|
||||
softSPIinit(spi_drv, configure_info);
|
||||
break;
|
||||
|
||||
case OPE_CFG:
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void soft_spi_writebyte(struct SpiHardwareDevice *spi_dev, uint8_t data)
|
||||
{
|
||||
int8_t i = 0;
|
||||
uint8_t temp = 0;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
temp = ((data & 0x80) == 0x80) ? 1 : 0;
|
||||
data = data << 1;
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_LOW);
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
if (0 == temp)
|
||||
{
|
||||
gpiohs_set_pin(SOFT_SPI_MOSI, GPIO_PV_LOW);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpiohs_set_pin(SOFT_SPI_MOSI, GPIO_PV_HIGH);
|
||||
}
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_HIGH);
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
}
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_LOW);
|
||||
}
|
||||
|
||||
/* 读一个字节 */
|
||||
static uint8_t soft_spi_readbyte(struct SpiHardwareDevice *spi_dev)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
uint8_t read_data = 0xFF;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
read_data = read_data << 1;
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_LOW);
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_HIGH);
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
if (1 == gpiohs_get_pin(SOFT_SPI_MISO))
|
||||
{
|
||||
read_data = read_data | 0x01;
|
||||
}
|
||||
}
|
||||
return read_data;
|
||||
}
|
||||
|
||||
/* 读写一个字节 */
|
||||
// this funcition is unverify until now!
|
||||
static uint8_t soft_spi_readwritebyte(struct SpiHardwareDevice *spi_dev, uint8_t data)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
uint8_t temp = 0;
|
||||
uint8_t read_data = 0xFF;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
temp = ((data & 0x80) == 0x80) ? 1 : 0;
|
||||
data = data << 1;
|
||||
read_data = read_data << 1;
|
||||
if (temp == 0)
|
||||
{
|
||||
gpiohs_set_pin(SOFT_SPI_MOSI, GPIO_PV_LOW);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpiohs_set_pin(SOFT_SPI_MOSI, GPIO_PV_HIGH);
|
||||
}
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
gpiohs_set_pin(SOFT_SPI_SCK, GPIO_PV_HIGH);
|
||||
usleep(SOFT_SPI_CLK_DELAY);
|
||||
if (gpiohs_get_pin(SOFT_SPI_MISO) == 1)
|
||||
{
|
||||
read_data = read_data + 1;
|
||||
}
|
||||
}
|
||||
return read_data;
|
||||
}
|
||||
|
||||
static uint32 softSpiWriteData(struct SpiHardwareDevice *spi_dev, struct SpiDataStandard *spi_datacfg)
|
||||
{
|
||||
SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_dev->haldev.private_data);
|
||||
|
||||
uint8 cs_gpio_pin = dev_param->spi_slave_param->spi_cs_gpio_pin;
|
||||
const uint8_t *data_buff = spi_datacfg->tx_buff;
|
||||
int data_length = spi_datacfg->length;
|
||||
if (NONE == spi_datacfg->tx_buff)
|
||||
{
|
||||
data_length = 0;
|
||||
}
|
||||
|
||||
if (spi_datacfg->spi_chip_select)
|
||||
{
|
||||
gpiohs_set_pin(cs_gpio_pin, GPIO_PV_LOW);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < data_length; i++)
|
||||
{
|
||||
soft_spi_writebyte(spi_dev, data_buff[i]);
|
||||
}
|
||||
|
||||
if (spi_datacfg->spi_cs_release)
|
||||
{
|
||||
gpiohs_set_pin(cs_gpio_pin, GPIO_PV_HIGH);
|
||||
}
|
||||
spi_datacfg = spi_datacfg->next;
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
||||
static uint32 softSpiReadData(struct SpiHardwareDevice *spi_dev, struct SpiDataStandard *spi_datacfg)
|
||||
{
|
||||
SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_dev->haldev.private_data);
|
||||
uint8 cs_gpio_pin = dev_param->spi_slave_param->spi_cs_gpio_pin;
|
||||
uint8_t *recv_buff = spi_datacfg->rx_buff;
|
||||
int recv_length = spi_datacfg->length;
|
||||
|
||||
if (NONE == spi_datacfg->rx_buff)
|
||||
{
|
||||
recv_length = 0;
|
||||
}
|
||||
|
||||
if (spi_datacfg->spi_chip_select)
|
||||
{
|
||||
gpiohs_set_pin(cs_gpio_pin, GPIO_PV_LOW);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < recv_length; i++)
|
||||
{
|
||||
recv_buff[i] = soft_spi_readbyte(spi_dev);
|
||||
}
|
||||
|
||||
if (spi_datacfg->spi_cs_release)
|
||||
{
|
||||
gpiohs_set_pin(cs_gpio_pin, GPIO_PV_HIGH);
|
||||
}
|
||||
|
||||
spi_datacfg = spi_datacfg->next;
|
||||
|
||||
return spi_datacfg->length;
|
||||
}
|
||||
|
||||
const struct SpiDevDone soft_spi_dev_done = {
|
||||
.dev_close = NONE,
|
||||
.dev_open = NONE,
|
||||
.dev_read = softSpiReadData,
|
||||
.dev_write = softSpiWriteData};
|
||||
|
||||
static int BoardSoftSpiBusInit(struct SpiBus *spi_bus, struct SpiDriver *spi_driver)
|
||||
{
|
||||
x_err_t ret = EOK;
|
||||
|
||||
/*Init the spi bus */
|
||||
ret = SpiBusInit(spi_bus, SOFT_SPI_BUS_NAME);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_init SpiBusInit error %d\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/*Init the spi driver*/
|
||||
ret = SpiDriverInit(spi_driver, SOFT_SPI_DRV_NAME);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_init SpiDriverInit error %d\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/*Attach the spi driver to the spi bus*/
|
||||
ret = SpiDriverAttachToBus(SOFT_SPI_DRV_NAME, SOFT_SPI_BUS_NAME);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_init SpiDriverAttachToBus error %d\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int BoardSoftSpiDevBend(void)
|
||||
{
|
||||
x_err_t ret = EOK;
|
||||
|
||||
static struct SpiHardwareDevice spi_device0;
|
||||
memset(&spi_device0, 0, sizeof(struct SpiHardwareDevice));
|
||||
|
||||
static struct SpiSlaveParam spi_slaveparam0;
|
||||
memset(&spi_slaveparam0, 0, sizeof(struct SpiSlaveParam));
|
||||
|
||||
spi_slaveparam0.spi_slave_id = SOFT_SPI_DEVICE_SLAVE_ID;
|
||||
spi_slaveparam0.spi_cs_gpio_pin = SOFT_SPI_CS0_PIN;
|
||||
spi_slaveparam0.spi_cs_select_id = SOFT_SPI_CHIP_SELECT;
|
||||
|
||||
spi_device0.spi_param.spi_dma_param = NONE;
|
||||
spi_device0.spi_param.spi_slave_param = &spi_slaveparam0;
|
||||
|
||||
spi_device0.spi_dev_done = &(soft_spi_dev_done);
|
||||
|
||||
ret = SpiDeviceRegister(&spi_device0, (void *)(&spi_device0.spi_param), SOFT_SPI_DEVICE_NAME);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_init SpiDeviceInit device %s error %d\n", SOFT_SPI_DEVICE_NAME, ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
ret = SpiDeviceAttachToBus(SOFT_SPI_DEVICE_NAME, SOFT_SPI_BUS_NAME);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_init SpiDeviceAttachToBus device %s error %d\n", SOFT_SPI_DEVICE_NAME, ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int HwSoftSPIInit(void)
|
||||
{
|
||||
x_err_t ret = EOK;
|
||||
|
||||
static struct SpiBus spi_bus;
|
||||
memset(&spi_bus, 0, sizeof(struct SpiBus));
|
||||
|
||||
static struct SpiDriver spi_driver;
|
||||
memset(&spi_driver, 0, sizeof(struct SpiDriver));
|
||||
|
||||
spi_driver.configure = &(softSpiDrvConfigure);
|
||||
|
||||
ret = BoardSoftSpiBusInit(&spi_bus, &spi_driver);
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_Init error ret %u\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
ret = BoardSoftSpiDevBend();
|
||||
if (EOK != ret)
|
||||
{
|
||||
KPrintf("Board_Spi_Init error ret %u\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
Loading…
Reference in New Issue