ARM裸机-3.GPIO和LED

1.裸机实验体验之usb启动配合dnw工具下载
    1.1、背景知识介绍
    回顾S5PV210的启动方式,必须将OM5打到VCC,才能从USB启动。
    S5PV210的启动过程:开机时先执行内部的iROM中的BL0,然后BL0做了一系列的初始化后,再读取外部OMpin的设置来确定用户选择了从哪里启动。当检测到我们设置的是USB启动时,S5PV210就会从USB OTG接口试图连接主机进行下载启动。
    1.2、dnw工具介绍
    dnw是一个软件,是三星公司编写的,这个软件的功能是通过USB线连接开发板和电脑主机,然后从主机下载文件镜像到开发板中去烧录系统。
    dnw软件使用注意1:dnw是需要装usb驱动的,驱动在“X210光盘资料\A盘\tools\USB驱动”目录中
    dnw软件使用注意2:dnw使用时通过usb线下载,所以一定要插USB线。
    dnw软件使用注意3:dnw下载时需要设置dnw下载内存地址。在dnw软件的菜单“Configuration”中设置
                        Download Address为0xd0020010,确认即可。
    1.3、dnw驱动安装
    X210开发板使用了软开关,但是我们这里还没到操作系统没去处理开关,所以在整个裸机实验中必须手工按下POWER键才能保持开机,只要手一抬起来就关机了····
    dnw驱动装好的标志是:开发板开机从usb启动后,设备管理器中显示已经安装的设备,并且关键是dnw工具中USB:OK
    1.4、裸机程序下载地址设置
    从usb启动做裸机实验时,因为不需要16字节的校验头,所以直接下载到0xd0020010
    1.5、usb启动裸机实验总结
    usb启动方式主要是用来调试程序的,其实分析S5PV210即可知道,我们这里是把裸机程序当作BL1来使用了。

扩充知识:Win7 X64版本驱动安装非常麻烦,因为微软启用了USB设备驱动签名政策。


2.裸机实验体验之SD卡下载
    2.1、背景知识
    一般情况下,用USB下载来调试裸机程序比较方便;但是有时候电脑使用dnw会频繁蓝屏,这时候用SD卡下载调试是不错选择。
    把OM5打开GND,以从SD通道启动。
    从SD启动时会先从iNand(SD0)启动执行,当iNand启动做校验和时失败才会转为启动SD2。而我们做裸机实验时是通过SD2来提供裸机程序镜像的,因此需要先破坏内部iNand的uboot才可以强迫开发板从SD2启动去执行我们的裸机程序。
    2.2、擦除开发板iNand中的uboot的方法
    在linux和android系统下,擦除uboot的方法:
    busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
    sync
    在uboot底下如何擦除uboot:movi write u-boot 0x30000000
    2.2、Windows下制作启动SD卡
    方法等同于我们第二部分讲过的SD卡刷机时的操作
    2.3、linux下制作启动SD卡
    后面章节再演示。

总结:SD卡启动和usb启动优劣势对比:如果你的电脑本身支持usb启动下载而且不蓝屏,建议以后做实验用usb下载调试;


