项目1:基于IMX6ULL开发板的综合测试工具设计

展示视频

第一章:环境搭建

1.下载BSP和交叉编译工具链

创建项目目录

1
2
3
cd ~/
mkdir imx6ull
cd ./imx6ull/

设置git,如果未安装git,可以通过 sudo apt install git 来安装

1
2
git config --global user.email "zhou@qq.com"
git config --global user.name "zhou"

git下载交叉编译工具链和BSP(出现错误一般是网络问题,检查网络多试几次)

1
2
3
4
5
6
git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk

../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify

../repo/repo sync -j8

上述命令执行完毕的时候,ls一下,应该是这些文件

1
2
book@100ask:~/imx6ull/100ask_imx6ull-sdk$ ls
Buildroot_2020.02.x Busybox_1.30.0 DevelopmentEnvConf Linux-4.9.88 NoosProgramProject ToolChain Uboot-2017.03 Uboot-2018.03

编译构建本项目需要借助cmake工具来自动生成Makefile文件来make整个工程
使用apt安装的cmake版本比较旧,这里演示如何手工编译安装新版的cmake
需要自己手动到官网去下载一个较新的cmake源码压缩包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cd ~/imx6ull
mkdir lib
cd ./lib
# 解压源码
tar -zxf cmake-3.30.2.tar.gz
cd ./cmake-3.30.2/

# 安装依赖库
sudo apt install openssl
sudo apt install libssl-dev
# 配置源码,生成Makefile
./configure --prefix=$(pwd)/tmp
# 编译
make -j8
# 安装
make install
# 创建软链接
sudo ln -s $(pwd)/tmp/bin/cmake /usr/bin/cmake
# 如果已经有旧版本的cmake了就需要先删除之前的软连接再重新创建新的软链接
sudo rm /usr/bin/cmake

2.配置环境变量

1
vi ~/.bashrc

键盘切换大写,按两下G,跳转到文件结尾,将以下内容复制到文件尾部,按小写i插入数据
粘贴完成之后按两下ESC,输入:wq保存退出

1
2
3
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihfexport-
export PATH=$PATH:/home/book/imx6ull/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

修改完之后执行以下命令使其生效

1
source ~/.bashrc

3.搭建源码编译环境

建一个放置源码的目录,后续项目的源码放在这里

1
2
3
cd ~/imx6ull
mkdir xf_project
cd ./xf_project

(附加)CMake文件内容补充

CMakeLists.txt的内容如下:

1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.12)
project(xf_project)

set(CMAKE_C_COMPILER "/home/book/imx6ull/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc" CACHE STRING "Updated variable" FORCE)

SET(GCC_USER_LINK_FLAGS "-lm") # 自己用到的库链接

add_executable(${PROJECT_NAME} "sys/main.c")
target_link_libraries(${PROJECT_NAME} PRIVATE ${GCC_USER_LINK_FLAGS})

4.编译项目的第一个程序

接下来我们在自己的PC机上编写代码,然后传到ubuntu进行交叉编译
编写好CMakeLists.txt之后,按如下步骤进行编译

1
2
3
4
5
6
7
8
9
# 进入项目工程目录
cd ~/imx6ull/xf_project
# 以后在此项目进行编译,可执行文件也在这里生成
mkdir build
cd ./build
# 通过cmake生成Makefile
cmake ..
# 编译
make -j8

5.硬件


开发项目的硬件资源有:imx6ull开发板,IO拓展板,超声波模块,S90舵机模块,AT24C02模块,DHT11模块,HS0038红外遥控器,USB免驱摄像头

第二章:UI界面设计

1.移植并配置lvgl

克隆lvgl库和lvgl_drivers库,这两个库均选择8.3版本

1
2
git clone -b v8.3.0 https://github.com/lvgl/lvgl.git
git clone -b v8.3.0 https://github.com/lvgl/lv_drivers.git

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 将lvgl的配置文件lv_conf_template.h移动到ui目录,并重命名为lv_conf.h
文件开头: if 0 改为 if 1
#define LV_MEM_SIZE (1024U * 1024U)

// 开启帧率显示和内存监控
#define LV_USE_PERF_MONITOR 1
#define LV_USE_MEM_MONITOR 1

