大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Linux嵌入式开发入门(一)——初探嵌入式开发板的基本使用

嵌入式?! 从哪里开始讨论?

开发板其实和一台电脑是同样的道理,他同样有计算、存储的功能。同样,对Linux的开发板来说,也会像PC一样装有一套系统,只是这套系统不是PC上最常用的Windows,而是Linux系统而已。

嵌入式的硬件结构和PC其实没有什么不同,都是由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

而嵌入式设备来说,总体看来,嵌入式系统具有便利灵活、性能价格比高、嵌入性强等特点,可以嵌入到现有 任何信息 家电和工业控制系统中。从软件角度来看,嵌入式系统具有可修改性、系统所需配置要求较低、系统专业性和实时性较强等特点。

在这也不想说什么嵌入式的特点、分类等等的话题,这些内容直接google即可,但是不得不简单提出几句,来过渡一下。

对于嵌入式硬件来说,是非常广泛的,ARM、DSP、FPGA、STM32等等一大堆的嵌入式硬件平台。从软件角度来看,嵌入式的设备也是五花八门,uC/OS II、Arm-Linux、VxWorks、Windows CE等等,而我列举的也才是其中对我来说出镜率比较高的几种,那么我在接下来的文章里面想要讨论的主要还是 ARM架构下的Linux系统的嵌入式开发

至于为什么?原因很简单,就是ARM+Linux使用的范围实在很广。
那么其实还是从拿到的一块开发板开始。

开发板的基本操作

Google一下开发板
Google一下开发板

我随便google了一下,出现了一堆的开发板,对于这些开发板来说,长得都差不多,平时我们也都能看到类似的各类电路板。如果我们拆开过电脑,那么我们也会看到一堆的电路板,只是我们在使用电脑的时候,大部分这些板子都被包装在了那些美丽的外壳底下而已。

当你拿到一台PC的时候,无论他是笔记本还是台式机,那么第一件事是干什么呢?

我想,第一件事,不要讨论系统、配置什么的,那些都是次要的,我们肯定需要接线,如果不接线我们都没办法把他们打开,更别说使用了。(虽然笔记本有电池,我发现还是插电的比较多)

那么,我们给开发板接通了电源,上电后,如果开发板在出厂的时候就已经烧好了“系统”(暂且这么说),那么我们可以开机使用了。以上对于PC来说,以上的步骤基本就是完成了的,除非这台PC没有系统,没办法正常启动。

但是,我不得不说但是,对于很多的开发板来说其实都不一定有显示屏,比喻上面的图片,有屏幕的都是少数。
那么我们即使上电,开机了,也就只能看到几盏小灯,无助的亮着,不时还冲你眨眨眼睛。

同样,对于我们来说,用开发板是为了写出自己的程序,来让别人使用,而不是我们自己直接来用开发板。那么我们就需要考虑开发板是如何和电脑连接在一起,才能让我们进行开发的。

  • Linux开发板的接线工具
开发板与PC的连接方案
开发板与PC的连接方案

上面这幅图是一个ARM开发板的抽象图,上面分布着各类元器件,但是,一般开发板都会提供两个接口方便PC机使用,一个就是串口,另外一个就是JTag口。

JTag口就是类似下面的板子上面的黑色的插座,而串口就是底下那幅图上的样子,而上方的图中也是具备一个串口的。其实还有网口,这个回头再说。

JTag
JTag
串口
串口

上面提到了关于开发板的接口问题,那么我们再来看看PC上面如果有对应的接口不就可以直接连接了吗?

想法很好,但是对于PC来说,现在很少有电脑上直接有JTag的接口来直接和开发板连接了。那么我们如果考虑使用串口,但是也很可惜,在现在的电脑上,也很少有串口。但是如果有串口,也是可以直接使用串口线,把开发板和PC直接连在一起的。

那么,如果PC上没有串口,就不能和PC连接了吗?显然不是。

由第一幅图可以看出,开发板与PC机相连的方案还是很多种选择的(图上每一种颜色都是一种方案)。总结如下:

  1. 如果计算机有串口,那么直接通过串口线连接就完成了开发板与PC机的连接。
  2. 如果计算机有并口,那么可以使用并口JTag转接板与PC机连接在一起。

