烧录
学习文件系统的构建时,需要烧写自己构建的文件系统来验证是否能被成功挂载,这就需要烧录工具。之前裸机时使用的烧录工具是linux版本的oflash,但该工具只能烧录裸机程序,不适用于kernel,rootfs等烧录,故转而寻找其他代替工具。首先试过使用linux班的dnw,但pc机一直无法检测到开发板usb设备,因此只能选择通过网络来烧录。
开发环境
开发板:s3c2440
烧录工具:tftp + uboot
pc系统:ubuntu 14.04
环境搭建
- 开发板
支持tftp功能的uboot:使用tftp需要开发板uboot支持tftp功能,该功能在uboot编译时需要加入。 - pc端
tftpd-hpa:tftp server端,用来响应uboot的文件下载请求
sudo apt-get install tftpd-hpa
安装完成后需进行配置
sudo vi /etc/default/tftpd-hpa
配置如下
TFTP_USERNAME="tftp" //默认
TFTP_DIRECTORY="/home/jiang/workspace/tftproot" //创建的目录作为文件下载目录
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s" //权限
完成配置后需更改tftproot目录的权限
sudo chmod 777 /tftpboot
重启tftp服务
sudo service tftpd-hpa restart
烧写
将需烧写的文件放到tftproot/下,再赋予权限(否则会因权限不足导致无法下载)便进行下载。
步骤如下:
- 进入uboot控制台,设置开发板和pc机ip(二者需在同一网段)
set ipaddr 192.168.0.110 //开发板ip
set serverip 192.168.0.100 //pc机
save
- 检查开发板与pc网络是否通畅,在uboot界面
ping 192.168.0.100
出现"is alive"说明网络通畅,若出现"is not alive"实名二者网络不同,需检查是否ip设置有误
- 下载文件rootfs.yaffs2
tftp 0x30000000 rootfs.yaffs2
如图:
由图可看出下载大小为8783808 byte
- 擦除对应分区
nand erase root
或如下格式:
nand erase $offset $size //指定分区偏移offset和分区大小size
- 烧录
nand write.yaffs 0x30000000 0x00260000 0x8607c0
//在此注意区分write.jffs2和write.yaffs针对不同格式文件系统
如上图表示烧写成功
- 启动
boot
或:
reset
至此,通过tftp烧写文件按系统已完成。但如此烧写太过麻烦,每次文件系统稍有修改便要烧写一次,占用太多时间。为解决该问题,可以使用网络文件系统。
网络文件系统
网络文件系统即是处于同一网络的开发板通过网络挂载pc机上指定目录下的文件系统,该文件系统并未烧到开发板flash,而是存在于pc上,开发板只是在启动文件系统时通过设置的参数到pc指定位置去挂载。
环境搭建
- pc端
安装nfs服务
sudo apt install nfs-kernel-server
sudo apt install nfs-common
配置
sudo vi /etc/exports
在该文件最后加入以下内容:
/home/jiang/workspace/zj2440/nfs_root/rootfs *(rw,sync,no_root_squash) //指定开发板与pc机nfs共享目录
重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart
- 开发板端
在此有两种挂载方式:
1.开发板启动后挂载flash中文件系统,进入系统后再手动挂载nfs文件系统;
启动后串口进入开发板,执行挂载命令
mount -t nfs -o nolock 192.168.0.101:/home/jiang/workspace/zj2440/nfs_root/rootfs /mnt
//192.168.0.101为pc机ip
///home/jiang/workspace/zj2440/nfs_root/rootfs为设置的nfs共享目录
//mnt为开发板上的目录,指定为文件系统的挂载点
2.开发板启动文件系统时直接从nfs网络文件系统启动;
该方式需设置bootargs参数
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.101:/home/jiang/workspace/zj2440/nfs_root/rootfs ip=192.168.0.100:192.168.0.101:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
//root=:指定文件系统为位置
//192.168.0.100为开发板ip地址
//192.168.0.1为网关
save
如此设置,开发板启动时会直接加载网络文件系统,避免繁琐的烧录过程。