您的位置:首页 > 编程语言 > C语言/C++

纯汇编点亮led-以替代uboot的方式执行

2015-08-25 20:49 447 查看

led.S

#define GPIO_BASE           0x01C20800
#define GPIO_PH_CFG2_BASE   (GPIO_BASE + 0x104)
#define GPIO_PH_DAT_BASE    (GPIO_BASE + 0x10C)

.global _start

_start: b reset

reset:
ldr r0, =GPIO_PH_CFG2_BASE

/* read current cfg */
ldr r1, [r0]

/* clear bit 22:20 for LED1 (PH21) */
bic r1, r1, #(0x7 << 20)

/* set PH21 (LED1) to output */
orr r1, r1, #(0x01 << 20)
str r1, [r0]

/* clear bit 18:16 for LED2 (PH20) */
bic r1, r1, #(0x7 << 16)

/* set PH20 (LED2) to output */
orr r1, r1, #(0x01 << 16)
str r1, [r0]

loop:
ldr r0, =GPIO_PH_DAT_BASE

bl led1_on
bl delay
bl led1_off
bl delay
bl led2_on
bl delay
bl led2_off
bl delay

b loop

led1_on:
/* pull up PH21 to light on LED1 */
ldr r1, [r0]
orr r1, r1, #(0x01 << 21)
str r1, [r0]

/* return */
mov pc, lr

led1_off:
/* pull up PH21 to light on LED1 */
ldr r1, [r0]
bic r1, r1, #(0x01 << 21)
str r1, [r0]

/* return */
mov pc, lr

led2_on:
/* pull up PH20 to light on LED2 */
ldr r1, [r0]
orr r1, r1, #(0x01 << 20)
str r1, [r0]

/* return */
mov pc, lr

led2_off:
ldr r1, [r0]
bic r1, r1, #(0x01 << 20)
str r1, [r0]

/* return */
mov pc, lr

delay:
mov r5, #0x0
ldr r4, =0x3ffff

minus:
sub r4, r4, #1
cmp r5, r4
bne minus

/* return */
mov pc, lr


编译

arm-linux-gnueabihf-gcc -c led.S -o led.o


添加sunxi头

./mksunxiboot led.o led.bin


烧写到TF卡

sudo dd if=led.bin of=/dev/sdb bs=1024 seek=8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息