但是由于现在的计算机很多都没有串口和并口,所以一般现在都会采用USB来连接开发板,所以需要有开发板的转接板。使用USB连接的方案,也有两种选择:

  1. 使用USB串口卡连接开发板的串口和PC的USB口连接
  2. 另外一种方案是通过USB转JTag板连接JTag和PC的USB口连接,来完成开发板和PC的连接。

其中OpenJTag的接口如图所示,OpenJTag的接口比较丰富,可以直接使用OpenJTag上面的JTag口通过排线连接,也可以使用引线通过串口来实现PC和开发板的连接。
同样也有的开发板直接是吧USB串口卡集成在了开发板上的情况,那么相对来说就简单多了,直接使用一条USB连接线就可以完成PC和开发板的连接了。

那么只需要任意选择其中一种方式,把开发板和PC连在了一起了。

完成了开发板和PC的连接,但是是否上电以后就可以直接的开发了呢?
显然还是不行,这些硬件连接在一起还需要为这些硬件安装对应的驱动程序,才能保证,这些设备能够正行的运行。

驱动装完后设备管理器里面会有设备(不需要同时都有,有一个就行了)
驱动装完后设备管理器里面会有设备(不需要同时都有,有一个就行了)

烧写系统,需要使用JTag口实现,所以必须要在JTag的所提供的方案里面选择,连接PC的并口或者PC的USB来连接。
如果使用并口来操作开发板,那么对于PC来说需要安装并口的驱动程序,具体的并口驱动程序的安装,需要参考对应的开发板的开发手册,上面会有具体的介绍。

那么开发板上的程序运行的时候,会产生一些运算后的数据,这些数据应该从哪里输出呢?
一般用串口比较多,应为串口的操作相对比较简单。
如果没有串口,那么需要使用USB串口卡来连接,同样也是需要在PC安装对应的USB串口的驱动。

** 以下部分采用的是三星的2440开发板,对于不同的开发板的具体操作可能存在差异,但操作的概念大体相同。**

  • 安装对应的烧写软件
    我的开发板对应的烧写oflash,只需要把软件的目录写到对应的环境变量里面即可,方便在cmd下能够在任意目录执行到oflash即可。

  • 安装串口工具
    常用的串口工具比如SecureCRT,可以通过串口来管理开发板。我更喜欢使用的是XShell,里面也会带有串口工具。并且XShell是一个免费软件,我也不想去使用盗版或者破解版的软件。

    • 具体设置如下:


      添加新的会话
      添加新的会话

      需要设置开发板的对应的串口号,波特率一般为115200,数据位一般为8位,停止位为1位,流控选为None。

用串口工具来操作已经通过串口连接的开发板,并返回了数据
用串口工具来操作已经通过串口连接的开发板,并返回了数据

使用串口操作开发板的前提是开发板烧好了程序。

那么如果没烧写程序的裸板我们就需要给他烧写裸板程序了,那么烧写一般有四种方法:

  1. 使用并口工具烧写
    • 接线
    • 使用oflash烧写
    • 上电(并口里面没有复位引脚,需要手动上电)
  2. OpenJTag
    • 接线
    • 使用oflash烧写,烧写完成后,有复位引脚,可以自动复位,不需要手动上电
  3. JLink:只能烧写Nor flash,烧好u-boot.bin后,使用Nor启动
  4. 通过nor上的uboot
    • 使用菜单通过usb烧写
      • 连线
      • 进入u-boot的选项Download u-boot to xxx
      • 使用程序DNW把需要安装的文件发送给开发板(需要连接usb host线,并安装驱动)



      • 自动完成安装过程
    • 使用tftp下载
      • 启动tftp程序,指定文件目录和Server的ip地址
      • 开发板nor启动,进入U-boot
      • 设置set ipaddr 到同一网段
      • 设置set serverip 为pc的ip
      • 接入网线
      • 测试是否可以ping通pc(pc不能ping通开发板)
      • 命令tftp 30000000 文件名,来将文件文件下载到开发板


        uboot的分区情况
        uboot的分区情况
    • 烧写前,先擦除nand erase 分区名(从多少地址到多少地址)
    • 使用 nand write 30000000 分区名,进行烧写
    • 断电,切换nand启动,上电
  • 重烧系统:uboot、内核、文件系统
    • uboot的烧写和烧写裸板程序的方法一样(uboot本身就是一个裸板程序)

    • 烧写内核

      • uboot + usb Host + DNW(发送文件)来烧写内核



        • 使用dnw发送文件即可
    • uboot + tftp(下载文件) 烧写系统

      • tftp 30000000 uImage
      • nand erase kernel(使用分区名代替起止内存地址)
      • nand write.jffs2 3000000 kernel (使用jffs2进行校验,把30000000的内容烧写到kernel分区中去)
    • 烧写文件系统

      • uboot + DNW(使用jffs文件)



      • uboot + DNW(使用jffs2文件)



        • 使用dnw发送完毕后1,需要设置 bootargs

