buildroot里面选定ffmpeg编译,太大了,rootfs.tar 22M,16M内存放不下。
mplayer也是不行。9M多,重新编译rootfs.tar变成32M。难道要make clean再编译?
ST7789 SPI屏幕
IO按键控制
IO输出
LED驱动
参考https://whycan.com/t_5017.html
#include <dt-bindings/gpio/gpio.h>
/ {
model = "Lichee Pi Nano";
compatible = "licheepi,licheepi-nano", "allwinner,suniv-f1c100s",
"allwinner,suniv";
aliases {
serial0 = &uart0;
spi0 = &spi0;
};
chosen {
stdout-path = "serial0:115200n8";
};
panel: panel {
compatible = "qiaodian,qd43003c0-40", "simple-panel";
#address-cells = <1>;
#size-cells = <0>;
enable-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
panel_input: endpoint@0 {
reg = <0>;
remote-endpoint = <&tcon0_out_lcd>;
};
};
};
reg_vcc3v3: vcc3v3 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
leds {
compatible = "gpio-leds";
blue_led {
label = "licheepi:blue:usr";
gpios = <&pio 0 0 GPIO_ACTIVE_LOW>; /* PA0 */
};
};
};
添加上面加粗那一段,重新编译内核烧录开机
# cd /sys/class/gpio
# ls
export gpiochip0 unexport
# chmode 777 export
-sh: chmode: not found
# chmod 777 export
# echo 1 > /sys/class/leds/licheepi\:blue\:usr/brightness
# echo 0 > /sys/class/leds/licheepi\:blue\:usr/brightness
# echo 1 > /sys/class/leds/licheepi\:blue\:usr/brightness
# echo 0 > /sys/class/leds/licheepi\:blue\:usr/brightness
#
添加触摸驱动
https://whycan.com/t_2143.html
看这个↓:
https://whycan.com/t_5897.html
tsc2007
ns2009.c
driver/input/touchscreen
linux内核目录下:
menu:
device-》input device—》touchscreen
cat /dev/input/event
buildroot里面工具测试触摸屏
tb-test
tslib
Target packages > Libraries > Hardware handling > BR2_PACKAGE_TSL
安装工具之后,使用工具
保持:
mount: you must be root
mount: you must be root
mkdir: can't create directory '/dev/pts': Permission denied
mkdir: can't create directory '/dev/shm': Permission denied
mount: you must be root
hostname: sethostname: Operation not permitted
Starting logging: OK
Initializing random number generator... done.
Starting network: ip: RTNETLINK answers: Operation not permitted
ip: SIOCSIFFLAGS: Operation not permitted
FAIL
can't open /dev/console: Permission denied
can't open /dev/console: Permission denied
can't open /dev/console: Permission denied
去掉network dhcp两项,wifi工具部分功能,重新编译文件系统。
或者用指令解压
可以登录
执行OK
- 调试:笔记-编译LittlevGL GUI demo支持tslib 分享链接
https://whycan.com/t_2303.html
安装lrz,linjie
https://whycan.com/t_4266.html
简单说:将lrz源码目录下src中lsz、lrz放到rootfs/bin
将libc.so.0放到 rootfs/lib
使用MobaXterm执行lrz不能用,下载SecureCRT,设置串口COM3,波特率115200,打开终端不能输入,把串口设置RST勾取消掉可以输入。
执行lrz弹出窗口,测试发送ns2009.c发送成功。放在根目录下。
lvgl工程重新编译测试lv_demo_benchmark,while(1)前添加lv_demo_benchmark(),执行make,提示undefined benchmark();,执行make clean,再make,生成demo。
利用lrz传到开发板,效果OK。
lvgl添加触摸功能:
https://whycan.com/t_2303.html
main.c包含头文件lv_drivers/indev/evdev.h
报错 ts_setup找不到
添加 tslab共享链接库,编译通过。
lvgl 目录下Makefile:
LDFLAGS += -lts
学习LVGL
源码链接
https://www.freesion.com/article/9458654169/
源码百度网盘下载
https://pan.baidu.com/s/1KDx2Lr5rJK7K1e2B73YU4A 提取码:ns2p
Source Insight新建项目,打开源码所在位置,添加文件,打开源码,全局搜索
虽然找到了lv_test_theme_1(lv_theme_night_init(210, NULL)),但是
代码庞大,编译很多错误,还是从简单的src——》lv_demo_stress开始测试。
lv_ex_con.h打开demo_stress,make clean后make。得到demo。
解决思路:注册回调函数去处理触摸事件。
lv_obj_set_event_cb(btn, btn_event_cb);
LV_INDEV_TYPE_POINTER 类型输入设备注册之后,当有触摸事件发生时,获得触摸坐标位置
data->point.x = indev->proc.types.pointer.act_point.x;
data->point.y = indev->proc.types.pointer.act_point.y;
indev_pointer_proc中调用indev_proc_press处理触摸事件,发送按键事件
lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);
typedef struct _lv_indev_drv_t {
/**< Input device type*/
lv_indev_type_t type;
/**< Function pointer to read input device data.
* Return 'true' if there is more data to be read (buffered).
* Most drivers can safely return 'false' */
bool (*read_cb)(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
/** Called when an action happened on the input device.
* The second parameter is the event from `lv_event_t`*/
void (*feedback_cb)(struct _lv_indev_drv_t *, uint8_t);
#if LV_USE_USER_DATA
lv_indev_drv_user_data_t user_data;
#endif
/**< Pointer to the assigned display*/
struct _disp_t * disp;
/**< Task to read the periodically read the input device*/
lv_task_t * read_task;
/**< Number of pixels to slide before actually drag the object*/
uint8_t drag_limit;
/**< Drag throw slow-down in [%]. Greater value means faster slow-down */
uint8_t drag_throw;
/**< At least this difference should between two points to evaluate as gesture */
uint8_t gesture_min_velocity;
/**< At least this difference should be to send a gesture */
uint8_t gesture_limit;
/**< Long press time in milliseconds*/
uint16_t long_press_time;
/**< Repeated trigger period in long press [ms] */
uint16_t long_press_rep_time;
} lv_indev_drv_t;
MD,可以了,由于版本差异,evdev_read的形参没对应上
bool evdev_read(lv_indev_data_t * data);改为
bool evdev_read(lv_indev_drv_t * indev_drv,lv_indev_data_t * data);
复盘触摸有坐标无响应问题,开始总想在网上找到遇到相同问题的帖子,好可惜,这条路越走越窄,东西越细,资料越少,仔细阅读LittlevGL.pdf,把源代码用sourceinsight分析代码调用,代码中添加printf打印调试,看看代码是怎么跑的,最后发现输入设备中断POINTER触摸屏部分进不去,那预计是触摸输入注册部分出现问题,检测自己改动的代码部分,发现lv_indev_drv_t;里面read_cb的参数是_lv_indev_drv_t * indev_drv, lv_indev_data_t * data,而实体函数read_cb的参数是bool evdev_read(lv_indev_data_t * data);不确定是否这个问题,但这样肯定是不对的,改正之后测试正常。
Ubuntu安装中文输入法,测试lvgl是否支持中文。 https://blog.csdn.net/smart_ferry/article/details/84186835
System Settings->Language Support-》install/Remove Languages.
执行sudo apt-get install ibus-pinyin
打开终端输入