开发板:tiny4412(1611)
编译器: arm-tiny4412-linux-gnueabi-gcc (gcc version 6.1)
根据电路图,有4个LED灯,引脚分别是GPM4_0~ GPM4_3。且当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。
Exynos4412属于12年出的SOC芯片,属于比较新的芯片,armv7架构。相较于前些年的arm9芯片,在启动上的功能更多一些,当然启动校验也更复杂一些。
BL0(brom)是在芯片内部的代码,在芯片出厂时已经固化。BL0进行简单的初始化之后,会根据配置检测对应介质上的代码,如果校验成功就能跳到代码执行(BL1)。
如果直接使用官方提供的BL1,那么就可以省去制作校验和的步骤。但是BL2就要遵循官方的规定,需要小于14KB。
这里我们直接使用官方的BL1,将裸机程序编译为BL2。
官方提供了BL1的固件 (E4412_N.bl1.bin)。BL1工作是做一些初始化并将BL2拷贝到片内内存运行。
IROM代码已经定死BL1大小只能是8K的代码,BL1可以使用官方提供的,也可以直接写。在官方的描述中(如下英文描述),BL2的大小可以用户定义,但是,如果使用了官方的BL1的话,那也就只能按人家说的做,则BL2只能是(14K-4B),后面四个字节用来做校验。通过mkbl2工具(主要是截取代码和计算校验)来制作。
但是如果你不使用官方的BL1的话,也可以自己写,有很多的灵活性。BL2的长度就可以自己定,或者没有BL2,直接将uboot拷贝到内存运行了,只要你的BL1不超过8K并能完成你要做的工作就可以,不一定非要用官方的BL1。
但是使用官方的BL1有很多好处,比如制作BL1加头,加校验,加签名等工作就不要做了。所以一般都会使用官方的BL1。
BL2运行在芯片内部的sram上,可以实现一些休眠唤醒的功能。BL2会去完成加载OS的功能(uboot、linux kernle、atf、optee)。这里我们直接把裸机程序替换成BL2。
获取代码:
git clone https://github.com/TinyWindzz/tiny4412_asm
(led_asm目录下)
led.S:
.text
.globl _start
_start:
ldr r0, =0x110002E0 //GPM4CON Register
ldr r1, =0x00001111 //Configurate GPM4_0GPM4_1GPM4_2GPM4_3 output
str r1, [r0]
mov r1, #0xF0 //light All led on
ldr r0, =0x110002E4 //GPM4DAT Register
str r1, [r0]
halt_loop:
b halt_loop
led.lds:
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
为什么链接地址是0x02023400,这个可以在irom手册上看到。
官方提供的BL1会默认将BL2加载到这个位置。
Makefile:
CC=arm-tiny4412-linux-gnueabi-
led.bin : led.S
$(CC)gcc -c -o led.o led.S
$(CC)ld -Tled.lds -N led.o -o led.elf
$(CC)objcopy -O binary -S led.elf led.bin
$(CC)objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
Makefile中指定编译器为arm-tiny4412-linux-gnueabi-gcc,所以确保已装上。
arm-tiny4412-linux-gnueabi-gcc
将SD卡插入电脑,烧写完毕后插回开发板。
root@ubuntu:/work/tiny4412/asm/led_asm# make
arm-tiny4412-linux-gnueabi-gcc -c -o led.o led.S
arm-tiny4412-linux-gnueabi-ld -Tled.lds -N led.o -o led.elf
arm-tiny4412-linux-gnueabi-objcopy -O binary -S led.elf led.bin
arm-tiny4412-linux-gnueabi-objdump -D -m arm led.elf > led.dis
root@ubuntu:/work/tiny4412/asm/led_asm# cd sd_fuse/tiny4412/
root@ubuntu:/work/tiny4412/asm/led_asm/sd_fuse/tiny4412# ./sd_fusing.sh /dev/sdb ../../led.bin
/dev/sdb reader is identified.
---------------------------------------
BL1 fusing
16+0 records in
16+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.0738208 s, 111 kB/s
---------------------------------------
BL2 fusing
28+0 records in
28+0 records out
14336 bytes (14 kB, 14 KiB) copied, 0.182688 s, 78.5 kB/s
---------------------------------------
u-boot fusing
0+1 records in
0+1 records out
40 bytes copied, 0.0101201 s, 4.0 kB/s
---------------------------------------
TrustZone S/W fusing
184+0 records in
184+0 records out
94208 bytes (94 kB, 92 KiB) copied, 1.45966 s, 64.5 kB/s
---------------------------------------
U-boot image is fused successfully.
Eject SD card and insert it again.
root@ubuntu:/work/tiny4412/asm/led_asm/sd_fuse/tiny4412#
./sd_fusing.sh /dev/sdb ../../led.bin 这条指令中/dev/sdb根据实际情况调整,
可以通过fdisk -l查看sd具体名称。
sd_fusing.sh中核心的就是下面几条烧写指令,当然裸机程序点灯这里只需要
E4412_N.bl1.bin和bl2.bin就行。
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
dd iflag=dsync oflag=dsync if=${E4412_UBOOT} of=$1 seek=$uboot_position
dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position
参考文章:
Tiny4412汇编流水灯代码,Tiny4412裸机LED操作
《Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf》