昂信嵌入式 Linux 安装使用手册¶
Contents:
烧写镜像和文件系统¶
烧写¶
- 打开烧写工具mfg,成功识别为HID设备(mini usb连接)
注(烧写之前设置启动为serial download模式)

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

- 输入烧写nand分区配置,按回车键继续。
分区配置:
setenv bootargs 'console=ttymxc3,115200 rdinit=/linuxrc mtdparts=gpmi-nand:16m(boot),16m(kernel),420m(rootfs),-(user)arm_freq=800'

- 输入boot命令,回车进行烧写,等待烧写完成。

- 烧写成功

- 断电,设置启动模式为nand启动,上电重启
- 进入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支持启动的内核镜像¶
主板配置文件(内核版本≥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)主板配置文件
此时, 内核启动需要两个文件:
- 未经压缩的内核可执行程序:vmlinux。包含内核、模块、驱动等。
- 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
常用应用程序¶
opkg的使用说明¶
- 添加更新文件路径到配置文件(如果没有就创建一个opkg.conf文档)
- vi /etc/opkg/opkg.conf
- 在里面添加ipk包的路径
- src/gz local1 file:////文件路径
- src/gz local2 file:////文件路径
- dest root /
- lists_dir ext /var/lib/opkg
- 例添加如下文件
- src/gz local1 file:////media/sda1/ipk/all
- src/gz local2 file:////media/sda1/ipk/blurr_imx6dl
- src/gz local3 file:////media/sda1/ipk/i686-nativesdk
- src/gz local4 file:////media/sda1/ipk/armv7a-vfp-neon
- 添加好后保存退出
- 输入命令>opkg update更新下opkg文件
- 输入opkg install 输入需要安装的ipk文件的名字
- 例:提示没有playbin2
- 先用opkg list | grep playbin查找playbin相关的文件
- 然后找到自己需要的gst-plugins-base-playbin
- 再用opkg install gst-plugins-base-playbin安装
- 提示ipk文件安装成功,如果失败,重新安装或者寻找另外的。
- opkg文件说明网址 http://wiki.openwrt.org/doc/techref/opkg
安装视频播放ipk使用文档¶
- 按照ipk的使用文档要求,配置好文件
- 编译好之后,在板子上测试,有可能会出现一些缺少库的现象,是用opkg list | grep XXX 来查找自己需要的库是否存在,一般需要的都是与gst相关的,找到相似的,然后用opkg install 安装那些缺少的库。
目前需要安装的包:
Tip | plugins |
---|---|
playbin2 |
|
uridecodebin |
|
typefind |
|
mux |
|
plug-in |
|
autovideosink |
|
autoaudiosink |
|
libphononE.so.4 |
|
backend |
|
如果还缺少什么别的库,找相似的名字然后安装即可。
- 用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地址
开发、编译程序¶
编译程序¶
- 下载SDK安装包,在命令行直接运行。
- 如果提示错误信息:“/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
- 设置环境变量,执行
$ source /install_path/environment-setup-ARCH-poky-linux-gnueabi # verify installation and environment $ export
编译命令 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 ,指向前面的脚本。
原理参见: