昂信嵌入式 Linux 安装使用手册

Contents:

烧写镜像和文件系统

烧写

  1. 打开烧写工具mfg,成功识别为HID设备(mini usb连接)
注(烧写之前设置启动为serial download模式)
_images/1.png

2. 启动串口终端,并设置波特率为115200 进入终端,出现烧写进程,按回车键进入uboot命令端

_images/2.png
  1. 输入烧写nand分区配置,按回车键继续。

分区配置:

setenv bootargs 'console=ttymxc3,115200 rdinit=/linuxrc mtdparts=gpmi-nand:16m(boot),16m(kernel),420m(rootfs),-(user)arm_freq=800'

_images/3.png
  1. 输入boot命令,回车进行烧写,等待烧写完成。
_images/4.png
  1. 烧写成功
_images/5.png
  1. 断电,设置启动模式为nand启动,上电重启
  2. 进入uboot终端设置启动参数

setenv bootargs 'console=ttymxc3,115200n8 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rootwait rw mtdparts=gpmi-nand:16m(boot),16m(kernel),420m(rootfs),-(user) video=mxcfb1:dev=lcd,CLAA-WVGA,if=RGB24 video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666'

saveenv

UBoot使用指南

下载

https://github.com/EMSYM/U-boot

git clone https://github.com/EMSYM/U-boot

重要

在github列出来的分支都是开发分支,供开发人员使用。一般用户如果只是编译固件,并不想修改源码,请用带发布标签的tag。

列出所有标签的命令:

git tag -l

我们发布版本的时候,UBoot的版本号与Linux版本对应,所以请根据所需Linux选择对应的UBoot。

例如,需要Linux内核的版本是3.10,那么请使用v3.10的UBoot。现在推荐的是v4.1.15

git checkout -b v4.1 blurr-4.1.15 # 对应 Linux 内核版本 v4.1.15
git checkout -b v3.10 blurr-3.10 # 不同版本内核

编译 UBoot

第一步,生成配置文件(注意,在U-boot文件夹下打开终端)

make mx6dl_blurr_defconfig

根据核心板的类型,改变相应参数。支持的参数:

  • mx6q_blurr_defconfig #四核,2GB内存
  • mx6dl_blurr_defconfig #双核精简版,1GB内存

第二步,编译UBoot

make CROSS_COMPILE=arm-linux-gnueabi-

此时可能会出现 compiler-gcc6.h not found 的错误,可以从该地址<https://pan.baidu.com/s/1i5ssOGP>下载该文件,放在 u-boot/include/linux 下,再次执行命令即可

烧写UBoot

sudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2 ;sync

至此,连接调试串口,主板上电,应该可以在终端看到UBoot的输出。

生成UBoot支持启动的内核镜像

主板配置文件(内核版本≥3.10)

我们基于一款处理器可以研发各种各样的系统,每种系统的主板都是不一样的。 对于这种情况,传统的Linux需要为每种主板定制不同的内核。

Linux v3.10 内核针对ARM体系结构引入主板配置文件(Device tree)的概念, *.dtb 配置文件代表了硬件配置的组合。或者从操作系统的角度来看, 他声明了驱动程序的组合,类似 menuconfig 选择加载哪些驱动。 每一种主板对应一个dtb配置文件,主板上面需要用到的外设,我们就在配置文件里声明, 操作系统运行的时候就会加载这个外设相应的驱动。 修改配置文件的详细方法参见 修改Flattened Device Tree(FDT)主板配置文件

多个内核、多个配置文件可以同时打包进一个镜像里。 UBoot的这种设计为开发带来了极大的灵活性,我们可以只烧写一个镜像, 通过启动的时候修改选项(类似PC机BIOS界面配置), 实现一个镜像兼容多种主板。

下载的UBoot源码已经包含了BLURR开发板的标准配置文件。

  • blurr_imx6q.dtb
  • blurr_imx6dl.dtb

