制作我的第一个嵌入式 Linux 系统

这篇文章记录了我构建第一个 Linux 系统的历程。我一开始完全没有 PCB 经验,现在我来记录我构建 Linux 版 PCB 的历程。

本文的开头部分可能看起来有些离题,但我保证各个部分都是连贯的,所以请耐心阅读全文。

目录

打开目录

别害怕!

虽然我并没有声称我的设计应该立即投入生产并用于管理医院患者的治疗,但我确实认为我的原型至少可以启动并运行 Linux,如果你正在阅读这篇文章,这可能是你唯一的目标。一旦你克服了这个最初的障碍,你就会更好地了解下一步该怎么做才能真正做好生产准备。

作为一个非 PCB 专家,我敢肯定,我在设计 Linux 主板时犯了很多新手错误,但最终还是完成了任务 — 而且比我想象的要容易。如果你了解一些电气工程基础知识,并且纪律严明,每天可以抽出几个小时,我想你可能只需要几天的时间就能组装出一个可以启动 Linux 的类似原型。我希望这能给你带来启发,希望本文能让你更快地完成这一旅程。

预读

如果 V = IR 对你来说毫无意义,那么你或许应该退后一步,回顾一下电路的基础知识。在继续阅读之前,你应该对电阻、电容和电感等词汇有一些直观的了解。话虽如此,但本文的其余部分应该很容易理解,只需要具备电子学的基础知识(反正我知道的也不多)。

现成的 PCB 和隐藏细节

像 Raspberry Pi 这样的 PCB 既好用又受欢迎,但如果我们只是继续使用它们,尤其是按照制造商的基本教程,我们可能对它们的工作原理不太了解;而我们需要这些知识来制作我们的 PCB。我的观察是,微控制器尤其如此,所以我们将以此为例。

不过,首先,让我们看看 Linux 有什么不同。例如,如果您使用 Raspberry Pi 启动 Linux 或任何其他主板,在某个时候,您将进入一个熟悉的环境区域。无论您使用的是功能齐全的桌面 Linux 还是一些小型 RPi 映像,您仍然会看到 /dev 之类的东西,并且经常运行熟悉的命令,如 ls 等。原因是 Linux 系统的 API(ABI?)的稳定性。微控制器不存在这样的标准化。

当您将示例代码加载到 Arduino 开发板时,与 STM32 Nucleo 开发板相比,您可能会经历完全不同的过程。不仅加载代码的过程不同,而且编写代码本身的方法也可能大不相同。我们看到不同的 IDE 和流程可以做同样的事情:编写一些 C 代码来闪烁 LED。遗憾的是,制造商确实经常逼迫我们使用他们的定制流程(大概是为了增加供应商锁定;有意或无意地,请运用您的判断力和怀疑态度)。

第一个定制 PCB 板(不支持 Linux)

观察上述情况后,我决定制作自己的第一个 PCB,上面带有一些可编程数字逻辑,并使其尽可能简单。

首先,对电路板进行编程到底意味着什么?我们编写一些代码,编译它,以某种方式将其发送到能够运行编译后的机器代码的芯片,然后观察效果。我不会专注于编写和编译代码,而是关注之后发生的事情。

启动芯片

想到一些极其简单的微控制器,我问自己——当我打开芯片时会发生什么(无论我怎么做)?它从哪里读取代码?它如何让我有机会首先给它一些代码?

几年前,我在寻找最便宜的 MCU,然后偶然发现了 Atmel ATtiny MCU(我相信这个品牌现在是 Microchip)。你可以以每片 1 美元甚至更低的价格购买这些 MCU。现在的问题是,一旦我们有了这个芯片,但只有芯片而没有其他东西,我们如何开始使用它?对于这么小的芯片,这肯定非常简单。

从概念上讲,在提供电源电压后,ATtiny 芯片将检查其引脚的状态。如果您满足某些条件,例如将某些引脚设置为高电平或低电平,芯片将进入编程模式。此模式允许您通过某种协议(例如 SPI)与芯片通信,并使用一些代码加载其片上闪存。在您对加载的代码感到满意后,您可以重置芯片,“取消满足”编程条件,然后让新代码运行。

程序员的使用(例如“龙争虎斗”)

