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
|
config TOUCH_DEV_DRIVER
|
||||||
string "Set touch dev path"
|
string "Set touch dev path"
|
||||||
default "/dev/touch_dev"
|
default "/dev/touch_dev"
|
||||||
|
config TOUCH_LCD_DEV_DRIVER
|
||||||
|
string "Set lcd dev path"
|
||||||
|
default "/dev/lcd_dev"
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,9 @@ void TestTouch(void)
|
||||||
#include <transform.h>
|
#include <transform.h>
|
||||||
|
|
||||||
#define NULL_PARAMETER 0
|
#define NULL_PARAMETER 0
|
||||||
|
#define LCD_DOT_TYPE 1
|
||||||
|
#define LCD_SIZE 320
|
||||||
|
|
||||||
|
|
||||||
void TestTouch(void)
|
void TestTouch(void)
|
||||||
{
|
{
|
||||||
|
@ -55,17 +58,52 @@ void TestTouch(void)
|
||||||
printf("open touch fd error:%d\n", touch_fd);
|
printf("open touch fd error:%d\n", touch_fd);
|
||||||
return;
|
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
|
// draw text
|
||||||
struct TouchDataStandard touch_pixel;
|
struct TouchDataStandard touch_pixel;
|
||||||
memset(&touch_pixel,0,sizeof(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){
|
while(1){
|
||||||
if(0 > PrivRead(touch_fd, &touch_pixel, NULL_PARAMETER)){
|
if(0 > PrivRead(touch_fd, &touch_pixel, NULL_PARAMETER)){
|
||||||
printf("read touch error\n");
|
printf("read touch error\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
printf("touch pixel position x:%d,y:%d\n",touch_pixel.x,touch_pixel.y);
|
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);
|
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
|
#if 1
|
||||||
|
|
||||||
/*********************
|
/*********************
|
||||||
|
@ -12,18 +12,18 @@
|
||||||
#include "lv_port_indev_template.h"
|
#include "lv_port_indev_template.h"
|
||||||
#include "../../lvgl.h"
|
#include "../../lvgl.h"
|
||||||
|
|
||||||
static int touch_fd = -1;
|
static int touch_fd = 0;
|
||||||
static TouchDataParam touch_data;
|
|
||||||
/*********************
|
/*********************
|
||||||
* DEFINES
|
* DEFINES
|
||||||
*********************/
|
*********************/
|
||||||
#define LV_USE_INDEV_TOUCHPAD 0x1u
|
#define LV_USE_INDEV_TOUCHPAD 0x1u
|
||||||
#define LV_USE_INDEV_MOUSE 0x2u
|
#define LV_USE_INDEV_MOUSE 0x2u
|
||||||
#define LV_USE_INDEV_KEYPAD 0x4u
|
#define LV_USE_INDEV_KEYPAD 0x4u
|
||||||
#define LV_USE_INDEV_ENCODER 0x8u
|
#define LV_USE_INDEV_ENCODER 0x8u
|
||||||
#define LV_USE_INDEV_BUTTUN 0x10u
|
#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
|
#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
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
|
@ -34,33 +34,36 @@ static TouchDataParam touch_data;
|
||||||
**********************/
|
**********************/
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
|
#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);
|
||||||
|
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
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
|
#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
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
|
#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
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
#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
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
|
#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
|
#endif
|
||||||
|
@ -69,23 +72,23 @@ static bool button_is_pressed(uint8_t id);
|
||||||
* STATIC VARIABLES
|
* STATIC VARIABLES
|
||||||
**********************/
|
**********************/
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
|
#if (LV_USE_INDEV & LV_USE_INDEV_TOUCHPAD) == LV_USE_INDEV_TOUCHPAD
|
||||||
lv_indev_t * indev_touchpad;
|
lv_indev_t *indev_touchpad;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
|
#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
|
||||||
lv_indev_t * indev_mouse;
|
lv_indev_t *indev_mouse;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
|
#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
|
||||||
lv_indev_t * indev_keypad;
|
lv_indev_t *indev_keypad;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||||
lv_indev_t * indev_encoder;
|
lv_indev_t *indev_encoder;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
|
#if (LV_USE_INDEV & LV_USE_INDEV_BUTTUN) == LV_USE_INDEV_BUTTUN
|
||||||
lv_indev_t * indev_button;
|
lv_indev_t *indev_button;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int32_t encoder_diff;
|
static int32_t encoder_diff;
|
||||||
|
@ -144,7 +147,7 @@ void lv_port_indev_init(void)
|
||||||
indev_mouse = lv_indev_drv_register(&indev_drv);
|
indev_mouse = lv_indev_drv_register(&indev_drv);
|
||||||
|
|
||||||
/*Set cursor. For simplicity set a HOME symbol now.*/
|
/*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_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
|
#endif
|
||||||
|
@ -169,8 +172,6 @@ void lv_port_indev_init(void)
|
||||||
*`lv_indev_set_group(indev_keypad, group);`*/
|
*`lv_indev_set_group(indev_keypad, group);`*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||||
/*------------------
|
/*------------------
|
||||||
* Encoder
|
* Encoder
|
||||||
|
@ -207,8 +208,8 @@ void lv_port_indev_init(void)
|
||||||
|
|
||||||
/*Assign buttons to points on the screen*/
|
/*Assign buttons to points on the screen*/
|
||||||
static const lv_point_t btn_points[2] = {
|
static const lv_point_t btn_points[2] = {
|
||||||
{10, 10}, /*Button 0 -> x:10; y:10*/
|
{10, 10}, /*Button 0 -> x:10; y:10*/
|
||||||
{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
|
#endif
|
||||||
|
@ -225,27 +226,37 @@ 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);
|
touch_fd = PrivOpen(PRIV_TOUCH_DEV, O_RDWR);
|
||||||
if(touch_fd >= 0) {
|
if (touch_fd >= 0)
|
||||||
|
{
|
||||||
printf("touch fd = %d\n",touch_fd);
|
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*/
|
/*Your code comes here*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static struct TouchDataStandard touch_data;
|
||||||
|
|
||||||
/*Will be called by the library to read the touchpad*/
|
/*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_x = 0;
|
||||||
static lv_coord_t last_y = 0;
|
static lv_coord_t last_y = 0;
|
||||||
|
|
||||||
|
static struct TouchDataStandard touch_data;
|
||||||
|
|
||||||
/*Save the pressed coordinates and the state*/
|
/*Save the pressed coordinates and the state*/
|
||||||
if(touchpad_is_pressed()) {
|
if (touchpad_is_pressed(&touch_data))
|
||||||
touchpad_get_xy(&last_x, &last_y);
|
{
|
||||||
|
touchpad_get_xy(&touch_data, &last_x, &last_y);
|
||||||
data->state = LV_INDEV_STATE_PR;
|
data->state = LV_INDEV_STATE_PR;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_REL;
|
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*/
|
/*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;
|
int ret;
|
||||||
/*Your code comes here*/
|
/*Your code comes here*/
|
||||||
memset(&touch_data, 0 ,sizeof(TouchDataParam));
|
memset(touch_data_ptr, 0, sizeof(struct TouchDataStandard));
|
||||||
|
ret = PrivRead(touch_fd, touch_data_ptr, 1);
|
||||||
if (touch_fd < 0) {
|
if (ret)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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)
|
||||||
return true;
|
{
|
||||||
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Get the x and y coordinates if the touchpad is pressed*/
|
/*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*/
|
/*Your code comes here*/
|
||||||
|
|
||||||
(*x) = touch_data.x;
|
(*x) = touch_data_ptr->x;
|
||||||
(*y) = touch_data.y;
|
(*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
|
#endif
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_MOUSE) == LV_USE_INDEV_MOUSE
|
#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*/
|
/*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*/
|
/*Get the current x and y coordinates*/
|
||||||
mouse_get_xy(&data->point.x, &data->point.y);
|
mouse_get_xy(&data->point.x, &data->point.y);
|
||||||
|
|
||||||
/*Get whether the mouse button is pressed or released*/
|
/*Get whether the mouse button is pressed or released*/
|
||||||
if(mouse_is_pressed()) {
|
if (mouse_is_pressed())
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_PR;
|
data->state = LV_INDEV_STATE_PR;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_REL;
|
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*/
|
/*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*/
|
/*Your code comes here*/
|
||||||
|
|
||||||
|
@ -328,8 +376,6 @@ static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
|
#if (LV_USE_INDEV & LV_USE_INDEV_KEYPAD) == LV_USE_INDEV_KEYPAD
|
||||||
/*------------------
|
/*------------------
|
||||||
* Keypad
|
* Keypad
|
||||||
|
@ -342,7 +388,7 @@ static void keypad_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Will be called by the library to read the mouse*/
|
/*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;
|
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*/
|
/*Get whether the a key is pressed and save the pressed key*/
|
||||||
uint32_t act_key = keypad_get_key();
|
uint32_t act_key = keypad_get_key();
|
||||||
if(act_key != 0) {
|
if (act_key != 0)
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_PR;
|
data->state = LV_INDEV_STATE_PR;
|
||||||
|
|
||||||
/*Translate the keys to LVGL control characters according to your key definitions*/
|
/*Translate the keys to LVGL control characters according to your key definitions*/
|
||||||
switch(act_key) {
|
switch (act_key)
|
||||||
|
{
|
||||||
case 1:
|
case 1:
|
||||||
act_key = LV_KEY_NEXT;
|
act_key = LV_KEY_NEXT;
|
||||||
break;
|
break;
|
||||||
|
@ -374,7 +422,9 @@ static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||||
}
|
}
|
||||||
|
|
||||||
last_key = act_key;
|
last_key = act_key;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_REL;
|
data->state = LV_INDEV_STATE_REL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,8 +440,6 @@ static uint32_t keypad_get_key(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
#if (LV_USE_INDEV & LV_USE_INDEV_ENCODER) == LV_USE_INDEV_ENCODER
|
||||||
/*------------------
|
/*------------------
|
||||||
* Encoder
|
* Encoder
|
||||||
|
@ -404,7 +452,7 @@ static void encoder_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Will be called by the library to read the encoder*/
|
/*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;
|
data->enc_diff = encoder_diff;
|
||||||
|
@ -433,7 +481,7 @@ static void button_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Will be called by the library to read the button*/
|
/*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;
|
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*/
|
/*Get the pressed button's ID*/
|
||||||
int8_t btn_act = button_get_pressed_id();
|
int8_t btn_act = button_get_pressed_id();
|
||||||
|
|
||||||
if(btn_act >= 0) {
|
if (btn_act >= 0)
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_PR;
|
data->state = LV_INDEV_STATE_PR;
|
||||||
last_btn = btn_act;
|
last_btn = btn_act;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
data->state = LV_INDEV_STATE_REL;
|
data->state = LV_INDEV_STATE_REL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -458,9 +509,11 @@ static int8_t button_get_pressed_id(void)
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
/*Check to buttons see which is being pressed (assume there are 2 buttons)*/
|
/*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*/
|
/*Return the pressed button's ID*/
|
||||||
if(button_is_pressed(i)) {
|
if (button_is_pressed(i))
|
||||||
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include "lv_port_indev_template.h"
|
#include "lv_port_indev_template.h"
|
||||||
#include "../lvgl.h"
|
#include "../lvgl.h"
|
||||||
|
|
||||||
#include <dev_touch.h>
|
|
||||||
|
|
||||||
static int touch_fd = 0;
|
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)
|
static uint32 dvpDrvConfigure(void *drv, struct BusConfigureInfo *args)
|
||||||
{
|
{
|
||||||
|
|
||||||
x_err_t ret = EOK;
|
x_err_t ret = EOK;
|
||||||
|
|
||||||
int cmd_type = args->configure_cmd;
|
int cmd_type = args->configure_cmd;
|
||||||
struct CameraCfg* tmp_cfg;
|
struct CameraCfg* tmp_cfg;
|
||||||
switch (cmd_type)
|
switch (cmd_type)
|
||||||
|
|
|
@ -65,8 +65,8 @@ typedef enum _touch_event
|
||||||
#define GTP_REG_VERSION 0x8140
|
#define GTP_REG_VERSION 0x8140
|
||||||
|
|
||||||
#define LCD_SIZE 320
|
#define LCD_SIZE 320
|
||||||
#define TOUCH_WIDTH 1080
|
#define TOUCH_WIDTH 1000
|
||||||
#define TOUCH_HEIGHT 720
|
#define TOUCH_HEIGHT 660
|
||||||
|
|
||||||
#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0]))
|
#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;
|
struct TouchDataStandard* data = (struct TouchDataStandard*)read_param->buffer;
|
||||||
|
|
||||||
result = KSemaphoreObtain(touch_sem, 10);
|
result = KSemaphoreObtain(touch_sem, 100);
|
||||||
// if (EOK == result)
|
// if (EOK == result)
|
||||||
// {
|
// {
|
||||||
memset(TOUCHRECDATA, 0, 24);
|
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].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;
|
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;
|
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;
|
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].y = pos_y;
|
||||||
ts_event.fingers[i].fingerID = (uint32_t)TOUCHRECDATA[(i * 4) + 7] >> 4; // finger that did the touch
|
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);
|
// 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);
|
result = KSemaphoreObtain(touch_sem, 1000);
|
||||||
if (EOK == result)
|
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->x = abs(LCD_WIDTH - touch_point.X);
|
||||||
data->y = abs(LCD_HEIGHT - touch_point.Y);
|
data->y = abs(LCD_HEIGHT - touch_point.Y);
|
||||||
|
@ -369,6 +370,11 @@ static uint32 TouchRead(void *dev, struct BusBlockReadParam *read_param)
|
||||||
|
|
||||||
read_param->read_length = read_param->size;
|
read_param->read_length = read_param->size;
|
||||||
ret = EOK;
|
ret = EOK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -ERROR;
|
||||||
|
read_param->read_length = -ERROR;
|
||||||
}
|
}
|
||||||
SemReleaseFlag = 0;
|
SemReleaseFlag = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,3 +91,19 @@ select RESOURCES_WDT
|
||||||
if BSP_USING_WDT
|
if BSP_USING_WDT
|
||||||
source "$BSP_DIR/third_party_driver/watchdog/Kconfig"
|
source "$BSP_DIR/third_party_driver/watchdog/Kconfig"
|
||||||
endif
|
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
|
SRC_DIR += watchdog
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_BSP_USING_SOFT_SPI),y)
|
||||||
|
SRC_DIR += soft_spi
|
||||||
|
endif
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
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