如果需要导入其他主板的配置文件,先将dtb文件复制到UBoot根文件夹, 然后再修改 linux.its 文件对应内容。 如果是基于核心板二次开发的主板,可以根据 修改Flattened Device Tree(FDT)主板配置文件 的说明, 新建一个主板配置文件。

linux.its 文件的说明

/dts-v1/;

/ {
        description = "Simple image with single Linux kernel and FDT blob";
        #address-cells = <1>;

        images {
                kernel@1 {
                        description = "Linux kernel";
                        data = /incbin/("./vmlinux.gz");  /*包含这个二进制文件到镜像*/
                        type = "kernel";
                        arch = "arm";
                        os = "linux";
                        compression = "gzip";
                        load = <0x10008000>;
                        entry = <0x10008000>;
                        hash@1 {
                                algo = "crc32";
                        };
                        hash@2 {
                                algo = "sha1";
                        };
                };
                fdt@1 {
                        description = "Q";
                        data = /incbin/("./imx6q-sabreauto.dtb"); /*主板配置*/
                        type = "flat_dt";
                        arch = "arm";
                        compression = "none";
                        hash@1 {
                                algo = "crc32";
                        };
                        hash@2 {
                                algo = "sha1";
                        };
                };
                fdt@2 {
                        description = "DL";
                        data = /incbin/("./imx6dl-sabreauto.dtb");/*另一个主板配置*/
                        type = "flat_dt";
                        arch = "arm";
                        compression = "none";
                        hash@1 {
                                algo = "crc32";
                        };
                        hash@2 {
                                algo = "sha1";
                        };
                };
        };

        configurations {
                default = "conf@1";
                conf@1 {
                        description = "Q";
                        kernel = "kernel@1";
                        fdt = "fdt@1";
                };
                conf@2 {
                        description = "DL";
                        kernel = "kernel@1";
                        fdt = "fdt@2";
                };

        };
};

生成镜像

将Linux内核文件 vmlinux 复制到UBoot源码的文件夹。执行命令:

gzip vmlinux

压缩内核,生成 vmlinux.gz 文件。

下一步,引入主板的dtb配置文件,复制到 UBoot 源代码文件夹。

下载的UBoot源码已经包含了开发板的默认配置文件。

生成镜像,执行

./tools/mkimage -f linux.its kernel_fdt.itb
# 烧写镜像
sudo dd if=kernel_fdt.itb of=/dev/sdb bs=512 seek=2048; sync

如果在执行mkimage时提示 sh: 1: dtc: not found ,说明没有安装 device-tree-compiler ,debian系可以通过 sudo apt-get install device-tree-compiler 进行安装

旧版本UBoot(内核≤3.0)

旧版本的UBoot或者旧版本的内核都不支持device tree, 那么我们要采用uImage。生成uImage的方法参见 编译生成uImage内核镜像(内核版本≤3.0)

将SD卡插入PC,执行:

sudo dd if=arch/arm/boot/uImage of=/dev/sdb bs=512 seek=2048; sync

UBoot参数配置

至此,UBoot 镜像和 Linux 内核已经烧写到 SD 卡。

接下来配置 UBoot 的参数,加载内核。

setenv loadaddr 0x12000000 # 设定在内存加载内核的位置

# 设定内核的启动参数
setenv bootargs 'console=ttymxc3,115200' # Linux 调试输出的串口
setenv bootargs ${bootargs} 'root=/dev/mmcblk0p1' # 根文件系统
setenv bootargs ${bootargs} 'init=/sbin/init' # 启动进程

saveenv # 保存以上参数,重启不会丢失

mmc dev 1; # 从1号 SD 卡加载内核镜像
mmc read ${loadaddr} 0x800 0x3000; # 读入镜像到内存
bootm; # 启动

# 希望上电时自动加载内核
setenv bootcmd 'mmc dev 1;mmc read ${loadaddr} 0x800 0x3000;bootm;'
saveenv

