天天看点

s3c2440 ARM9 裸机驱动第一篇-GPIO驱动(C)

此文为对于LED驱动的补充:

废话不说,先上代码。

start.s

.text
.global _start
_start:
	ldr 	r0 	,= 0x53000000 	@WATCHDOG ADD
	mov r1	,#0x0
	str	r1	,[r0]			@r1 的数据写入r0 关看门狗
	ldr	sp	,=1024*4		@设置栈
	bl main					@跳转到main执行
 halt:	
	b	halt
           

led.c

#define	GPFCON	(*(volatile unsigned long *)0x56000050)
#define	GPFDAT	(*(volatile unsigned long *)0x56000054)


void delay(unsigned int num);
int main(int argv, char *argc)
{
	GPFCON	&=0x00ff;
	GPFCON	|=0x5500;
	GPFDAT	&=0x0f;
	while(1)
	{
		GPFDAT	|=0xf0;
		delay(20);
		GPFDAT	&=0x0f;
		delay(20);
	
	}
	return 0;
}

void delay(unsigned int num)
{
	unsigned int i,j;
	for(i=0;i<3000;i++)
		for(j=0;j<num;j++);
}
           

Makefile

CC=arm-linux-gcc
LD=arm-linux-ld
led.bin:led.o start.o
	$(LD) -Ttext 0x0000000 -g start.o 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
led.o:led.c
	$(CC)  -c -g -o led.o led.c
start.o:start.s
	$(CC)  -c -g -o start.o start.s
clean:
	rm -f led.bin led_elf led.dis start.o
           

其中有一个注意的地方,在Makefile中两个.o文件链接为一个led_elf文件时

由于没注意,写为:

$(LD) -Ttext 0x0000000 -g led.o start.o -o led_elf
           

导致无法点亮LED,是因为将led.o文件内容放到了0地址。