arm cotex-a9裸机led实践-以exynos4412为例

具體的源代碼存放與:https://download.csdn.net/download/u010299133/11244210

  1. 文件列表说明:

├── 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]#

 arm cotex-a9裸机led实践-以exynos4412为例_第1张图片

 

连接后再次查看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中就可以了。

你可能感兴趣的:(linux驱动,BootLoader,linux系统,arm)