系统移植基本操作

开发环境

开发机:Ubuntu 20.04(虚拟机)

开发板:三星exynos-4412 fs4412核心板+华清远见外设板

系统启动顺序

上电—> 引导程序(Bootloader)—> 内核(kernel)—> 设备树(dtb)—> 根文件系统(rootfs)

前期系统配置

Ubuntu中网络设置

因为该开发板有网口,所以我们选择网线进行数据传输(串口通信太慢了)。首先保证Ubuntu可以访问百度(现在百度就是拿来Ping的),然后使用ifconfig查看Ubuntu的IP,并且记录下来。

有条件的可以使用交换机或者路由器讲Ubuntu和开发板连接起来,确保他们在一个网段。(这里需要的网络知识就后面找个时间写一个文档)

现在假设他们物理上是在一个网段,然后我们使用串口连接Windows,使用hypertrm(超级终端)工具连接开发板,注意设置连接的波特率为115200

开发板上的设置

上电后,我们就进入了u-boot的引导(默认在3S内按任意键打断启动,否则开发板会进行加载内核步骤),然后我们使用如下命令去设置开发板的网络信息,请根据自己的网络所属网段以及Ubuntu的IP进行设置。

set ipaddr 192.168.12.233		//设置【目标机】开发板的ip地址;
set serverip 192.168.12.120		//设置【开发主机】ubuntu的ip地址;
set gatewayip 192.168.12.1		//设置网关
set netmask 255.255.255.0		//设置子网掩码
save							//保存环境变量到emmc中;

设置好后一定要使用save将设置的信息保存在emmc中,否则只有这一次生效。

pri			//查看u-boot的配置信息

接下来在超级终端中使用ping Ubuntu的IP去查看网络是否设置成功。如果成功就继续下面的步骤,没有成功就找出问题并解决。

Ubuntu上的tftp

为了可以使用网络进行数据传输,我们选择tftp去进行传输,首先在Ubuntu上安装tftp服务器,步骤如下

0.检查是否安装过tftp
sudo apt-cache policy tftpd-hpa

1. 安装tftp服务器:
sudo apt-get install tftpd-hpa tftp-hpa
注意:虚拟机需要连外网,也就是能够ping www.baidu.com 

2. 配置tftp服务器:
sudo vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"				#用户的使用命令;
TFTP_DIRECTORY="/tftpboot"			#共享文件的路径;
TFTP_ADDRESS="0.0.0.0:69"			#服务器的ip地址和端口号;
TFTP_OPTIONS="-l -c -s"
根文件系统下面创建目录tftpboot,修改共享文件的权限
sudo chmod 0777 /tftpboot

3. 启动tftp服务器
sudo service tftpd-hpa restart	//重启

4. 将需要传输的文件存储在共享目录中(/tftpboot)

5. 测试是否成功安装
tftp 127.0.0.1    
tftp>get <filename>    
tftp>q

网络环境测试

在Ubuntu中将镜像文件uImage;exynos4412-fs4412.dtb;ramdisk.img拷贝到/tftpboot

在u-boot中输入如下命令使用tftp加载内核、设备树、根文件系统以启动系统,测试网络环境。

tftp 41000000 uImage				//下载内核
tftp 42000000 exynos4412-fs4412.dtb	//下载设备树
tftp 43000000 ramdisk.img			//下载根文件系统
bootm 41000000 	43000000 		42000000
	  内核地址   根文件系统地址	设备树地址
注意:地址顺序不能出错;	  

设置启动参数,以便在板子上电后可以自动去tftp服务器上下载所需文件
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; tftp 43000000 ramdisk.img\; bootm 41000000 43000000 42000000
使用boot可以让板子加载内核。
boot

交叉编译器安装

1. 将gcc-4.6.4.tar.xz 拷贝到虚拟机的某一个目录中
    cp gcc-4.6.4.tar.xz ~/workspace/fs4412	
2. 进入到所对应的目录中,解压gcc-4.6.4.tar.xz
    cd ~/workspace/fs4412 
    tar -xvf gcc-4.6.4.tar.xz
