main.c
#include "led.h"
static void delay()
{
unsigned int i = 0;
for(i = 0; i < 50000; i++);
}
int main()
{
led_init();
while(1)
{
led1_on();
delay();
led1_off();
delay();
led2_on();
delay();
led2_off();
delay();
}
return 0;
}
led.h
#ifndef _LED_H_
#define _LED_H_
void led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
#endif
led.c
#define GPIO_BASE 0x01C20800
#define GPIO_PH_CFG2_BASE (GPIO_BASE + 0x104)
#define GPIO_PH_DAT_BASE (GPIO_BASE + 0x10C)
#define GPIO_PH_CON (*(volatile unsigned *)GPIO_PH_CFG2_BASE)
#define GPIO_PH_DAT (*(volatile unsigned *)GPIO_PH_DAT_BASE)
void led_init()
{
/* clear PH21 */
GPIO_PH_CON &= ~(0x7 << 20);
/* clear PH20 */
GPIO_PH_CON &= ~(0x7 << 16);
/* set PH21 output */
GPIO_PH_CON |= (0x1 << 20);
/* set PH20 output */
GPIO_PH_CON |= (0x1 << 16);
}
void led1_on()
{
GPIO_PH_DAT |= (1 << 21);
}
void led1_off()
{
GPIO_PH_DAT &= ~(1 << 21);
}
void led2_on()
{
GPIO_PH_DAT |= (1 << 20);
}
void led2_off()
{
GPIO_PH_DAT &= ~(1 << 20);
}
start.S
.section .init
.global _start
_start: b reset
reset:
mrs r0, cpsr
and r1, r0, #0x1f
teq r1, #0x1a
bicne r0, r0, #0x1f
orrne r0, r0, #0x13 @set svc mode
orr r0, r0, #0xc0 @disable fiq, irq
msr cpsr, r0
/* setup stack */
ldr sp, =(1024 * 10)
/* start main */
bl main
loop:
b loop
Makefile
CC = arm-linux-gnueabihf-gcc
LD = arm-linux-gnueabihf-ld
AS = arm-linux-gnueabihf-as
OBJCP = arm-linux-gnueabihf-objcopy
OBJ = led.o main.o start.o
all: $(OBJ)
$(LD) -T led.lds $(OBJ) -o led.elf
$(OBJCP) -O binary -S led.elf led.bin
led.o:
$(CC) -c led.c
main.o:
$(CC) -c main.c
start.o:
$(AS) start.S -o start.o
clean:
rm $(OBJ) led.elf led.bin
led.lds
SECTIONS
{
.text : {*(.init) *(.text)}
}
编译
make
make后生成以下文件:
led.elf ELF格式文件
led.bin 去掉了ELF头的纯可执行文件
添加sunxi头
./mksunxiboot led.bin led.hex
烧写到TF卡
sudo dd if=led.hex of=/dev/sdb bs=1024 seek=8