经过一些挖掘,我意识到我的代码是准确的,但我忘记了一步。在GPIO1总线输出信号之前,我需要打开GPIO1总线时钟。控制该时钟的寄存器见的第8.1.12.1.29节
the manual
. 此外,我在
TI Website
.
我所做的:
我放弃了从FAT文件系统引导的尝试,转而采用“原始模式”引导参见本手册第26.1.8.5.5节。我最初避免使用这种方法,因为它的细节较少,但最终会更简单。
然而,这种方法有点棘手,因为我必须将原始字节写入SD卡。我用过
HxD
这样做。
在地址0处,我输入以下代码。。。这是手册第26.1.10节中描述的魔法代码。为了便于阅读,请在十六进制编辑器中查看此内容。
40 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 @...............
00 00 00 00 43 48 53 45 54 54 49 4E 47 53 00 00 ....CHSETTINGS..
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
C1 C0 C0 C0 00 01 00 00 00 00 00 00 00 00 00 00 ÃÃÃÃ............
00 [0x50-0x1FF]...
然后在地址0x200(512字节)之前必须有零。
我将二进制代码放在地址0x200处,并添加了手册第26.1.10.2节中描述的GP头。GP标头由2个字(每个字有4个字节)组成。第一个字是“image”(又名二进制)的大小,第二个字是ROM引导加载程序将放入代码的内存目标。
由于AM335x芯片的公共RAM从0x402F0400开始,我们希望将代码放在那里。(手册第26.1.4.2节)。记住,这是小恩迪安。我用FF表示我的图像大小,但实际上,它比我的图像大。
FF 00 00 00 00 04 2F 40
紧接着,我将编译后的汇编代码的二进制代码放在原始问题中。(所以我的代码从0x208开始)
总之,从0x200开始,十六进制转储如下
FF 00 00 00 00 04 2F 40 50 00 9F E5 AC 10 A0 E3
01 00 80 E0 02 10 A0 E3 00 10 80 E5 40 00 9F E5
4D 1F A0 E3 01 00 80 E0 00 10 A0 E3 00 10 80 E5
2C 00 9F E5 4F 1F A0 E3 01 00 80 E0 00 10 E0 E3
00 10 80 E5 01 28 A0 E3 01 20 42 E2 00 00 52 E3
F6 FF FF 0A 00 10 A0 E3 00 10 80 E5 F3 FF FF EA
00 00 E0 44 00 C0 04 48 00 00 00 00 00 00 00 00
我的最终装配是这样的
.equ GPIO1, 0x4804C000
.equ GPIO_OE, 0x134
.equ CM_PER, 0x44E00000
.equ CM_PER_GPIO1_CLKCTRL, 0xAC
.equ GPIO_DATAOUT, 0x13C
.globl _start
_start:
ldr r0, =CM_PER @Clocks control register bus.
ldr r1, =CM_PER_GPIO1_CLKCTRL @Offset of the clock register for GPIO1
add r0, r1
mov r1, #2 @Set the enable bit. Man 8.1.12.1.29
str r1, [r0]
_led_enable:
ldr r0, =GPIO1 @Register bank for GPIO1
ldr r1, =GPIO_OE @Register that controls output enable.
add r0, r1
mov r1, #0
str r1, [r0]
_main:
ldr r0, =GPIO1
ldr r1, =GPIO_DATAOUT @Register than controls the output of GPIO1
add r0, r1
ldr r1, =0xFFFFFFFF
str r1, [r0]
loop:
ldr r2, =0x00010000 @The start of a loop that may or may not work.
sub r2, #1 @I tried to make the USR LEDs blink, but I posted
cmp r2, #0 @this before I tested it.
beq _main
mov r1, #0
str r1, [r0]
_hang:
b _main
我的makefile看起来像原始问题中的makefile。