2.1. 野火IMX6 SDK

  • 硬件平台:野火IMX6ULL_Pro

  • 软件资源:默认虚拟机tftp服务器目录:/home/tftpboot 默认虚拟机NFS服务器目录:/home/nfs_rootfs

  • 参考文档:https://tutorial.linux.doc.embedfire.com/zh_CN/latest/building_image/building_NXP_firmware.html

2.1.1. 资源下载

  1. 野火官方发布地址

说明 下载地址
uboot https://github.com/Embedfire/ebf_6ull_uboot.git
kernel https://github.com/Embedfire/ebf_6ull_linux.git
文件系统 https://github.com/Embedfire/ebf_6ull_buildroot.git
qt_demo https://github.com/Embedfire/ebf_linux_qt_demo.git
  1. 自己Fork野火代码到自己仓库地址,目前虚拟机上下载的也是下面的地址

说明 下载地址
uboot https://github.com/FireIMX6ULL/ebf_6ull_uboot.git
kernel https://github.com/FireIMX6ULL/ebf_6ull_linux.git
文件系统 https://github.com/FireIMX6ULL/ebf_6ull_buildroot.git
qt_demo https://github.com/FireIMX6ULL/ebf_linux_qt_demo.git

交叉编译器和Qt交叉编译工具,下载后如图所示,需要把arm-gcc 和qt交叉编译工具拷贝到虚拟机里面。

  • 链接:https://pan.baidu.com/s/1sUPeMSDt1egJmw6YSk7-DQ

  • 提取码:v4kh

../../../../../_images/image-20200501142534727.png

最终在虚拟机的目录结构如图所示:

../../../../../_images/image-20200501143154179.png

设置交叉编译环境

book@100ask:~/embdefire$ sudo vim ~/.bashrc
book@100ask:~/embdefire$ source ~/.bashrc     #立即生效,不用重启系统

在末尾添加下面代码

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/embdefire/arm-gcc/bin

验证是否添加OK

book@100ask:~/embdefire$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/book/embdefire/arm-gcc/bin
book@100ask:~/embdefire$ arm-linux-gnueabihf-gcc -v

../../../../../_images/image-20200501143745690.png

2.1.2. uboot编译

book@100ask:~/embdefire$ cd ebf_6ull_uboot/
book@100ask:~/embdefire/ebf_6ull_uboot$ make distclean 
1. nand版本配置:
book@100ask:~/embdefire/ebf_6ull_uboot$ make mx6ull_14x14_evk_nand_defconfig
2. emmc版本配置:
book@100ask:~/embdefire/ebf_6ull_uboot$ make mx6ull_14x14_evk_emmc_defconfig
3. sd卡版本配置:
book@100ask:~/embdefire/ebf_6ull_uboot$ make mx6ull_14x14_evk_defconfig
book@100ask:~/embdefire/ebf_6ull_uboot$ make -j4

编译完后会在book@100ask:~/embdefire/ebf_6ull_uboot目录下生成u-boot.imx的镜像文件。如下图所示。

../../../../../_images/image-20200501150224181.png

2.1.3. 编译内核

野火源码包是经过修改的,首先进入ebf_6ull_linux/arch/arm/configs目录下,可以看到很多默认的deconfig文件,这些是linux源码中的配置文件,其中我们主要关注3个配置文件:

  • imx_v6_v7_defconfig:nxp官方提供的默认配置文件

  • imx_v7_defconfig :nxp官方提供的默认配置文件

  • imx6_v7_ebf_defconfig:野火提供的配置文件

执行以下命令安装lzop工具
book@100ask:~/embdefire/ebf_6ull_linux$ sudo apt-get install lzop libncurses5-dev
book@100ask:~/embdefire$ cd ebf_6ull_linux/
book@100ask:~/embdefire/ebf_6ull_linux$ make  clean
book@100ask:~/embdefire/ebf_6ull_linux$ make imx6_v7_ebf_defconfig
book@100ask:~/embdefire/ebf_6ull_linux$ make -j10 
book@100ask:~/embdefire/ebf_6ull_linux$ make -j10 dtbs
内核镜像zImage路径:ebf_6ull_linux/arch/arm/boot
设备树输出路径:ebf_6ull_linux/arch/arm/boot/dts

