相信很多人都跟我一样,买了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这一侧,上电运行试试,如果成功的话,大概会在串口助手出现一下情况:
有时候大同小异吧,我的开发板就和上面的显示内容有些差异,不过也是成功的,接下来,我们把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
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