安泰电子世界网 首页 Ardunio Raspberry Pi 硬件(七)

Raspberry Pi 硬件(七)

2024-11-5 16:53 | 发布者: txc | 查看: 78 | 评论: 0

简介:Raspberry Pi 硬件

USB 启动模式

警告默认情况下,Raspberry Pi 从 SD 卡启动。对于新用户和没有经验的用户,这是推荐的方法。

USB 有两种单独的启动模式:USB 设备启动和 USB 主机启动。
两种启动模式之间的选择由固件在启动时读取 OTP 位时进行。有两个位来控制 USB 启动。第一个启用 USB 设备启动,默认启用;第二个启用 USB 主机启动。如果设置了 USB 主机启动模式位,则处理器读取 OTGID 引脚以决定是作为主机启动(像在任何 Raspberry Pi 型号 B/B+ 上一样驱动到零)还是作为设备(左浮动)。Raspberry Pi Zero可以通过USB连接器上的OTGID引脚访问此引脚,而计算模块可以访问边缘连接器上的此引脚。
还有一些 OTP 位允许使用某些 GPIO 引脚来选择 Raspberry Pi 应尝试使用的启动模式。

注意USB 启动模式仅适用于某些型号。

USB 设备启动模式

注意设备启动仅在 Raspberry Pi 计算模块、计算模块 3、Raspberry Pi Zero、Zero W、A、A+ 和 3A+ 上可用。

激活此启动模式后(通常在从 SD 卡启动失败后),Raspberry Pi 将其 USB 端口置于设备模式并等待主机的 USB 重置。可以在 Github 上找到显示主机需要如何与 Raspberry Pi 通信的示例代码。
主机首先将结构发送到设备关闭控制端点 0。这包含启动的大小和签名(未启用安全性,因此不需要签名)。其次,代码沿端点 1 (bootcode.bin) 传输。最后,设备将回复以下成功代码:

  • 0 - Success

  • 0x80 - Failed

USB 主机启动模式

注意主机启动仅在 Raspberry Pi 3B、3B+、3A+ 和 2B v1.2 上可用。树莓派 3A+ 仅支持大容量存储启动,不支持网络启动。

USB 主机启动模式遵循以下顺序:

  • 启用 USB 端口并等待 D+ 线被拉高,表示 USB 2.0 设备(我们仅支持 USB2.0)

  • 如果设备是集线器:

    • 为集线器的所有下游端口启用电源

    • 对于每个端口,循环最多两秒(如果设置了 program_usb_boot_timeout=1,则循环五秒)

      • 从复位中释放并等待 D+ 被驱动为高电平以指示设备已连接

      • 如果检测到设备:

        • 发送“获取设备描述符”

          • If VID == SMSC && PID == 9500

            • 将设备添加到以太网设备列表

        • If 类接口 == 大容量存储类

          • 将设备添加到大容量存储设备列表

  • Else

    • 枚举单个设备

  • 浏览大容量存储设备列表

  • 浏览以太网设备列表

USB 大容量存储启动

注意仅适用于 Raspberry Pi 2B v1.2、3A+、3B、3B+、4B、400 和 Zero 2 W,以及 Raspberry Pi 计算模块 3、3+ 和 4。

您可能希望从 USB 大容量存储设备(如闪存驱动器或 USB 硬盘)启动 Raspberry Pi。连接 USB 设备(尤其是硬盘和 SSD)时,请注意它们的电源要求。如果您计划将多个 SSD 或硬盘连接到 Raspberry Pi,这通常需要外部电源 - 供电硬盘盒或供电 USB 集线器。

注意Raspberry Pi 4B 之前的型号存在已知问题,这些问题会阻止使用某些 USB 设备启动。

Raspberry Pi 4B 和 Raspberry Pi 400

Raspberry Pi 400 和更新的 Raspberry Pi 4B 主板中的引导加载程序默认支持 USB 启动,但可能需要修改BOOT_ORDER引导加载程序配置。在早期的 Raspberry Pi 4B 主板上,或者要选择备用引导模式,必须更新引导加载程序。
看:

计算模块 4

请参阅刷新计算模块 eMMC 以获取引导加载程序更新说明。

Raspberry Pi 3B+

Raspberry Pi 3B+ 支持开箱即用的 USB 大容量存储启动。

Raspberry Pi 2B, 3A+, 3B, CM3, CM3+, Zero 2 W