烧写 JFFS2文件系统,需要设置 bootargs的 rootfstype=jffs2,命令如下: setenv bootargs 'root=/dev/mtdblock3 noinitrd init=/linuxrc console=ttySAC0,115200 rootfstype=jffs2 ' save, 2,同样的,在 Linux下使用 dnw和 u-boot烧写系统同样需要设置 rootfstype,不再赘述。 烧写 JFFS2文件系统不需要设置 rootfstype,设置了反而会报错,导致系统无法启动。 3,系统启动后 nand flash 有坏块是它的天然缺点,无法避免。有的坏块多,有的少,纯属 几率,不影响使用

  • uboot + tftp

    • 下载 tftp 3000000 fs_qtopia.faffs2
    • 擦除 nand erase root
    • 烧写 nand write.yaffs 30000000 0x00260000 $(filesize) (这里不能直接使用root的分区,需要指定从3000000里写到0x00260000的内存,并且指定文件的大小$(filesize))
  • uboot打补丁、内核打补丁

    • 先将uboot、内核、补丁文件放入虚拟机中。
    • 解压uboot,tar xjf uboot.tar.bz2
    • 用UE打开补丁文件(+++)是修改后的文件、(---)是被修改的文件,(-)删除老文件的内容,(+)添加的内容



    • 进入要被修改的文件目录
    • 执行:patch -p1 < ../u-boot-1.1.6_jz2440.patch 其中p代表忽略补丁文件中,位置信息第几个/符号之前的信息,比如-p1代表忽略u-boot-1.1.6/这部分信息,直接使用/board/和他之后的内容来做定位文件。(根据执行命令的的目录和被打补丁的目录的相对位置来确定-p的选项)
    • 将目录创建压缩文件 tar cjf uboot-1.1.6_jz2440.tar.bz u-boot-1.1.6,放到Windows下,方便查看(此步骤并非必须)
    • 在Linux下make编译得到uboot.bin
  • 制作、烧写根文件系统,以及初探驱动

    • 解压缩文件系统的压缩包到Linux服务器
    • 使用mkyaff2Image工具,在解压的路径中执行,mkyaffs2image dir image_file 就会生成yaffs2文件,例如mkyaffs2image fs_mini_mdev fs_image.yaffs2
    • 把yaffs2文件烧写到开发板上
    • 进入到uboot目录,进入Download root_yaffs image选项
    • 通过nfs网络系统把Linux服务器上之前生成的yaffs2文件发送到开发板上,nfs 下载的内存地址 服务器地址:yaffs2路径,例如nfs 192.168.1.19:work/nfs_root/tmp/fs.yaffs2(前提是虚拟机启动了NFS服务)
    • 擦除nand erase root
    • 烧写nand write.yaffs 259999 $(filesize)
    • 重启reset
  • 设置NFS网络文件系统服务

    • 在开发板上进行挂载NFS:用flash上的根文件系统启动后,手工mount nfs mount -t nfs -o nolock,vers=2 192.168.1.19:work/nfs_root /mnt
    • 使用NFS作为根文件系统来启动
      • 进入uboot
      • 设置bootargs : set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/tmp ip=192.168.1.17:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
        服务器配置信息:nfsroot=[<server-ip>:]<root-dir>[,<nfs-option>]
        ip信息配置:ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
    • 保存并重启savereset
  • 在win7下不能使用dnw的解决方案
    DNW的作用只是使用USB Host下载文件到开发板。

    • 使用网络下载,手动擦除烧写
      • 使用tftp进行下载
      • 使用nfs进行下载
    • 使用Linux服务器的DNW下载文件