树莓派的设备树驱动内核

11

我想使用设备树驱动的Linux内核启动Raspberry Pi,是否需要特殊操作呢?

有没有人可以指点一下如何设置设备树为基础的树莓派内核引导。

我可能需要用于设备驱动兼容设备树的Raspberry Pi内核源代码。如果需要,我应该在哪里找到这样的内核源代码呢?


4
请尝试观看http://www.youtube.com/watch?v=m_NyYEBxfn8。 - sawdust
你的树莓派目前运行的是哪个Linux版本? - m-ric
bcm2835自Linux-3.7以来似乎使用设备树。 - m-ric
@m-ric:我正在使用来自http://downloads.raspberrypi.org/raspbian_latest 的2014年1月版raspbian映像,它使用Linux内核3.12.20+。但似乎它正在使用BSP bcm2708而不是带有设备树的bcm2835。 - Craig McQueen
1
@CraigMcQueen RaspPi的引导程序是闭源的。很可能你正在使用的start.elf不支持设备树。因此,你需要获取一个新的。你看过这些帖子了吗?https://github.com/raspberrypi/linux/issues/24 https://github.com/raspberrypi/linux/wiki/How-to-boot-using-device-tree - m-ric
1个回答

16

树莓派上的设备树支持

树莓派采用了 ARM11 SoC: Broadcom BCM2835。ARM 的设备树(DT)支持相对较新,但似乎已经应用到了树莓派 CPU 上。你可以在arch/arm/boot/dts/bcm2835.dts*找到树莓派的 DT。

然而,默认的配置文件bcm2835_defconfig并未启用设备树:

$ grep DT arch/arm/configs/bcm2835_defconfig
<nothing interesting>

我原以为可以像 CONFIG_OF*=y 或者 CONFIG_USE_OF=y 那样做,但不幸的是,这将会非常困难和漫长(需要3个月时间?)。

有没有特别的事情要做来实现呢?

这取决于您当前的 Linux 内核版本。您现在使用的 Linux 版本可能已经使用了设备树(Linux 3.7 或更新版本?)。

如果没有,那么您需要学习广泛的变化:

设备树对系统的影响

设备树完全改变了 Linux 内核引导的方式。它会影响到以下方面:

  1. 引导加载程序(例如 u-boot.bin)。U-Boot 必须知道如何处理设备树。旧的 U-Boot 不知道什么是设备树......
  2. Linux 内核镜像(例如 zImage)。Linux 必须知道它必须在设备树中获取其硬件描述。
  3. 闪存/SD 卡分区布局。您需要为设备树文件腾出空间。

影响意味着:您需要一种方法来编译/烧录这些镜像:完整的源代码、构建环境、UART 访问、可能是 JTAG 硬件。在没有 JTAG 的情况下更改引导加载程序通常是自杀行为,除非您可以安全地从板子上重新编程您的 SD 卡。

谈到设备树时,您可能会找到OpenFirmware(OF) 的参考资料。在选择设备树约定之前,OpenFirmware 是 IBM PowerPC 上的原始规范。与设备树相关的代码在 Linux 中以 of_ 为前缀。这并不直观......

请阅读:

  1. http://devicetree.org/Main_Page
  2. Documentation/devicetree

如何生成设备树二进制文件(.dtb)?

以下是使用 buildroot 在 PowerPC 板上的示例:

/usr/bin/make -j5 HOSTCC="/usr/bin/gcc" HOSTCFLAGS="" ARCH=powerpc INSTALL_MOD_PATH=/home/evigier/buildroot/output/target CROSS_COMPILE=" /home/evigier/buildroot/output/host/usr/bin/powerpc-buildroot-linux-gnu-" DEPMOD=/home/evigier/buildroot/output/host/sbin/depmod -C /home/evigier/buildroot/output/build/linux-master mpc8347.dtb

以下是 PowerPC 板上示例 U-Boot 控制台输出:

Uncompressing Kernel Image ... OK
kernel loaded at 0x00000000, end = 0x006f8780
## cmdline at 0x0ff1b900 ... 0x0ff1b925
## initrd_high = 0xffffffff, copy_to_ram = 1
ramdisk load start = 0x00000000, ramdisk load end = 0x00000000
## device tree at 00780000 ... 00781f57 (len=20312 [0x4F58])
Loading Device Tree to 0ff16000, end 0ff1af57 ... OK
## Transferring control to Linux (at address 00000000) ...
Booting using OF flat tree..

祝你愉快地编写代码 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接