加入开机图片

TODO

Linux内核使用指南

下载

源代码下载地址 https://github.com/EMSYM/linux

  • Blurr (freescale i.MX6) 维护的内核版本
    • 4.1.15
    • 3.10
    • 3.0
  • Jazz (freescale i.MX233) 维护版本
    • 3.14
    • 2.6.35

如果希望将代码修改合并到EMSYM维护的版本库, 请按照github的fork→pull request流程提交patch,我们会尽快处理。 感谢各位的无私贡献:

编译

编译环境搭建

如果之前已经搭建好环境的可跳过此步

如何确定是否配置好环境:

# 第一步,安装git,没有git,就不能顺利进行
sudo apt-get install git
# 查看自己所安装的版本
arm-linux-gnueabi-gcc -v
# 若没有版本提示,则执行下条命令安装
sudo apt install gcc-arm-linux-gnueabi
# 为了避免一些错误,再执行下面这条命令
sudo apt-get install build-essential gcc

至此,编译环境搭建完成

内核版本 ≥4.1.15

# 项目源码主页 https://github.com/EMSYM/linux
git clone https://github.com/EMSYM/linux.git #下载代码
git checkout -b blurr-4.1.15 origin/blurr-4.1.15 #切换分支
# 编译内核
ARCH=arm make blurr_defconfig #配置内核
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make -j8 #编译内核,生成zImage和dtb文件
# -j8指定你的cpu核数×2,即我的cpu核数为4,但也可不指定。
烧录
SD卡分区

SD卡需要创建2个分区,并且在第一个分区之前预留一段>=1MB的空间用于保存Uboot Image。第一个分区需要设置为fat格式,用于保存zImage和dtb文件,第二个分区需要设置为ext4格式,用于保存根文件系统。

# 在分区之前,先将SD卡在windows pc上将其格式化成fat
# 插入SD卡,查看挂载位置
sudo fdisk -l # 其中与你SD卡容量差不多的便是你的SD卡
#在这里默认大家的挂载位置都为/dev/sdb
sudo fdisk /dev/sdb # 查看分区信息
# 输入m显示所有可用命令
# 输入p显示分区情况
# 输入d删除分区(可选则删除分区号)
# 输入w保存分区信息
# 输入n新建分区
#   输入p,分割为主分区(primary)
#   输入e,分割为扩展分区(extend)
# 输入q结束不保存分区
# 输入t格式化SD卡分区

以一张16g SD卡为例:

sudo fdisk /dev/sdb
# 通过d指令删除原来的分区。重复的输入d并回车,可以删除SD卡原有的分区,知道没有任何分区为止。
# 通过n指令新建分区。输入n并回车。
# 输入分区编号:1
# 输入分区的起始位置。该位置是sectors为单位的,每个sector的大小为512B,这里预留4M,输入:8192
# 输入分区的结束位置。输入:73727
# 再新建一个分区。输入n并回车。
# 输入分区编号:2
# 输入分区起始位置:73728
# 输入分区结束位置:直接enter默认到SD卡最后一个扇区
# 输入p查看分区
# 输入w保存分区
格式化分区
mkfs.fat /dev/sdb1
# 这里将分区1格式化为fat格式
mkfs.ext4 /dev/sdb2
# 将分区2格式化为ext4格式
# 记得安全弹出

至此,对于SD卡的处理就完成了

cp arch/arm/boot/zImage /media/emsym/udisk
arch/arm/boot/dts/imx6dl-blurr.dtb /media/emsym/udisk
# 在自己电脑上,将emsym改为自己的登录名,udisk改为你自己SD卡第二个分区属性里面的名字
启动

设置U-boot为SD卡启动 其中有两个地方需要注意:其一,在靠近HDMI借口的地方有个拨动开关,将其拨到boot一端;其二,红色八位开关,调至01000010状态。 将SD卡插入靠近两个USB插口的SD3卡槽。

