@和原子哥一起学习Linux
Ubuntu入门学习完毕,怀着激动的心情开始了I.MX6U的裸机入门
.global _start /*开始*/
_start:
/*使能所有时钟 */
ldr r0, =0x020c4068 @CCGR0
ldr r1, =0xffffffff
str r1,[r0]
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 GPIO3*/
ldr r0, =0x020e0068 @CIOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1, =0x05
str r1,[r0]
/*配置io电气属性 */
ldr r0, =0x020e02f4 @IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
ldr r1, =0x10b0 @下拉
str r1,[r0]
/*设置GPIO寄存器 */
ldr r0, =0x0209c004 @GPIO1_GDIR
ldr r1, =0x8 @输出
str r1,[r0]
ldr r0, =0x0209c000 @GPIOx_DR
ldr r1, =0 @输出0
str r1,[r0]
loop:
b loop
指定 led.s 编译完成以后的文件名字为 led.o
arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
其中 “-g”选项是产生调试信息
遇到的问题:
编译报错:
错误1:leds.s:4: 错误: bad instruction `_start’
原因:“_start”后面加“:”
错误2; partial line at end of file ignored
原因:“b loop"后面需要再换行
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
其中:-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名
错误1:对‘ox020c4068’未定义的引用
原因:。。。0x不是ox
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
其中:“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试
信息。
arm-linux-gnueabihf-objdump -D led.elf > led.dis
其中:“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
./imxdownload led.bin /dev/sdb
注意
1)必须知道自己的卡在/dev中sd*文件名
2)如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了!(重启Ubuntu)
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