但是,如果我使用电脑,我没有任何单独的引脚或电线伸出来执行上述操作,更不用说运行 SPI 协议之类的东西了。我可能有很多 USB 端口,并且许多预制的 PCB 通过 USB 连接到我们的电脑进行编程,所以这可能是正确的方法。

但是,我这里没有电路板,只有芯片,那么我该如何通过 USB 进行编程呢?ATtiny 仅支持 SPI 编程,因此必须有某种东西来弥补 USB 和 SPI 之间的差距。

在 ATtiny 的案例中,有一种东西叫做 AVR 龙 这就是解决这个问题的方法。

图片来自 官方 AVR Dragon 页面

这是一个可以通过 USB 连接到计算机的设备,通过计算机上的某些软件进行驱动,以进行我们上面提到的信号编排。一旦您的计算机命令 AVR Dragon 对 ATtiny 芯片进行编程,AVR Dragon 将满足编程条件并与芯片本身运行协议(例如 SPI),以使用编译后的代码填充微控制器的片上闪存。

对于 ATtiny 用例,我能够通过使用面包板连接 Dragon 和 MCU 来进行编程。编程会失败,直到我发现有一个参数可以减慢代码上传到 MCU 的数据速率,一旦我这样做了,面包板设置就可以正常工作。我所要做的大部分工作就是将 AVR Dragon 的 SPI 连接到我的芯片的 SPI。

编程达人:avrdude

我们现在有 USB -> SPI 舞蹈的硬件解决方案,但是我们的主机上什么可以实现这种编程?

需要有一个应用程序将 USB 端口上的消息驱动到 Dragon。就我而言,我使用了 avrdude。这是一个开源应用程序,可以对各种 Atmel/Microchip 芯片进行编程,包括 ATtiny 系列。avrdude 的参数之一是您正在进行哪种编程。就我而言,这就像将其中一个标志设置为 avr_dragon 之类的东西一样简单。

有了它,我就能够用一些代码加载我的 ATtiny,然后关闭它,将它放在另一个面包板上,并闪烁一些 LED。

太好了,如果我要用 ATtiny 芯片做 PCB,现在我有一些重要的信息:

  • 我要么像这里一样在单独的表面上对芯片进行编程,然后将它们“放入”它们的操作环境中,要么……
  • 暴露 SPI 引脚,以便我可以将它们连接到 AVR Dragon。

如果相同的引脚连接到 LED 之类的东西,后者会产生明显的后果,当 Dragon 将引脚设置为高电平和低电平时,它们会闪烁,但这在这里并不重要。

什么是龙?我需要它吗?

现在我们解开了 ATtiny 的端到端编程流程,我们了解到 AVR Dragon 不会做任何非常复杂的事情——只要我们有 一些 可以向芯片发送一些 SPI 消息的设备,我们可以使用该设备作为编程器。

嗯,有趣的是,avrdude 可以与以 avr_dragon 为参数的同一标志一起使用不同的标志值。此值旨在用于 Raspberry Pi,并利用 RPi 的 GPIO 引脚进行编程。详细的说明是 这里

为 ATtiny 设计 PCB

此时,我有一种简单的方法,即使用连接到计算机的面包板和 AVR Dragon 来对我的 ATtiny 进行编程,但如果我愿意,我甚至可以省去 Dragon。

我现在的 PCB 目标是设计一个 PCB,上面有一个插座,可以插入预编程的 ATtiny。一旦该 PCB 通电,一些 LED 就会闪烁。

这是一个非常简单的 PCB。您只需要一个 DIP-8 插座(可替换面包板的孔)和一些 PCB 走线(可替换面包板原型的跳线)。我的电路将由一条 5 V 走线供电,该走线进入芯片,然后有 2 条走线从 GPIO 出来为 LED 供电,然后到处都有一条 GND 走线来闭合电路。结果如下:

USB 设备的十六进制转储

实际的 PCB 如下:

USB 设备的十六进制转储

因此,这里的设计分为两个部分:原理图和物理实现。原理图是类似于教科书的电路逻辑模型。设计完成后,您将单击工具中的一个按钮,使用该按钮您将获得一个空白的 PCB 表面来组织您的组件并连接它们。原理图驱动您的工作,您的 EDA 工具可以使用它来捕获错误,例如,如果您尝试建立原理图中不存在的连接。