3.自己动手安装交叉编译工具链1
    3.1、Windows中装软件的特点
    Windows中装软件使用安装包,安装包解压后有2种情况:一种是一个安装文件(.exe .msi),双击进行安装,下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式,我们平时使用快捷方式来启动这些程序;另一种是所谓的绿色软件、免安装软件。这种不用安装,直接解压开里面就有exe可以直接双击执行。
    3.2、linux中装软件的特点
    linux中安装软件比windows中复杂。linux中安装软件一般有以下几种方法:
    第一种:在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。
    第二种:自己下载安装包来安装。这种方式的缺陷就是你不知道你下载的安装包和你的系统是否匹配。
    第三种:最装逼的一种方式,就是源代码安装。
    总结:我们安装交叉编译工具链(arm-linux-gcc)实际采用第二种安装方式。
    3.3、交叉编译工具链的选择
    我们选择交叉编译工具链的原则:和我们所使用的目标平台(给哪款SoC编程)尽量去匹配。譬如我们开发S5PV210的程序就是用arm-2009q3这个版本,因为三星官方在开发S5pv210时就使用这个版本的交叉编译工具链,这样可以最大限度的避免稀奇古怪的问题出现。
    3.4、交叉编译工具链的安装
    步骤1:打开虚拟机,在/usr/local/下创建/usr/local/arm文件夹
    步骤2:先将安装包从Windows中弄到linux中去。可以用共享文件夹,也可以用Samba,也可以cuteftp。
    步骤3:解压。tar -jxvf arm-2009q3.tar.bz2
    到此相当于程序已经安装完毕,真正的应用程序安装在/usr/local/arm/arm-2009q3/bin目录下

注:linux中的目录管理方法。技术角度来讲,linux中所有目录性质都是一样的,所以技术角度来讲我们把软件安装到哪里都行。但是因为如果胡乱放置,将来程序可能不好找。所以久而久之大家就总结了一个文件放置的一般定义,譬如说/bin目录放置一些系统自带的用户使用的应用程序,/sbin目录下存放的是系统自带的系统管理方面的应用程序。
那我们装软件放在哪里?一般都在/usr目录下。我们安装arm-linux-gcc,就在/usr/local/底下创建一个arm文件夹,然后装到里面。
    3.5、安装后的测试
    到真正的应用程序的安装目录下(也就是/usr/local/arm/arm-2009q3/bin),去执行arm-linux-gcc -v
    执行方法是:./arm-none-linux-gnueabi-gcc -v
    执行后可以得到一长串输出,其中有“gcc version 4.4.1 ”字样,即表示安装成功。

4.自己动手安装交叉编译工具链2
    4.1、环境变量的意义
    环境变量就是操作系统的全局变量。每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。linux系统可以有很多个环境变量。其中有一部分是linux系统自带的,还有一些是我们自己来扩充的。我们这里涉及到的一个环境变量是
    PATH。PATH这个环境变量是系统自带的,它的含义就是系统在查找可执行程序时会搜索的路径范围。
    4.2、将工具链导出到环境变量
    export PATH=/usr/local/arm/arm-2009q3/bin:$PATH
    在一个终端中执行以上命令后,该终端中就可以直接使用arm-linux-gcc了,但是只要关掉这个终端再另外打开一个立马就不行了。原因是我们本次终端中执行时的操作只是针对本终端,以后再打开的终端并未被执行过这个命令所以没导出。
    解决方案是在~/.bashrc中,添加export PATH=/usr/local/arm/arm-2009q3/bin:$PATH 即可。
注意:我们导出这个环境变量是在当前用户,如果你登录时在其他用户下是没用的。

    4.3、为工具链创建arm-linux-xxx符号链接
    ln arm-none-linux-gnueabi-addr2line -s arm-linux-addr2line

5.Makefile大侠隆重登场
    5.1、为什么需要Makefile
    Makefile是用来管理工程的。
    在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,就会像这样:gcc a.c b.c c.c d.c e.c f.c g.c -o exe        每次编译都要输入一堆东西很麻烦,这个问题严重影响工作效率,怎么办?Makefile来解决
    5.2、一个简单的Makefile示例
    见光盘下载文件夹下面的 随堂代码/1.4.5/Makefile1和Makefile2
    5.3、Makefile中的一些基本概念
    目标:目标定格写,后面是冒号(冒号后面是依赖)
    依赖:依赖是用来产生目标的原材料。
    命令:命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作。
    5.4、Makefile的基本工作原理
    其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。
    其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。
    其三,我们直接执行make 和make 第一个目标  效果是一样的。(第一个目标其实就是默认目标)
    5.5、ARM裸机中用到的Makefile介绍

    5.6、进一步学习Makefile的资料
    我们学习Makefile的思路就是:先学会基本的概念和应用,先理解Makefile的概念和使用方法、工作原理。先自己会写简单的Makefile来管理工程。一般先学到这里就可以了,更深入的内容可以随同稍后的课程一起来学习,我们讲到课程的时候会再次提及并且逐步深入。
    对于我们有一定基础的同学,同时还有时间,可以深入学习Makefile,看《跟我一起学Makefile》(作者:陈皓)