在树莓派 2B v1.2、3A+、3B、零 2 W 以及计算模块 3 和 3+ 上,您必须先启用 USB 主机启动模式。这是为了允许 USB 大容量存储启动和网络启动

注意Raspberry Pi 3A+ 或 Zero 2 W 不支持网络启动。

要启用 USB 主机启动模式,Raspberry Pi 需要从 SD 卡启动,并带有一个特殊选项,用于在一次性可编程 (OTP) 存储器中设置 USB 主机启动模式位。设置此位后,不再需要 SD 卡。

警告您对 OTP 所做的任何更改都是永久性的,无法撤消。
  • 在 Raspberry Pi 3A+ 上,将 OTP 位设置为启用 USB 主机启动模式将永久阻止该 Raspberry Pi 在 USB 设备模式下启动。
    您可以使用任何运行 Raspberry Pi OS 的 SD 卡对 OTP 位进行编程。
    启用 USB 主机启动模式:

echo program_usb_boot_mode=1 | sudo tee -a /boot/firmware/config.txt

这会将program_usb_boot_mode=1添加到 /boot/firmware/config.txt 的末尾。
尽管该选项名为 program_usb_boot_mode,但它仅启用 USB 主机启动模式。USB 设备启动模式仅适用于某些型号的 Raspberry Pi - 请参阅 USB 设备启动模式
使用 sudo reboot 重新启动 Raspberry Pi 并检查 OTP 是否已编程:

vcgencmd otp_dump | grep 17:
17:3020000a

检查是否显示输出0x3020000a。如果不是,则OTP位未成功编程。在这种情况下,请再次执行编程过程。如果仍未设置该位,则可能表示 Raspberry Pi 硬件本身存在故障。
如果您愿意,您可以从config.txt中删除program_usb_boot_mode线,因此如果您将 SD 卡放入另一个 Raspberry Pi,它不会对 USB 主机启动模式进行编程。确保config.txt末尾没有空行。
您现在可以从 USB 大容量存储设备启动,其方式与从 SD 卡启动的方式相同。有关详细信息,请参阅以下部分。

从 USB 大容量存储引导

该过程与 SD 卡相同 - 只需使用操作系统映像对 USB 存储设备进行映像即可。
准备好存储设备后,连接驱动器并打开 Raspberry Pi 的电源,同时了解外部驱动器的额外 USB 电源要求。
五到十秒后,Raspberry Pi 应该开始启动并在连接的显示器上显示彩虹闪屏。确保您没有在 Raspberry Pi 中插入 SD 卡,因为如果您这样做,它将首先从该卡启动。
有关启动顺序和备用启动模式(网络、USB 设备、GPIO 或 SD 启动),请参阅启动模式文档

已知问题

注意这些不适用于 Raspberry Pi 4 Model B。
  • 检查可启动 USB 设备的默认超时时间为 2 秒。某些闪存驱动器和硬盘的电源启动速度太慢。可以将此超时延长至五秒(向 SD 卡添加新的文件超时),但请注意,某些设备需要更长的时间才能响应。

  • 某些闪存驱动器具有非常特定的协议要求,引导代码不处理该协议,因此可能不兼容。

特殊的仅bootcode.bin启动模式

重要这不适用于 Raspberry Pi 4 Model B。

如果您无法使用特定的 USB 设备来启动 Raspberry Pi,另一种选择(可用于 Raspberry Pi 2B v1.2、3A+、3B 和 3B+)是使用特殊的仅限bootcode.bin启动模式。Raspberry Pi 仍将从 SD 卡启动,但 bootcode.bin 是唯一从中读取的文件。

硬件兼容性

在尝试从 USB 大容量存储设备启动之前,建议验证设备在 Linux 下是否正常工作。使用 SD 卡启动并插入 USB 大容量存储设备。这应该显示为可移动驱动器。这对于 USB SATA 适配器尤其重要,在大容量存储模式下,引导加载程序可能支持该适配器,但如果 Linux 选择 USB 连接 SCSI-UAS 模式,则该适配器将失败。
旋转硬盘驱动器几乎总是需要有源的 USB 集线器。即使一切看起来都正常,如果没有有源的 USB 集线器,您也可能会遇到间歇性故障。

多个可启动驱动器

在搜索可引导分区时,引导加载程序会并行扫描所有 USB 大容量存储设备,并选择第一个响应的 USB 大容量存储设备。如果引导分区不包含合适的 start.elf 文件,则选择下一个可用设备。没有根据 USB 拓扑指定启动设备的方法,因为这会减慢启动速度并增加不必要且难以支持的配置复杂性。

