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

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

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

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

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

http://blog.csdn.net/lizuobin2/article/details/52825033

这篇博文就是在以上几位的基础上,再结合自己开发板的实际情况写的,我的开发板是tiny4412,板子的型号是1611.因为走了很多弯路,现在也帮一下你们,少走点弯路,才能多一些自信.

本篇博文分为以下几个部分:

①安装交叉编译工具链;

②制作uboot;

③制作Linux镜像文件;

④制作文件系统;

⑤开发板验证;

 

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

在附带的资料盘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这一侧,上电运行试试,如果成功的话,大概会在串口助手出现一下情况:

 

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第1张图片

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

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

fdisk -p 0
fdisk -p 1

应该可以看到如下信息:

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第2张图片

(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输出已经变成了:

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第3张图片

至此,就完成了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

配置:

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第4张图片

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第5张图片

tiny4412新手入门,从零开始一步一步到挂载网络根文件系统_第6张图片

选择完,我们退出保存,然后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 



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

你可能感兴趣的:(Linux)