具體的源代碼存放與:https://download.csdn.net/download/u010299133/11244210
├── led.lds --链接脚本
├── led.S --led主程序
├── makefile --编程步骤控制Mafile
└── sd_fuse --这个文件夹中的内容是用于制作BL2的工具源码
├── Makefile --- 编译BL2 制作工具的Makefile
├── tiny4412
│ ├── E4412_N.bl1.bin -- 这个就三星公司提供的BL1代码。
│ ├── E4412_tzsw.bin
│ | 制作BL2以及把BL1,BL2烧写到SD卡中的脚本
│ ├── sd_fusing.sh
└── V310-EVT1-mkbl2.c -- BL2 制作工具源码。
2.汇编代码文件 led.S
.text //表示代码段
.globl _start //定义一个全局变量_start
_start: //标号
ldr r0, =0x110002E0 //把 GPM4COM 地址赋值给r0
ldr r1, =0x1111 //设置 GPM4_(0~3) 为输出模式
str r1, [r0] //写入r0里面,也就是写到GPM4COM地址
ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E4
mov r1, #0xa // 设置数据寄存器低4位为低电平
str r1, [r0] // 写入GPM4DAT地址,点亮所有LED灯
loop:
b loop
3.链接脚本文件led.lds
SECTIONS {
. = 0x02023400;
.text :{ *(.text)}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
4.编译步骤Makefile
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
说明:
arm-linux-gcc -c -o led.o led.S 这步把 led.S 编译生成目标文件 led.o
arm-linux-ld -Tled.lds -N led.o -o led.elf 表示把led.o 根据led.lds脚本进行链接,生成led.elf格式的的可执行程序。
arm-linux-objcopy -O binary -S led.elf led.bin 把 led.elf 中的二进制代码复制出来保存为led.bin文件 ,这个文件就是开发板要下载的可执行文件。
arm-linux-objdump -D -m arm led.elf > led.dis :反汇编,根据 led.elf 文件内容生成对应的反汇编代码。
5.编译:
[root@localhost 01_leds]# ls
led.lds led.S makefile sd_fuse
[root@localhost 01_leds]# make
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
[root@localhost 01_leds]#
[root@localhost 01_leds]# ls
led.bin led.dis led.elf led.lds led.o led.S makefile sd_fuse
[root@localhost 01_leds]#
6.编译BL2制作工具
[root@localhost 01_leds]# ls
led.bin led.dis led.elf led.lds led.o led.S makefile sd_fuse
[root@localhost 01_leds]# cd sd_fuse/
[root@localhost sd_fuse]# ls
Makefile sd_fdisk.c tiny4412 V310-EVT1-mkbl2.c
[root@localhost sd_fuse]# make
gcc -o mkbl2 V310-EVT1-mkbl2.c
gcc -o sd_fdisk sd_fdisk.c
[root@localhost sd_fuse]# ls
Makefile mkbl2 sd_fdisk sd_fdisk.c tiny4412 V310-EVT1-mkbl2.c
7.烧写led程序到SD卡中。
7.1把SD卡连接到Linux系统中
连接前先查看当前Linux系统中块设备情况:
[root@localhost sd_fuse]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2
[root@localhost sd_fuse]#
连接后再次查看SD卡在Linux系统中的设备名。
[root@localhost sd_fuse]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdc /dev/sdc1
我的是sdc ,不同的系统可能不一样,根据自己情况记录这个名字。
7.2下载bl1,bl2到SD卡
[root@localhost sd_fuse]# cd tiny4412/
[root@localhost tiny4412]# ls
bl2.bin E4412_tzsw.bin sd_fusing.sh
E4412_N.bl1.bin fast_fuse.sh sd_fusing.sh~
[root@localhost tiny4412]# rm bl2.bin
rm:是否删除普通文件 "bl2.bin"?y
[root@localhost tiny4412]# ls
E4412_N.bl1.bin fast_fuse.sh sd_fusing.sh~
E4412_tzsw.bin sd_fusing.sh
[root@localhost tiny4412]# ./sd_fusing.sh /dev/sdc
/dev/sdc reader is identified.
Error: NO media found in card reader.
root@localhost tiny4412]# ./sd_fusing.sh /dev/sdc
/dev/sdc reader is identified.
---------------------------------------
BL1 fusing
记录了16+0 的读入
记录了16+0 的写出
8192字节(8.2 kB)已复制,0.214619 秒,38.2 kB/秒
---------------------------------------
BL2 fusing
记录了28+0 的读入
记录了28+0 的写出
14336字节(14 kB)已复制,0.151043 秒,94.9 kB/秒
---------------------------------------
u-boot fusing
记录了0+1 的读入
记录了0+1 的写出
392字节(392 B)已复制,0.0122199 秒,32.1 kB/秒
---------------------------------------
TrustZone S/W fusing
记录了184+0 的读入
记录了184+0 的写出
94208字节(94 kB)已复制,1.04513 秒,90.1 kB/秒
---------------------------------------
U-boot image is fused successfully.
Eject SD card and insert it again.
[root@localhost tiny4412]#
烧写成功。
在这个例子中可以把 led.bin看成是前面说的bootloader,只是它很小,总大小不超过14KB-4B 字节,直接制作成BL2.bin下载到SD卡中,由BL1.bin加载到SRAM中就可以了。