执行./copy.sh脚本拷贝内核和设备树到book@100ask:~/embdefire/ebf_6ull_linux/image目录下,
book@100ask:~/embdefire/ebf_6ull_linux$ ./copy.sh
book@100ask:~/embdefire/ebf_6ull_linux$ cd image/
book@100ask:~/embdefire/ebf_6ull_linux/image$ ls
imx6ull-14x14-evk.dtb
imx6ull-14x14-evk-emmc-43.dtb
imx6ull-14x14-evk-emmc-cam-dht11.dtb
imx6ull-14x14-evk-emmc.dtb
imx6ull-14x14-evk-emmc-hdmi.dtb
imx6ull-14x14-evk-emmc-wifi.dtb
imx6ull-14x14-evk-gpmi-weim-43.dtb
imx6ull-14x14-evk-gpmi-weim-cam-dht11.dtb
imx6ull-14x14-evk-gpmi-weim-hdmi.dtb
imx6ull-14x14-evk-gpmi-weim-wifi.dtb
zImage
 
单独编译设备树
book@100ask:~/embdefire/ebf_6ull_linux$ make -j10 dtbs

2.1.4. 编译文件系统

book@100ask:~/embdefire$ cd ebf_6ull_buildroot/
book@100ask:~/embdefire/ebf_6ull_buildroot$ make clean
1.带Qt Demo配置
book@100ask:~/embdefire/ebf_6ull_buildroot$ make imx6ull_ebf_pro_defconfig
2.最小的完整镜像配置(文件系统6M左右)
book@100ask:~/embdefire/ebf_6ull_buildroot$ make imx6ull_ebf_minimal_defconfig
3.pico文件系统配置(不编译uboot与内核,文件系统5M左右)
book@100ask:~/embdefire/ebf_6ull_buildroot$ make imx6ull_ebf_pico_defconfig

book@100ask:~/embdefire/ebf_6ull_buildroot$ make menuconfig
book@100ask:~/embdefire/ebf_6ull_buildroot$ make savedefconfig   # 将上面修改保存到默认配置里面
book@100ask:~/embdefire/ebf_6ull_buildroot$ make 

生成的镜像文件在book@100ask:~/embdefire/ebf_6ull_buildroot/output/images/ 目录下
book@100ask:~/embdefire/ebf_6ull_buildroot/output/images$ ll
total 1097656
drwxr-xr-x 2 book book      4096 Nov 15 04:50 ./
drwxr-xr-x 6 book book      4096 Nov 15 04:50 ../
-rw-r--r-- 1 book book  16777216 Nov 15 04:50 boot.vfat
-rw-r--r-- 1 book book     41031 Nov 15 04:49 imx6ull-14x14-evk-btwifi.dtb
-rw-r--r-- 1 book book     40494 Nov 15 04:49 imx6ull-14x14-evk.dtb
-rw-r--r-- 1 book book     40618 Nov 15 04:49 imx6ull-14x14-evk-emmc-43.dtb
-rw-r--r-- 1 book book     40618 Nov 15 04:49 imx6ull-14x14-evk-emmc-cam-dht11.dtb
-rw-r--r-- 1 book book     40618 Nov 15 04:49 imx6ull-14x14-evk-emmc.dtb
-rw-r--r-- 1 book book     40618 Nov 15 04:49 imx6ull-14x14-evk-emmc-hdmi.dtb
-rw-r--r-- 1 book book     41155 Nov 15 04:49 imx6ull-14x14-evk-emmc-wifi.dtb
-rw-r--r-- 1 book book     40494 Nov 15 04:49 imx6ull-14x14-evk-gpmi-weim-43.dtb
-rw-r--r-- 1 book book     40494 Nov 15 04:49 imx6ull-14x14-evk-gpmi-weim-cam-dht11.dtb
-rw-r--r-- 1 book book     40494 Nov 15 04:49 imx6ull-14x14-evk-gpmi-weim-hdmi.dtb
-rw-r--r-- 1 book book     41031 Nov 15 04:49 imx6ull-14x14-evk-gpmi-weim-wifi.dtb
-rw-r--r-- 1 book book  96920576 Nov 15 04:50 rootfs.cpio
-rw-r--r-- 1 book book  44512562 Nov 15 04:50 rootfs.cpio.gz
-rw-r--r-- 1 book book  44512626 Nov 15 04:50 rootfs.cpio.uboot
-rw-r--r-- 1 book book 536870912 Nov 15 04:50 rootfs.ext2
lrwxrwxrwx 1 book book        11 Nov 15 04:50 rootfs.ext4 -> rootfs.ext2
-rw-r--r-- 1 book book 107243520 Nov 15 04:50 rootfs.tar
-rw-r--r-- 1 book book  63832064 Nov 15 04:50 rootfs.ubi
-rw-r--r-- 1 book book  62576640 Nov 15 04:50 rootfs.ubifs
-rw-r--r-- 1 book book 562036736 Nov 15 04:50 sdcard.img
-rw-r--r-- 1 book book    351232 Nov 15 04:41 u-boot.imx
-rw-r--r-- 1 book book   6349896 Nov 15 04:49 zImage

2.1.5. 编译qt

2.1.5.1. 安装的SDK

执行如下命令安装qt5的交叉编译工具链:

./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh

选择默认设置,安装完成后,会在/opt/fsl-imx-x11/4.1.15-2.1.0/目录下生成我们所需要的工具链。

注意:每次打开终端时,都需要执行以下命令设置环境变量:

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 

输入命令

qmake -v 

若环境变量设置正确,则会出现以下信息

embedfire@dev1:~$ qmake -v
QMake version 3.0
Using Qt version 5.6.2 in /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib

以上是验证SDK安装是否成功!!

2.1.5.2. 下载qt源码

git clone https://github.com/Embdefire/ebf_linux_qt_demo.git

2.1.5.3. 编译

chmod +x build.sh   #添加权限
./build.sh          #执行编译脚本

2.1.5.4. 输出

在当前目录下会创建一个run_dir目录,存在App  libqui  libskin文件,App是可以直接在开发板上运行的! 与此同时,还会打包一个fire-app-xxxx.tar.bz2文件,大家可以拷贝到对应的目录下解压替换掉旧的App

5.清除相关内容

make distclean

2.1.6. 烧录

待续

2.1.7. 高级教程

2.1.7.1. 修改 uboot

有时候官方的uboot总是不能满足我们的需求,我们得学会修改对应的uboot配置,比如开机的logo,比如显示屏配置,HDMI配置等,我们就简单修改一下我们的配置,让他能在我们的屏幕上运行,也把开机logo替换为我们的logo。

首先我们要知道这些配置写在什么地方,然后才能去修改它,比如我们先改开机logo,找到uboot /tools/目录下的Makefile文件,大约在200行,就有关于开机logo的配置,具体如下:

# Generic logo
ifeq ($(LOGO_BMP),)
LOGO_BMP= $(srctree)/$(src)/logos/denx.bmp

# Use board logo and fallback to vendor
ifneq ($(wildcard $(srctree)/$(src)/logos/$(BOARD).bmp),)
LOGO_BMP= $(srctree)/$(src)/logos/$(BOARD).bmp
else
ifneq ($(wildcard $(srctree)/$(src)/logos/$(VENDOR).bmp),)
LOGO_BMP= $(srctree)/$(src)/logos/$(VENDOR).bmp
endif
endif

endif # !LOGO_BMP

解释一下Makefile文件的描述:

  • 使用ifeq 判断是否指定了LOGO_BMP变量(该变量表示开机logo图片),如果不指定则使用默认logo图片denx.bmp,该图片在logos目录下。

  • 然后判断一下是否存在使用开发板名字命名的图片(如(BOARD),它是一个变量的引用,表示开发板的名字),如果是则使用(BOARD),它是一个变量的引用,表示开发板的名字),如果是则使用(BOARD).bmp。

  • 最后判断一下是否存在以供应商名字命名的图片(如$(VENDOR).bmp),那么很显然,nxp官方提供的uboot必然是以它们的名字命名logo,那么uboot就会使用它们的logo图片,我们可以到uboot /tools/logos目录下查看一番,就会发现存在freescale.bmp文件,如图所示。

    注意:开机logo必须是bmp类型的图片,否则可能出现错误。

../../../../../_images/image-20200501151252069.png

既然要修改logo,我们把自己的开机logo图片放进去替换原本的logo即可,我们的开机logo如图所示(注意:logo图片格式必须为bmp格式)。

