嵌入式Linux系统环境搭建全流程-4412友善之臂开发板

4412友善之臂开发板-Linux系统环境搭建全流程

​ 没错,这篇确实值得一看!可能是由于我稍微会一点点哈,就有好多小伙伴就找我帮他们搭建环境,但Linux中的以及开发版连接,与烧写程序中的整个环境搭建会有很多不确定的问题,确实让人头疼。所以可爱滴你们哈,使用的系统和环境以及串口连接,不是我亲手所搞,一但出现问题所以我这边是很难在较短的时间内解决的。这就导致了一个花费很长的时间,且不一定能解决问题的问题,更要命的是远程连接。。。控制,这个 ,啊~~~确实要命,,,

​ 所以赖,我就重新使用老师的那套系统,又重新搭建了一遍环境并做一个完整流程的笔记以供大家参考。

​ 好了,一个人的闲扯结束,正片开始。以下内容本人以及大口测试过了,请放心食用。

​ 同样滴,所用到的软件请自行更具自己爱好下载咯,为了方便我以及将梁老师云盘中所用到的资料,偷偷搬到了我云盘目录下,直接下载即可。(至于百度网盘限速的问题,大家可以百度 软件小妹使用浏览器插件即可加速下载,或者。。。。vip。。。。)


Linux系统:梁老师云盘Cetos_32.ova

虚拟机:Vmware16pro

终端登录软件:Tabby

文件传输软件:Xftp

这些软具体我会在云盘中标注直接选用下载即可

链接:https://pan.baidu.com/s/1gp2MkpKK0XShxCnQdW-eUA?pwd=1111 提取码:1111


1、虚拟机ova文件的导入

  • 这里直接使用梁老师的虚拟机打包文件即可

image-20220424211959023

  • ova是一种开放的虚拟机文件格式。说人话就是,该文件就是一个打包压缩好的本地虚拟机文件,其特点就是只要本地计算机有虚拟机软件,就可以直接打开使用,不会受虚拟机软件的版本或者软件的不同的限制。

image-20220424212008621

2、安装交叉编译工具链

  • 由于梁老师提供的该系统所有的基本软件工具环境是搭建好的大家下载直接使用即可,交叉编译工具已经完整安装,交叉编译这一步我就直接跳过咯。
  • 如果自己想试试整个安装的流程,体验一下PATH环境的配置,以及整个gcc编译器的调用,那么不妨自己搭建一把玩玩咯,关于arm-linux-gcc 的搭建大家可参考以前的一篇博客即可。

3、编译内核

​ 关于什么是内核,为什么要编译内核,编译内核有什么用,额。。。既然有人问赖,那我这里就 弱弱的说说咯,只是个人的理解。可能这里一部分有点啰嗦,大家也可以直接跳过我胡扯的这一部分。

其实我当初想的是,应该没有多少人对这个感兴趣滴,想这大家可能就抱着完任务的心态,随便搞搞就行了。既然哈~有小伙伴问了,那你别走,我可要和你多扯几句了,整个内容包括,我在哪,我是谁我到底要干什么,这样滴玄学问题,聊聊咯,废话就这么多现在开始。
  1. 我们到底在干什么:

我们做的这所以的一切其实很简单,我们都知道,一个什么系统都没有安装的电脑只是一个躯壳,它木的灵魂,不可开机,不可愉快的占领高地赢得胜利,也不能大吉大利,今晚吃鸡。但是如果我们在自己的电脑中安装一个系统比如,微软的Windows10,这个时候,我就可以在这个电脑中安装PUBG、安装LOL,甚至是下载学习资料同时与多个女孩子在同一个窗口下聊天,当然你首先必须保证你的电脑有一个系统,其次系统中有以供以上活动内容的软件,才行。

其实我们的开发版也就是一个电脑,一个迷你微机,那么我们目前在做的作业与一个比较low,且不太专业的词汇解释的话,就是所谓的装系统,对的没错就是在装系统,不是吧,只是在装系统???没有别的,,,额,这个当然是有的了,我们还得装软件。。

