LINUX-I.MX6U从零开始之1.3--I.MX6U的烧录实现

目录

          • 一,烧录步骤
            • 1.1编译
            • 1.2链接地址
            • 1.3.1转换格式
            • 1.3.2反汇编(烧录用不到)
            • 1.4烧录bin文件
          • 二,makefile简化操作
            • 2.1创建makefile
            • 2.2简单编写makefile
            • 2.3.1编译
            • 2.3.2清除编译结果
          • 三,镜像编写(imxdownload)
            • 3.1文件.imx组成(IVT+Boot data+DCD+.bin)

一,烧录步骤

以LED.s(汇编点灯)为例

1.1编译
arm-linux-gnueabihf-gcc -g -c led.s -o led.o

会生成led.o

1.2链接地址
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

会生成led.elf

1.3.1转换格式
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

会生成led.bin(烧录bin文件)

1.3.2反汇编(烧录用不到)
arm-linux-gnueabihf-objdump -D led.elf > led.dis

会生成led.dis

1.4烧录bin文件

“imxdownload”是原子编写的
1.4.1赋予imxdownload权限

chmod 777 imxdownload

1.4.2确定SIM卡是哪个

ls /dev/sd*

1.4.3向SD卡烧录

./imxdownload led.bin /dev/sdb //我的是sdb

最后一行会显示烧写大小、用时和速度,如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了!

二,makefile简化操作
2.1创建makefile
touch makefile

会生成makefile

2.2简单编写makefile
led.bin:led.s
	arm-linux-gnueabihf-gcc -g -c led.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
2.3.1编译
make

生成.o,.elf,.bin,.dis

2.3.2清除编译结果
make clean
三,镜像编写(imxdownload)

前面说了,imxdownload是原子写的,现在来看看这玩意是怎么写的。imxdownload 会在 led.bin前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终实际烧写的是 laod.imx。

3.1文件.imx组成(IVT+Boot data+DCD+.bin)

、Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在 ROM中按照固定的地址存放着。
、Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
、Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
、用户代码可执行文件,比如 led.bin。
3.1.1 IVT 数据和Boot Data 数据
IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。
内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。
详见原子手册9.4.1
3.1.2 DCD 数据
复位以后,I.MX6U 片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。
详见原子手册9.4.2

你可能感兴趣的:(linux)