Linux设备驱动开发——3.点亮LED灯

三、点亮LED灯

通过前面的学习,我们便大致了解了如何操作4412,最直观的方面就是操作开发板来点亮一个LED灯了。

工具文件:

E4412_N.bl1.bin:   三星公司提供的,bl1代码

V310-EVT1-mkbl2.c :三星公司提供的,BL2制作工具(mkbl2)源码

E4412_tzsw.bin:    三星公司提供的,安全保密代码

sd_fusing.sh  :      三星公司提供的,BL1BL2烧写到SD卡中的脚本

1.编写裸机代码:led.S

.text
.global _start				
_start:
	LDR R0,=0x110002E0       @GPM4CON寄存器地址
	LDR R1,=0x00001111   	 @GPM4_0--3配置为输出   
	STR R1,[R0]		 @R1写入R0,即将值写入寄存器

	LDR R0, =0x110002E4      @GPM4DAT
	LDR R1, =0x00000001	 @GPM4_0输出1,LED1不亮;LED2 3 4亮 
	STR R1,[R0]
MAIN_LOOP:			 @进入死循环
	B	MAIN_LOOP

tiny4412开发板的,4个LED接在4412管脚GPM4_0GPM4_3上


2.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

led.elf:包含地址信息

led.bin:纯二进制文件

led.dis:反汇编文件


3.链接脚本文件:

SECTIONS {
    . = 0x02023400;
    .text : { *(.text) }
    
    . = ALIGN(4);
    .rodata : {*(.rodata*)} 
    
    . = ALIGN(4);
    .data : { *(.data) }
    
    . = ALIGN(4);
    .bss : { *(.bss)  *(COMMON)}
}

注意这里的0x02023400是链接地址。链接地址是代码的起始存储地址,它表示代码应该位于的地方,即决定代码的布局。这里我们指定为0x02023400,表示放在iRAM(手册知道为0x0202000)里执行。其实,LED代码很简单,这里我们使用iRAM的空间都可以,甚至使用iROM空间0x2000_0000,都可以运行,因为我们是汇编代码,位置无关码!之所以用0x02023400,是因为这是三星公司规定的BL2的起始地址。

4.编译和烧录:

直接输入命令# make,就生成了led.bin文件,那么我们怎么把它烧写进SD卡呢。
这里我们使用脚本文件sd_fusing.sh,使用命令 #  sd_fusing.sh /dev/sdb。
简要说下这个脚本文件,其实是执行了命令:
	signed_bl1_position=1
	bl2_position=17
	uboot_position=49
	tzsw_position=705

	dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position
	dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
	dd iflag=dsync oflag=dsync if=./led.bin of=$1 seek=$uboot_position
	dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position
以上命令的功能就是:bl1、bl2、led裸码、保密代码分别写入到SD卡的分区1、17、49、705中,我们把led裸机代码烧写到原本uboot(除去bl2 )的代码,让代码去运行,就可以点亮LED灯了!

你可能感兴趣的:(Linux设备驱动开发)