"重温"嵌入式开发第一课—跑起来

以上都做好了,什么都弄OK.就差建立NFS服务器然后进行linux的学习了.建立NFS服务器个人觉得还是建立在linux上更好一点.所以这里就需要让开发板能够访问到处于虚拟机中的linux了.
这里我使用的虚拟机是virtualbox,安装完成后系统中会出现两张网卡,同时选择两张网卡(一个虚拟机(host_only)的),一个是宿主机网络的(和开发板在同一个网络的.)右键选择"桥接";[图片上传中。。。(1)]
等待一会儿就会生成一个桥接的网络: [图片上传中。。。(2)]
然后设置桥接的网络的IP和开发板一样.
然后在设置虚拟机: [图片上传中。。。(3)]
再进入虚拟机中设置一个IP地址(和开发板同网段),然后就可以了直接访问了.不确定的话可以先ping一下排除问题,实际走到这里我这里是可以了.之前学过一段时间linux,但是过于松散,现在回头换了地方竟然忘了怎么给烧系统了.完了.把命令重新写在这边便于记忆吧!

一、装编译器

装编译器很好搞,就直接解压了然后再用户的bashrc中导入相关的位置就可以了。这里不贴代码了(之前已经弄好了,就暂时懒得弄了)。

二、编译相关uboot和kernel

在光盘中得到了linux kernel,在国嵌中得到了uboot,编译我这里也没有废话要讲,因为就只是调用编译器进行make。

说明:这里uboot会生产uboot-spl.bin和u-boot.bin(220KB左右),最后合成成一个smart210-uboot.bin程序(250KB左右)

三、把编译好的uboot下载到sd卡上

这一块就是我我忘记了的地方,记得是linux使用dd命令,windows有工具来着。这里就直接使用linux搞事,记录命令如下:

//先查看sd卡所在的磁盘
ls /dev/sd*
//找到自己的磁盘过后(这里我是 /dev/sdb)
//查看磁盘前部数据
sudo hexdump -n 1048576 /dev/sdb
//清除前面1m数据
sudo dd if=/dev/zero of=/dev/sdb count=2000
//清除过后再检查一遍
sudo hexdump -n 1048579 /dev/sdb
//这时候就可以直接写入uboot了
sudo dd iflag=dsync oflag=dsync if=./u-boot.bin of=/dev/sdb seek=1
//再次查看一下,有数据了。之前由于下错了映像导致了烧写进去了没反应.检查一下重新烧录就好了.

四、进入uboot操作

下面介绍一部分重要的uboot操作而自己忘得差不多的操作:

printenv    //打印环境变量
setenv name value   //将环境变量中项目名为name的写入 value值
saveenv     //保存环境变量到flash中
tftp 0x20000000 smart210-uboot.bin //将该bin文件下载到指定地址
nand erase 0 50000 //擦除FLASH在0地址开始的0x50000偏移
nand write 20000000 0 50000  //向nand flash 中写入uboot
reset  //复位,重启

这里遇到几个问题:

问题1:这里的uboot 有点大,260kb左右.所以烧写的时候选择了0x50000 这个大小,但是我发现保存环境变量会在0x40000上面保存,会导致出现问题,保存了环境变量,重启uboot就启动不起来了.为了让环境变量改一个位置,同时不要和linux划分分区冲突了.这里就参考的linux启动时候的分区输出和uboot占用,综合考虑选择了以下地址,暂时这个uboot放不下开机logo了.

解决办法:uboot中定义的环境变量保存存放在:

include/configs/smart210.h
#define CONFIG_ENV_OFFSET 0Xa0000 (这个地址要计算下,不然擦写地址不是整数有问题.)

五、搭建网络环境

以上都做好了,什么都弄OK.就差建立NFS服务器然后进行linux的学习了.建立NFS服务器个人觉得还是建立在linux上更好一点.所以这里就需要让开发板能够访问到处于虚拟机中的linux了.

这里我使用的虚拟机是virtualbox,安装完成后系统中会出现两张网卡,同时选择两张网卡(一个虚拟机(host_only)的),一个是宿主机网络的(和开发板在同一个网络的.)右键选择"桥接";

40464272.png

等待一会儿就会生成一个桥接的网络:

40496393.png

然后设置桥接的网络的IP和开发板一样.

然后在设置虚拟机:

40545829.png

再进入虚拟机中设置一个IP地址(和开发板同网段),然后就可以了直接访问了.不确定的话可以先ping一下排除问题,实际走到这里我这里是可以了.