路人甲:嗨~~~你这不是和没说一样吗?装系统不就是为了装软件吗,这个还用你说,有手就会的好吗?

不不不,其实这里的装系统与软件,绝非是像在自己的电脑中安装那么简单的。由于我们普通使用的电脑CPU(X86)与开发板中的CPU(4412芯片 ARM)其架构在底层是不同的,那么其安装方式也是有着很大的差别,如果安装过Linux系统的小伙伴可能会深有体会。

路人甲:既然安装Linux这么的麻烦,那我们为什么不直接在开发版上安装Windows呢?

哈哈,糊涂啊!你,你是不是Windows正宗的盗版系统用习惯了,都忘记了自己使用是破解的盗版系统了?

由于,Windows系统是收费的,既然是收费这就导致了,系统的源码,也就是系统的五脏六腑(源码)是不可以更换自定义DIY(个性化定制)的。这样就有一个很严重的问题出现,Winwds系统源码不公开,无法对系统进行裁剪,系统本身的体积就变得非常庞大(至少4G)。不能将系统轻量化,对于这样程度的庞大系统,我们的板子看了后直摇头,直呼,臣妾做不到。。。其实这也难为我们板子,毕竟,比较开发板的芯片可没有电脑中的cpu强劲,也没有我们电脑中的8G或16G甚至32G的内存条那样豪横。。

但Linux却不一样,对Linux可以理直气壮的给Windws说,我们不一样。

Linux首先我们这辈子肯定是没有机会使用盗版的咯,因为哈。Linux就没有正版,又从哪里来的盗版呢?

路人甲:停停停,,你说没有正版,什么意思???这是什么意思??我当时可是特意花费了,一顿两个牛肉包的早餐,你感想吗?两个牛肉包哦,专门请隔壁的老王,让他在Cetos官网,在Ubuntu官网上下载的正版呀。老王还给我说这玩意,绝对正品。而且我用着觉得很流程呀?

呃呃呃。。。我只能说天下的隔壁老王都不可靠。你还记得我们的Linux的精神是什么吗?对的没错,就是让人热血沸腾的开源分享精神,秉着Linux的开源精神,Linux源码就衍生出了许多的后代如同我们熟悉的Cetos,Ubuntu,readhead,kali等,既然是开源精神,那么这些系统就是完全免费,不向广大的可爱群众收取任何费用,这里的费用是值不收取系统的使用费用,但系统的维护费用还是该要还得要得嘛,不然向我们这群常常白嫖习惯得小可爱,那可不得让人家Cetos,Ubuntu官方倾家荡产哈。

路人甲:哦哦,了解懂了懂了。也就是说,Cetos,Ubuntu官方也就是使用原生得Linux内核将其进行衍生定制DIY出了属于自己旗下得有特色的Linux咯

对的没错,就是这样。所以Linux的源码才是一栋高楼的基础,只有了Linux原汁原味的内核源码,才能衍生出其他的DIY定制Linux滴

路人甲:那还等什么,我们就开始定制自己的Linux咯,这样我就可以将自己qt软件安装,到自己定制的轻量级Linux中,以后编写好的qt程序,直接就可以在自己定制的开发版中使用咯。

对的没错,就是这样,既然你大致了解了我们整体的流程,那我们就开始装系统吧?怎么装?那当然是先编译内核源码的咯。。。

路人甲:哎哎哎!!!听一下,你说点人话行不行?为什么叫做编译内核而不是安装内核呢?

额。。。额。。。你糊涂呀,你。。小可爱。你用记事本写的HelloWorld.c 直接双击会出现什么惊喜?

路人甲: 额。。我想想哈,,会出现一个黑窗口 并弹出一句向世界问好的 HelloWorld 哈哈没错就是这样,我写HelloWrold的高手

​ 我。。。。我。。真的是。你还是把HelloWorld.c 熟练的用鼠标打开关闭20遍吧。你的打开的是HelloWorld.c 源码哎,我的路人甲呀,既然是源码,你看到的就是只有C语言编写的程序,又怎么可能会出现一个黑色的运行窗口呢?**

