【系统移植】 (二)交叉开发环境搭建

发布于:2025-04-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

【系统移植】 (二)交叉开发环境搭建

  • ubantu下交叉编译工具链的安装(不同的芯片使用的不一样,不讲解)
  • ubantu与开发板要配网(同一个局域网,也可串口)
  • TFTP服务器搭建(用于ubantu与开发板传文件)
  • scp服务(也可传文件,与tftp类似)
  • nfs服务(将ubantu的某个目录映射到开发板,共享一个目录,默认是有的,没有再安装)
  • filezilla(连上ubantu或开发板的ip地址,也可传文件)
  • MobaXterm_Personal(远程登录开发板或ubantu,可SSH登录也可串口)
  • source insight(可查看大型工程,如Linux内核源码,或编写代码,通过文件传输工具传到ubantu或开发板)
  • vs code(代码编辑工具,功能与source insight差不多,可SSH远程连接开发板后编写代码)

1.ubantu网络环境搭建

说白了就是给ubantu配网络,让他能上网。这个之前写过,不再重复。

image-20241216102922527

2.TFTP服务器的安装和测试

tftp(Trivial File Transfer Protocol)即简单文件传输协议,是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

使用条件是:

  1. 需要网络连接
  2. 主机端需要安装 tftp 服务器软件
  3. 目标机需要实现tftp客户端

**优点:**传输速度快,可以将编译好的内核下载到目标机,提高开发效率

tftp 是用来下载远程文件的最简单网络协议,它基于udp协议而实现。

嵌入式 linux 的 tftp 开发环境包括两个方面:

  • 一是 linux 开发主机端的 tftp-server 支持,
  • 二是嵌入式目标系统的 tftp-client 支持。

当然之前写的树莓派教程用的是scp传输文件,也可以用scp

image-20241216102922527

TFTP(Trivial File Transfer Protocol,简单文件传输协议)和SCP(Secure Copy Protocol,安全复制协议)不是同一个东西,它们是两种不同的网络协议,用于不同的目的和环境:

TFTP

  1. 目的:TFTP主要用于在客户端和服务器之间进行简单、不复杂的文件传输。
  2. 特点:它基于UDP协议,因此不提供可靠的数据传输。TFTP不支持用户认证,数据在传输过程中不加密,安全性较低。
  3. 应用场景:常用于网络设备(如路由器、交换机)的固件升级,或者在无盘工作站环境中传输启动所需的文件。
  4. 限制:TFTP不支持目录操作,只能进行文件的上传和下载。

SCP

  1. 目的:SCP用于在不同主机之间安全地传输文件。
  2. 特点:它基于SSH(Secure Shell)协议,提供加密的数据传输和用户认证,安全性较高。
  3. 应用场景:广泛用于远程文件传输,特别是在需要保护数据安全和隐私的场合。
  4. 功能:SCP支持文件的上传、下载、目录操作,并且可以指定传输过程中的压缩选项。

主要区别

  • 安全性:SCP提供加密和用户认证,而TFTP不提供这些安全特性。
  • 传输协议:SCP基于SSH,而TFTP基于UDP。
  • 可靠性:SCP提供可靠的数据传输,TFTP则不保证数据的可靠传输。
  • 功能:SCP功能更全面,支持目录操作和压缩,TFTP功能较为有限。

总的来说,如果你需要在网络中进行安全的文件传输,SCP是更好的选择。而如果你只需要进行简单的文件传输,且不关心安全性,TFTP可能足够使用。

命令行提示符为“$”表示在主机上运行,“#”表示在目标板上运行。
  1. 运行下面的命令安装TFTP服务器和客户端。
//可以先检查是否已经安装了tftp服务器
$dpkg -s tftpd-hpa
$ sudo apt-get install tftpd-hpa tftp-hpa

2.修改 tftp服务器的配置文件

sudo vi /ete/default/tftpd-hpa

将:image-20241216102922527

修改为如下内容,然后保存退出。

image-20241216102949751

注:TFTP_DIRECTORY是tftp服务器的工作目录,即客户端要下载的文件需要放到该目录下

3.创建服务器工作目录并设置为最高的权限

$sudo mkdir /tftpboot
$sudo chmod 777 /tftpboot    
  1. 运行下面的命令,重启TFTP服务器。
$ sudo service tftpd-hpa restart

显示如下信息表示重启成功

