在 ATEB9200 开发板上移植 Linux

  2014-02-03 00:00:00 CST

  Jingwen Peng

  Linux

ARM-Chipset

用 Mac OS X 做嵌入式开发真是挺折腾的,总算把 Linux 移植到了 ARM 开发板上。

开始之前先大概说明一下使用的开发板。

Embest ATEB9200 评估板 CPU:16-32Bit ARM920T Flash:Atmel AT49BV1614 SDRAM:16M Data Flash:8M 接口:USB、串口、红外、以太网、SD/MMC、CF卡、SM卡、JTAG

有图有真相

ARM-Board

几个条线设置什么的就不多说了,不同型号的板子基本不一样,参考官方给的使用手册。

随板附带的光盘和手册都没有,网上也没怎么找到,但是该板硬件整体类似于 Atmel 的 AT91RM9200,以后的编译都可以在 AT91RM9200 的配置文件的基础上进行修改。


开发环境

作为 Mac 脑残粉,使用 Mac 做嵌入式开发的感觉就是麻烦

一. MacBook Air 没有串口接口,解决方法是使用 Prolific-PL2303 芯片的串口转 USB 转换器。10.6 左右的 OS X 需要装一下驱动,最新版的 OS X 插上就可以用,在 /dev/ 目录下会出现一个名为 tty.usbserial 的设备。

二. 串口通讯的命令行软件,这里使用 minicom、lrzsz、c-kermit,在 Mac 上使用 brew 安装就可以了。使用前需要对 minicom 和 kermit 进行配置,根据自己需要进行配置即可。其中 lrzsz 和 c-kermit 提供文件传输支持。打开 minicom,开发板上电之后就能看到终端的输出了。

三. 操作系统,Mac 不适合用来编译 Linux 软件。用 vbox 跑了一个 CentOS 虚拟机,有人说 CentOS 也不适合用来做开发,不过用习惯了,什么都能克服的。

整体流程大概是这样的,使用虚拟机里的 CentOS 进行修改编译,之后将二进制文件通过 scp 复制到 Mac,再通过串口或者网络与开发板进行通讯和文件传输。

有关于此型号开发板遇到的各种奇怪问题下面就掠过了,记录的是一个更通用的过程。


U-Boot 简介及编译安装

要让开发版跑起来,需要一个引导程序,也就是 bootloader。U-Boot 是一个通用的基于 GPL 协议的开源的引导程序,几乎支持所有处理器,功能相当于 PC 的 BIOS,但又比 BIOS 强大的多。

可以到 U-Boot 的官方网站 http://www.denx.de/wiki/U-Boot 下载。

这里用 U-Boot-1.0.0,使用 at91rm9200dk 的配置文件即可,发现其 board/at91rm9200dk/flash.cflash_identification 函数有错误,导致无法识别 Flash,修正后继续。

还有一点需要注意,因为使用的是 at91rm9200dk 的配置文件,配置文件对应的硬件 ID 是 at91rm9200dk 的,需要将其修改为当前使用的开发板的 ID,在 board/at91rm9200dk/at91rm9200dk.c 中修改。

1
2
3
make at91rm9200dk_config
make
gzip –c u-boot.bin > u-boot.gz

设置跳线,之后下载 u-boot.bin 到开发板,正常启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOT 1.0 (Feb 3 2014 - 19:36:25)
Uncompressing image…

U-Boot 1.0.0 (Feb 3 2014 - 22:40:50)

U-Boot code: 21F00000 -> 21F1458C BSS: -> 21F1FF04
DRAM Configuration:
Bank #0: 20000000 32 MB
Atmel: AT49BV1614 (16Mbit)
Flash: 2 MB
DataFlash:AT45DB642
Nb pages: 8192
Page Size: 1056
Size= 8650752 bytes
Logical address: 0xC0000000
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
Uboot>

之后将 U-Boot 烧写到 Flash

最后将 tools 目录下 mkimage 加入 PATH,供以后的内核编译使用


Linux 移植

使用 linux-2.6.20.tar.bz2,打上对应的补丁 http://maxim.org.za/at91_26.html。交叉编译工具使用 arm-linux-gcc-3.4.1.tar.bz2,BusyBox 使用 busybox-1.00.tar.gz。

解压内核并打补丁

1
2
cd linux-2.6.20
zcat ../2.6.20-at91.patch.gz | patch -p1

修改 Makefile 文件

1
2
ARCH := arm ( 原 ARCH ?=$(SUBARCH) )
CROSS_COMPILE ?= arm-linux- ( 原 CROSS_COMPILE ?= )

配置编译内核

1
2
3
make at91rm9200dk_defconfig
make menuconfig # 根据需要设置
make uImage # 需要用到 U-Boot 提供的 mkimage 工具

使用 tftp 将内核传输至开发板,启动内核。当然串口也可以,不过串口速度慢的难以忍受。此时内核正常启动,但是报错找不到根文件系统。

下面制作根文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 编译 BusyBox
cd busybox-1.00
make menuconfig # 设置交叉编译器,使用静态编译
make
make install
# 制作空的 ramdisk
dd if=/dev/zero of=ramdisk bs=1k count=8192
# 挂载至 /mnt
losetup /dev/loop2 ramdisk
mkfs.ext2 /dev/loop2
mount -t ext2 /dev/loop2 /mnt
# 复制库文件
cd /mnt
mkdir lib
cd  /usr/local/arm/3.4.1/arm-linux/lib
for file in libc libcrypt libdl libm libpthread libresolv libutil
> do
> cp $file-*.so /mnt/lib
> cp -d $file.so.[*0-9] /mnt/lib
> done
cp -d ld*.so* /mnt/lib
# 复制 busybox
cp -r busybox-1.00/_install/* /mnt/
# 建立目录
cd /mnt
mkdir dev home root usr etc mnt tmp
# 建立设备
cd /dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
# 配置文件,使用 busybox 提供的参考进一步修改
cp -r busybox-1.00/example/bootfloppy/etc/* /mnt/etc/
# 卸载 并 压缩
umount /dev/loop2
losetup -d /dev/loop2
gzip -9 ramdisk

将 uImage 和 ramdisk 下载到开发板,此时已经可以正常启动了。

1
2
3
BusyBox v1.00 (2014.02.04-06:33+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
[root arm]#

如果您有疑问或建议,请在下方评论区域留言

遵循 BY-NC-ND 协议

评论功能加载中...