路人甲:哦哦哦,,对对对呀,我疏忽了,大意了呀。我刚才听错了,我以为是你让我点击,我华丽的VC++上面的绿色三角图标呢?

其实呀,你点击的过程也就是编译的过程,也就是将HelloWorld.c源码编译成了HeoolWorld,exe的Winwds可执行文件。所以赖,我们所谓的Linux内核编译,其实就是Linux内核的源码编译,再人话点的说就是,Linux内核源码C语言文件程序编译。怎么不行?那你看看LInux源码下都是什么赖

image-20220424212025642

路人甲:哦哦哦,明白了。源码了Linux源码是一个庞大的HelloWorld工程呀,懂咯,懂了,只要我们把,这个庞大的HelloWorld工程编译成一个可执行的HelloWorld.exe的应用就行了呀,这简单哈,我就用gcc编译工具直接编译就行咯。

额,,呀,你这稀奇古怪的想法,真滴是,,,对的,你说的没错,我们需要的就是,将这个庞大的Linux内核源码文件进行编译,最终生成我们的可执行文件。但是哈,值得注意的一点是,由于之前说过,我们的普通电脑(x86)与开发板(arm)中的cpu架构是不一样的,所以当然咯,可执行程序的架构也必定也是不一样的?这就解释了为什么,苹果ios系统的应用程序,再我的安卓机上无法使用赖,或者windows应程序在Linxu中也无法使用咯。这个时候我们的交叉编译工具就得登场了,注意区别linux中得gcc与arm-linux-gcc的区别,这是两个不同的编译工具。相当于两个不同的交通工具,比如汽车与飞机,最终可能到达的目的地一样,但是所走的路完全不同,不然就是很严重的事故。

不信你看嘛,我用两个不同编译器编译同一个HelloWrold.c文件

image-20220424212048284

这里可以看到通过使用arm-linux-gcc 与gcc 编译生成的两个可执行文件Hello_arm 与 Hello_x86 的文件属性是不同的一个是arm架构一个是x86架构,当然咯,我们4412开发板中可以执行的文件当然是用arm-linux-gcc编译生成的Hello_arm文件咯,而我们的虚拟机中的linux可执行文件就是gcc编译生成的Hello_x86文件咯。

image-20220424212057321

什么?你不相信。。。。那你看我在虚拟机中分别执行这两个文件会出现什么效果赖。。

image-20220424212107822

没错——可爱路人甲哈,和你猜到的结果一样哈,果然gcc 编译生成的x86架构的可执行文件,在虚拟机中的Linxu中成功向这个世界发出了一句友好的HelloWorld问候。

路人甲:不愧是我,那么也就是说 arm-linux-gcc 编译生成的arm架构可执行文件,就只能在我们的开发板中向这个世界问好咯?

对的没错,就是这样,既然 要让arm架构的HelloWrold在开发板中,向世界问好,那么我们就得给它一个可以打招呼的平台咯,那这个平台就是我们的自定义的arm架构的linux咯。

路人甲:既然如此,那就开始我们的系统DIY咯。。。


  • 其实扯了这么多,大家应该明白了我们在干一件什么事咯。。。。

  • 好了言归正传,继续回到内核编译


1、ssh远程登录Cetos
  • 通过SSH服务连接虚拟机中的Cetos
  • 这里需要注意的一点就是你的ssh服务必须开启,防火墙22号端口没有拦截,其具体的实现可以自行百度了解咯
  • 但是如果使用的是老师提供的Cetos环境是没得问题得直接通过ip连接即可

我这里使用的 Tabby 这款终端软件,由于该软件是在Github上源码开源的所以可以免费使用,软件在我上传的云盘自行下载即可咯

image-20220424212118129

2、关于共享文件夹与通过ftp实现主机与虚拟机Linux之间的文件传输
  • 共享文件夹

    ​ 由于这是一个新的Linux,我又比较懒,共享文件夹挂载与搭建起来比较麻烦,所以我在整个过程中未使用共享文件夹。关于共享文件的挂载,你们赖可以参考之前我这篇博客过程

  • ftp文件传输

    ​ 这里我使用了一款正宗的破解软件Xftp,使用该软件直接ssh登录即可实现文件的传输。

    image-20220424212130589

    • 这里直接拖拽即可

    image-20220424212141869

