第五章 GPIO
1、下载的程序
USB启动的时候,使用的是led.bin,下载到0xd0020010。不需要校验前16个字节的数据。
SD卡启动的时候,使用的是210.bin,下载到0xd0020000。需要校验前16个字节的数据。因为BL1的大小是16k,所以生成的210.bin的大小也是16k。
2、校验头生成分析
对于BL1程序的校验头,使用mkv210_image.c程序来进行生成,该程序的生成原理是:首先申请一个16KB大小的buffer,然后把内容数据填充,最终把填充好的buffer写入到一个文件(210.bin)就得到了最后想要的文件
首先将该c代码,编译成可执行程序,然后执行这个可执行程序,带上两个参数,第一个是输入的bin文件,第二个是输出的bin文件。
2.1、mkv210_image.c代码解读
参数检查,检查传入的参数是否是3个,如果不是的话,就提示错误,然后退出。
分配16kb大小的buffer,并将该buffer全部清为0。
打开源bin文件。以rb模式,也就是二进制的方式打开。
获取源bin文件的长度,如果超过16k,就以16k大小处理。然后将buffer的前16个字节,填充数据"S5PC110 HEADER "。刚好16个字节。
读取源bin文件的内容,写入到buffer中。
计算校验和,其实就是将源bin的所有数据的低8位,进行累加。并将校验的结果写入到buf[8]中。
打开目的bin文件。以wb方式打开,也就是二进制方式打开。
将buf中的数据,写入到文件中。写完后,关闭文件,释放buffer。这样,就生成好了带有头信息的bin文件。
2.2、获取一个文件的长度
fp是一个文件指针
fseek(fp, 0L, SEEK_END); // 定位到文件尾
fileLen = ftell(fp); // 得到文件长度
fseek(fp, 0L, SEEK_SET); // 再次定位到文件头
3、GPIO介绍
对于S5PV210,有100多个GPIO,这些GPIO兼具复用功能,即可以通过配置,使这些GPIO具有其他的一些的功能。
3.1、 GPIO控制器
每个GPIO有两类控制器,
一类是工作在普通模式下,另一类是工作在休眠模式(STOP, DEEP-STOP, SLEEP mode)
在普通模式下,由以下寄存器控制:
GPxCON,GPxDAT,GPxPUD,and GPxDRV
在休眠模式,由以下寄存器控制:
GPxCONPDN, GPxPUDPDN
如果210进入了电源休眠模式,所有的配置和上下拉控制都由休眠下的寄存器控制。如果没有进入到休眠状态,那么GPIO由普通模式的寄存器来控制。
3.2、210开发板的LED
开发板使用的4个led,都是共阳接法。
D22:GPJ0_3
D23:GPJ0_4
D24:GPJ0_5
D25:PWMTOUT1(GPD0_1)
3.3、GPIO相关寄存器
GPJ0相关的寄存器以下几个:
◾GPJ0CON: 控制寄存器,控制GPIO的功能,每4位控制一个GPIO。
◾GPJ0DAT:数据寄存器,控制GPIO的端口电压,分输入和输出
◾GPJ0PUD: 上拉下拉寄存器,控制GPIO的上拉下拉功能,一般不使用
◾GPJ0DRV: 控制GPIO的驱动强度
◾GPJ0CONPDN: 掉电模式的配置寄存器,CPU在休眠情况下, IO的状态应该是什么样。
◾GPJ0PUDPDN: 掉电模式下的上拉下拉配置寄存器,CPU在休眠情况下, IO的上下拉应该是什么样。
因此,知道了这些寄存器的功能,以及寄存器的地址,就可以编程,实现控制GPIO,从而控制LED的点亮。
具体的代码实现,可以查看我的github:https://github.com/weiqi7777/...
4、杂散
arm-linux-objdump –D led.elf > led_elf.dis
objdump是gcc工具链中的反汇编工具,作用是将编译链接好的elf格式的可执行程序反过来得到汇编源代码。
-D 表示反汇编
反汇编的原因:
1) 逆向破解
2) 调试程序时,反汇编代码可以帮助我们理解程序。尤其是在理解链接脚本、链接地址等概念。
3) 把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。
下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是链接的时候ld工具给指定的(ld根据编写的链接脚本确定地址)。
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定链接脚本来让链接器给我们链接合适的地址。
系列其他篇
原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。