您可以观看 Robert Feranec 编写的关于如何构建您的第一个 PCB 的 7 步入门教程,虽然篇幅可能很长,但至少值得浏览一下,看看知识渊博的人是如何操作的:

现在我已经成功完成了这个实验,我想让我们全力以赴,制作一个嵌入式 Linux 板。

设计嵌入式 Linux 系统需要什么?

Jay Carlson 写了一篇关于如何入门的优秀高级文章,你可以在这里找到它 此链接

如果您已经了解“为什么是嵌入式 Linux”,则可以跳过那里的大量介绍文字,直接进入设计工作流程部分。不过,我们将处理比 BGA 封装简单得多的内容,并且还将跳过 DDR 路由等复杂部分,因为我们的所有 RAM 都将位于我们将要探索的 SoC 的片上。我们也不会对信号完整性过于严格,因为我们的所有组件都将运行得相当快(慢?),并且在设计决策方面会很宽容。

考虑到这一点,仍然请阅读杰伊的文章,并将本文视为对杰伊所写内容的更温和的介绍。

启发性设计

正如我在关于在 5 美元硬件上运行 Linux 的文章中所写,我对第一个嵌入式 Linux 系统的灵感来自 运行Linux的名片。事实上,它是一张名片,这向我表明它的设计应该尽可能简单,而且这是值得研究的正确设计。

这篇文章的作者慷慨地发布了 示意图 对于电路设计和理解来说,这是旅程的第一部分。

设计原理图

这个鼓舞人心的设计中并没有那么多组件,这似乎是正确的。毕竟,我们已经证明了仅使用板载闪存和 Allwinner SoC 就可以启动和运行 Linux!让我们分解设计原理图的问题并将其集中在 F1C100s SoC 上。

电源

正如 Jay Carlson 所提到的,并且灵感设计证实,支持 Linux 的 SoC 将需要几种不同的电源电压。如果我们查看 F1C100s 数据表,我们会看到以下内容:

USB 设备的十六进制转储

我们在游戏中看到了几种不同的电压,如 VCC-IO、VDD-CORE 等。

对于一些值来说,3.3 V 似乎是推荐电压,因此我们现在可以标记出我们需要在电路板上使用这个电压。我们还看到 VCC-DRAM 为 2.5 V,并且它仍然在 AVCC 的 OK 值范围内。因此,让我们将 2.5 V 添加到我们需要的板载电压列表中。最后,VDD-CORE 的范围相当“狭窄”,我们将 1.1 V 添加到我们的列表中。

Linux 主板可以通过 USB 主机供电,这意味着我们的主板将通过 USB 连接到另一台机器并从那里获取 5 V 电压。如果这看起来有点陌生,请查看我最近关于构建 USB 设备的文章。这是我们从“外部世界”获得的唯一电压,我们需要在我们的 PCB 上配备一些可以将 5 V 转换为上述值的组件。

我们将使用电压调节器来实现这些功能,我们需要 3 个电压调节器,每个电压对应一个。我们将在这些电压调节器周围放置一些电容器,要找出应该做什么,您可以打开电压调节器的数据表,找到一个标题为“典型应用”的部分。

USB 设备的十六进制转储

水晶

F1C100s 需要一些振荡才能以 24 MHz 时钟速度运行。因此,我们需要一个 24 MHz 晶体,并且需要一些电容器围绕它。幸运的是,这是一个众所周知的配方。请查看 这一页 对于这个配方(晶体+2个电容器)。

是的,在我的设计中,我也估计 Cstray 为 5 pF。

去耦电容

我们需要在电源引脚周围放置一堆去耦电容。我不会谈论太多超出我专业范围的事情,我只会链接到一些我发现的关于这个主题的有用的 YouTube 视频。

第一个可以让您非常清楚地了解这些电容器的作用:

接下来是 Zach Peterson 制作的有关实际用例的精彩视频:

最后,我还发现 EEVblog 上的这个视频有助于扩展我对这种电容器用法的直觉:

我几乎到处都使用了一堆 100 nF 去耦电容器。

连接器、引脚和 IO

我通过 USB 连接(板载 USB-micro 连接器)为 PCB 供电,并使用同一连接填充板载闪存/RAM(稍后会详细介绍)。我想说,对于这个练习,您至少需要这样做。