image-20241216105504458

注:以后每次重新打开 ubuntu 若要使用 tftp 都需要重启。

  1. 本地测试是否安装成功

进入到服务器工作目录

$ cd /tfpboot/

创建一个文件

$sudo touch test.txt

回到家目录,做一个自环测试

目前客户端和服务端我们都安装在了Linux主机上面

$cd

使用tftp命令登录本机

image-20241216110021305

$tftp localhost

获取文件

上传文件put 文件名

$ get test.txt

退出

$q

执行如下命令查看是否获取到即可

$ls
  1. 如果TFTP的下载不成功,运行下面的命令卸载软件(连同配置信息一起),然后再重新安装,最后再重启TFTP服务器。
$ sudo apt-get remove --purge tftpd-hpa tftp-hpa

$ sudo apt-get install tftpd-hpa tftp-hpa

$ sudo service tftpd-hpa restart

3.连接nfs服务

image-20241219112957856
1、检查nfs服务是否安装
$ service nfs-kernel-server     如果为安装需安装  sudo apt-get install nfs-kernel-server 

2、修改 /etc/exports 文件为 (vi /etc/exports)
# /etc/exports: the access control list for filesystems which may be exported
/nfs/rootfs  *(rw,sync,no_root_squash)
    
3、准备内容
$ sudo mkdir /nfs
$ sudo chmod 777 /nfs
$ cd /nfs
$ cp rootfs.tar.xz  .          它已制作好的根文件系统
$ tar -xvf  rootfs.tar.xz 
$ sudo chmod 777 rootfs	 

4、重启 nfs 服务
$ sudo  /etc/init.d/nfs-kernel-server  restart
    
5、测试nfs服务是否安装成功
$ sudo mount -t nfs localhost:/nfs/rootfs/  /mnt/
$ ls /mnt/   如果其中的内容和/nfs/rootfs中一致。 表示有挂载成功 
$ sudo umount /mnt 

在使用TFTP(Trivial File Transfer Protocol,简单文件传输协议)服务时,是否需要在下位机开发板上安装TFTP客户端或服务器取决于您的具体需求和开发板的操作系统支持情况。以下是几种可能的情况:

  1. Linux主机作为TFTP服务器:如果您的Linux主机上已经安装并运行了TFTP服务器,那么您可以通过TFTP客户端从任何支持TFTP协议的设备上进行文件传输,包括下位机开发板。
  2. 下位机开发板作为TFTP客户端:如果下位机开发板需要从Linux主机上的TFTP服务器下载文件,那么开发板上需要有一个TFTP客户端。许多Linux发行版默认就包含了TFTP客户端工具,如tftp命令行工具。
  3. 下位机开发板作为TFTP服务器:如果下位机开发板需要作为TFTP服务器,让Linux主机或其他设备从它那里下载文件,那么开发板上需要安装并运行TFTP服务器软件。

4.开发板配置

此开发板型号为三星的4412,可能并不是所有人都用得此开发版,所以本节仅供参考步骤。

SD卡制作

制作SD卡,并从SD卡启动   (使用的是2010版本u-boot,支持fastboot烧写的)  
	   将sdfuse_q  文件拷贝到Linux下
	   将SD卡插入电脑并识别
	   进入sdfuse_q执行如下操作
		 $ sudo ./mkuboot.sh /dev/sdb  /*出现下面的信息,表示SD启动盘制作成功
					 Fuse FS4412 trustzone uboot file into SD card
				/dev/sdb reader is identified.
				u-boot-fs4412.bin fusing...
				1029+1 records in
				1029+1 records out
				527104 bytes (527 kB) copied, 5.31834 s, 99.1 kB/s
				u-boot-fs4412.bin image has been fused successfully.
				Eject SD card
		    */
		
		关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)
	  刚才做好的SD启动盘插入SD卡插槽
		打开电源
	

串口出问题排查