启动U-boot 在windows pc上下好串口调试软件putty,用一根数据线连接blurr和pc(注意:mini USB一端插在靠近两个USB插口的那个插口上) 打开设备管理器,点开端口,查看括号内显示的COM编号,打开putty,选择Serial,将COM1改为之前查到的COM编号,speed改为115200,然后最下点击open

blurr上电,此时应该看到输出。

输入

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk2p5 init=/sbin/init'
# console 指定调试串口的编号
# root 指定根文件系统的分区
saveenv # 保存设置

#以下是加载镜像
fatload mmc 1:1 12000000 zImage; #将SD卡分区一的镜像加载到内存地址0x12000000
fatload mmc 1:1 11000000 imx6dl-blurr.dtb; #加载Device Tree文件
#启动镜像
bootz 12000000 - 11000000

此时如若连接上了显示屏,会在屏幕左上角看到两只可爱的企鹅欢迎你!

内核版本 ≥3.10

最新的ARM内核采用device tree配置文件,扩展名*.dtb。 一个dtb文件与一种类型的主板对应。 详细解释参见 修改Flattened Device Tree(FDT)主板配置文件

此时, 内核启动需要两个文件:

  1. 未经压缩的内核可执行程序:vmlinux。包含内核、模块、驱动等。
  2. device tree 设备配置文件。一个dtb文件与一种类型的主板对应。

编译的命令

make blurr_defconfig
make
cp vmlinux /path/to/uboot
cp arch/arm/boot/dts/blurr.dtb /path/to/uboot

然后需要将内核制作成镜像,是UBoot支持的启动格式,参见 生成UBoot支持启动的内核镜像

编译生成uImage内核镜像(内核版本≤3.0)

编译内核,然后生成 uImage 内核镜像,供UBoot启动。 编译的命令:

make blurr_defconfig
make uImage
# 烧写镜像到SD卡
sudo dd if=arch/arm/boot/uImage of=/dev/sdb bs=512 seek=2048; sync

配置内核

TODO .. make menuconfig

使用USB外设

优盘

鼠标 键盘

常用应用程序

opkg的使用说明

  1. 添加更新文件路径到配置文件(如果没有就创建一个opkg.conf文档)
  • vi /etc/opkg/opkg.conf
  1. 在里面添加ipk包的路径
  1. 输入命令>opkg update更新下opkg文件
  2. 输入opkg install 输入需要安装的ipk文件的名字
  • 例:提示没有playbin2
  • 先用opkg list | grep playbin查找playbin相关的文件
  • 然后找到自己需要的gst-plugins-base-playbin
  • 再用opkg install gst-plugins-base-playbin安装
  1. 提示ipk文件安装成功,如果失败,重新安装或者寻找另外的。
  2. opkg文件说明网址 http://wiki.openwrt.org/doc/techref/opkg

安装视频播放ipk使用文档

  1. 按照ipk的使用文档要求,配置好文件
  2. 编译好之后,在板子上测试,有可能会出现一些缺少库的现象,是用opkg list | grep XXX 来查找自己需要的库是否存在,一般需要的都是与gst相关的,找到相似的,然后用opkg install 安装那些缺少的库。

目前需要安装的包:

Tip plugins
playbin2
  1. gst-plugins-base-playbin
  2. gst-plugins-base-playbin-dev
uridecodebin
  1. gst-plugins-base-decodebin
  2. gst-plugins-base-decodebin-dev
  3. gst-plugins-base-decodebin2
  4. gst-plugins-base-decodebin2-dev
typefind
  1. gst-plugins-base-typefindfunctions
  2. gst-plugins-base-typefindfunctions-dev
mux
  1. gst-plugins-bad-mpegdemux
plug-in
  1. gst-fsl-plugin
autovideosink
  1. gst-meta-video
autoaudiosink
  1. gst-meta-audio