此时您要添加的其他引脚和连接由您选择。您希望 PCB 如何与外界交互?也许您想公开 I2C 端口、UART 端口或其他端口,这完全取决于您。

您可能希望使调试更容易的一件事是添加一些 LED,这应该很容易。

“FEL模式”按钮

回到关于在 5 美元硬件上运行 Linux 的文章:使用 F1C100 的 FEL 模式对我们来说非常重要。我将在本文中再次简要介绍这一点,但现在 — 我添加了一个按钮,该按钮将接地 SPI 闪存上的时钟,从而有效地将其关闭。这看起来可能很奇怪,但它使生活变得更轻松。

SPI 闪存

这里出了点问题。:) 我想要一个 16 MB 的闪存芯片,但最后只得到了 2 MB。不确定是我搞砸了还是制造商搞砸了(包括其文档或其他方面),但没关系,我设法在这里摆脱了困境。关于编程 ATtiny 的最初漫谈是这里的一个重要教训!

更重要的是,目前,SPI 闪存有以下几点:

  • 我们希望它足够大来存储我们的 Linux 映像,甚至可以存储一些运行时数据(可选)。
  • 理想情况下,我们希望它由我们已有的板载电压供电。3.3 V 应该可以做到。

SVREF 怪异之处

SoC 上有一个非常奇怪的引脚,称为 SVREF。数据表只说它存在,没有提到这个引脚。在这种情况下,我只是查看了其他设计在这里的作用并复制了该方法。对于这个特定的东西,我只是应用了一个简单的基于电阻的分压器(例如,查看灵感设计的原理图)。

混凝土构件

我们上面列出的几乎是将 Linux 系统整合在一起所需的一切。但是,您确实需要弄清楚哪些组件 确切地 您希望在设计中使用哪种元件。例如,您希望使用 100 nF 去耦电容器,但您的制造商可以使用的型号有很多,每种型号都有不同的特性(价格包含在特性中)。此外,您的制造商可能更喜欢这些元件中的一些,其中一些元件可能可以更快地添加到您的 PCB 中,其中一些元件可能有库存,也可能没有库存,等等。就我而言,我使用了 JLCPCB,他们称这些为“更易于使用”的部件 基本部件

对于原型,请确保各部件能够很好地连接在一起。例如,如果您使用电阻器,请确保它能够处理您流过的电流。此外,还要注意几何形状,即封装。封装是组件的空间和连接布局。您会看到电阻器等的不同名称。有 0603 电阻器,但它们比 0402 电阻器大。对于电容器和电阻器,我主要使用 0402 封装。

最后,我喜欢使用 EasyEDA 进行此练习还有一个重要原因:他们提供了一个庞大的组件库,可以将它们连同封装一起放到 PCB 上。PCB 设计师(据我所知,我不是 PCB 设计师)经常花时间研究组件数据表和其他东西,以确定确切的封装是什么以及如何将它们与他们想要使用的组件匹配 – EasyEDA 与 JLCPCB 制造过程非常契合。

将原理图放在一起

看一下此处的示意图。

USB 设备的十六进制转储

注意:请不要期待一个非常易读的原理图。:) 经验丰富的 PCB 人员在看到它后可能会退缩。这只是一个概念验证,而且很老套。最重要的是,我绝对不是 PCB 专家。我从来没有真正想过要分享这个原理图,但我想它对你们中的一些人仍然有用。

下面我将总结一下该示意图中发生的情况:

  • SoC 的大多数引脚都未连接。SoC 本身是 U1。
  • U2、U3 和 U4 是电压调节器,用于获取启动 SoC 所需的不同电压。
  • U5 是 SPI NOR 闪存。再次查看有关 5 美元硬件 Linux 的旧文章,了解如何从这里启动等等。可以通过按住原理图中的 U6 按钮来“禁用”此内存,这将使时钟信号接地。这使您能够重新启动 SoC 并使其相信没有任何东西可以启动,从而强制它进入 FEL 模式。
  • U7是复位开关。
  • U8 和 U9 是 LED 驱动器。完全是大材小用,您只需将 LED 连接到 GPIO 即可。
  • 此时应该很容易发现去耦电容器(它们有很多)。
  • USB1 是 USB-micro 连接器,它既为电压调节器提供原始 5 V 电压,也为您提供差分对,您可以将其路由到 SoC 进行 USB 通信。查看有关制作 USB 设备的文章以了解这里发生了什么。
  • X 是晶体,它遵循将晶体连接到芯片的标准配方。
  • L1 是铁氧体磁珠。据我所知,很多时候当你将 USB 插入带有 USB 端口的插座时,5 V 电压可能会很吵,这时铁氧体磁珠会有所帮助。
  • 其余大部分只是用于向外界公开信号的接头针。