3、编译源码

解压源码

  • tar -xvzf linux-3.5-20160514.tgz   
    

    image-20220424212151803文件

cp tiny4412_linux_defconfig .config
//复制修改tiny4412_linux_defconfig 文件为 .config 
//指定编译的配置文件芯片为4412

image-20220424212203561

image-20220424212210038

定制Linux剪裁定制内核

make menuconfig
//进入配置定制的图形化菜单

image-20220424212219924

  • 键盘上下键选择要进入的模块
  • 选择System Type 回车进入系统配置文件模块

image-20220424212230034

  • 继续向下翻动选择 Support TrustZone-enabled Trusted Execution Environment 并按下键盘的空格键,取消选择
  • Support TrustZone-enabled Trusted Execution Environment是默认选择的,【*】表示选用【 】表示取消选用

image-20220424212238778

  • 双击两次键盘esc键或者按下键盘的左右控制键 选择 回车推出即可
  • 选择保存配置即可
  • 为了保险可以再次进入,查看是否已经成功保存

image-20220424212310404

image-20220424212321844

3、开始内核源码编译
make -j 4
-j 指定编译调用的cpu线程 
	*需要注意的一点就是这个与自己的主机配置以及虚拟机所分配的硬件配置有关
	*具体的参数详情以及参数指定可自行百度了解
  • 由于之前已经指定了编译配置文件 .config 现在直接make即可
  • 内核源码时比较大所以正常情况下是需要一段时间等待,更具个人的主机不同,时间编译时间也有其不同的差异

image-20220424212335447

  • 这里可以看到的一点是 调用了arm-linux-gcc 编译器正在将原来的 xxx.c文件正在编译为xxx.o的文件

  • 这些就交给我们的编译脚本MakeFile文件去在执行咯

  • 这里可以看到以及编译完成咯

image-20220424212345120

  • 这里可以看到我们的在目录 /home/linux-3.5/linux-3.5/arch/arm/boot 下生成了Image与zimage文件
  • Image 是没有进行压缩的文件 zImage 是经过压缩的文件

image-20220424212354012

4、编译Uboot

  1. 解压Uboot源码

    unzip uboot_tiny4412_new.zip 
    
    • 这里需要注意的一点就是 unzip这个工具需要自己安装,如果使用的是老师提供的系统,该系统中以及安装好了该工具

    • 安装命令

    • #Cetos 系统
      yum install unzip 
      #Ubuntu 系统
      apt-get install unzip 
      

    image-20220424212408837

  2. 编译Uboot引导

    unzip uboot_tiny4412_new.zip
    #解压Uboot源码文件
    
    cd uboot_tiny4412  
    #进入源码文件根目录
    
    make tiny4412_config  
    #加载 编译配置文件
    
    make
    #uboot源码编译
    

    image-20220424212426397

    image-20220424212438046

    • 编译用于生成bl2的工具

      cd sd_fuse
      
      make
      

      image-20220424212446447

    5、烧写Uboot驱动到SD卡

    1. SD卡的连接
    • 将SD卡如图所示的方式插入到自己笔记本USB接口

    image-20220424212955465

    • 选择将USB连接到自己的虚拟机,这里注意是将自己的USB读卡器移动设备连接到自己LInux中

    image-20220424213005405

    • 正常接入如图所示

    image-20220424213022327

    image-20220424213030432

  3. 在Linux下检查是否正常接入

    ls /dev/sd*
    
    • dev目录下存储的就是我们所有的Linux 的外部设备 其这里的sdb1就是我们这里插入的SD卡所在的目录

    image-20220424213039682

  4. 烧写Uboot到SD卡

    • 进入到uboot_tiny4412-master/sd_fuse/tiny4412 目录
    ./fast_fuse.sh /dev/sdb1
    
    # ./fast_fuse.sh 这是我们之前编译好的可执行文件
    #/dev/sdb1 所烧写到的目录 
    

    image-20220424213051407

