tiny4412 裸机程序 二、汇编点亮LED灯

来源:互联网 发布:两个数最小公约数c语言 编辑:程序博客网 时间:2024/04/29 12:21

一、控制原理说明

首先查看《Tiny4412_1306_sch.pdf》原理图,找到我们想控制的LED灯,如下图2-1所示。





图2-1、LED灯电路原理图

如上图1可知,PCB板上有4个LED灯可受IO控制的,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。我们要做的工作就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低即可。

二、程序说明

程序代码目录为1_leds_s。以下进行必要说明。

1、       start.s说明

由原理图可知,程序只进行了两步操作;

第一步:设置GPM4_0~GPM4_3相对应的控制寄存器GPM2CON,使GPM4_0~ GPM4_3四个引脚为功能。

第二步:设置其对应的数据寄存器GPM2DAT对应的4个bit位为0,使GPM4_0~ GPM4_3为低电平,4个LED灯全亮,等待一段时间设置其为1,使GPM4_0~ GPM4_3为高电平,4个LED灯全灭。

程序代码中,也有相关解释这里不做过多说明。

2、       MakeFile说明

led.bin: start.o

arm-linux-ld -Ttext 0x0 -o led.elf $^

arm-linux-objcopy -O binary led.elf  u-boot.bin

arm-linux-objdump -D led.elf > led_elf.dis 

%.o : %.S

arm-linux-gcc -o $@ $< -c

 

%.o : %.c

arm-linux-gcc -o $@ $< -c

 

clean:

rm *.o *.elf *.bin *.dis  -f

如上是Makefile的全部内容,其实需求学习目标不一,我现在的要求是能看明白,进行相关修改,能让自己修改程序运行编译通过,运行起来即可。Makefile高深的语法,我也不甚了解,大家可以自行学习,关于Makefile网上的相关资料相当多,推荐《跟我一起写makefile》。

下面只是进行粗略地讲解下此Makefile。当我们在Makefile所在目录下执行make命令时,系统会进行如下操作:

第一步 执行arm-linux-gcc -o $@$< -c命令将当前目录下存在的汇编文件和C文件编译成.o文件;

第二步 执行arm-linux-ld -Ttext0x0 -o led.elf $^将所有.o文件链接成elf文件,-Ttext 0x0表示程序的运行地址是0x0,由于目前我们编写的代码是位置无关码,所以程序能在任何一个地址上运行;

第三步 执行arm-linux-objcopy-O binary led.elf u-boot.bin将elf文件抽取为可在开发板上运行的bin文件;为什么不是arm-linux-objcopy -O binary led.elf  led.bin,这是由于我在参考《Linux平台下Mini210S裸机程序开发指南》进行实验时,发现一个问题,按照其说明的方法,不能成功运行程序,这是由于Exynos4412的启动原理和S5PV210的不同,虽然都有一个检验拷贝的16K代码较验和的过程,但是Exynos4412好像第一段程序是是一段叫BL1的程序,然后才能执行我们所写的程序,具体原理启动原理大家可以好好看一下Exynos4412手册的第5节启动原理说明。我想找到写BL1程序方法,但我从网上找不到Exynos4412的类似S5PV210的启动说明文档《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》,所以,我想uboot里面有一个sd_fuse的文件夹,是用来烧写U-boot程序到SD卡的。我想他可能可以工作,我拷贝了里面必要的文件到我们的裸机程序下,进行了必要的修改,发现其真的能运行,所以我们裸机程序不像Mini512S的是用write2sd脚本文件了。为了这个修改过的sd_fuse文件夹的程序,能在不同的裸机程序上运行,所以这里让我们裸机程序来匹配sd_fuse下的程序。这里写成arm-linux-objcopy -O binary led.elf u-boot.bin,让其生成的Bin文件名为u-boot。

建议大家可以先看一次《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》文档。

第四步 执行arm-linux-objdump-D led.elf > led_elf.dis将elf文件反汇编后保存在dis文件中,调试程序时可能会用到。

 

clean:

rm *.o *.elf *.bin *.dis  -f

上面代码是用来清除编译链接过程生成的一切文件。

 

3、       sd_fuse文件夹简单说明

sd_fuse文件夹下我只抽取了我们需要的4个文件:

