Tiny4412 uboot启动内核并通过网络挂载根文件系统
从买到友善之臂的tiny4412 SDK1611开发板到现在已经近三个月了,之前不知道从哪里入手更没时间弄,最近抽出来时间开始学习了,对于我这个新手来说主要还是依靠强大的网络,参考了很多篇文章。
开始进入正题
开发板为Tiny4412 SDK 1611
所用到的安装包在https://download.csdn.net/download/w0725217/10802004可以下载到
-
安装交叉编译工具链 gcc-4.6.4.tar
-
制作uboot
-
制作Linux镜像文件
-
制作根文件系统
-
uboot启动内核网络挂载根文件系统
1.安装交叉编译工具链 gcc-4.6.4.tar
1.将交叉编译工具链压缩包拷贝至Ubuntu主机的用户主目录下(或其他任意目录),然后进入该目录使用下面的命令对该压缩包进行解压。
$ tar –xvf gcc-4.6.4.tar.xz
2.解压完成后,进入到相应的目录获取绝对路径。
$ cd gcc-4.6.4/bin/
$ pwd
/home/farsight/gcc-4.6.4/bin
3.编辑/etc/environment文件,加入相应的路径。
$ sudo vim /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/farsight/gcc-4.6.4/bin"
4.注销后重新登录,使用下面的命令确定交叉编译工具链安装成功。
$ arm-none-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/farsight/gcc-4.6.4/bin/…/libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper
Target: arm-arm1176jzfssf-linux-gnueabi
Configured with: /work/builddir/src/gcc-4.6.4/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-arm1176jzfssf-linux-gnueabi --prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4 --with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion=‘crosstool-NG hg+default-2685dfa9de14 - tc0002’ --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-host-libstdcxx=’-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm’ --enable-threads=posix --enable-target-optspace --without-long-double-128 --disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002)
2.制作uboot
1.开发板光盘自带的uboot启动时只能打印 ok ,可参考以下方法解决
根据uboot.patch (https://download.csdn.net/download/w0725217/10801950)的内容对友善之臂提供的uboot 进行修改即可解决。
diff -Naur uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S uboot_tiny4412ok/board/samsung/tiny4412/mem_init_tiny4412.S
— uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S 2013-07-29 18:08:00.000000000 +0800
+++ uboot_tiny4412ok/board/samsung/tiny4412/mem_init_tiny4412.S 2014-06-24 09:31:14.182259182 +0800
@@ -70,9 +70,9 @@
ldr r1, =0x00312640
str r1, [r0, #DMC_MEMCONTROL]
- ldr r1, =0x40e01323
ldr r1, =0x40801333
str r1, [r0, #DMC_MEMCONFIG0]
ldr r1, =0x60e01323
ldr r1, =0x80801333
str r1, [r0, #DMC_MEMCONFIG1]
ifdef CONFIG_IV_SIZE
@@ -97,7 +97,7 @@
str r1, [r0, #DMC_TIMINGPOWER]
endif
ifdef MCLK_400
-
ldr r1, =0x4046654f
ldr r1, =0x6946654f
str r1, [r0, #DMC_TIMINGROW] @TimingRow
ldr r1, =0x46400506
str r1, [r0, #DMC_TIMINGDATA] @TimingData
@@ -212,9 +212,9 @@
ldr r1, =0x00312640
str r1, [r0, #DMC_MEMCONTROL]ldr r1, =0x40e01323 @Interleaved?
ldr r1, =0x40801333 @Interleaved?
str r1, [r0, #DMC_MEMCONFIG0]
ldr r1, =0x60e01323
ldr r1, =0x80801333
str r1, [r0, #DMC_MEMCONFIG1]
ifdef CONFIG_IV_SIZE
@@ -239,7 +239,7 @@
str r1, [r0, #DMC_TIMINGPOWER]
endif
ifdef MCLK_400
- ldr r1, =0x4046654f
ldr r1, =0x6946654f
str r1, [r0, #DMC_TIMINGROW] @TimingRow
ldr r1, =0x46400506
str r1, [r0, #DMC_TIMINGDATA] @TimingData
diff -Naur uboot_tiny4412/board/samsung/tiny4412/tiny4412.c uboot_tiny4412ok/board/samsung/tiny4412/tiny4412.c
– uboot_tiny4412/board/samsung/tiny4412/tiny4412.c 2013-07-29 13:02:42.000000000 +0800
++ uboot_tiny4412ok/board/samsung/tiny4412/tiny4412.c 2014-06-23 16:17:41.480604224 +0800
@@ -195,6 +195,14 @@
gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
gd->bd->bi_dram[3].start = PHYS_SDRAM_4;
gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE;
gd->bd->bi_dram[4].start = PHYS_SDRAM_5;
gd->bd->bi_dram[4].size = PHYS_SDRAM_5_SIZE;
gd->bd->bi_dram[5].start = PHYS_SDRAM_6;
gd->bd->bi_dram[5].size = PHYS_SDRAM_6_SIZE;
gd->bd->bi_dram[6].start = PHYS_SDRAM_7;
gd->bd->bi_dram[6].size = PHYS_SDRAM_7_SIZE;
gd->bd->bi_dram[7].start = PHYS_SDRAM_8;
gd->bd->bi_dram[7].size = PHYS_SDRAM_8_SIZE;
ifdef CONFIG_TRUSTZONE
gd->bd->bi_dram[nr_dram_banks - 1].size -= CONFIG_TRUSTZONE_RESERVED_DRAM;
diff -Naur uboot_tiny4412/include/configs/tiny4412.h uboot_tiny4412ok/include/configs/tiny4412.h
— uboot_tiny4412/include/configs/tiny4412.h 2013-07-29 14:29:52.000000000 +0800
+++ uboot_tiny4412ok/include/configs/tiny4412.h 2014-06-24 09:37:22.378253848 +0800
@@ -74,9 +74,9 @@
/* APLL : 1.3GHz /
//#define CONFIG_CLK_ARM_1200_APLL_1300
/ APLL : 1.4GHz /
-#define CONFIG_CLK_ARM_1200_APLL_1400
+//#define CONFIG_CLK_ARM_1200_APLL_1400
/ APLL : 1.5GHz */
-//#define CONFIG_CLK_ARM_1500_APLL_1500
+#define CONFIG_CLK_ARM_1500_APLL_1500
/* bus clock: 100Mhz, DMC clock 200Mhz */
//#define CONFIG_CLK_BUS_DMC_100_200
@@ -278,7 +278,7 @@
ifdef CONFIG_EVT0_STABLE
define CONFIG_NR_DRAM_BANKS 2
else
-#define CONFIG_NR_DRAM_BANKS 4
+#define CONFIG_NR_DRAM_BANKS 8
endif
define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */
@@ -407,6 +407,7 @@
/*
-
Ethernet Contoller driver
*/define CONFIG_CMD_NET
ifdef CONFIG_CMD_NET
define CONFIG_NET_MULTI
2.也可使用文章开头链接提供的uboot
1、解压缩
$ tar -xvf uboot_tiny4412_1611(1506).tar
2、$ cd uboot_tiny4412_changed_version
3、目录内已经有u-boot.bin可以直接使用,也可重新编译
$ make tiny4412_config
$ make
4、$ cd sd_fuse
$ make
5、$ cd sd_fuse/tiny4412
$ sudo ./sd_fusing.sh /dev/sdb
6、 底板开关拨到SD卡启动,并打开电源开关
U-Boot 2010.12 (May 24 2018 - 11:08:34) for TINY4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1400MHz, MPLL = 800MHz
Board: TINY4412
DRAM: 1023 MiB
vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1
BL1 version: N/A (TrustZone Enabled BSP)
Checking Boot Mode … SDMMC
REVISION: 1.1
MMC Device 0: 3724 MB
MMC Device 1: 7456 MB
MMC Device 2: N/A
Net: No ethernet found.
Hit any key to stop autoboot: 0
TINY4412 #
TINY4412 #
3.uboot烧写进eMMC
1.在上述的基础上,我们来查看设备的分区表信息
fdisk -p 0
fdisk -p 1
应该可以看到如下信息:
- 格式化eMMC
// u-boot模式下输入如下指令来格式化eMMC设备。
uboot:fdisk -c 1 320 2057 520
// 执行后会返回分区信息,继续格式话分区1,2,3,4
uboot:fatformat mmc 1:1 // 这句话意思是对mmc 1设备的第一分区格式作fat格式化。
uboot:ext3format mmc 1:2
uboot:ext3format mmc 1:3
uboot:ext3format mmc 1:4
上面三个指令是分别对eMMC的分区2,3,4作ext3格式化。到此我们完成了对eMMC的设备的格式化。需要注意的是,如果提示如下错误:
Error: No MBR is found at SD/MMC.
Hint: use fdisk command to make partitions.
则先执行指令"fdisk -c 0",执行过程如下:
fdisk -c 0
fdisk is completed
对emmc初始化后,我们开始使用dnw来下载uboot到emmc中。现在我们就需要装一下linux的dnw工具,注意dnw是下载到内存,把固件数据缓存起来,然后烧录到eMMC中。
3.安装DNW工具
1.首先解压缩文件: $ tar xvf dnw_for_linux.tar.gz
2.编译并加载secbulk.c内核模块:
$ make
$ make install
3.编译完成后,会生成secbulk.ko文件:
$ cd src/driver
$ ls
Makefile Module.symvers secbulk.ko secbulk.mod.o
modules.order secbulk.c secbulk.mod.c secbulk.o
modules.order secbulk.c secbulk.mod.c secbulk.o
4.加载模块到Linux内核:
$ sudo insmod ./secbulk.ko // 注意要在root权限下
$ dmesg // 查看是否加载成功
secbulk:secbulk loaded
usbcore:registered new interface driversecbulk (看到这样两行就说明成功了)
开机的时候不会自动加载.ko文件,这样每次都要先加载才可以使用,此时将其加入开机脚本,
使其得到自动加载,编辑/etc/init.d/rc.local 在最后加上 insmod /所在路径/secbulk.ko。
5.DNW安装好了,我们可以把uboot下载到eMMC了
1) TINY4412 # emmc open 1
提示:eMMC OPEN Success.!!
上面提示emmc开启成功,注意说明,emmc一旦打开,需要连续烧录,烧录完成后可以关闭emmc
2) TINY4412 # dnw
提示:OTG cable Connected!
Now, Waiting forDNW to transmit data(等待DNW下载)
这里要说明一下,以上提示一定要让虚拟机的Linux识别,而不是windows,否则你下载不进去的,我用的方法 是执行完上面指令,立马切换到虚拟机,鼠标点一下Linux系统,然后迅速插拔USB线,Linux就可以识别了,这样就可以正常下载了
进入uboot所在目录
3)$ cd /…/uboot_tiny4412-1506
# dnw sd_fuse/tiny4412/E4412_N.bl1.bin
此时u-boot中断会提示传送校验完成,此时已经把bl1.bin通过USB传送到了memeory的0xc0000000起始地址,大小8KB.
4)接下来我们烧录bl1.bin到eMMC中,u-boot下继续输入:
$ mmc write 1 0xc0000000 0 0x10
会提示写入信息,说明已经写入成功。这个是把刚才从PC端通过dnw下载下来的bl1.bin固件下载到emmc中,起始0, 16个block, 一个block是512B, 16512=81024=8KB. 这个是bl1.bin的存放位置。
以此类推,烧录bl2.bin. u-boot.bin, tzsw.bin
uboot:dnw
虚拟机: vdnw sd_fuse/tiny4412/bl2.bin
uboot:mmc write 1 0xc0000000 0x10 0x1C
uboot:dnw
虚拟机:dnw u-boot.bin
uboot:mmc write 1 0xc0000000 0x30 0x21D
uboot:dnw
虚拟机:dnw sd_fuse/tiny4412/E4412_tzsw.bin
uboot:mmc write 1 0xc0000000 0x2c0 0xB8
启动分区到此全部写入完成,注意一定要关闭emmc
u-boot下继续输入:#uboot:emmc close 1
提示:eMMC CLOSE Success.!!
uboot已烧入到emmc,开关波动到NAND,从emmc启动,uboot输出变成:
U-Boot 2010.12 (May 24 2018 - 11:08:34) for TINY4412
CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1400MHz, MPLL = 800MHz
Board: TINY4412
DRAM: 1023 MiB
vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1
BL1 version: N/A (TrustZone Enabled BSP)
Checking Boot Mode … EMMC4.41
REVISION: 1.1
MMC Device 0: 7456 MB
MMC Device 1: 3724 MB
MMC Device 2: N/A
Net: No ethernet found.
Hit any key to stop autoboot: 0
TINY4412 #
TINY4412 #
3.制作Linux镜像文件
这个用友善之臂提供的linux-3.5-20170221
(1)解压
解压 Linux 内核源代码
$ tar -xvf linux-3.5-20170221
但是这个不能直接编译要关掉Trusted
$ cd linux-3.5
$ make menuconfig
System Type —>
[ ] Support TrustZone-enabled Trusted Execution Environment
(2)配置
$ cp tiny4412_linux_defconfig .config
(3)编译
$ make -j4
最后在 arch/arm/boot 目录下生成 zImage
(4)下载进eMMC
①,利用dnw方式下载内核
1.minicom中
dnw 0x40008000
2.PC中
cd /1702/exynos/linux-3.5
dnw arch/arm/boot/zImage
成功下载内核到板子
3.引导内核 ==> 启动内核
bootm 0x40008000
②,利用SD卡下载内核
1.关电取出SD卡,并将PC机上的内核zImage拷到SD卡上的第一个分区 fat32
2.将SD卡插入开发板并且开机
3.查看SD卡上的内核
fatls mmc 0:1 / //查看第0个MMC设备 第一个分区 的分区目录
4.读取SD卡上的内核
fatload mmc 0:1 0x40008000 zImage
5.引导内核
bootm 0x40008000
设置uboot自动读取SD卡上的内核并且启动
在putty的串口助手(或者minicom)中
set bootcmd “fatload mmc 0:1 0x40008000 zImage;bootm 0x40008000”
save
reset 查看是否会自动启动内核
③如果可以成功启动内核,我们接下来把内核写到eMMC中,在①的基础上,步骤如下:
1.minicom中
dnw 0x40008000
2.PC中
cd /1702/exynos/linux-3.5
dnw arch/arm/boot/zImage
成功下载内核到板子
3.写内核到eMMC
movi write kernel 0 0x40008000
4.设置自动启动
set bootcmd “movi read kernel 0 0x40008000;bootm 0x40008000”
save
reset看能否启动.如果可以说明成功了.
4.制作文件系统
通过网络来挂载的文件系统,所以要搭建nfs环境
1)安装NFS
$ sudo apt-get install portmap
$ sudo apt-get install nfs-kernel-server
$ sudo apt-get install nfs-common
2)修改/etc/exports文件
$ sudo vi /etc/exports
在文件的末尾添加这一句:
/home/1702/exynos/filesystem *(rw,async,no_root_squash,no_subtree_check)
3)重启NFS服务
$ sudo exportfs –a
$ sudo /etc/init.d/nfs-kernel-server restart
5.安装busybox,
$ tar xvf busybox-1.22.1.tar.bz2
$ cd busybox-1.22.1
$ make menuconfig
Busybox Settings —>
Build Options —>
[*] Build BusyBox as a static binary (no shared libs)
(arm-none-linux-gnueabi-) Cross Compiler prefix 注意 一定要指定交叉编译工具
$ make
$ file busybox 确认编译生成的是 ARM 平台的(显示为ELF 32-bit LSB executable, ARM)
$ make install 安装(默认安装路径为_install)
$ cd _install
$ ls
bin linuxrc sbin usr
$ mkdir dev etc mnt proc var tmp sys root 创建需要的目录
$ cp ~/store/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a 注意是lib/
$ du -mh lib 查看lib库的大小
$ rm lib/*.a 裁剪,删除掉静态库文件
$ arm-none-linux-gnueabi-strip lib 裁剪掉调试信息 not recognized 有些库是不能strip的 忽略掉
$ sudo rm lib/libstdc++* 删除不需要的库,确保所有库大小不超过4M
$ du -mh lib 查看lib库的大小 可能 显示3.4M lib (这里确保小于 8M)
$ cp /nfs/rootfs/etc -rf . 拷入成熟的参考配置
$sudo mknod dev/console c 5 1 必须要有 console设备节点
创建一个目录用来挂载根文件系统
$ mkdir filesystem
$ cd filesystem
$ cp …/busybox-1.22.1/_install/* . -r
$ mkdir etc/init.d
$ vim etc/init.d/rcS
- 在filesystem/etc/init.d/rcS里修改为如下内容:
!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/mount -a #挂载fstab文件中所有指定的文件系统
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s #在/dev目录下建立必须的设备节点
/bin/hostname -F /etc/sysconfig/HOSTNAME
ifconfig eth0 192.168.0.10 # 设置ip地址非常重要,一定要跟服务器的地址再同一个网段
-
$vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/mount -a -r3.$vim etc/fstab
device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 04.$ vim etc/profile
!/bin/sh
ulimit -S -c 0>/dev/null 2>&1
USER=“id -un”
LOGNAME=KaTeX parse error: Expected 'EOF', got '#' at position 26: …[root@tiny4412]#̲' PATH=PATH
HOSTNAME=‘bin/hostname’
export USER LOGNAME PS1 PATH5.$ cd …/
$ sudo chmod 777 filesystem
6.uboot启动内核网络挂载根文件系统
setenv gatewayip 192.168.0.1
setenv ipaddr 192.168.0.xxx //板子的IP
setenv serverip 192.168.0.xxx //PC机IP
setenv ethaddr 00:0c:29:a7:9b:2csetenv bootargs “root=/dev/nfs nfsroot=192.168.0.111:/home/linux/Tiny4412/filesystem ip=192.168.0.10 init=/linuxrc console=ttySAC0,115200”
saveenv
reset
uboot加载内核并通过网络挂载文件系统
…
…
[ 6.825000] device=eth0, addr=192.168.0.10, mask=255.255.255.0, gw=255.255.255.255
[ 6.825000] host=192.168.0.10, domain=, nis-domain=(none)
[ 6.825000] bootserver=255.255.255.255, rootserver=192.168.0.111, rootpath=
[ 6.830000] hotplug_policy_init: intialised with policy : DVFS_NR_BASED_HOTPLUG
[ 6.840000] ALSA device list:
[ 6.840000] No soundcards found.
[ 6.985000] VFS: Mounted root (nfs filesystem) on device 0:10.
[ 6.985000] Freeing init memory: 212K
Please press Enter to activate this console.
0
[root@tiny4412]#ls
bin etc linuxrc opt root sys usr
dev lib mnt proc sbin tmp var
[root@tiny4412]#