tiny4412新手入门,从零开始一步一步到挂载网络根文件系统

相信不少人都跟我同样,买了tiny4412以后,都无从下手,由于官方出的光盘附带资料跟屎同样,以前买了两套开发板,附带的光盘年久失修,读不出文件,给卖家要了百度云的连接,几十个G的文件,百度云又对大文件限速,20M宽带,愣是80k/s的速度下载了3天4夜,才下载下来,惊喜吧,下载好以后,还发现,资料乱七八糟的,因而只能借助强大的网络来解决我遇到的各类问题,确实发现了几篇很给力的文章这里贴出来:html

http://blog.csdn.net/fengyuwuzu0519/article/details/74080109?locationNum=7&fps=1linux

http://blog.csdn.net/morixinguan/article/details/50677105shell

http://blog.csdn.net/karaskass/article/details/53363096ubuntu

http://blog.csdn.net/lizuobin2/article/details/52825033小程序

这篇博文就是在以上几位的基础上,再结合本身开发板的实际状况写的,个人开发板是tiny4412,板子的型号是1611.由于走了不少弯路,如今也帮一下大家,少走点弯路,才能多一些自信.vim

本篇博文分为如下几个部分:windows

①安装交叉编译工具链;缓存

②制做uboot;网络

③制做Linux镜像文件;async

④制做文件系统;

⑤开发板验证;

 

一,安装交叉编译工具链:

在附带的资料盘A盘里有相关的压缩包,arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz,本文的最后面也会有提供下载连接.

(1)解压编译器源码

sudo tar -xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C /

(2)执行后将自动把 arm-linux-gcc 安装到/opt/FriendlyARM/toolschain/4.5.1 目录

(3)sudo vim /etc/environment修改PATH为:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.5.1/bin"

(4)重启Linux系统,执行arm-linux-gcc -v查看版本。

若是能够查看到版本,就说明安装成功了,接下来制做uboot.

二,制做uboot

开发板附带的资料里有提供uboot,可是作好以后实验,发现就只是打一个ok,并不会运行,因此,咱们这里用上面博文中的uboot,本文的最后面也有提供下载连接.

(1)下载相关uboot压缩包以后,咱们拷贝到Linux里面,作以下命令:

unzip uboot-tiny4412-1506.zip
cd uboot-tiny4412-1506
unzip uboot_tiny4412-master.zip
cd uboot_tiny4412-master
make tiny4412_config
make

(2)编译 用于生成bl2 的工具,上述编译完成以后,执行下列操做:

cd sd_fuse
make

(3)这时候插入SD卡,假设SD卡已被PC Linux识别为/dev/sdb, 以root用户运行如下命令便可:

cd sd_fuse/tiny4412  
sudo ./sd_fusing.sh  /dev/sdb

执行上述命令会有相关信息显示已经下载完毕,接下来咱们就把卡插在开发板上,把启动开关波导SD这一侧,上电运行试试,若是成功的话,大概会在串口助手出现一下状况:

 

有时候大同小异吧,个人开发板就和上面的显示内容有些差别,不过也是成功的,接下来,咱们把uboot烧写进eMMC里面,这样就不须要SD卡了,

(4)首先仍是在上述的基础上,咱们来查看设备的分区表信息

fdisk -p 0
fdisk -p 1

应该能够看到以下信息:

(5)格式化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中。

(6)安装DNW工具

首先这里说一下原理,咱们经过DNW工具把uboot的相关文件下载进开发板的RAM,而后经过板子上已经运行的uboot来把RAM上的文件写入eMMC,相关工具能够在上述博文下载,也能够下载本文的最后面提供的.

1.首先解压缩文件:
# tar xvf dnw_for_linux.tar.gz
另:在Ubuntu下右键解压也很方便
目录以下:

src/dnw
src/driver
dnw.rules
logo.png
Makefile
README

其中src/driver/secbulk.c是PC端USB驱动, dnw.c是写入工具.

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

 

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。

(7)DNW安装好了,咱们能够把uboot下载到eMMC了

 

首先这里说明一下,我是用虚拟机+Putty远程登陆方式的,用另外打开的putty充当串口调试助手,咱们须要把USB线链接开发板的OTG,而后执行以下操做

