Linux之ARM(MX6U)裸机汇编LED驱动实验-编译驱动代码

Linux之ARM(MX6U)裸机汇编LED驱动实验-编译驱动代码

汇编驱动代码(leds.s):

  .global _start @全局标号 
_start:

/* 使能外设时钟
*CCGR0~CCGR6这7个寄存器全部使能,设置CCGR0~CCGR6这7个寄存器地址全部为       0XFFFFFFFF
*/
ldr r0, =0x020c4068   @CCGR0
ldr r1, =0xffffffff   @向CCGR0写入的数据
str r1, [r0]          @将oxffffffff写到CCGRO中

ldr r0, =0x020c406c   @CCGR1
str r1, [r0]

ldr r0, =0x020c4070   @CCGR2
str r1, [r0]

ldr r0, =0x020c4074   @CCGR3
str r1, [r0]

ldr r0, =0x020c4078   @CCGR4
str r1, [r0]

ldr r0, =0x020c407c   @CCGR5
str r1, [r0]

ldr r0, =0x020c4080   @CCGR6
str r1, [r0]


/*IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101=5,
*这样GPIO1_IO03就复用为GPIO。
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器的地址为0x020E0068
*/

ldr r0, =0x020E0068   @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1, =0x5           @写入的数据
str r1, [r0]           @将5写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中


/*@寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性
*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的地址为0x020e02f4

*bit0:     0 低速率
*bit5-3:   110  R0/6驱动能力
*bit7-6:   10  100MHz速度
*bit11:    0 关闭开路输出
*bit12:    1 使 Pull/Keeper 
*bit13:    0  Keeper
*bit15-14: 00  100k下拉
*bit16:    0  关闭hys
*/

ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]

/*  设置GPIO
*   设置GPIO1_GDIR寄存器 设置GPIO1_GPIO03为输出
*   寄存器GPIO1_GDIR的地址是  0x0209c004
*   设置GPIO1_GDIR寄存器bit3为1,也就是GPIO01_GPIO03为输出
*/

ldr r0, =0x0209c004
ldr r1, =0x8
str r1, [r0]

/*打开LED,也就是设置GPIO1_GPIO03为0
*GPIO01_DR寄存器地址为0x0209c000
 */
ldr r0, =0x0209c000
ldr r1, =0
str r1, [r0]

loop:
b  loop

①、使用arm-linux-gnueabihf-gcc,将.c .s文件变为.o

在这里插入图片描述

arm-linux-gnueabihf-gcc -g -c led.s -o led.o 

在这里插入图片描述
就是将 leds.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些 调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文 件名字,这里我们指定 leds.s 编译完成以后的文件名字为 led.o。执行上述命令以后就会编译生 成一个 led.o 文件

②、将.o文件连接为elf格式的可执行文件。

所有的裸机例程都是烧写到 SD 卡中,上电以后 I.MX6U 的内部 boot rom 程序会将 可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中 (0X900000~0X91FFFF),也可以在外部的 DDR 中。本教程所有裸机例程的链接地址都在 DDR 中,链接起始地址为 0X87800000。I.MX6U-ALPHA 开发板的 DDR 容量有两种:512MB 和 256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容 量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其 链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址,不容易记混。

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf 

在这里插入图片描述
上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名
为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件

led.elf 文件也不是我们最终烧写到 SD 卡中的可执行文件,我们要烧写的.bin 文件,因此还 需要将 led.elf 文件转换为.bin 文件,这里我们就需要用到 arm-linux-gnueabihf-objcopy 这个工具 了

③、将elf文件转为bin文件。

	arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin 

“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出, 选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试 信息。
在这里插入图片描述

④、将elf文件转为汇编,反汇编

arm-linux-gnueabihf-objdump -D led.elf  >  led.dis

“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一 个名为 led.dis 文件
在这里插入图片描述
可以打开 led.dis 文件看一下,看看是不是汇编代码:
Linux之ARM(MX6U)裸机汇编LED驱动实验-编译驱动代码_第1张图片
可以看出 led.dis 里面是汇编代码,而且还可以看到内存分配情况。在 0X87800000 处就是全局标号_start,也就是程序开始的地方。通过 led.dis 这个反汇编文件可以 明显的看出到我们的代码已经链接到了以 0X87800000 为起始地址的区域

⑤、 创建 Makefile 文件

如果我们修改了 leds.s 文件,那么就需要在重复一次上面的这些命令,太麻烦了,这个时候 我们就可以使用Makefile 文件了。

led.bin:leds.s
        arm-linux-gnueabihf-gcc -g -c leds.s -o led.o 
        arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
        arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
        arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean: 
         rm -rf *.o led.bin led.elf led.dis

使用make就可以了
在这里插入图片描述

你可能感兴趣的:(IMX6ULL)