(2)tiny4412 裸机程序之点灯

开发板:tiny4412(1611)
编译器: arm-tiny4412-linux-gnueabi-gcc (gcc version 6.1)

文章目录

  • 电路
  • 启动流程
    • IROM CODE(brom、BL0)流程图
    • BL1流程图
    • BL2流程图
  • 程序
  • 烧写方式


电路

(2)tiny4412 裸机程序之点灯_第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。

IROM CODE(brom、BL0)流程图

(2)tiny4412 裸机程序之点灯_第2张图片

BL1流程图

(2)tiny4412 裸机程序之点灯_第3张图片

官方提供了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流程图

(2)tiny4412 裸机程序之点灯_第4张图片
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) }                                           
}     

(2)tiny4412 裸机程序之点灯_第5张图片

为什么链接地址是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

体外话,插一张ATF标准启动流程图:
(2)tiny4412 裸机程序之点灯_第6张图片


烧写方式

将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具体名称。

效果:
(2)tiny4412 裸机程序之点灯_第7张图片

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》

你可能感兴趣的:(Tiny4412,Tiny4412之旅)