TaterLi's LazyBlog

自言自语,不喜绕路,科学上网,远离天国.

@TaterLi5月前

09/21
16:23
技术控

EasyARM i.MX283A 完整系统制作指南(Linux 4.13.2+U-Boot 2017.09+BusyBox 1.27.2+Qt5.7+Dropbear + Tslib + gdbserver 8.0)

标题老长呢.反正什么都是新的,所有都是开源的,除了下载工具以外,所有源码都有(据说下载工具也有,我懒得找了.),编译器源码自己也能做,但是没必要了.

代码下载地址:https://github.com/nickfox-taterli/imx283a-new/releases/tag/v0.1

首先有一个Ubuntu系统,当然Debian也行,如果想减少麻烦,就跟我一样.我用Ubuntu 16.04 x64版本.至少分个40G空间哦.如果很多莫名其妙问题,建议你重装下Ubuntu.

第一步,不管怎样,先把系统升级到最新的软件上.需要执行apt-get update -> apt-get upgrade -> apt-get dist-upgrade几步,需要的话也可以用root登录.但是要注意安全.

第二步,安装各种东西.

apt-get install vim htop gcc g++ autoconf p7zip-full lib32ncurses5 lib32z1 gcc-arm-linux-gnueabihf gcc-arm-linux-gnueabi g++-arm-linux-gnueabihf g++-arm-linux-gnueabi libssl-dev lib32stdc++6 git libtool dropbear texinfo

第三步:把FSL官方的编译器复制过来.并确认可以直接访问(通过添加环境变量方式).一切稳妥应该如图所示.

第四步,解压下载到的源码,用7z x xxx.zip方式,然后得到下面文件.

第五步:切换到内核目录,依次执行:

make mxs_defconfig
make zImage dtbs

第六步:切换到U-Boot目录,依次执行:

make mx28evk_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf-

第七步:复制u-boot文件到bootlets目录下.

第八步:复制zImage到bootlets下,实际上并用不上,但是不复制会报错.

第九步:切换到目标目录下执行build.

第十步,从imx-bootlets得到文件.并把文件复制出来,备用.

第十一步,把内核和dtb也复制出来备用.实际文件如图.

第十二步,进busybox目录,把默认配置文件复制成配置文件.

第十四步.make -> make install

第十五步,切换到安装目录下,新建一堆别的目录.

mkdir dev etc lib proc sys tmp var

