Tiny4412 uboot启动内核并通过网络挂载根文件系统

Tiny4412 uboot启动内核并通过网络挂载根文件系统

从买到友善之臂的tiny4412 SDK1611开发板到现在已经近三个月了,之前不知道从哪里入手更没时间弄,最近抽出来时间开始学习了,对于我这个新手来说主要还是依靠强大的网络,参考了很多篇文章。

开始进入正题

开发板为Tiny4412 SDK 1611

所用到的安装包在https://download.csdn.net/download/w0725217/10802004可以下载到

  1. 安装交叉编译工具链 gcc-4.6.4.tar

  2. 制作uboot

  3. 制作Linux镜像文件

  4. 制作根文件系统

  5. 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

应该可以看到如下信息:

img

  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

  1. 在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地址非常重要,一定要跟服务器的地址再同一个网段

  1. $vim etc/inittab

    ::sysinit:/etc/init.d/rcS
    ::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/mount -a -r

    3.$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 0

    4.$ 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 PATH

    5.$ 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:2c

    setenv 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]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值