#uboot:emmc open 1

提示:eMMC OPEN Success.!!

上面提示emmc开启成功,注意说明,emmc一旦打开,须要连续烧录,烧录完成后能够关闭emmc

#uboot:dnw

提示:OTG cable Connected!
Now, Waiting forDNW to transmit data(等待DNW下载)
这里要说明一下,以上提示必定要让虚拟机的Linux识别,而不是windows,不然你下载不进去的,我用的方法是执行完上面指令,立马切换到虚拟机,鼠标点一下Linux系统,而后迅速插拔USB线,Linux就能够识别了,这样就能够正常下载了

进入uboot所在目录

cd /1702/exynos/uboot_tiny4412-1506
dnw  sd_fuse/tiny4412/E4412_N.bl1.bin

此时u-boot中断会提示传送校验完成,此时已经把bl1.bin经过USB传送到了memeory的0xc0000000起始地址,大小8KB.

接下来咱们烧录bl1.bin到eMMC中,u-boot下继续输入:

#uboot:mmc write 1 0xc0000000 0 0x10

会提示写入信息,说明已经写入成功。这个是把刚才从PC端经过dnw下载下来的bl1.bin固件下载到emmc中,起始0, 16个block, 一个block是512B, 16*512=8*1024=8KB. 这个是bl1.bin的存放位置。

以此类推,烧录bl2.bin. u-boot.bin, tzsw.bin

#uboot:dnw
#虚拟机:dnw 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输出已经变成了:

至此,就完成了uboot下载进eMMC了,而后,之后就能够经过Nand Flash启动了,固然,若是你没有那么顺利,还没把uboot烧进eMMC,那么先不急,先作下面的,把全部的都准备好,在来攻克烧写进eMMC.

三,制做Linux镜像文件

这个用友善之臂提供的linux-3.5-20160514.tgz

(1)解压

解压 Linux  内核源代码

tar xvzf  linux-3.5-20151029.tgz
cd  linux-3.5

(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看可否启动.若是能够说明成功了.

四,制做文件系统

①首先,咱们是要作经过网络来挂载的文件系统,因此须要搭建一下nfs环境

设置NFS服务
1)在ubuntu12.04上安装NFS Server

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/george/1702/exynos/filesystem  *(rw,async,no_root_squash,no_subtree_check)
格式说明:
*:容许全部的网段访问,也可使用具体的IP
rw:挂接此目录的客户端对该共享目录具备读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具备对根目录的彻底管理访问权限。
no_subtree_check:不检查父目录的权限。
注意,*和后面的括号不能出现空格。
而后保存退出。

3)重启NFS服务

sudo exportfs –a
sudo /etc/init.d/nfs-kernel-server restart

4)测试NFS服务是否成功
把本地的文件夹挂载到mnt上

showmount -e 192.168.1.xxx

若是有出现相应设置的路径,说明NFS服务设置完成.

②安装busybox,下载连接https://busybox.net/

/1702/exynos$ mkdir filesystem
/1702/exynos$ tar -xzvf busybox-1.22.1.tar.bz2
/1702/exynos$ cd busybox-1.22.1/
/1702/exynos/busybox-1.22.1$ make defconfig
/1702/exynos/busybox-1.22.1$ make menuconfig

配置:

选择完,咱们退出保存,而后make -j4,进行编译,编译完成以后,咱们再make install,这样会在当前目录下生成_install文件夹,检测有没有成功:

file bin/busybox

若是出现一下信息,说明成功了:

bin/busybox: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

上面显示ARM平台运行,说明安装成功.特别说明,busybox在make时有可能会提示一些错误,好比缺乏某个库libm.so等等,或者其它编译错误,我就遇到了,个人作法是,选择了busybox 1.23.2,而后make以后提示缺乏两个库文件,不用管,直接make install便可.

③制做根文件系统

