制作自己的嵌入式 Linux 电脑(5)

在把USB缆线接到USB设备口上,没有出现什么意外,而且我看到了一个新的串口 /dev/ttyACM0 出现。再用SAM-BA程序(用来对启动加载程序和内核编程)打开,一切都能用了。许多人说焊接BGA很难,但是从这次经验来看,我觉得还好。也许只是幸运吧,但是我的确没出什么问题就搞定了。

制作自己的嵌入式 Linux 电脑


打开SAM-BA。At91sam9n12ek是Atmel针对这款处理器提供的开发工具,他的配置同样适用于这块板。

制作自己的嵌入式 Linux 电脑


DDR2 也可以工作,执行程序,并且可以写回NAND。一切都OK。

软件

制作自己的嵌入式 Linux 电脑

软件启动加载程序

启动进程开始工作时,内部的ROM加载器尝试在不同的内存区域发现一个合法的程序。他会扫描SPI (串行外设接口)缓存,SD卡,NAND flash,二级SPI flash 还有I2C EEPROM 对于一个合法的程序。一旦发现一个,马上就启动它,否则就会进入SAM-BA监控器,也就是进入调试模式,此时处理器会监听来自串口和USB端口的指令。这种模式下可以对bootloader进行编程。

ROM 启动不能直接启动linux内核,所以需要一个二级的启动加载器。它会初始化RAM和时钟,然后开始加载linux内核。AT91 Bootstrap 是一个现成的启动加载器,可以完成这一系列操作。它被放在NAND flash开始的地方,或者如果我填充这些位置,它可能被放到Dataflash。即使AT91 bootstrap 可以直接启动linux,对于调试而言,之后启动U-boot的bootloader 对调试更有用。U-boot是它自带的基于命令行的微操作系统,可以读取USB棒,使用以太网,读写NAND,当然可以启动linux。例如使用U-boot 可以清除NAND或者改变linux 启动参数。

为编译bootloader,需要一个ARM 交叉编译器。我用的是Sourcery codebench lite edition,因为它容易设置,而且效果不错。先加载AT91SAM9N12EK 开发板配置文件是最容易的。和从头开始写新的配置相比,修改文件要省事的多。

为了让这份定制版同样有效,需要做一些改动:RAM 大小需要设置成64MB,bank的数量改成4,一些试验需要稍微调整一下(试用版有128MB的RAM容量,8个banks)。NAND初始的函数也需要改动,这块板比开发板相比,NAND flash要连接的地方有些不同,因此有必要告诉bootloader。

U-boot

因为AT91 bootstrap已经初始化了整个硬件,就可以直截了当的配置U-boot。同样有为at91sam9n12ek准备的配置文件,但是默认是从SD卡启动设置的。因为硬件已经配置好了,所以其他需要改动的地方就没多少了。有一些可选项比如在NAND flash上创造和改变分区时启动UBIFS 工具 ,以及为读取ext4格式的USB棒提供支持。USB支持使得从USB棒启动Linux 内核变得可能,这让试验不同的内核配置变得容易了。

Linux和根文件系统

安装linux不像安装一台常规的x86 pc一般容易。需要配置内核来支持各种需要的设置,而且需要建立根目录的镜像文件。可以手动来做,但是用buildroot做起来会很容易些。后者是用来建立根文件系统和内核的一系列工具。整个过程可能会有一些难,因为内核和build root有很多的选项。

Buildroot 没有为at91sam9n12ek开发板提供配置文件,但有为另一款 Atmel板 at91sam9260ek提供配置文件。使用这个配置文件作为基准文件,配置会更容易些。可以通过“make at91sam9260ek_defconfig”加载。

开始我们想有一个相对新的内核版本,因为相对于处理器来说,只需要做一些很小的改动,所以我们就使用上周新发布的3.15.1版本吧。

Linux 被配置成用buildroot 的“make linux-menuconfig” 命令配置。它会打开寻常的Linux菜单配置窗口。内核中大多数重要的配置是系统类型的配置菜单。我们需要检查AT91SAM9N12的支持情况还有“Atmel AT91SAM Evaluation Kits with device-tree support”” 选项。设备树是一个随内核一同加载的外部二进制文件,描述了开发板上各硬件的可用性情况。这使得使用带有不同开发板的同样的内核以及针对不同开发板的设备配置,可以用文本来写,而不是为每块板都写一个只是略有不同的C文件。幸运的是:有一个可以作为基准文件的针对at91sam9n12ek 的设备树文件。需要做得改动只是一些简单的移除不再使用的设备。这块修改过的设备数文件需要被添加到buildroot配置,所以它可以知道如何编译,并且从中构造一个镜像文件。

内核里面其他值得启动的选项是:

USB 主机支持AT91_USB。

支持NAND flash还有处理器内部的NAND ECC 控制器支持。

支持UBIFS,将被用作一个根文件系统。

读取USB棒的Ext4 支持。

在buildroot 配置过程中,我们需要选择我们想要在根目录上安装哪些程序以及产生根文件系统镜像的选项。这块开发板有不带控制器的原始NAND内存,所以一般的桌面文件系统,比如ext4就不能用了。UBIFS是通常的选择,在这正好也能用。

UBIFS 有一些依赖NAND flash 类型的选项,如果设置错了,LInux将不能读取最终的文件系统。这些选项可以从NAND FLASH 的数据清单里面得到,但是更容易的方法是从USB 棒启动linux,并且从那创建ubi 分区。或者也可以使用 U-boot的“ubi info”指令,这将会读取NAND 并且输出需要的配置值。

在键入“make”后, Buildroot 会下载交叉编译器,linux 内核以及所有其他的包,构建并输出内核,设备树,以及根文件系统镜像。然后可以用SAM-BA程序传到开发板上。一些程序需要对 NAND ECC controller 参数编程。一些参数也应该被配置到AT91bootstrap, U-boot 以及linux 内核,否则他们会报告NAND已经损坏。这种情况下NAND有2048个字节,带有512字节的扇区,ECC能够每1个扇区纠正4个字节。存储这些镜像的NAND地址可以在AT91的bootstrap 以及U-boot配置文件中找到。

在对主板编程以及重置后,ROM 启动加载器应该可以在NAND上找到AT91bootstrap 并且开始启动过程。如果你对更多细节感兴趣,所有硬件和软件的文件都可以在找到。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/17586.html