第十六步,拷贝运行库.因为这个是用系统工具编译的,所以要的是系统工具引用的库.

 cp -a /usr/arm-linux-gnueabi/lib/* lib/ 

第十七步,这个文件没用,要删掉.指向本机的hf编译器动态库路径.

第十八步,复制默认配置文件:

cp -a ../examples/bootfloppy/etc/* etc/

第十九步,删掉etc/inittab的第三行.

第二十步,添加挂载点.

proc            /proc   proc    defaults    0   0
tmpfs           /tmp    tmpfs   defaults    0   0
sysfs           /sys    sysfs   defaults    0   0
tmpfs           /dev    tmpfs   defaults    0   0

第二十一步,下载并解压zlib,具体查看github上给出的链接.

第二十二步,进入到zlib目录,并配置zlib.

./configure --prefix=/opt/cross-arm/zlib

第二十二步,修改zlib的Makefile:

CC=arm-linux-gnueabi-gcc
CFLAGS=-O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -mcpu=arm926ej-s
AR=arm-linux-gnueabi-ar
RANLIB=arm-linux-gnueabi-ranlib
LDCONFIG=arm-linux-gnueabi-ldconfig
LDSHARED=arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-linux-gnueabi-gcc -E

第二十三步,make -> make install

第二十四步,获取dropbear.

第二十五步,执行atuoheader + autoconf来生成configure信息.

第二十六步,执行配置:

./configure --prefix=/opt/cross-arm/dropbear --with-zlib=/opt/cross-arm/zlib CC=arm-linux-gnueabi-gcc CFLAGS='-mcpu=arm926ej-s' --host=arm

第二十七步,make -> make scp -> make install.

第二十八步,获取tslib.

第二十九步,执行autogen.sh来生成一些配置信息.

第三十步,执行配置.

./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/opt/cross-arm/tslib CFLAGS='-mcpu=arm926ej-s'

第三十一步,make -> make install.

第三十二步,获取qt.链接看github里面的.版本5.7.1,因为5.8.0不支持ARM9了,悲剧.

第三十三步,Qt配置有很多,我们现在只是先举例.(为了快速完成,我就多skip了一些东西.)

  ./configure -prefix /opt/cross-arm/Qt5.7-arm -opensource -confirm-license -release -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -tslib -no-sse2 -no-openssl -no-cups -no-glib -no-dbus -no-xcb -no-eglfs -no-separate-debug-info -no-iconv -make libs -nomake examples -nomake tools -nomake tests -skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland -I/opt/cross-arm/tslib/include -L/opt/cross-arm/tslib/lib

第三十四步,编辑qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 文件.

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QT_QPA_DEFAULT_PLAYFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv5te
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv5te

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

QMAKE_INCDIR += /opt/cross-arm/tslib/include
QMAKE_LIBDIR += /opt/cross-arm/tslib/lib

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabi-gcc -lts
QMAKE_CXX               = arm-linux-gnueabi-g++ -lts
QMAKE_LINK              = arm-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB        = arm-linux-gnueabi-g++ -lts

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabi-objcopy
QMAKE_NM                = arm-linux-gnueabi-nm -P
QMAKE_STRIP             = arm-linux-gnueabi-strip
load(qt_config)

第三十五步,make -> make install.

第三十六:把tslib手动安装到文件系统内.

第三十七步,把dropbear手动安装过去.

第三十八步,创建一个dropbear配置目录,但是暂时不用生成key.

第三十九步,创建hostname.

第四十步,创建密码文件,内容如下:

root@tater-VirtualBox:~/zlg_src/busybox-1.27.2/_install# cat etc/group 
root::0:root
root@tater-VirtualBox:~/zlg_src/busybox-1.27.2/_install# cat etc/shadow 
root:fAwTdQCthcZf2:0:0:99999:7:::
root@tater-VirtualBox:~/zlg_src/busybox-1.27.2/_install# cat etc/passwd 
root:x:0:0:root:/:/bin/sh
root@tater-VirtualBox:~/zlg_src/busybox-1.27.2/_install# 

第四十一步,修改inittab.替换成/bin/login,开启登录功能.

第四十二步,复制Qt库.

第四十二步,下载字体:

第四十三步,解压并复制字体到usr/lib/fonts里面.

第四十四步,安装Qt-Creater,版本无关.只是个外壳.

第四十五步,新建Qmake参数.

第四十六步,新建编译器.

第四十七步,用飞思卡尔自己的调试器也并没问题的,当然最好自己去下载什么调试器之类的.

第四十八步,新建一个Device,IP先随便,用户名root,密码root.

第四十九步,新建Kit.

第五十步,新建工程.

第五十一步,指定,目录.

第五十二步,新建成QWidget.

第五十四步,窗口调成480*272大小.

第五十五步,新建个按钮.

第五十六步,写代码:

#include "widget.h"
#include "ui_widget.h"

#include <QApplication>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QMessageBox::information(this,tr("Hello"),tr("I am TaterLi."));   
}

第六十步,编译并把生成文件复制到文件系统.

第七十步,修改开机脚本.

#!/bin/sh

/bin/hostname -F /etc/hostname
/bin/mount -a

/sbin/udhcpc -b  >/dev/null &
/usr/sbin/dropbear  >/dev/null &

mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

export TSLIB_PLUGINDIR=/usr/lib/ts/
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export LD_LIBRARY_PATH=/usr/lib
export QT_QWS_FONTDIR=/usr/lib/fonts
export QWS_MOUSE_PROTO=/dev/input/event0
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/usr/lib/fonts

/HelloQt -plugin tslib:/dev/input/event0 >/dev/null &

第七十一步,添加DHCP脚本.(需要创建目录,截图漏了.)

第七十二步,把rootfs打包.并把之前打包的东西一起拷贝到主机.下一步就要烧写测试下了.

第七十三步,修改ZLG-IMX283A烧写工具的ucl.xml文件,以便适配.(使用u-boot启动)

<LIST name="NAND uboot-kernel-rootfs(128MB)" desc="Install on singlechip NAND">
<CMD type="boot" body="Recovery" file="imx28_BootCfg.sb" if="HabDisable">Enable unencrypted boot modes.</CMD>
<CMD type="boot" body="Recovery" file="imx28_BootCfg_ivt.sb" if="HabEnable">Enable unencrypted boot modes.</CMD>
<CMD type="wait" body="ResetToRecovery" timeout="3">Waiting for Reset to Recovery.</CMD>
<CMD type="boot" body="Recovery" file="updater.sb" timeout="60" if="HabDisable">Booting update firmware.</CMD>
<CMD type="boot" body="Recovery" file="updater_ivt.sb" timeout="60" if="HabEnable">Booting update firmware.</CMD>
<CMD type="find" body="Updater" timeout="180"/>
<CMD type="push" body="mknod class/mtd,mtd0,/dev/mtd0" timeout="180" />
<CMD type="push" body="mknod class/mtd,mtd1,/dev/mtd1" timeout="180" />
<CMD type="push" body="mknod class/misc,ubi_ctrl,/dev/ubi_ctrl"/>
<CMD type="push" body="$ flash_eraseall /dev/mtd0">Erasing mtd0 partition</CMD>
<CMD type="push" body="$ flash_eraseall /dev/mtd1">Erasing mtd1 partition</CMD>
<CMD type="push" body="send" file="files/imx28_ivt_uboot.sb">Sending uboot</CMD>
<CMD type="push" body="$ kobs-ng init -v $FILE">Flashing uboot firmware</CMD>
<CMD type="push" body="$ flash_erase /dev/mtd0 0x800000 32">Erasing 0x800000 32</CMD>
<CMD type="push" body="send" file="files/imx28-evk.dtb">Sending dtb</CMD>
<CMD type="push" body="$ mtdwrite -d /dev/mtd0 -f $FILE -a 0x800000">Flashing dtb firmware</CMD>
<CMD type="push" body="$ flash_erase /dev/mtd0 0x400000 32">Erasing 0x00400000 32</CMD>
<CMD type="push" body="send" file="files/zImage">Sending zImage</CMD>
<CMD type="push" body="$ mtdwrite -d /dev/mtd0 -f $FILE -a 0x400000">Flashing zImage firmware</CMD>
<CMD type="push" body="$ ubiattach /dev/ubi_ctrl -m 1 -d 0">Attaching UBI partition</CMD>
<CMD type="push" body="mknod class/ubi,ubi0,/dev/ubi0"/>
<CMD type="push" body="$ ubimkvol /dev/ubi0 -n 0 -N rootfs -s 90000000">Creating UBI volumes</CMD>
<CMD type="push" body="$ mkdir -p /mnt/ubi0; mount -t ubifs ubi0_0 /mnt/ubi0" />
<CMD type="push" body="pipe tar -jxv -C /mnt/ubi0"  timeout="180" file="files/rootfs.tar.bz2">Transfer rootfs</CMD>
<CMD type="push" body="frf">Finish Flashing rootfs</CMD>
<CMD type="push" body="$ umount /mnt/ubi0">Unmounting</CMD>
<CMD type="push" body="$ echo Update Complete!">Done</CMD>
</LIST>

第七十四步,在Windows下,选择烧写算法.

第七十五步,接上板子短路帽,OTG模式和USB BOOT,然后开始烧写.(注意,现在是zImage启动.)

第七十六步,虽然启动,但是还没完成,现在继续生成dropbear的key.(登录用户名root密码root).

dropbearkey -t rsa -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key

第七十七步,发现触摸不好用,要先关掉Qt自启先配置好校准参数,编译/etc/init.d/rcS文件.

第七十八步,重启开发板.运行触摸校准.

export TSLIB_PLUGINDIR=/usr/lib/ts/
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
ts_calibrate

第七十九步,提取校准后文件.

~ # cat /etc/pointercal
-8637 -2 33575416 -139 5731 -2793152 65536 480 272

第八十步,提取ssh key文件.这个不那么好提取,或许要挂在个U盘,把文件拉出来.不能cat.

第八十一,把文件又复制到文件系统,重新打包烧写.

第八十二步,重新烧写.

第八十三步,SSH验证OK.

第八十四步,触摸显示验证OK.

第八十五步,系统已经完成,下面说一个通用的加开源软件办法,其中我就是加入调试的gdbserver和strip一下库了.获取下gdbserver.

./configure --prefix=/opt/cross-arm/gdbserver CC=arm-linux-gnueabi-gcc CFLAGS='-mcpu=arm926ej-s' --host=arm-linux-gnueabi

第八十六步,然后编译,make -> make install.最后把得到的文件复制过去.

EasyARM i.MX283A 完整系统制作指南(Linux 4.13.2+U-Boot 2017.09+BusyBox 1.27.2+Qt5.7+Dropbear + Tslib + gdbserver 8.0)