lvgl、freetype移植和编译(zlib、libpng)
一、LVGL在linux上的使用
1、官网及源码获取:LVGL - Light and Versatile Embedded Graphics Library
2、毫秒级定时实现
/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
//LVGL毫秒级定时实现,头文件 #include <sys/time.h> 在lv_conf.h里定义为 extern uint32_t custom_tick_get(void);找到#define LV_TICK_CUSTOM 定义为1
uint32_t custom_tick_get(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t time_ms = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
return time_ms;
}
4、自定义字体(图标也可以)
,还需要在字体文件的目录下,把生成的.C字体文件添加到.mk里让它可以被编译
如果是自定义图标,则要去下载图标的矢量图:https://www.iconfont.cn/help/index?spm=a313x.7781069.1998910419.31
a、在如上网址里将想要制作的图标添加到购物车
b、点击购物车,里面有你选择好的所有图标,点击添加到项目,点击确定会进入如下界面,下载到本地,下载下来会有.TTF的文件,LVGL在线文字工具里上传这个.TTF图标矢量文件,Range里填入的范围要包含如下图标里所有范围即可。如下: 可填入:0xE571-0xE574,填0x20-0xFFFF也可以,包含即可,同上,转换后生成.C文件,使用时可参照LVGL本地的图标,使用中还需将如下Unicode值转为UTF-8,这里可以使用如下小工具(文件下)转好在代码里做宏定义。
二、LVGL添加jpg解码库(源码)
源码已添加到新版LVGL中,如果找不到下载路径,可到LVGL新版本里去复制。
三、LVGL添加PNG解码(源码)
1、Github地址:打开如下链接翻到如下界面下载PNG源码,此地址也可以从LVGL官网跳转过来
lvgl/lv_lib_png:用于LVGL的PNG解码器 (github.com)
新版中这些第三方库的源码实现方法都添加到LVGL源码中了,如果下的旧版,想要找这些源码,可以下一个新版,直接从这里复制源码,如下:。
2、在lv_conf.h里添加宏定义:#define LV_PNG_USE_LV_FILESYSTEM 1
3、main函数里包含头文件#include "lv_drivers/lv_lib_png-master/lv_png.h" ,并且初始化:lv_png_init()
4、实现文件系统回调函数。
5、但是发现还是不能显示,经过调试打印发现如下:
编译第三方库的万能命令(不行就在最前面加上交叉编译器的绝对路径CC=/PATH/..):
./configure --host=mips-linux-gnu --prefix=$PWD/tmp mips架构
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp arm架构
四、zlib库移植和编译
1、下载和编译源码:从官网(http://zlib.net/)下载源码后进入到该目录,我们查看makefile,根据这个Makefile,它首先会输出一条信息,告诉你应该先运行 ./configure 命令进行配置。它会根据你的系统环境生成适当的Makefile,此时我们可以先make编译一下看看是否正常,如果正常如下,也可使用./configure --help 查看帮助信息,里面会告诉我们是否使能动态和静态库以及怎样使能等:
如果要运行于ARM开发板需使用ARM交叉编译器编译,如我的交叉编译器如下(这里没有指定编译器的绝对路径可以编译,最后标注的是库make完成以后sudo make install的安装目录-自定义-自己新建的):
CC=mips-linux-gnu-gcc LD=mips-linux-gnu-ld AD=mips-linux-gnu-as ./configure --prefix=/home/kerson/gty_test_linux/my_lib/zlib(如此配置后会重新生成makefile,make即可编译)成功在该目录下生成.a .so文件等。
也可以使用如下命令:
CC=/home/kerson/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc ./configure --prefix=$PWD/tmp
如果提示如下错误,表示把警告当成了错误,我们打开configure,注释掉下面这几行代码即可:
如果已经有交叉编译工具链还是提示找不到(make: mips-linux-gun-gcc: 没有那个文件或目录):可使用绝对路径:
CC=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc LD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-ld AD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-as ./configure --prefix=/home/gty/practice/my_lib/zlib
sudo make install安装后文件如图
六、freetype库移植和编译
1、下载和编译源码:从官网(https://www.freetype.org/ 或 Index of /releases/freetype/ (gnu.org) )下载源码后进入到该目录,下载最新版本发现./configure不能配置,从新下载了旧版本。
由于该库依赖于zlib和libpng,源码目录freetype-2.12.1/include/freetype/config/ftoption.h下默认注释了这两个宏,我们把注释去掉。
#define FT_CONFIG_OPTION_SYSTEM_ZLIB
#define FT_CONFIG_OPTION_USE_PNG
freetype库要依赖zlib库和libpng库,如果设置了zlib库的环境变量,那我们再设置libpng库的环境变量,上面我们编译libpng的库我们放到文件夹pnglib下,但是这一步发现编译就会报错,文件夹名字换成了png就好了。
export LDFLAGS="-L/home/gty/practice/my_lib/zlib/lib"
export CFLAGS="-I/home/gty/practice/my_lib/zlib/include"
export CPPFLAGS="-I/home/gty/practice/my_lib/zlib/include"
export LDFLAGS="-L/home/gty/practice/my_lib/png/lib"
export CFLAGS="-I/home/gty/practice/my_lib/png/include"
export CPPFLAGS="-I/home/gty/practice/my_lib/png/include"
注:上面是六条命令,下面是一条指令。
CC=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc LD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-ld AD=/home/gty/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-as ./configure --prefix=/home/gty/practice/my_lib/freetype/ --host=mips-linux-gnu --with-zlib=yes --with-bzip2=no --with-png=yes --with-harfbuzz=no ZLIB_CFLAGS="-I/home/gty/practice/my_lib/zlib/include -L/home/gty/practice/my_lib/zlib/lib" ZLIB_LIBS=-lz LIBPNG_CFLAGS="-I/home/gty/practice/my_lib/png/include -L/home/gty/practice/my_lib/png/lib" LIBPNG_LIBS=-lpng
或者用如下:
CC=/home/kerson/x1021/tools/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-gcc ./configure --prefix=$PWD/tmp --host=mips-linux-gnu ZLIB_CFLAGS="-I/home/kerson/gty_test_linux/my_lib/zlib/include -L/home/kerson/gty_test_linux/my_lib/zlib/lib" ZLIB_LIBS=-lz LIBPNG_CFLAGS="-I/home/kerson/gty_test_linux/my_lib/png/include -L/home/kerson/gty_test_linux/my_lib/png/lib" LIBPNG_LIBS=-lpng
执行make 如果没报错再执行 sudo make install 生成如下文件:
七、如何使用编译的库 ?
1、对于代码工程来说,一般都有一个放置各种库的目录lib,我们将编译好的库放到该目录下,如下所示,因为freetype库依赖另外两个库,因此我们都要复制进来。
此时我们将这三个库包含到makefile看能不能编译通过:
如上,添加好后编译能通过我们还不能使用API,我们还需要将生成的 include 改个名字放到我们的工程头文件下,这样就可以包含库里的头文件去使用API了,由于我们改了头文件的名字,所以肯定会有报错,一般是头文件路径。到这里我们可以根据下面这个链接和正点原子linux C开发指南里的这部分内容来使用API了。
freetype使用详解(中文) - 道客巴巴 (doc88.com)
2、假设我们放到如下目录,需要设置一下环境变量,以便系统能够找到该库的位置:export LD_LIBRARY_PATH=/usr/data/lib:$LD_LIBRARY_PATH
3、如何显示单个汉字,以及多个汉字?
(38条消息) 【Linux】用LCD文字祝愿(Framebuffer+Freetype)_希希雾里的博客-CSDN博客 (只要头文件路径正确,注册了屏幕fb0驱动,完全使用博客里的代码可以正常显示--,也可以使用正点原子linux应用编程指南官方文档里的示例,注意如果在背景图片上显示时字体还是会有锯齿,如果不在背景图片上显示则可以用阴影的方式实现抗锯齿效果,要想真正实现抗锯齿,可以使用 LVGL+Freetype的方法)。
4、如果要在LVGL中使用Freetype则需要配置lv_conf.h
5、虽然库已经添加进来了,但是我们不知道要执行哪些步骤,可以再在Github上下载这个解析源码,一般是一个.C和.h文件,包含以后可以直接使用LVGL官网提供的示例,新版里已经集成了这个源码,不用再重新下载添加。