4-GPIO和LED

一、裸机实验体验之USB启动配合dnw工具下载

1.1、背景知识介绍

回顾S5PV210的启动方式,必须将OM5打到VCC,才能从USB启动。
S5PV210的启动过程:开机时先执行内部的IROM中的BL0,然后BL0做了一系列的初始化后,再读取外部OMpin的设置来确定用户选择了从哪里启动。当检测到我们设置的是USB启动时,S5PV210就会从USB OTG接口试图连接主机进行下载启动。
注意:
(1)只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出,无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。

1.2、dnw工具介绍

dnw是一个软件,是三星公司编写的,这个软件的功能是通过USB线连接开发板和电脑主机,然后从主机下载文件镜像到开发板中去烧录系统。
位置:G:\朱有鹏视频\210开发板光盘资料\X210V3S_A\tools,这是一个纯绿色软件,无需安装。
dnw软件使用注意1:dnw是需要usb驱动的,驱动在“G:\朱有鹏视频\210开发板光盘资料\X210V3S_A\tools\USB驱动”目录中,叫dnw_driver。
dnw软件使用注意2:dnw使用时通过usb线下载,所以一定要插USB线。
dnw软件使用注意3:dnw下载时需要设置dnw下载内存地址,在dnw软件的菜单“Configuration”中设置,USB port的Download ADdress 为0xd0020010,然后确认即可。
为什么要写成这个地址呢?这个地址从哪里来的呢?
在这里插入图片描述
这个BL1是从外部读进来的(具体可以去看一下S5PV210的启动过程),读进来,就要放在地址为0xd0020000的内存里,所以我们下载也要下载到这个位置,但是上面明明是0xd0020010,而这里又说是0xd0020000,差了整整16个字节呢?因为从0xd0020000开始有4个字(16字节)的Header(头信息),这里面放了一些校验信息之类的。真正的BL1的内容是从0xd0020010开始的,一般情况下我们需要从0xd0020000开始,但是对于USB下载来说,它是不需要做校验的,所以直接从0xd0020010开始。
详细的内容可以看《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》

1.3、dnw驱动安装

x210开发板使用了软开关,但是我们这里还没到操作系统没去处理开关,所以在整个裸机实验中必须手工按下POWER键才能保持开机,只要手一抬起来就关机了…
安装驱动过程如下:
1、首先将OM5开关拨到USB启动那边;
2、接上电源,连上USB口和OTG口;·
3、按下电源键,在设备管理那里就会显示有未知驱动;
在这里插入图片描述

然后,在电脑中找到dnw的驱动程序,然后更新驱动即可。因为win10或者win7的64位的驱动必须要有数字签名,所以在更新驱动之前先将数字签名给破解掉就可以了。参照网上的一些教程。
dnw驱动装好的标志是:开发板开机从usb启动后,设备管理器显示已经安装的设备,并且关键是dnw工具中USB:OK
下面是win10中安装dnw驱动安装不成功或者是安装驱动之后无法正常使用的解决方法:(这个方法一旦重启就失效了)
4-GPIO和LED_第1张图片

1.4、裸机程序下载地址设置

从usb启动做裸机实验时,因为不需要16字节的校验头,所以直接下载到0xd0020010

1.5、usb启动裸机实验总结

点击
在这里插入图片描述
选择bin文件的目录,确定即可,就可以看到运行结果了。
这里有一个已经写好的裸机代码,效果就是让3颗led灯闪烁,bin文件的位置如下:G:\朱有鹏视频\课件and代码\课件\1.ARM裸机全集\1.4.ARM裸机第四部分-GPIO和LED\bin文件\led.bin
usb启动方式主要是用来调试程序的,其实分析S5PV210即可知道,我们这里是把裸机程序当作BL1来使用了。

二、裸机实验体验之SD卡下载

2.1、背景知识

一般情况下,用USB下载来调试裸机程序比较方便;但是有时候,电脑使用dnw会频繁蓝屏,这时候用S D卡下载调试是不错的选择。
把OM5打到GND(eMMC),以便从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,输入help movi就可以看到movi命令的用法。在这里我们输入:

movi  write  u-boot  0x30000000

这行命令的意思就是把0x30000000(内容应该是全零)开头的地址里面的内容写到u-boot分区里面去。

2.3、windows下制作启动SD卡

方法等同于讲过的SD卡刷机时的操作。
注意:
(1)这里下载进SD卡的是210.bin,不是led.bin;
(2)usb转串口线和SD卡刷机是一样的都是uart2;

2.4、linux下制作启动SD卡

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

三、自己动手安装交叉编译工具链

3.1 Windows中安装软件的特点

Windows中装软件使用安装包,安装包解压后有两种情况:一种是一个安装文件(.exe,.msi),双击进行安装,下一步直到安装完毕;安装完毕后会在桌面上生成快捷方式,我们平时使用快捷方式来启动这些程序。另一种是所谓的绿色软件(免安装软件),这种不用安装,直接解压开里面就有exe直接双击执行。

3.2Linux中安装软件的特点