3. 进入到gcc-4.6.4目录中,通过pwd查看绝对路径;
    cd gcc-4.6.4/bin
    pwd   === > /home/CodeDrawing/workspace/fs4412/gcc-4.6.4/bin
4. 修改PATH的值;
    进入到/etc/bash.bashrc,在文件的最前面添加
    sudo vim /etc/bash.bashrc
    export PATH=$PATH:/home/CodeDrawing/workspace/fs4412/gcc-4.6.4/bin
5. 重启;
    source /etc/bash.bashrc
6.测试:
    a.生成可执行文件:arm-none-linux-guneabi-gcc 1.c
    b.拷贝执行文件到下载目录: cp a.out /tftpboot
    c.在板子上使用tftp下载a.out到板子上: tftp -g -r a.out 192.168.12.120 (注:板子和Ubuntu必须在同一网段)
    注:使用tftp上传文件到服务器 tftp -p -r a.out 192.168.12.120
    d.修改a.out权限:chmod 777 a.out
    e.执行a.out: ./a.out

nfs文件系统

使用tftp服务在某些情况下不太方便,所以这里使用nfs网络文件系统来是我们平时的编译等操作更加方便。

开发机上的步骤

0. 查看是否安装过nfs服务器:
sudo apt-cache policy nfs-kernel-server
1. 安装nfs服务器
sudo apt-get install nfs-kernel-server
2. 配置nfs服务器
    1) 拷贝day1镜像目录下的根文件系统rootfs.tar.xz到开发主机中的一个目录(例如/source/nfs)
    cp rootfs.tar.xz /source/nfs
    2) 进入到rootfs.tar.xz所对应的目录中
    cd /source/nfs
    3) 解压根文件系统
    tar -xvf rootfs.tar.xz
    4) 进入到rootfs目录,使用pwd确定所对应的绝对路径
    cd rootfs
    pwd  ----> /source/nfs/rootfs   就是用来挂载的共享路径;
    5) 修改nfs配置文件 sudo vim  /etc/exports 
    在文件的尾部添加代码:
    /source/nfs/rootfs  *(rw,sync,no_root_squash,no_subtree_check)
    注意:路径需要和根文件系统的实际路径一致;
3. 启动nfs服务器:
sudo service nfs-kernel-server restart

开发板的步骤

设置启动命令:
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; bootm 41000000 - 42000000
设置启动参数:
set bootargs root=/dev/nfs nfsroot=192.168.12.111:/source/nfs/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.12.58 clk_ignore_unused=true

当出现[root@farsight ]#后说明成功

nfs的问题解决

一、
/*Ubuntu 18.04 nfs 默认为协议3和协议4,但是 我的uboot 默认启动的是协议2的形式
如:  /srv/homes    hostname1(rw,sync,no_subtree_check)
若想要求 nfs 支持协议2,就在/etc/default/nfs-kernel-server末尾加一句:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
*/
二、
1)把nfs配置文件备份
sudo mv /etc/default/nfs-kernel-server  /etc/default/nfs-kernel-server.back
2) 替换nfs配置文件
把day1镜像目录下的nfs-kernel-server拷贝到/etc/default目录下
sudo cp nfs-kernel-server  /etc/default
3) 重启nfs服务
sudo service nfs-kernel-server restart
4) 重新挂载到开发板

把内核设备树根文件系统烧写到EMMC上,直接启动

a)	拷贝第一天/镜像文件/ramdisk.img拷贝到虚拟机/tftpboot目录下
b)	烧写内核镜像到EMMC上
	# tftp 41000000 uImage
    # movi  write  kernel  41000000

c)	烧写设备树文件到EMMC上
    # tftp  41000000 exynos4412-fs4412.dtb
    # movi  write  dtb  41000000

d)	烧写文件系统镜像到EMMC上
    # tftp  41000000  ramdisk.img
    #movi  write  rootfs  41000000  3000000

e)	设置启动参数
    # set bootcmd movi read kernel 41000000\;movi read dtb 42000000\;movi read rootfs 43000000 3000000\;bootm 41000000 43000000 42000000
    # set bootargs
    # saveenv
f)	重新启动开发板,u-boot自动加载、执行内核