/1702/exynos$ mkdir filesystem
/1702/exynos$ cd filesystem
/1702/exynos$ cp ../busybox-1.22.1/_install/* . -r
/1702/exynos/filesystem$ mkdir etc dev opt sys tmp mnt lib proc
/1702/exynos/filesystem$ mkdir etc/init.d
/1702/exynos/filesystem$ vim etc/init.d/rcS

在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
#设置主机的名字

保存退出

/1702/exynos/filesystem$vim etc/inittab

在inittab里添加以下内容:

::sysinit:/etc/init.d/rcS	#设置内核的热插拔,有mdev接收来自内核的消息并作出响应
::askfirst:-/bin/sh     	#在串口启动一个登录会话
::ctrlaltdel:/sbin/reboot	#做为init重启执行程序
::restart:/sbin/init
::showdown:/bin/mount		#告诉init在关机时运行umount命令卸载全部文件系统,若是卸载失败,以只读方式从新挂载

保存退出

/1702/exynos/filesystem$vim etc/fstab

在fstab里添加以下内容(按tab键隔开):

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

保存退出
注意:
第一列是挂载设备  
第二列是挂载目录
第三列是挂载文件系统类型
#第四列是挂载选项(裁掉了,哈哈)

/1702/exynos/filesystem$ vim etc/profile

在profile里添加以下内容:

#/etc/profile:system-wide .profile file for the Bourne shells
#!/bin/sh
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[root@tiny4412]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH

保存退出

/1702/exynos/filesystem$ cd ..
/1702/exynos$ sudo chmod 777 filesystem

建立设备文件:

/1702/exynos/filesystem$ sudo mknod dev/console c 5 1

完善动态连接库:
(1)咱们在busybox设置的是动态连接库,并且编译器是arm-linux-gcc,找到安装arm-linux-gcc的安装路径

/1702/exynos/filesystem$ which arm-linux-gcc

/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
上面是个人路径,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,这个就是要复制出来的动态库的路径,把里面的动态连接文件复制到filesystem文件夹下
(2)复制动态连接文件

/1702/exynos/filesystem$ cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/*  ./lib   -r

简单小结一下:
1.inittab,rcS,fstab关系
系统启动挂载文件系统--->
--->读取/etc/inittab文件,解析其中定义的动做
--->根据sysinit定义的process执行/etc/init.d/rcS
--->/etc/init.d/rcS中第一条命令 mount -a
--->读取/etc/fstab文件
--->根据文件列表内容逐个挂载其中的设备到指定地
2.profile文件
设置环境变量,根据这里设置命令提示符号相关的环境变量
用户能够根据本身须要添加环境变量
3./etc/init.d/rcS
执行系统初始化时候,想开机启动的程序均可以写在这个文件中.

 

五,开发板验证

启动开发板,按任意键让uboot中止加载,而后在uboot中设置以下内容:

set gatewayip  192.168.1.1
set ipaddr     192.168.1.x   	//板子的IP
set serverip   192.168.1.xxx   //PC机IP
setenv ethaddr 11:22:33:44:55:78
set bootargs "root=/dev/nfs nfsroot=192.168.1.12:/home/george/1702/exynos/filesystem ip=192.168.1.72 init=/linuxrc console=ttySAC0,115200"

设置完成以后,

save
reset

以后,然uboot本身加载内核和网络文件系统,若是顺利的话,就能够成功了,若是你还没搞好,骚年,你还需努力哦,本身在网上再找找,本身也解决一下.

 

完成上述以后,咱们来写个小程序验证一下是否真正可行,在Ubuntu下写以下程序:

#include <stdio.h>



int main(void)
{
	printf("hello girl\n");
	
	return 0;
}

而后用交叉编译器编译成ARM板能用的二进制文件,放入刚刚制做好的文件系统,从新上电开发板,运行文件,不出问题,就能够看到运行后的结果:hello girl了.

后边写驱动程序的时候,发现没法卸载驱动,提示以下信息:

rmmod: can't change directory to '/lib/modules': No such file or directory

缘由是没有在lib目录建立modules目录,执行:

mkdir /lib/modules

再次用rmmod卸载驱动,发现接着提示:

rmmod: can't change directory to '3.5.0-FriendlyARM': No such file or directory

这时执行:

mkdir /lib/modules/3.5.0-FriendlyARM

以后就能够正常卸载驱动了.

本博文相关下载:

百度云:连接:http://pan.baidu.com/s/1jHDLkV0 密码:o8qu