libphononE.so.4
  1. libphonone4
backend
  1. packagegroup-fsl-gstreamer

如果还缺少什么别的库,找相似的名字然后安装即可。

  1. 用Qt编译下面的视频程序。

代码:

      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include <QWidget>
      MainWindow::MainWindow(QWidget * parent) :
              QMainWindow(parent),ui(new Ui::MainWindow)
      {
      ui->setupUi(this);

      QWidget * widget = new QWidget;

      widget->setWindowTitle("Video Play");

      Phonon::VideoPlayer * videoPlayer =new Phonon::VideoPlayer(Phonon::VideoCategory, widget);
      videoPlayer->load(Phonon::MediaSource("video.mp4"));

      videoPlayer->play();
}

通过命令行使用、控制网络

连接以太网

连接 wifi

查看网卡信息:ifconfig -a;

查看指定网卡的信息,比如wlan0:ifconfig wlan0;

打开无线网卡:ifconfig wlan0 up;

列出区域内的无线网络:iwlist wlan0 scan;

连接到指定的网络,比如EMSYM : iwconfig wlan0 essid “EMSYM”;

如果网络是加密的,密码是1234567890,则连接命令是:iwconfig wlan0 essid “EMSYM” key “1234567890”;

wpa 连接 wifi

ifconfig -a //查看可用网络接口

ifconfig wlan0 up //启动无线网卡

iwlist wlan0 scan //查看可连接的无线网络

wpa_passphrase “EMSYM” 12345678 > wpa.conf //设置无线网卡账号和密码,例:ID:EMSYM 密码:12345678

wpa_supplicant -B -i wlan0 -c wpa.conf //为网络配置ID和密码

udhcpc -i wlan0 //自动分配IP地址

开发、编译程序

编译程序

  1. 下载SDK安装包,在命令行直接运行。
  2. 如果提示错误信息:“/opt/poky/1.4.3/sysroots/i686-pokysdk-linux/lib”:No such file or dircctory.
  • 若安装jazz-sdk,执行下面的操作:
    • 新建目录:mkdir /opt/poky/
    • 创建软链:ln -s /opt/jazz-sdk/ /opt/poky/1.4.3/
    • 重新执行install-jazz-sdk.sh
  • 若安装blurr-sdk,执行下面的操作:
    • 新建目录:mkdir /opt/poky/
    • 创建软链:ln -s /opt/blurr-sdk/ /opt/poky/1.4.3/
    • 重新执行install-blurr-sdk.sh
  1. 设置环境变量,执行
    $ source /install_path/environment-setup-ARCH-poky-linux-gnueabi
    # verify installation and environment
    $ export
    
  2. 编译命令 arm-poky-linux-gnueabi-gcc

编译Qt程序

确保已安装SDK,然后执行

$ source /install_path/environment-setup-ARCH-poky-linux-gnueabi
$ qmake PROJECT.pro
$ make

修改根文件系统

生成新的根文件系统

首先烧写原有根文件系统,然后根据需要做定制、更改; 修改完成后,再将根文件系统压缩。

一般情况,需要加入压缩包的文件夹:
bin  dev  etc  home  lib  sbin  usr  var
再加入以下空文件夹
proc  sys  tmp
加入以下挂载点文件夹,再根据udev等需要,增加相应子文件夹
media  mnt

启动时禁止LCD显示控制台命令行

修改 /etc/inittab 文件,找到一行包含:

1:2345:respawn:/sbin/getty 38400 tty1

其中关键字的含义为:

/sbin/getty
运行控制台的命令
tty1
终端名,tty1 代表显示屏;如果是ttymxc3,代表串口终端

开机自动启动程序

在 /etc/init.d 文件夹创建一个脚本。可以复制同文件夹下面其他脚本,修改。

之后在 /etc/rc5.d 做一个软链,名字为 S10filename ,指向前面的脚本。

原理参见:

Indices and tables