如何在PocketBeagle上从SD卡启动裸机?

时间:2018-01-25 00:07:19

标签: assembly arm embedded beagleboard bare-metal

我正在尝试做什么:

我正在尝试将我的新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非常相似。

  • 我已经尝试了TI StarterWare,它应该包含正常运行的二进制文件。我使用了MLO和一个没有运气的示例程序。另外,我没有成功完成自己编译的项目。 Code Composer Studio令我很沮丧。我已经尝试过如何修复CCS的工具链,但是,不可否认,我对这个主题知之甚少,甚至不知道从哪里开始。
  • 我尝试过社区驱动StarterWareFree。这不是二进制文件,但是,像上面一样,我无法编译,因为我的工具链出了问题。
  • 我确保我的PocketBeagle仍能正常工作。我安装了BeagleBone社区建议的linux发行版,我得到了USR0 LED的心跳。所以董事会工作。
  • 我尝试使用Linux的MLO,但我无法在我正在使用的图像中找到MLO ...
  • 我尝试使用GPIO_SETDATAOUT寄存器;根据文档,它应该完成我在程序集中尝试做的同样的事情。 (手册第25.4节。)
  • 我确保电路板可以通过验证0xAA55的存在来识别FAT文件系统 在SD卡的偏移量0x01FE处(我使用HxD执行此操作)。所以FAT MBR就在那里。 (第26.1.8.5.7.1节)

我在寻找:

某些方向。我从哪里开始?我接受了这样一个事实,即我可能无法让USR LED闪烁。我不认为手册可以帮助我,并且网上没有任何资源。我还在学习嵌入式编程,我在Arduino和Atmel Studio上取得了成功。我不是完全新手,但感谢指导。

在哪里可以查找有关嵌入式系统启动的信息? 是否有一个类似的简单问题我可以解决以帮助我理解?

这可能是stackoverflow格式不正确的问题,但我对这个主题知之甚少。请指教。

上下文 - 什么是PocketBeagle:

我链接到上面的PocketBeagle网站。对于那些不想离开SO的人,这里有一些信息。 它类似于BeagleBoneBlack。它有三个主要组件,一个微型USB端口,一个SD卡读卡器和Octavo Systems OSD33581GHzARM®Cortex-A8片上系统。 OSD3358包含AM3358 TI处理器;手册在上面。 PocketBeagle配置方便,可以从SD卡启动,而无需使用SYSCONFIG引脚。因此,您可以将代码放在SD卡上,将其放入PocketBeagle中,然后它将启动到该代码中......希望如此。

1 个答案:

答案 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看起来就像原来的问题一样。