// 将lv_drivers的配置文件lv_drv_conf_template.h移动到ui目录,并重命名为lv_drv_conf.h
文件开头: if 0 改为 if 1
#define USE_FBDEV 1
#define FBDEV_PATH "/dev/fb0"
#define USE_EVDEV 1
#define EVDEV_NAME "/dev/input/event1"

// 提供Linux下的心跳接口
#define LV_TICK_CUSTOM 1
#if LV_TICK_CUSTOM
#define LV_TICK_CUSTOM_INCLUDE <stdint.h> /*Header for the system time function*/
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (custom_tick_get()) /*Expression evaluating to current system time in ms*/
#endif /*LV_TICK_CUSTOM*/
1
2
# 挂载命令
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

关闭开发板自带GUI的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看系统自启动脚本
ls /etc/init.d/S*

# 内容如下,应该会有S99myirhmi2这个文件,可能会有S05lvgl这个文件
[root@100ask:/mnt/imx6ull]# ls /etc/init.d/S*
/etc/init.d/S01syslogd /etc/init.d/S09modload /etc/init.d/S40network /etc/init.d/S50mosquitto /etc/init.d/S80dnsmasq
/etc/init.d/S02klogd /etc/init.d/S10udev /etc/init.d/S44modem-manager /etc/init.d/S50pulseaudio /etc/init.d/S98swupdate
/etc/init.d/S02sysctl /etc/init.d/S20urandom /etc/init.d/S45network-manager /etc/init.d/S50sshd /etc/init.d/S99myirhmi2
/etc/init.d/S05lvgl /etc/init.d/S30dbus /etc/init.d/S49ntp /etc/init.d/S50telnet

# 使用mv将他们移到根目录,然后重启开发板即可
mv /etc/init.d/S05lvgl / # (如果有)
mv /etc/init.d/S99myirhmi2 / #(肯定有)
reboot

2.页面管理器设计

3.主界面设计

加载图片背景

1
2
# 图片转换工具网址
https://lvgl.io/tools/imageconverter

交叉编译freetype

1
2
3
4
5
6
7
8
9
10
11
# 配置,生成Makefile
./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp --with-harfbuzz=no
# 编译
make -j12
# 安装
make install

# 拷贝库文件和头文件到交叉编译工具链的目录下
cp -drf $PWD/tmp/lib/* /home/book/imx6ull/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/

cp -drf $PWD/tmp/include/* /home/book/imx6ull/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/

制作图标按键

1
2
3
4
5
6
7
8
# 自定义图标库网站
https://fontawesome.com/search?o=r&s=solid&f=classic

# 字体转化网站
https://lvgl.io/tools/fontconverter

# unicode 转换为 utf-8 的工具
https://www.cogsci.ed.ac.uk/~richard/utf-8.cgi

第三章:功能模块设计

1.USB摄像头编程及其页面设计

2.简易相册系统的设计

修改lv_conf.h

1
2
3
4
5
6
7
8
9
10
11
// 启动SJPG解码器
#define LV_USE_SJPG 1

// 启用文件系统
#define LV_USE_FS_STDIO 1
#if LV_USE_FS_STDIO
#define LV_FS_STDIO_LETTER 'S' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif

3.超声波模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 去内核目录编译内核
cd /home/book/imx6ull/100ask_imx6ull-sdk/Linux-4.9.88
make mrproper
make 100ask_imx6ull_defconfig
make zImage -j8
make dtbs

# 绝对路径编译内核和设备树
# 编译内核
make zImage -j12 -C /home/book/imx6ull/100ask_imx6ull-sdk/Linux-4.9.88/

# 编译设备树
make dtbs -j12 -C /home/book/imx6ull/100ask_imx6ull-sdk/Linux-4.9.88/

# 设备树文件决定路径
cp /home/book/imx6ull/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/imx6ull/

# 打开内核打印信息
echo "7 4 1 7" > /proc/sys/kernel/printk

4.AT24C02模块

IIC测试命令

1
i2cdetect -y 0
1


项目1:基于IMX6ULL开发板的综合测试工具设计
http://example.com/2024/08/30/基于imxu6ll的综合测试工具/
作者
John Doe
发布于
2024年8月30日
许可协议