首先查看《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。以下进行必要说明。
由原理图可知,程序只进行了两步操作;
第一步:设置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灯全灭。
程序代码中,也有相关解释这里不做过多说明。
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
上面代码是用来清除编译链接过程生成的一切文件。
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
#
${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
#
echo "---------------------------------------"
echo "BL1 fusing"
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1seek=$signed_bl1_position
#
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灯在闪烁,说明程序运行成功。
程序不知道如何上传附件,稍后会想法上传