新建目录结构:
├── led_asm
│ ├── led.bin
│ ├── led.dis
│ ├── led.elf
│ ├── led.lds
│ ├── led.o
│ ├── led.S
│ └── Makefile
├── readme.md
└── sd_fuse
├── bl2.bin
├── E4412_N.bl1.bin
├── E4412_tzsw.bin
├── Makefile
├── mkbl2
├── sd_fuse.sh
└── V310-EVT1-mkbl2.c
先看led.lds
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
可知链接地址在0x02023400, 在BL2的起始地址。
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
简单源码:
.text
.globl _start
_start:
/*
* set GPM4_0 as output
*/
ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0
ldr r1, [r0] // 先读出原值
bic r1, r1, #0xf // 清除bit[3:0]
orr r1, r1, #1 // 设置bit[3:0]为0b0001
str r1, [r0] // 写入GPM4CON
/*
* set GPM4_0 as High
*/
ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E4
ldr r1, [r0] // 读出原值
bic r1, r1, #1 // 清除bit[0]为0
str r1, [r0] // 写入GPM4_0
halt_loop:
b halt_loop
然后看sd_fuse目录:
E4412_N.bl1.bin E4412_tzsw.bin是三星提供的, bl2.bin是V310-EVT1-mkbl2.c使用gcc编译的工具,
#!/bin/bash
target=../led_asm/led.bin
./mkbl2 $target bl2.bin 14336
dd iflag=dsync oflag=dsync if=E4412_N.bl1.bin of=$1 seek=1
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=17
sync
执行sudo ./sd_fuse /dev/sdc后即可烧写到SD卡里面。