如何从 PocketBeagle 上的 SD 卡启动裸机?
How can I boot bare metal from SD card on PocketBeagle?
我想做什么:
我正在尝试将我的新 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 section 26.1.6 (26.1.8.5 for SD booting), I can boot into this code from an SD card with the FAT filesystem if I name the file MLO
. Now, if I got my registers right in the assembly code, then the USR0, USR1, USR2, and USR3 LEDs on the PocketBeagle should light up. (See here 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 上取得了成功。我不是完全的新手,但感谢指导。
我在哪里可以找到有关嵌入式系统启动的信息?
有没有类似的更简单的问题可以帮助我理解?
对于 Whosebug,这可能是一个格式不正确的问题,但我对这个主题知之甚少。请指教
上下文 - 什么是 PocketBeagle:
我链接到上面的 PocketBeagle 网站。对于那些不想离开 SO 的人,这里有一些信息。
它类似于 BeagleBoneBlack。它具有三个主要组件,一个微型 USB 端口、一个 SD 卡 reader 和 Octavo Systems OSD3358 1GHz ARM® Cortex-A8 片上系统。 OSD3358 包含 AM3358 TI 处理器;手册在上面。 PocketBeagle 的配置非常方便,因此它可以从 SD 卡启动,而无需担心 SYSCONFIG 引脚。所以你可以把代码放在 SD 卡上,把它放在 PocketBeagle 中,它会启动到那个代码......希望如此。
经过一番挖掘,我意识到我的代码是准确的,但我忘记了一步。在GPIO1总线输出信号之前,我需要打开GPIO1总线时钟。控制这个时钟的寄存器可见the manual. Additionally, I found this noted in a forum on the TI Website.
的8.1.12.1.29节
我做了什么:
我放弃了从 FAT 文件系统启动的尝试,转而采用 'raw mode.' 中的启动方式,请参阅手册的第 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 header。 GP Header 由 2 个字组成(每个字 4 个字节)。第一个词是 'image'(又名您的二进制文件)的大小,第二个词是 ROM 引导加载程序将放置您的代码的内存目标。
由于 AM335x 芯片的 public 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 看起来和原来的问题一样。
我想做什么:
我正在尝试将我的新 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 section 26.1.6 (26.1.8.5 for SD booting), I can boot into this code from an SD card with the FAT filesystem if I name the file MLO
. Now, if I got my registers right in the assembly code, then the USR0, USR1, USR2, and USR3 LEDs on the PocketBeagle should light up. (See here 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 上取得了成功。我不是完全的新手,但感谢指导。
我在哪里可以找到有关嵌入式系统启动的信息? 有没有类似的更简单的问题可以帮助我理解?
对于 Whosebug,这可能是一个格式不正确的问题,但我对这个主题知之甚少。请指教
上下文 - 什么是 PocketBeagle:
我链接到上面的 PocketBeagle 网站。对于那些不想离开 SO 的人,这里有一些信息。 它类似于 BeagleBoneBlack。它具有三个主要组件,一个微型 USB 端口、一个 SD 卡 reader 和 Octavo Systems OSD3358 1GHz ARM® Cortex-A8 片上系统。 OSD3358 包含 AM3358 TI 处理器;手册在上面。 PocketBeagle 的配置非常方便,因此它可以从 SD 卡启动,而无需担心 SYSCONFIG 引脚。所以你可以把代码放在 SD 卡上,把它放在 PocketBeagle 中,它会启动到那个代码......希望如此。
经过一番挖掘,我意识到我的代码是准确的,但我忘记了一步。在GPIO1总线输出信号之前,我需要打开GPIO1总线时钟。控制这个时钟的寄存器可见the manual. Additionally, I found this noted in a forum on the TI Website.
的8.1.12.1.29节我做了什么:
我放弃了从 FAT 文件系统启动的尝试,转而采用 'raw mode.' 中的启动方式,请参阅手册的第 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 header。 GP Header 由 2 个字组成(每个字 4 个字节)。第一个词是 'image'(又名您的二进制文件)的大小,第二个词是 ROM 引导加载程序将放置您的代码的内存目标。 由于 AM335x 芯片的 public 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 看起来和原来的问题一样。