通过前面的学习,我们便大致了解了如何操作4412,最直观的方面就是操作开发板来点亮一个LED灯了。
E4412_N.bl1.bin: 三星公司提供的,bl1代码
V310-EVT1-mkbl2.c :三星公司提供的,BL2制作工具(mkbl2)源码
E4412_tzsw.bin: 三星公司提供的,安全保密代码
sd_fusing.sh : 三星公司提供的,把BL1,BL2烧写到SD卡中的脚本
.text
.global _start
_start:
LDR R0,=0x110002E0 @GPM4CON寄存器地址
LDR R1,=0x00001111 @GPM4_0--3配置为输出
STR R1,[R0] @R1写入R0,即将值写入寄存器
LDR R0, =0x110002E4 @GPM4DAT
LDR R1, =0x00000001 @GPM4_0输出1,LED1不亮;LED2 3 4亮
STR R1,[R0]
MAIN_LOOP: @进入死循环
B MAIN_LOOP
tiny4412开发板的,4个LED接在4412管脚GPM4_0到GPM4_3上
led.bin:led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -Tled.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
led.elf:包含地址信息
led.bin:纯二进制文件
led.dis:反汇编文件
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
. = ALIGN(4);
.rodata : {*(.rodata*)}
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.bss : { *(.bss) *(COMMON)}
}
注意这里的0x02023400是链接地址。链接地址是代码的起始存储地址,它表示代码应该位于的地方,即决定代码的布局。这里我们指定为0x02023400,表示放在iRAM(手册知道为0x0202000)里执行。其实,LED代码很简单,这里我们使用iRAM的空间都可以,甚至使用iROM空间0x2000_0000,都可以运行,因为我们是汇编代码,位置无关码!之所以用0x02023400,是因为这是三星公司规定的BL2的起始地址。
signed_bl1_position=1
bl2_position=17
uboot_position=49
tzsw_position=705
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
dd iflag=dsync oflag=dsync if=./led.bin of=$1 seek=$uboot_position
dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position