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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值