//1. 板子串口能显示信息
   连接串口线到板子的COM2口   //如果是用笔记本电脑的,需装usb转串口驱动(用360驱动大师在线装方便)
   确认拨号开关SW1 为0110 (从EMMC(FLASH的一种) 启动)
    
   //2.无串口打印信息    
      波特率设置不对, 流控未选为无
      电脑用的可能是COM2
      u-boot被破坏了,切换到SD卡启动(SW1 改为1000

确认板子和电脑是能通信的

//---------确认板子和电脑是能通信的
	设置电脑网卡ip 为192.168.9.222  255.255.255.0 192.168.9.1
	 启动板子,快速按任意键停在boot处,设置u-boot 的环境变量
	# setenv serverip 192.168.9.120    //注意它与虚拟机里 ubuntu 的ip要一致
    # setenv ipaddr 192.168.9.9
	# setenv gatewayip  192.168.9.1
	# pri  /*查看设置后效果 				
			FS4412 # pri
			baudrate=115200
			bootargs=root=/dev/nfs nfsroot=192.168.9.120:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9
			bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
			bootdelay=3
			ethact=dm9000
			ethaddr=11:22:33:44:55:66
			gatewayip=192.168.9.1
			ipaddr=192.168.9.9
			netmask=255.255.255.0
			serverip=192.168.9.120
			*/
	# ping 192.168.9.222   //测试网络是否连通  ,注意在u-boot中, 它能ping电脑, 电脑不能ping它  
	                      //注意,要拔掉jtag线,否则ping 会重启  
	       host 192.168.9.222 is alive    //is alive 表示ok    
	# saveenv   保存设置	

确认电脑和虚拟机时能通信

//---------确认电脑和虚拟机时能通信
编辑 -> 虚拟网络编辑器  -> 	 VMnet0 桥接到(选连板子的网卡) //注意不要用automic,应手动指定对应的网卡	                             
    虚拟机 -> 设置 -> 网卡适配器  -> 自定义 (选 VMnet0)    /*使虚拟机内的虚拟网卡,关联到电脑实际用到的网卡       
		   通过选VMnet0 和 VMnet1 。实现连板子,还是上internet的切换
		   */                                     
    点ubuntu右上角网络图标 -> 右键选编辑连接 -> 全删掉 -> 添加(改新连接名称为board) 
    -> IPV4 设置 -> 方法(选手动) -> 点添加 设置为 192.168.9.120 255.255.255.0 192.168.9.1 并保存退出		
    点右上角网络图标,先断开,再选board连接  // 通过选board,和internet 实现连板子,还是上internet的切换
    $ ifconfig //看ip是否已变为了192.168.9.120
    $ ping 192.168.9.222  //测试电脑和虚拟机是否联通 (如不通,可尝试修复一下网卡,重启虚拟机)   

确认板子能和虚拟机能通讯

//---------确认板子能和虚拟机能通讯
$ reset  重启boot
    $ ping 192.168.9.120         //注意: boot阶段是板子能ping 电脑 ,电脑不能ping板子
    host 192.168.9.120 is alive  //通讯OK  ,失败会显示not alive

下位机挂载根文件系统nfs

image-20241219155313514

{//3. 网络自动 tftp 加载内核,并挂载nfs  rootfs 启动
   # setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000	/* 设置tftp方式加载内核
       setenv bootcmd    设置环境变量(自启动命令 bootcmd)
       tftp 41000000 uImage\;  通过tftp从虚拟机/tftpboot目录下下载内核uImage到板子的内存  41000000 处。    \; 用于分割多个命令
       tftp 42000000 exynos4412-fs4412.dtb   通过tftp下载设备树文件 exynos4412-fs4412.dtb 到板子的内存  42000000 处
       bootm 41000000 - 42000000   启动内核(41000000处放的是内核uImage, 42000000处放的是设备树文件)
      */  
  
   # setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9	 /* 挂载nfs  rootfs
   	  setenv bootarg  设置环境变量( bootarg是启动参数)
   	  root=/dev/nfs  指定根文件系统类型是 nfs
   	  nfsroot=192.168.9.120:/source/rootfs  指定source rootfs的位置 (是在ip 是192.168.9.120的主机上 ,的/source/rootfs目录下). 注意/nfs/rootfs必须和前面NFS服务配置文件设置一致   
      console=ttySAC2,115200 串口2波特率为115200
      init=/linuxrc ip=192.168.9.9  开发板地址
   	 */
   # savenenv //保存环境变量

   掉电重启动板子 
    /* 看能否挂载nfs rootfs成功
    能看到下面信息表示成功
      [root@farsight ]# ls
       etc      linuxrc  proc     sbin     tmp      var
       bin      dev      lib      mnt      root     sys      usr
    在里面创建文件,电脑的/nfs/rootfs上同步变化
     */           
}