相信不少人都跟我同样,买了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