差不多就是这样了!

PCB 布线

现在我们有了原理图,是时候对东西进行布线并最终得到真正的电子设备了。

对我来说,这里的一大挑战是布置这些去耦电容器。根据最佳实践,它们应该尽可能靠近 SoC 引脚(查看上面的视频),但 SoC 封装使事情变得具有挑战性。我以为是我缺乏经验,但后来我发现了 Phil's Lab 的一个视频,其中详细介绍了这个问题。也就是说,这种封装称为 QFN 封装,这里的引脚非常密集,一切都非常小。即使这些电容器不是很大,它们仍然会很快聚集在这些 SoC 引脚周围,事情变得困难。这时我决定按照 Phil 分享的最佳实践改用 4 层 PCB。视频如下:

这里看似具有挑战性的另一部分是 USB 布线。但是,我们只使用全速 USB 2.0,这非常非常宽容。再次,在这里刷新您对 USB 设备的知识,不要太担心。我只是使用了 EasyEDA 的差分对布线从 USB-micro 连接器到 SoC。无需过多关注走线宽度和长度,只要它们都是合理的(例如,我猜将走线长度保持在 2 英寸以下,并且不要使用一些奇怪的宽度);一切都会顺利进行。

其余一切都应该非常简单。我使用了以下层堆栈:信号-GND-电源-信号。

  • 顶部信号层有很多 GPIO 走线,以及 USB 差分对(据我所知,在布线差分对时不应该跳越不同的层)。
  • GND 就是地,整个层。
  • 在电源层,我使用相当粗的走线布置了不同的电压来为 SoC 供电。
  • 底部信号层主要为去耦电容。
  • 我认为我不应该更详细地讨论路由——我可能会给出错误的认识,所以我就在这里停下来。

    创建软件映像

    理想情况下,我应该为这块主板创建一个自定义设备树,但我很懒,想立即看到结果。为了在 5 美元的硬件上运行 Linux,我为 Lichee Pi 创建了一个映像,它除了 SoC + 闪存之外没有太多其他东西,我决定使用它,它应该可以正常工作。

    它确实能工作,但有一个问题 — 正如我所说,不知何故我最终得到的是 2 MB 板载闪存,而不是我最初打算的 16 MB。缩减映像需要做很多工作,我只是想看看它能不能工作。

    这就是 FEL 模式的亮点所在,也是为什么拥有像那个可以轻松禁用板载闪存的 hack 按钮这样的东西很重要。我使用 sunxi-fel 工具与我的 SoC 通信,因为它通过 USB 差分对直接暴露在我的计算机上。此工具可以为您做的事情之一是用一些内容填充 RAM,然后在保留这些内容的同时启动。这就是为什么我在介绍中谈到了编程 ATtinys 并弄清楚您可以通过哪些方式将字节传输到芯片中并让它运行您希望它运行的一些代码。

    因此,我没有从板载闪存加载 U-boot FIT 映像,而是从我的计算机下载并从那里启动。Linux 运行良好。

    为了更加确信我与板载闪存的连接能够按预期工作,我可以打包 U-boot 映像并将其写入 NOR 闪存存储器,但将 Linux 放在一起很麻烦。不过,U-boot 工作得很好。

    结论

    这是一次极其复杂的旅程,但它满足了我的很多好奇心,在经过所有的研究、设计和等待制造之后,看到 PCB 栩栩如生,感觉很棒。我希望你在组装第一个嵌入式 Linux 系统时也能感受到同样的喜悦。祝你好运!

    请考虑关注 推特/XLinkedIn 保持更新。

    USB 设备的十六进制转储


    1718531610
    #制作我的第一个嵌入式 #Linux #系统
    2024-06-16 06:51:25

    Leave a Reply

    Your email address will not be published. Required fields are marked *

    近期新闻​

    编辑精选​