Linux中安装软件比Windows中复杂,Linux中安装软件一般有以下几种方法:
第一种:在线安装,譬如Ubuntu中使用apt-get install vim来安装vim软件。
第二种:自己下载安装包来安装。这种方式的缺陷就是你不知道你下载的安装包和你的系统是否匹配。
第三种:最装逼的一种方式,就是源代码安装。(注意:Linux中的很多软件可以直接下载其源代码,我们就可以去读别人写的源代码了,如果他的源代码不合你的意,你还可以修改其源代码)
总结:我们安装交叉编译工具链(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目录下
注意:
(1)Linux中的目录管理方法,技术角度来讲,Linux中所有目录性质都是一样的,所以技术角度来讲我们把软件安装到哪里都行。但是,因为如果胡乱放置,将来程序可能不好找,所以久而久之大家就总结了一个文件放置的一般定义,譬如说/bin目录放置一些系统自带的用户使用的应用程序,/sbin目录(这里的s就是super的意思)下存放的是系统自带的系统管理方面的应用程序。
(2)那我们装软件放在哪里?一般都在/usr目录下。我们安装arm-linux-gcc,就在/usr/local/底下创建一个arm文件夹,然后装到里面。
(3)在Linux中,可以安装多个不同的交叉编译工具链;

3.5安装后的测试

到真正的应用程序的目录下(也就是/usr/local/arm/arm-2009q3/bin),去执行arm -linux-gcc -v执行方法是:./arm-none-linux-gnueabi-gcc -v
执行后可以得到一长串输出,其中有“gcc version 4.4.1”字样,即表示安装成功。
注意:./就是表示当前目录下,仅此而已;

3.6环境变量的意义

环境变量就是操作系统的全局变量,每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。Linux系统可以有很多个环境变量,其中有一部分是Linux系统自带的,还有一些是我们自己来扩充的。我们这里涉及到的一个环境变量是PATH,PATH这个环境变量是系统自带的,它的涵义就是系统在查找可执行程序时会搜索的路径范围。

3.7将工具链导出到环境变量

export  PATH =/usr/local/arm/arm-2009q3/bin :$PATH

在一个终端中执行以上命令后,该终端中就可以直接使用arm-Linux-gcc了,但是只要关掉这个终端再另外打开一个立马就不行了。原因是我们本次终端中执行时的操作只是针对本终端,以后再打开的终端并未被执行过这个命令所以没导出。解决方案是在 ~/.bashrc中,添加上面这行命令。
.bashrc对作用是:每一次用户在登陆一个终端的时候都会自动执行这个.bashrc文件,即这个文件会在每一次终端打开的时候会被附带的自动执行。
注意:我们导出这个环境变量是在当前用户,如果你登陆时是在其它用户下是没用的;

3.8为工具链创建arm-linux-xxx符号链接

ln  arm-none-linux-gnueabi-gcc  -s  arm-linux-gcc

注意:可以写一个脚本文件,然后执行。这样做的好处是方便记忆,在写Makefile的时候更方便。

四、Makefile大侠隆重登场

4.1为什么需要Makefile

Makefile是用来管理工程的;
在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,就会像这样:gcc a.c b.c c.c d.c e.c f.c g.c -o exe ,每次编译都要输入一堆东西很麻烦,这个问题严重影响工作效率,怎么办?Makefile来解决。

4.2 Makefile中的一些基本概念

目标:目标顶格写,后面是冒号(冒号后面是依赖)
依赖: 用来产生目标的原材料。
命令:命令前面一定是Tab,不能是顶格,也不能是8个空格;(经常有在Windows中写好的Makefile复制到Linux中之后不能使用,就是因为Tab可能被解释成了空格或者是其它的)。命令就是要生成那个目标需要做的动作。
4-GPIO和LED_第2张图片
当在Linux中输入make exe的时候就会执行exe目标下面的命令,如果输入make clean 的时候就会执行clean目标下面的命令。

4.3 Makefile的基本工作原理

其一,当我们执行make xx的时候,Makefile会自动执行xx这个目标下面的命令语句。
其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。
其三,我们直接执行make和make 第一个目标 效果是一样的。(第一个目标其实就是默认目标)

4.4进一步学习Makefile的资料

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

五、mkv210_image.c文件详解

5.1 mkv210_image.c的使用演示

位置:G:\朱有鹏视频\课件and代码\随堂代码\1.ARM裸机全集\chapter4\1.leds_s
裸机程序中的Makefile(实际上真正的项目的Makefile都是这样的)是把程序的编译和链接过程分开的。(平时我们用gcc a.c -o exe这种方式来编译时,实际上把编译和链接过程一步完成了,在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld)
在这里插入图片描述
链接器得到led.elf其实就是我们的可执行程序,(如果是在操作系统下,这个led.elf就可以执行了)但是在嵌入式裸机中我们需要的是可以烧写的文件(可烧写的文件就叫镜像image),因此我们需要用这个led.elf为原材料来制作镜像。
在这里插入图片描述
我们使用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)。
在这里插入图片描述
mkv210_image.c这个文件主要是用来由USB启动的led.bin制作得到由SD卡启动的210.bin。那么我们就需要知道由USB启动和SD卡启动的区别。详细参考文件:G:\朱有鹏视频\210开发板光盘资料\X210V3S_A\DataSheet下的《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》
Makefile的代码如下:

led.bin: led.o 
 arm-linux-l

你可能感兴趣的:(4-GPIO和LED)