代码之家  ›  专栏  ›  技术社区  ›  M. Evers

如何从PocketBeagle上的SD卡引导裸机?

  •  1
  • M. Evers  · 技术社区  · 6 年前

    我想做的是:

    我正在试着启动我的新 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节),如果我命名文件,我可以从带有FAT文件系统的SD卡引导到此代码 MLO . 现在,如果我在汇编代码中获得了正确的寄存器,那么PocketBeagle上的USR0、USR1、USR2和USR3指示灯应该亮起。(参见此处 USR to PIN Mappings )这是因为GPIO1\U 21、22、23和24引脚对应于这4个LED,而这些引脚正是我(试图)设置为高的。

    但LED不会亮起。所以我做错了什么,但我想不出来。

    我所尝试的:

    关于PocketBeagle的在线文档很少。显然,袖珍小猎犬的电气性能应该与小猎犬的黑色非常相似。

    • 我试过TI StarterWare 它应该包含起作用的二进制文件。我使用了MLO和其中的一个示例程序,但运气不佳。此外,我一直没有成功地让项目自己编译。Code Composer Studio让我很沮丧。我曾试图研究如何修复CCS的工具链,但无可否认,我对这个主题的了解还不够,甚至不知道从哪里开始。
    • 我试过社区驱动 StarterWareFree . 这不附带二进制文件,但像上面一样,我无法编译,因为我的工具链不正常。
    • 我已经确定我的袖珍小猎犬还能用。我安装了BeagleBone社区建议的linux发行版,我在USR0 LED上看到了心跳信号。因此,董事会工作。
    • 我尝试使用Linux的MLO,但在我使用的图像中找不到MLO。。。
    • 我尝试改用GPIO\U SETDATAOUT寄存器;根据文档,它应该完成与我在组装中尝试做的相同的事情。(手册第25.4节。)
    • 我通过验证0xAA55的存在,确保电路板能够识别FAT文件系统 SD卡偏移量0x01FE处(我使用 HxD 这样做)。所以脂肪MBR就在那里。(第26.1.8.5.7.1节)

    我要找的是:

    一些方向。我该怎么办?我已经接受了一个事实,我可能无法让USR LED闪烁。我认为这本手册再也帮不了我了,而且网上也没有任何资源。我仍在学习嵌入式编程,我在Arduino和Atmel Studio取得了成功。我不是一个完全的新手,但我很感激你的指导。

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

    对于stackoverflow来说,这可能是一个格式很差的问题,但我对这个主题知之甚少。请告知。

    上下文-什么是袖珍小猎犬:

    我链接到了上面PocketBeagle的网站。对于那些不想离开的人,这里有一些信息。 它类似于BeagleBoneBlack。它有三个主要组件,一个微型USB端口、一个SD卡读卡器和Octavo系统OSD3358 1GHz ARM Cortex-A8片上系统。OSD3358包含AM3358 TI处理器;手册在上面。PocketBeagle的配置非常方便,因此它可以从SD卡启动,而无需费心处理SYSCONFIG引脚。所以你可以把代码放在SD卡上,放在小猎犬的口袋里,然后它就会引导到代码中。。。有希望地

    1 回复  |  直到 6 年前
        1
  •  2
  •   M. Evers    6 年前

    经过一些挖掘,我意识到我的代码是准确的,但我忘记了一步。在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。