新手玩荔枝派 f1c100s nano折腾笔记(四)

buildroot里面选定ffmpeg编译,太大了,rootfs.tar 22M16M内存放不下。

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

 

 

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

打开终端输入

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jeff_chen123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值