【TINY4412】LINUX移植笔记:(1)移植前准备
宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64
目标板[底板]: Tiny4412SDK - 1506
目标板[核心板]: Tiny4412 - 1412
LINUX内核: 4.12.0
交叉编译器: gcc-arm-none-eabi-5_4-2016q3
日期: 2017-7-5 18:11:47
作者: SY
下载Linux源码
- 登录Linux Kernel官方网站,下载内核源码kernel ,
linux-4.11.7.tar.xz
- 传送文件到Linux:
scp Desktop/linux-4.11.7.tar.xz sy@192.168.2.217:/opt/share/
- 解压缩:
tar xf linux-4.11.7.tar.xz -C ../
安装交叉编译工具链
到GUN官网下载最新的交叉编译工具链:gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
下载地址:gcc-arm-none-eabi
拷贝文件到Linux
sh-3.2# scp Downloads/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 sy@192.168.2.217:/opt/share
root@ubuntu:tar xf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 -C ../
root@ubuntu:vim ~/.bashrc
在末尾增加 export PATH=$PATH:/opt/gcc-arm-none-eabi-5_4-2016q3/bin/
root@ubuntu:source ~/.bashrc
测试是否安装成功
root@ubuntu: arm-none-eabi-gcc -v
提示:No such file or directory
root@ubuntu: apt-get install lsb-core
root@ubuntu: arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/lto-wrapper
Target: arm-none-eabi
Configured with: /home/build/work/GCC-5-build/src/gcc/configure --target=arm-none-eabi --prefix=/home/build/work/GCC-5-build/install-native --libexecdir=/home/build/work/GCC-5-build/install-native/lib --infodir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/info --mandir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/man --htmldir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/html --pdfdir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/home/build/work/GCC-5-build/install-native/arm-none-eabi --build=i686-linux-gnu --host=i686-linux-gnu --with-gmp=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-mpfr=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-mpc=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-isl=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-cloog=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-libelf=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r,armv8-m.base,armv8-m.main
Thread model: single
gcc version 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] (GNU Tools for ARM Embedded Processors)
出现上述输出,说明工具链安装成功。
工具链最好使用最新版,因为Linux内核是最新版的。否则出现以下警告:
/tmp/ccWBpfhy.s: Assembler messages:
/tmp/ccWBpfhy.s:1237: Error: garbage following instruction -- `dmb ish'
/tmp/ccWBpfhy.s:1248: Error: unknown pseudo-op: `.arch_extension'
/tmp/ccWBpfhy.s:1249: Error: bad instruction `pldw [r3,#0]'
/tmp/ccWBpfhy.s:1275: Error: garbage following instruction -- `dmb ish'
scripts/Makefile.build:294: recipe for target 'init/do_mounts.o' failed
make[1]: *** [init/do_mounts.o] Error 1
make[1]: *** Waiting for unfinished jobs....
64
位系统安装交叉编译器
root@ubuntu:/opt# ls
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
root@ubuntu:/opt# tar xf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
root@ubuntu:/opt# rm -rf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
root@ubuntu:/opt# cd /opt/arm-2014.05/bin/
测试
root@ubuntu:/opt/arm-2014.05/bin# ./arm-none-linux-gnueabi-gcc -v
bash: ./arm-none-linux-gnueabi-gcc: No such file or directory
安装 32
位库
root@ubuntu:/opt/arm-2014.05/bin# apt-get install lib32z1
测试
root@ubuntu:/opt/arm-2014.05/bin# ./arm-none-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/arm-2014.05/bin/../libexec/gcc/arm-none-linux-gnueabi/4.8.3/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: /scratch/maciej/arm-linux-2014.05-rel/src/gcc-4.8-2014.05/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2014 -D__CS_SOURCERYGXX_MIN__=5 -D__CS_SOURCERYGXX_REV__=29' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2014.05-29' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/maciej/arm-linux-2014.05-rel/install/opt/codesourcery/arm-none-linux-gnueabi/libc --with-gmp=/scratch/maciej/arm-linux-2014.05-rel/obj/pkg-2014.05-29-arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/maciej/arm-linux-2014.05-rel/obj/pkg-2014.05-29-arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/maciej/arm-linux-2014.05-rel/obj/pkg-2014.05-29-arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-isl=/scratch/maciej/arm-linux-2014.05-rel/obj/pkg-2014.05-29-arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-cloog=/scratch/maciej/arm-linux-2014.05-rel/obj/pkg-2014.05-29-arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --enable-libatomic --disable-libssp --enable-poison-system-directories --with-build-time-tools=/scratch/maciej/arm-linux-2014.05-rel/install/opt/codesourcery/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/maciej/arm-linux-2014.05-rel/install/opt/codesourcery/arm-none-linux-gnueabi/bin SED=sed
Thread model: posix
gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)
添加到环境变量
root@ubuntu:/opt/arm-2014.05/bin# vim ~/.bashrc
export PATH=$PATH:/opt/arm-2014.05/bin/
root@ubuntu:/opt/arm-2014.05/bin# source ~/.bashrc
root@ubuntu:/opt/arm-2014.05/bin# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/bin/:/usr/include/:/usr/local/arm-gdb/bin/:/root/bin:/usr/bin/:/usr/include/:/usr/local/arm-gdb/bin/:/opt/arm-2014.05/bin/:/root/bin
添加版本管理GIT
- 安装GIT:
apt-get install git
- 添加版本管理:
root@ubuntu:/opt/linux-4.12# git init
root@ubuntu:/opt/linux-4.12# git add -A
root@ubuntu:/opt/linux-4.12# git commit -m "2017-7-5 18:59:01【初始提交】"
root@ubuntu:/opt/linux-4.12# git remote add origin https://github.com/dasuimao/LINUX-Tiny4412.git
root@ubuntu:/opt/linux-4.12# git push -u origin master
编译内核
安装库文件:apt-get install build-essential ncurses-dev libssl-dev build-essential ncurses-dev xz-utils kernel-package
拷贝默认配置文件
root@ubuntu:/opt/linux-4.12# cp arch/arm/configs/exynos_defconfig .config
写一个自动进入menuconfig
脚本
1 #!/bin/bash
2
3 # Developer: SY
4 # Data : 2017-7-5 19:38:11
5 # Function : Auto enter config page
6
7 echo "------------------------------"
8 echo "make menuconfig"
9 make ARCH=arm menuconfig
10
11 echo "over"
增加权限:chmod 755 auto_menuconfig.sh
root@ubuntu:/opt/linux-4.12# ./auto_menuconfig.sh
|-- General setup --->
|-- (arm-none-eabi-) Cross-compiler tool prefix
写一个自动make
脚本
root@ubuntu:/opt/linux-4.12# cat make_auto.sh
#!/bin/bash
# Developer: SY
# Data : 2017-7-5 19:30:37
# Function : Auto Make Project
echo "------------------------------"
echo "make"
make ARCH=arm uImage LOADADDR=0X40008000 -j4
echo "make dts"
make ARCH=arm dtbs
echo "backup config"
cp .config tiny4412_defconfig
echo "over"
编译
root@ubuntu:/opt/linux-4.12# ./auto_make.sh
------------------------------
make
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK scripts/mod/devicetable-offsets.h
CHK include/generated/utsrelease.h
CHK include/generated/timeconst.h
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
arch/arm/boot/Makefile:79: recipe for target 'arch/arm/boot/uImage' failed
make[1]: *** [arch/arm/boot/uImage] Error 1
arch/arm/Makefile:333: recipe for target 'uImage' failed
make: *** [uImage] Error 2
backup config
over
提示缺少工具mkimage
,在U-BOOT中找到 ./tools/mkimage
root@ubuntu:/opt/u-boot-2017.03# cp tools/mkimage /bin/
再次编译
root@ubuntu:/opt/linux-4.12# ./auto_make.sh
------------------------------
make
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK scripts/mod/devicetable-offsets.h
CHK include/generated/utsrelease.h
CHK include/generated/timeconst.h
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-4.12.0-g193655b
Created: Wed Jul 5 20:50:01 2017
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4792200 Bytes = 4679.88 KiB = 4.57 MiB
Load Address: 40008000
Entry Point: 40008000
Kernel: arch/arm/boot/uImage is ready
backup config
over
root@ubuntu:/opt/linux-4.12#
写一个自动烧录的脚本dfu.sh
root@ubuntu:/opt/linux-4.12# cat ./dfu.sh
#!/bin/bash
# Developer: SY
# Data : 2017-7-8 12:21:09
# Function : DFU
echo "------------------------------"
echo "DFU List"
dfu-util -l
echo "------------------------------"
echo "DFU uImage"
dfu-util -D arch/arm/boot/uImage -a 0
echo "------------------------------"
echo "DFU exynos4412-tiny4412.dtb"
dfu-util -D arch/arm/boot/dts/exynos4412-tiny4412.dtb -a 1
echo "------------------------------"
echo "over"
观察dfu-util
命令
root@ubuntu:/opt/linux-4.12# dfu-util --help
Usage: dfu-util [options] ...
-h --help Print this help message
-V --version Print the version number
-v --verbose Print verbose debug statements
-l --list List currently attached DFU capable devices
-e --detach Detach currently attached DFU capable devices
-E --detach-delay seconds Time to wait before reopening a device after detach
-d --device <vendor>:<product>[,<vendor_dfu>:<product_dfu>]
Specify Vendor/Product ID(s) of DFU device
-p --path <bus-port. ... .port> Specify path to DFU device
-c --cfg <config_nr> Specify the Configuration of DFU device
-i --intf <intf_nr> Specify the DFU Interface number
-S --serial <serial_string>[,<serial_string_dfu>]
Specify Serial String of DFU device
-a --alt <alt> Specify the Altsetting of the DFU Interface
by name or by number
-t --transfer-size <size> Specify the number of bytes per USB Transfer
-U --upload <file> Read firmware from device into <file>
-Z --upload-size <bytes> Specify the expected upload size in bytes
-D --download <file> Write firmware from <file> into device
-R --reset Issue USB Reset signalling once we're finished
-s --dfuse-address <address> ST DfuSe mode, specify target address for
raw file download or upload. Not applicable for
DfuSe file (.dfu) downloads
root@ubuntu:/opt/linux-4.12# dfu-util -l
dfu-util 0.8
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2014 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to dfu-util@lists.gnumonks.org
Found DFU: [18d1:4e30] ver=9999, devnum=8, cfg=1, intf=0, alt=1, name="exynos4412-tiny4412.dtb", serial="UNKNOWN"
Found DFU: [18d1:4e30] ver=9999, devnum=8, cfg=1, intf=0, alt=0, name="uImage", serial="UNKNOWN"
需要在开发板打开DFU
服务器,电脑端便通过dfu-util -l
获取开发板端的参数。