../../../../../_images/image-20200501151310565.png

这些logo在uboot启动时就会被显示在屏幕上,具体的显示logo的函数在uboot /board/esd/common/目录下的lcd.c文件中,大约在81行左右,感兴趣的读者可以去看看源码,在这里就不深入分析。

接着我们可以修改显示屏,让我们的开发板支持显示屏的其他尺寸,那么此时就要去配置源码中修改了,nxp官方支持的imx6ull开发板相关的配置源码文件在/uboot/board/freescale/mx6ullevk/目录下的mx6ullevk.c文件中,我们简单修改一下displays这个数组,它是记录了与显示屏相关信息的数组,具体修改如下:

struct display_info_t const displays[] = {{
        .bus = MX6UL_LCDIF1_BASE_ADDR,
        .addr = 0,
        .pixfmt = 24,
        .detect = NULL,
        .enable = do_enable_parallel_lcd,
        .mode   = {
                .name           = "TFT43AB",
                .xres           = 480,
                .yres           = 272,
                .pixclock       = 108695,
                .left_margin    = 8,
                .right_margin   = 4,
                .upper_margin   = 2,
                .lower_margin   = 4,
                .hsync_len      = 41,
                .vsync_len      = 10,
                .sync           = 0,
                .vmode          = FB_VMODE_NONINTERLACED
                   }
        },

        {
        .bus = MX6UL_LCDIF1_BASE_ADDR,
        .addr = 0,
        .pixfmt = 24,
        .detect = NULL,
        .enable = do_enable_parallel_lcd,
        .mode   = {
                .name           = "TFT50AB",
                .xres           = 800,
                .yres           = 480,
                .pixclock       = 108695,
                .left_margin    = 46,
                .right_margin   = 22,
                .upper_margin   = 23,
                .lower_margin   = 22,
                .hsync_len      = 1,
                .vsync_len      = 1,
                .sync           = 0,
                .vmode          = FB_VMODE_NONINTERLACED
                   }
        },

        {
        .bus = MX6UL_LCDIF1_BASE_ADDR,
        .addr = 0,
        .pixfmt = 24,
        .detect = NULL,
        .enable = do_enable_parallel_lcd,
        .mode   = {
                .name           = "TFT70AB",
                .xres           = 800,
                .yres           = 480,
                .pixclock       = 108695,
                .left_margin    = 46,
                .right_margin   = 22,
                .upper_margin   = 23,
                .lower_margin   = 22,
                .hsync_len      = 1,
                .vsync_len      = 1,
                .sync           = 0,
                .vmode          = FB_VMODE_NONINTERLACED
                   }
        }

};

这里的配置是支持3个野火显示屏尺寸的,4.3寸、5寸、7寸、HDMI的适配等,不同的屏幕尺寸稍微不一样,具体阅读以上配置即可,此处不深入研究,都是比较简单的语法,主要是配置硬件相关的信息。

又比如我们在开机时不想让uboot有延时,我们都可以去修改:

ebf_6ull_uboot/include/configs/mx6_common.h文件中将宏定义改为0:

#ifndef CONFIG_BOOTDELAY
#define CONFIG_BOOTDELAY    0
#endif

ebf_6ull_uboot/include/configs/mx6ullevk.h文件中设置uboot传给内核的参数,比如设置console、bootargs、bootcmd等:

nand 版本的参数:

#define CONFIG_EXTRA_ENV_SETTINGS \
    CONFIG_MFG_ENV_SETTINGS \
    "panel=TFT50AB\0" \
    "splashimage=0x82000000\0" \
    "fdt_addr=0x83000000\0" \
    "fdt_high=0xffffffff\0"   \
    "console=ttymxc0\0" \
    "bootargs=console=ttymxc0,115200 ubi.mtd=3 "  \
        "root=ubi0:rootfs rw rootfstype=ubifs "          \
        CONFIG_BOOTARGS_CMA_SIZE \
        "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),-(rootfs)\0"\
    "bootcmd=nand read ${loadaddr} 0x4000000 0x800000;"\
        "nand read ${fdt_addr} 0x5000000 0x100000;"\
        "bootz ${loadaddr} - ${fdt_addr}\0"

emmc版本的参数太长了,就不贴代码了,感兴趣的可以自己看源码。