6.mkv210_image.c文件详解1
     6.1、mkv210_image.c的使用演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
led.bin: start.o 
    arm-linux-ld -Ttext 0x0 -o led.elf $^
    arm-linux-objcopy -O binary led.elf led.bin //objcopy制作镜像
    arm-linux-objdump -D led.elf > led_elf.dis  //反汇编
    gcc mkv210_image.c -o mkx210
    ./mkx210 led.bin 210.bin
     
%.o : %.S
    arm-linux-gcc -o $@ $< -c
 
%.o : %.c
    arm-linux-gcc -o $@ $< -c 
 
clean:
    rm *.o *.elf *.bin *.dis mkx210 -f


    裸机程序中的Makefile(实际上真正的项目的Makefile都是这样的)是把程序的编译和链接过程分开的。(平时我们用gcc a.c -o exe这种方式来编译时,实际上把编译和链接过程一步完成了。在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld)
    链接器得到led.elf其实就是我们的可执行程序,(如果是在操作系统下,这个led.elf就可以执行了)但是在嵌入式裸机中我们需要的是可以烧写的文件(可烧写的文件就叫镜像image),因此我们需要用这个led.elf为原材料来制作镜像,制作工具是交叉编译工具链中的arm-linux-objcopy
    我们使用arm-linux-objdump工具进行反编译(反汇编),反汇编其实就是把编译后的elf格式的可执行程序给反过来的到对应的汇编程序,的到它的汇编源代码。我们使用反汇编主要是用来学习,见本部分最后一节。
    mkv210_image.c这个程序其实最终不是在开发板上执行的,而是在主机linux(就是用来执行make对整个项目进行编译的那个机器)中执行的,因此编译这个程序用gcc而不是用arm-linux-gcc。这个.c文件编译后得到一个可执行程序mkmini210,目的是通过执行这个mkmini210程序而由led.bin得到210.bin。(210.bin是通过SD卡启动时的裸机镜像,这个镜像需要由led.bin来加工的到,加工的具体方法和原理要看mkv210_image.c)

    6.2、背景知识:S5PV210的启动过程回顾
    分析启动过程可知;210启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin的配置选择一个外部设备来启动(有很多,我们实际使用的有2个:usb启动和SD卡启动)。在usb启动时内部BL0读取到BL1后不做校验,直接从BL1的实质内部0xd0020010开始执行,因此usb启动的景象led.bin不需要头信息,因此我们从usb启动时直接将镜像下载到0xd0020010去执行即可,不管头信息了;从SD启动时,BL0会首先读取sd卡得到完整的镜像(完整指的是led.bin和16字节的头),然后BL0会自己根据你的实际镜像(指led.bin)来计算一个校验和checksum,然后和你完整镜像的头部中的checksum来比对。如果对应则执行BL1,如果不对应则启动失败(会转入执行2st启动,即SD2启动。如果这里已经是2st启动了,这里校验通不过就死定了)。
    6.3、mkv210_image.c的作用:为BL1添加校验头
    我们编译链接时只得到了led.bin,这个210.bin的得到和交叉编译工具链是完全无关的。由led.bin得到210.bin的过程是三星的S5PV210所特有的,因此需要我们自己去完成,为此我们写了mkv210_image.c来完成。
    6.4、整个程序工作流分析
    整个程序中首先申请一个16KB大小的buffer,然后把所有内容按照各自的位置填充进去,最终把填充好的buffer写入到一个文件(名叫210.bin)就形成了我们想要的镜像。

7.mkv210_image.c文件详解2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值