5、连接测试是否烧写成功

  1. 将读卡器直接拔出

    • 这里一定要用RS454的这种串口线 usb接口暂时没有再Linux中安装驱动是无法使用的
    • 蓝色的COM口线的另一端,直接连接笔记本的USB口即可
    • 所以这里需要一个 COM串口的usb转化线或直接带有usb接口的COM线

    image-20220424213100310

    image-20220424214041849

  2. 注意检查自己的串口是否与笔记本正常连接

  • 再设备管理器中进行查看

    image-20220424214049306

  • 修改连接到主机

  • 注意这里的连接串口就是COM4

    image-20220424214055937

  1. 通过SD卡启动,连接串口到终端

    • 硬件连接

    image-20220424214102278

    image-20220424214110284

    • 终端连接

      • 选择串口的波特率115200

      • image-20220424214119862

      • image-20220424214125207

      • 板子上电即可

      • 如果这里没有出现以下内容就有两点可能

      • 1、软件部分: Uboot烧录失败,终端设置有误

      • 2、硬件物理:sd卡或串口线连接有误或损坏

        image-20220424214132778

    • 可以看到已经通过SD已经正常启动

    6、格式化eMMC

    fdisk -c 1 320 2057 520
    

    image-20220424214138964

    fatformat mmc 1:1
    

    image-20220424214146848

    ext3format mmc 1:2
    

    image-20220424214154724

    ext3format mmc 1:3
    

    image-20220424214201807

    ext3format mmc 1:4
    

    image-20220424214207551

    • 关于格式化的每一步具体的操作命令的解释,我这里就不再赘述咯,老师文件中是存在的。

    • 由于我使用的是老师这边提供的该系统,今天重新进行的测试,所以这一部分是没有出现文档中所提及到的错误的

    • 到此为止,我们关于sd卡这边Uboot的编译烧写就结束了

    6、Linux下DNW工具安装

    • 额、关于DNW工具其实更多像是一个驱动,所以原理还是一样,编译源码,执行安装DNW到Linux,这里注意的一点就是,安装到Linux下滴,而不是安装到开发板,因为在Linux下我们需要安装一个DNW驱动用于让我们的LInux与开发板的Micro USB连接。

      image-20220424214215013

      1. 同样的先上传并解压文件
      tar -vxf  dnw_for_linux.tar.gz 
      

      image-20220424214220395

      image-20220424214225582

      • 1.1 secbulk.c内核模块编译

      • 由于这里的secbulk.c文件中的主设备号与我们开发板连接的设备好号不同则这里需要对secbulk.c源程序进行修改

        • 使用vim编译器打开 secbulk.c 文件
        vim  secbulk.c
        
        • 将源程序的26行修改中的主设备号为 0x04e8 (由于友善之臂4412该板子经过测试,其设备号都是0x04e8)
        • image-20220424214233760
        • 如果不放心则进行查询即可
        • 我这里之前由于编译过一次文件所以,图中的编译可能与你们的有所不同,只要在当前目录下生成一个 secbulk.ok文件即可
         cd secbulk/
        
        make -C /lib/modules/`uname -r`/build M=`pwd` modules
        
         sudo insmod ./secbulk.ko
        
        • image-20220424214240915
        • 检查模块是否成功安装
        dmesg
        

        image-20220424214248567

        • 这里提醒一点,经过测试高版本的Linux系统在编译secblk内核时,可能会出现一个报错

          image-20220424214254908

          • 该错误应该时由于源码与版本不兼容引起的,源码比较老我记得 好像时07年左右滴吧。
          • 解决办法就是 更换源码或系统,测试没有问题的源码我已经上传到 云盘自行下载即可。
      • 1.2 编译dnw工具

        • 源码编译
        gcc -o dnw dnw.c
        

        image-20220424214300981

        • 配置dnw可执行文件到bin目录
        • 这个bin目录的配置与交叉编译链工具同理
        sudo cp dnw /usr/local/bin
        
      • 到此dnw驱动便已经在我们的虚拟机中的LInux安装完成咯