注意config.txt文件条件筛选器可用于在复杂设备配置中选择备用固件。

网络引导

本节介绍网络启动在 Raspberry Pi 3B、3B+ 和 2B v1.2 上的工作原理。
在 Pi 4 和 Pi 5 上,网络引导在 EEPROM 的第二级引导加载程序中实现。有关更多信息,请参阅 Raspberry Pi 4 引导加载程序配置
我们还有一个关于设置网络引导系统的教程
网络启动仅适用于上述型号的 Raspberry Pi 中内置的有线适配器。不支持通过无线局域网引导,也不支持从任何其他有线网络设备引导。

网络启动流

要进行网络引导,引导 ROM 执行以下操作:

  • 初始化板载以太网设备(Microchip LAN9500 或 LAN7500)

  • 发送 DHCP 请求(供应商类标识符 DHCP 选项 60 设置为 PXEClient:Arch:00000:UNDI:002001)

  • 接收 DHCP 回复

  • (可选)接收 DHCP 代理回复

  • ARP 到 tftpboot 服务器

  • ARP 回复包括 tftpboot 服务器以太网地址

  • TFTP RRQ bootcode.bin

    • 找不到文件:服务器回复 TFTP 错误响应,并显示文本错误消息

    • 文件存在:服务器将回复文件的第一个数据块(512 字节),标头中带有块号

      • Raspberry Pi 回复包含块号的 TFTP ACK 数据包,并重复直到最后一个块不是 512 字节

  • TFTP RRQ bootsig.bin

    • 这通常会导致找不到错误文件。这是意料之中的,TFTP 引导服务器应该能够处理它。

从此时开始,bootcode.bin代码将继续加载系统。它将尝试访问的第一个文件是 <serial_number>/start.elf。如果这不会导致错误,则要读取的任何其他文件都将在serial_number之前添加。这很有用,因为它使您能够为 Raspberry Pis 创建具有单独 start.elf / 内核的单独目录。
要获取设备的序列号,您可以尝试此启动模式并查看使用 tcpdump / wireshark 访问的文件,或者您可以运行标准的 Raspberry Pi OS SD 卡和 cat /proc/cpuinfo。
如果您将所有文件放入 TFTP 目录的根目录中,则将从那里访问以下所有文件。

调试网络启动模式

首先要检查的是OTP位是否正确编程。为此,您需要将 program_usb_boot_mode=1 添加到 config.txt 并重新启动(使用正确引导到 Raspberry Pi OS 的标准 SD 卡)。完成此操作后,您应该能够执行以下操作:

vcgencmd otp_dump | grep 17:

如果第 17 行包含 3020000a,则 OTP 已正确编程。您现在应该能够取出 SD 卡,插入以太网,然后以太网 LED 应该在 Raspberry Pi 通电后约 5 秒亮起。
要捕获服务器上的以太网数据包,请在 tftpboot 服务器(或 DHCP 服务器,如果它们不同)上使用 tcpdump。您将需要捕获那里的数据包,否则您将无法看到直接发送的数据包,因为网络交换机不是集线器!

sudo tcpdump -i eth0 -w dump.pcap

这会将 eth0 中的所有内容写入名为 dump.pcap 的文件。然后,您可以对数据包进行后处理或上传到 cloudshark 进行通信。

DHCP 请求/回复

至少,您应该看到如下所示的 DHCP 请求和回复:

6:44:38.717115 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 348)
    0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from b8:27:eb:28:f6:6d, length 320, xid 0x26f30339, Flags [none] (0x0000)
	  Client-Ethernet-Address b8:27:eb:28:f6:6d
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Discover
	    Parameter-Request Option 55, length 12:
	      Vendor-Option, Vendor-Class, BF, Option 128
	      Option 129, Option 130, Option 131, Option 132
	      Option 133, Option 134, Option 135, TFTP
	    ARCH Option 93, length 2: 0
	    NDI Option 94, length 3: 1.2.1
	    GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
	    Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
	    END Option 255, length 0