六、搭建文件系统(NFS)

这里的文件系统是指的根文件系统,因为之前自己的有写教程,所以自己这里贴出来当时的笔记:

http://www.jianshu.com/p/088dd635a50d

但是我这里因为friendlyarm提供了包,我这里先暂时不去弄那么复杂,直接解压他给的包搭建NFS.

搞着搞着忽然想起来的我linux还没有搭建NFS.那就赶紧搭建吧.过程如下.

先输入以下命令,安装nfs:

sudo apt-get install nfs-kernel-server
//这里一般都会默认装好 nfs-common 如果没有默认装好使用以下命令安装即可:
sudo apt-get install nfs-common

然后再修改配置文件: /etc/exports

sudo vim /ect/exports

在文件的最后添加如下内容:(这里我把目录放在了我的用户目录下新建了一个文件夹)

/home/jet/nfs *(rw,sync,no_root_squash,no_subtree_check)
//解释下以上配置项目意思
//* 代表所有网段都可以访问
//rw 挂载此目录对目录享有读写权限
//sync 资料同步写入内存和硬盘
//no_root_squash : root用户具有对根目录完全管理访问权限
//no_subtree_check :不检查父目录的权限

再使用以下命令是以上配置生效:

exportfs -rv
sudo chmod 777 /home/jet/nfs -R //修改权限

接下来就是重启服务,检查配置的时候了:

sudo /etc/init.d/rpcbind restart //重启portmap
sudo /etc/init.d/nfs-kernel-server restart //重启nfs服务
showmount -e  //显示出共享的目录

接下来进行测试,这里为了验证问题,使用另外一台笔记本测试.安装的是win7 旗舰版(专业版不包含NFS客户端),在 程序和功能 -> 打开或关闭windows功能中添加 NFS客户端.然后就可以使用了,下面是安装好客户端后的测试过程:

showmount -e 192.168.0.91
mount 192.168.0.91:/home/jet/nfs Z:
//上面执行完了过后就能够在windows下看到一个多出来的Z盘.里面写入一个文件.检查linux中果然也多出来了一个文件.到此完成任务.
umount Z:  //断开连接.

接下来就可以放心的将文件系统解压到nfs中去了.

重新编译内核,配置menuconfig.我去,这里竟然提示ncurses这个没有.按照提示安装了下.没找到.度娘看了下.使用如下命令安装即可:

sudo apt-get install libncurses-dev

再次测试:

make menuconfig ARCH=arm
//去除 general Setup -> initramfs 
//打开 File System -> networks File system -> root file system on NFS (勾选)
//然后重新编译就就可以了.
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
//喝杯水,练练字.差不多就好了.

7.直接去uboot测试启动(先搭建TFTP服务器)

之前测试内核都是在windows下面运行了一个小程序开了TFTP服务器.这里我就不继续沿用这种笨的办法了.我直接在linux上开一个tftp服务器吧.如下是操作过程:

sudo apt-get install tftpd-hpa tftp-hpa
//然后修改配置文件
sudo vim /etc/default/tftpd-hpa
//配置文件如下
TFTP_USERNAME="tftp
TFTP_DIRECTORY="/home/jet/tftpboot //工作目录
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS="-l -c -s"
//保存,重启服务器:
sudo service tftpd-hpa restart
//在tftpboot目录下新建一个1.txt文件.填入任何内容,为了测试
tftp 127.0.0.1
get 1.txt
当前目录出现一个1.txt..成功了.

将编译好的kernel(uImage) 放入tftpboot中.让开发板启动到uboot中.并将环境变量进行如下修改:

......卧槽,刚才搞着搞着还尼玛蓝屏了.坑爹啊.搞了十几分钟才搞定,坑爹.

先把uboot环境变量贴上吧:

setenv bootcmd "tftp 21000000 uImage; bootm 21000000"
setenv bootargs root=/dev/nfs rw nfsroot=192.168.0.91:/home/jet/nfs/rootfs_rtm_210 ip=192.168.0.110:192.168.0.91:192.168.0.90:255.255.255.0::eth0:off console=ttySAC0,115200
saveenv
reset

不出意外,保存过后直接复位能够重启到系统中.我这里很顺利就进去了.根文件系统也挂载上了.到这里,尝试就结束了.等下有空自己做一个根文件系统练练手试下.

你可能感兴趣的:("重温"嵌入式开发第一课—跑起来)