嵌入式?! 从哪里开始讨论?
开发板其实和一台电脑是同样的道理,他同样有计算、存储的功能。同样,对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了一下,出现了一堆的开发板,对于这些开发板来说,长得都差不多,平时我们也都能看到类似的各类电路板。如果我们拆开过电脑,那么我们也会看到一堆的电路板,只是我们在使用电脑的时候,大部分这些板子都被包装在了那些美丽的外壳底下而已。
当你拿到一台PC的时候,无论他是笔记本还是台式机,那么第一件事是干什么呢?
我想,第一件事,不要讨论系统、配置什么的,那些都是次要的,我们肯定需要接线,如果不接线我们都没办法把他们打开,更别说使用了。(虽然笔记本有电池,我发现还是插电的比较多)
那么,我们给开发板接通了电源,上电后,如果开发板在出厂的时候就已经烧好了“系统”(暂且这么说),那么我们可以开机使用了。以上对于PC来说,以上的步骤基本就是完成了的,除非这台PC没有系统,没办法正常启动。
但是,我不得不说但是,对于很多的开发板来说其实都不一定有显示屏,比喻上面的图片,有屏幕的都是少数。
那么我们即使上电,开机了,也就只能看到几盏小灯,无助的亮着,不时还冲你眨眨眼睛。
同样,对于我们来说,用开发板是为了写出自己的程序,来让别人使用,而不是我们自己直接来用开发板。那么我们就需要考虑开发板是如何和电脑连接在一起,才能让我们进行开发的。
开发板与PC的连接方案
上面这幅图是一个ARM开发板的抽象图,上面分布着各类元器件,但是,一般开发板都会提供两个接口方便PC机使用,一个就是串口,另外一个就是JTag口。
JTag口就是类似下面的板子上面的黑 {MOD}的插座,而串口就是底下那幅图上的样子,而上方的图中也是具备一个串口的。其实还有网口,这个回头再说。
JTag
串口
上面提到了关于开发板的接口问题,那么我们再来看看PC上面如果有对应的接口不就可以直接连接了吗?
想法很好,但是对于PC来说,现在很少有电脑上直接有JTag的接口来直接和开发板连接了。那么我们如果考虑使用串口,但是也很可惜,在现在的电脑上,也很少有串口。但是如果有串口,也是可以直接使用串口线,把开发板和PC直接连在一起的。
那么,如果PC上没有串口,就不能和PC连接了吗?显然不是。
由第一幅图可以看出,开发板与PC机相连的方案还是很多种选择的(图上每一种颜 {MOD}都是一种方案)。总结如下:
- 如果计算机有串口,那么直接通过串口线连接就完成了开发板与PC机的连接。
- 如果计算机有并口,那么可以使用并口JTag转接板与PC机连接在一起。
但是由于现在的计算机很多都没有串口和并口,所以一般现在都会采用USB来连接开发板,所以需要有开发板的转接板。使用USB连接的方案,也有两种选择:
- 使用USB串口卡连接开发板的串口和PC的USB口连接
- 另外一种方案是通过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。
用串口工具来操作已经通过串口连接的开发板,并返回了数据
使用串口操作开发板的前提是开发板烧好了程序。
那么如果没烧写程序的裸板我们就需要给他烧写裸板程序了,那么烧写一般有四种方法:
- 使用并口工具烧写
- 接线
- 使用oflash烧写
- 上电(并口里面没有复位引脚,需要手动上电)
- OpenJTag
- 接线
- 使用oflash烧写,烧写完成后,有复位引脚,可以自动复位,不需要手动上电
- JLink:只能烧写Nor flash,烧好u-boot.bin后,使用Nor启动
- 通过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的分区情况
- 烧写前,先擦除nand erase 分区名(从多少地址到多少地址)
- 使用 nand write 30000000 分区名,进行烧写
- 断电,切换nand启动,上电
- 重烧系统:uboot、内核、文件系统
- uboot的烧写和烧写裸板程序的方法一样(uboot本身就是一个裸板程序)
-
烧写内核
-
uboot + usb Host + 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=[:][,]
ip信息配置:ip=::::::
- 保存并重启
save
、reset
-
在win7下不能使用dnw的解决方案
DNW的作用只是使用USB Host下载文件到开发板。
- 使用网络下载,手动擦除烧写
- 使用Linux服务器的DNW下载文件