a、     E4412_N.bl1.bin,这个文件很有可能是三星提供的,我不清楚其来源,但它是我们要烧写在SD卡上seek=1位置处一文件,也就是第一个执行的文件吧。算了,像我们这些学习者,资料都拿不全,不知其源直接用吧。

b、     fast_fuse.sh 是烧写SD卡的shell脚本文件。

c、     V310-EVT1-mkbl2.c是为裸机程序增加检验和的程序。

d、     Makefile是用来将V310-EVT1-mkbl2.c编译成可执行的文件mkbl2。

 

下面来说一下V310-EVT1-mkbl2.c程序。

大家又可参考《Linux平台下Mini210S裸机程序开发指南》,文中以下内容:

从三星提供的S5PV210文档《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》以及芯片手册《S5PV210_UM_REV1.1.pdf》得知,S5PV210启动时,会先运行内部IROM中的固化代码进行一些必要的初始化,执行完后硬件上会自动读取NAND Flash或sd卡等启动设备的前16K的数据到IRAM中,这16K数据中的前16byte中保存了一个叫校验和的值,拷贝数据时S5PV210会统计出待运行的bin文件中含‘1’的个数,然后和校验和做比较,如果相等则继续运行程序,否则停止运行。所以所有在S5PV210上运行的bin文件都必须具有一个16byte的头部,该头部中需包含校验和信息。

Exynos4412的启动顺序和S5PV210的虽然不同,要先执行一个BL1.bin的文件,但其第二个BL2.bin的文件也是需要这个的校验和信息的,V310-EVT1-mkbl2.c作用就是用来给原始的bin文件添加较验和信息的,不过不同于S5PV210是在bin文件的状况,4412的是在这个14K的Bin文件尾部。V310-EVT1-mkbl2.c程序中虽然我做了必要修改,让其程序适应我们裸机程序,但其核心部分是没有变动的,程序主要内容也是别人写的,我也不做过多说明,如有需求,大家可以自己分析理解一下,如不想了解,直接应用就行。

 

fast_fuse.sh是一个shell脚本,此脚本主要是用来:

第一步、fast_fuse.sh脚本使用方法对不对,提示如何使用fast_fuse.sh。且检验参数2提供的SD卡是否存在,以及其大小是否超过32G等。

第一步调用mkbl2来将我们裸机程序增加较验和尾部,生成BL2.bin文件,由下面内容实现:

 

E4412_UBOOT=../u-boot.bin

MKBL2=./mkbl2                

#<make bl2>

${MKBL2} ${E4412_UBOOT} bl2.bin 14336

 

接着将E4412_N.bl1.bin写到SD卡的seek=1的位置处,将bl2.bin文件烧写到seek=17处。代码如下,of=$1中$1是提供的SD卡。

signed_bl1_position=1

bl2_position=17

uboot_position=49

tzsw_position=705

#<BL1 fusing>

echo "---------------------------------------"

echo "BL1 fusing"

dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1seek=$signed_bl1_position

 

#<BL2 fusing>

echo "---------------------------------------"

echo "BL2 fusing"

dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position

dd是一个读写命令,if是输入,of是输出,seek=n表示从扇区n处开始读写。

三、完整的烧写过程

首先请保证你的SD卡通过使用FriendlyARM提供的SD-Flasher.exe制作好了SD卡,建议你重新制作一次,因为我在调试过程中发现,SD卡在烧录过多次其他u-boot程序后,再来烧写这些裸机程序,我发现裸机程序,工作会存在异常,所以建议你重新制作一次SD卡。避免实验不成功。

现在假设你已将SD卡插入,linux识别了SD卡,其识别号为sdb。执行下面命令:

# chmod 777 –R 1_leds_s  //还没有进入1_leds_s文件夹执行

# cd 1_leds_s

# make

# cd sd_fuse

# make

# ./ fast_fuse /dev/sdb

执行完成,如下图2-2所示即可认为成功


图2-2、程序编译执行流程示意图

四、上电实验

将SD卡插入到Tiny4412板上子,将启动开关设置拔到SD卡启动端,上电,开机,可以看到4个LED灯在闪烁,说明程序运行成功。


程序不知道如何上传附件,稍后会想法上传

0 0
原创粉丝点击