我正在尝试将我的新PocketBeagle启动到普通的汇编程序中。
.equ GPIO_BANK1, 0x4804C000
.equ GPIO_OE, 0x134
.equ GPIO_USR_SETPIN0, 0x194
.equ GPIO_USR_PIN0, 0x13C
.globl _start
_start:
ldr r0, =GPIO_BANK1
ldr r1, =GPIO_OE @ Get the output enable register
add r0, r1
mov r1, #0 @ Set all of the GPIO1 Pins to output
str r1, [r0]
_main:
ldr r0, =GPIO_BANK1
ldr r1, =GPIO_USR_PIN0 @ Get the output register
add r0, r1
mov r1, #1
lsl r1, #24
str r1, [r0] @ Set the USR LED to hi.
loop:
ldr r2, =0x00010000
sub r2, #1
cmp r2, #0
beq _main
mov r1, #0
str r1, [r0]
_hang:
b _main
我使用以下makefile编译此文件
ARMGNU = arm-eabi
boot.bin: boot.asm
$(ARMGNU)-as boot.asm -o boot.o
$(ARMGNU)-ld -T linker.ld boot.o -o boot.elf
$(ARMGNU)-objdump -D boot.elf > boot.list
$(ARMGNU)-objcopy boot.elf -O srec boot.srec
$(ARMGNU)-objcopy boot.elf -O binary boot.bin
根据the manual第26.1.6节(SD引导的26.1.8.5),如果我将文件命名为MLO
,我可以从带有FAT文件系统的SD卡启动此代码。现在,如果我在汇编代码中得到了我的寄存器,那么PocketBeagle上的USR0,USR1,USR2和USR3 LED应该点亮。 (见这里USR to PIN Mappings)这是因为GPIO1_21,22,23和24引脚对应于那4个LED,这些是我(试图)设置为高电平的引脚。
但LED不亮。所以我做错了什么,但我无法弄清楚。
关于PocketBeagle在线的文档非常少。显然,PocketBeagle应该与BeagleBone Black非常相似。
在哪里可以查找有关嵌入式系统启动的信息? 是否有一个类似的简单问题我可以解决以帮助我理解?
这可能是stackoverflow格式不正确的问题,但我对这个主题知之甚少。请指教。
我链接到上面的PocketBeagle网站。对于那些不想离开SO的人,这里有一些信息。 它类似于BeagleBoneBlack。它有三个主要组件,一个微型USB端口,一个SD卡读卡器和Octavo Systems OSD33581GHzARM®Cortex-A8片上系统。 OSD3358包含AM3358 TI处理器;手册在上面。 PocketBeagle配置方便,可以从SD卡启动,而无需使用SYSCONFIG引脚。因此,您可以将代码放在SD卡上,将其放入PocketBeagle中,然后它将启动到该代码中......希望如此。
答案 0 :(得分:1)
经过一番挖掘,我意识到我的代码是准确的,但我忘记了一步。我需要在GPIO1总线输出信号之前打开GPIO1总线时钟。控制该时钟的寄存器可以在the manual的8.1.12.1.29节中看到。另外,我在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个字节)。第一个词是'图像'的大小。 (又名你的二进制文件)和第二个字是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看起来就像原来的问题一样。