6、通过USB连接Linux

  1. usb串口连接
  • 具体的连线方式如图所示

image-20220424214306984

image-20220424214314143

  • 将usb接入到虚拟机

image-20220424214319928

image-20220424214326611

  • 在com串口的终端中输入命令,打开emmc

    dnw 40000000
    

    image-20220424214331847

  • 在Linux终端输入lsusb查询开发板的usb是否与Linux系统正常连接

    lsusb
    

    Bus 001 Device 013: ID 04e8:1234 Samsung Electronics Co., Ltd

    这里的04e8就是我们的主设备号

image-20220424214338004

image-20220424214351584

ls /dev/s*

查询当前的外接设备中是否有 /dev/secbulk0如果存在表示 已经与开发板成功连接

image-20220424214357539

  1. 开始程序烧录

    • 进入uboot所在目录

      image-20220424214403970

    • 这里存在一个问题,使用原本的dnw源码在编译后文件与板子无法建立连接

    • 我这里更换了一下源码(源码已经上传到云盘)

    • image-20220424214414833

    • image-20220424214418976

    mmc write 1 0x40000000 0 0x10
    

    image-20220424214424956

    dnw 40000000
    
    dnw -a 40000000  bl2.bin
    
    mmc write 1 0x40000000 0x10 0x1C
    

    image-20220424214430442

    image-20220424162211877

    image-20220424162622609

    dnw 40000000
    
    dnw -a 40000000  u-boot.bin
    
    mmc write 1 0x40000000 0x30 0x21D
    

    image-20220424214533337

    image-20220424214546162

    dnw 40000000
    
    dnw -a 40000000  sd_fuse/tiny4412/E4412_tzsw.bin
    
    mmc write 1 0x40000000 0x2c0 0xB8
    
    emmc close 1
    

    image-20220424214553572

    image-20220424214558753

7、从emmc启动

  • 此时将sd卡一侧的拨码拨到emmc一侧,按下复位按键小按钮,此时系统并就会重新启动
  • 同时我们的串口终端也会同时打印出响应的启动信息

image-20220424214603977

  • 这里启动的时候由于内存中暂时还没用将我们的Linux系统烧写到开发板的内存中,所以这里会不断的自动重启刷新,这一点与我们的WIndows系统是相似的。
  • 我们在看到读秒的时候按下回车键,停止刷新即可。

image-20220424214611922

8、QT与LInux程序加载到开发板

  • 现在其实就是将我们之前编译的Linux可执行程序,复制到我们的开发板中,让之前烧写的Uboot程序去自动的找我们滴系统,并加载启动咯
  1. 这里我们只需将之间编译好的Linux源码程序搬运到当前的一个文件夹中即可

    • 老样子咯,找到之前源码编译的boot目录,直接拖拽zImage文件

    image-20220424214622939

    • 其实我们这里可以看到的一点就是 在boot目录下有两个Image

    • 这里的Image与ZImage唯一的区别就是 ZImage是经过压缩的文件,开发板的内存不比我们的电脑硬盘赖

    • image-20220424214628219

  2. 这里需要下载一下 以下的这几个文件镜像,用于qt的安装(文件在老师的云盘下即可找到)

image-20220424214633442

  1. 解压文件fastboot,并将所有用到的文件复制到fastboot目录下
    • 这里直接在路径栏中输入cdm,即可进入到cmd的当前目录

image-20220424214638649

image-20220424214645776

  1. 额。这里出现了一个问题

    fastboot无法启动

image-20220424214651138

  1. 输入以下指令

    fdisk -c 0  
    

    再次输入 fastboot 便可正常启动 fastboot

    fastboot
    

    image-20220424214700743

  2. 后续的步骤就是简单将Windws下的程序传输到开发板的内存中即可

image-20220424214706508

image-20220424214713886

image-20220424214720333

image-20220424214727287

image-20220424214732836

image-20220424214740415

image-20220424214747658

image-20220424214753704

image-20220424214800935

猜你喜欢

转载自blog.csdn.net/qq_33827423/article/details/126019608