16:44:41.224619 IP (tos 0x0, ttl 64, id 57713, offset 0, flags [none], proto UDP (17), length 372)
    192.168.1.1.67 > 192.168.1.139.68: [udp sum ok] BOOTP/DHCP, Reply, length 344, xid 0x26f30339, Flags [none] (0x0000)
	  Your-IP 192.168.1.139
	  Server-IP 192.168.1.1
	  Client-Ethernet-Address b8:27:eb:28:f6:6d
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Offer
	    Server-ID Option 54, length 4: 192.168.1.1
	    Lease-Time Option 51, length 4: 43200
	    RN Option 58, length 4: 21600
	    RB Option 59, length 4: 37800
	    Subnet-Mask Option 1, length 4: 255.255.255.0
	    BR Option 28, length 4: 192.168.1.255
	    Vendor-Class Option 60, length 9: "PXEClient"
	    GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
	    Vendor-Option Option 43, length 32: 6.1.3.10.4.0.80.88.69.9.20.0.0.17.82.97.115.112.98.101.114.114.121.32.80.105.32.66.111.111.116.255
	    END Option 255, length 0

供应商选项选项 43 包含回复的重要部分。这必须包含字符串“Raspberry Pi Boot”。由于引导 ROM 中的错误,您可能需要在字符串末尾添加三个空格。

TFTP 文件读取

正确指定供应商选项后,您将看到正在发送的后续 TFTP RRQ 数据包。 RRQ 可以通过第一个数据块或错误提示未找到文件来回复。在一些情况下,他们甚至会收到第一个数据包,然后Raspberry Pi中止传输(在检查文件是否存在时会发生这种情况)。下面的示例只有三个数据包:原始读取请求、第一个数据块(始终是 516 字节,包含标头和 512 字节的数据,尽管最后一个块始终小于 512 字节,长度可能为零)和第三个数据包(包含帧号以匹配数据块中的帧号的 ACK)。

16:44:41.224964 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 49)
    192.168.1.139.49152 > 192.168.1.1.69: [no cksum]  21 RRQ "bootcode.bin" octet
16:44:41.227223 IP (tos 0x0, ttl 64, id 57714, offset 0, flags [none], proto UDP (17), length 544)
    192.168.1.1.55985 > 192.168.1.139.49152: [udp sum ok] UDP, length 516
16:44:41.227418 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 32)
    192.168.1.139.49152 > 192.168.1.1.55985: [no cksum] UDP, length 4

已知问题

以太网引导模式存在许多已知问题。由于启动模式的实现是在芯片本身中实现的,因此除了仅使用带有bootcode.bin文件的SD卡外,没有其他解决方法。

DHCP 请求在五次尝试后超时

Raspberry Pi 将尝试 DHCP 请求五次,中间间隔 5 秒,总周期为 25 秒。如果服务器在这段时间内无法响应,则 Raspberry Pi 将进入低功耗状态。除了在 SD 卡上bootcode.bin之外,没有其他解决方法。

不支持单独子网上的 TFTP 服务器

已在 Raspberry Pi 3 型号 B+ (BCM2837B0) 中修复。

DHCP 中继断开

DHCP 检查还检查跃点值是否为 1,DHCP 中继不会这样做。
已在 Raspberry Pi 3 型号 B+ 中修复。

Raspberry Pi 启动字符串

DHCP 回复中的“Raspberry Pi Boot”字符串需要额外的三个空格,因为计算字符串长度时出错。
已在 Raspberry Pi 3 型号 B+ 中修复。

DHCP UUID 常量

DHCP UUID 设置为常量值。
已修复 Raspberry Pi 3 型号 B+;该值设置为 32 位序列号。

ARP 检查在 TFTP 事务中途可能无法响应

Raspberry Pi 仅在初始化阶段响应 ARP 请求;一旦它开始传输数据,它将无法继续响应。
已在 Raspberry Pi 3 型号 B+ 中修复。

DHCP 请求/应答/确认序列未正确实现

在启动时,Raspberry Pi 广播 DHCPDISCOVER 数据包。DHCP 服务器回复 DHCPOFFER 数据包。然后,Raspberry Pi 继续启动,而无需执行 DHCPREQUEST 或等待 DHCPACK。这可能会导致两个单独的设备获得相同的 IP 地址,并在未将其正确分配给客户端的情况下使用它。
在这种情况下,不同的 DHCP 服务器具有不同的行为。dnsmasq(取决于设置)将对 MAC 地址进行哈希处理以确定 IP 地址,并对 IP 地址执行 ping 操作以确保它尚未被使用。这减少了发生这种情况的机会,因为它需要在哈希中发生冲突。

最新评论

友情链接:

返回顶部