我想从头说清楚如何来在assabet上作linux嵌入式,是有些困难的,所以先说个大概的制作步骤吧。
首先所有的资料都来源于
http://handhelds.org/ 和
http://www.lart.tudelft.nl/以及我的实践经验。
特别建议您先买块intel的assabet的开发板。
如果按照下面的资料成功的在assabet开发板上跑除了linux,那么您就可以尝试着制作自己想要的系统了,因为这些都是open source的,我想做的就是open技术和经验。国外的好多code是开放的,而且技术也是开放的,然而这些开放的东西到了国内,则会被有些技术人员作为保密资料,作为自己的价值向公司提要求......这也阻碍的国内linux的发展。我个人认为,已经公开的东西应该努力让大家可以找到,可以参考。我们要做的是在这些已有的、公开的技术上面作行业应用,而不是每个想作应用的技术人员又来从头研究如何作基础的平台。当然首先这个平台要满足需求。我希望大家可以将自己掌握的技术写出来,写成教程最好了,全民提高啊!台湾的同胞有一些中文化的计划,不是空谈,有结果出来,国内好多站点上也可以看到一些资料翻译计划,但是很少看到有结果出来。尤其有些技术一般很少使用到,如果一个有使用经验的人写出来,会更有帮助的。拜托大家了。
首先需要的资料是:
bootldr-0000-2.14.5 :bootloader,是一个纯ARM指令序列。
params-v20.bin :bootloader执行时需要的参数。
init-2-70.cramfs :kernel引导后需要的系统文件和一些基本指令(/dev /etc /home /lib /root /tmp /var等等)
root-2-57.cramfs :root filesystem,其中出现在initial中的目录为连接。
usr-2-61.cramfs :图形环境的code (/usr/X11R6)
zImage-2.4.0-rmk2-np1-hh1 :kernel
可以从ftp://ftp.handhelds.org/pub/linux/compaq/ipaq/stable/update.html 下载这些资料。这些资料都有已经做好的。所以先尝试一下如何在assabet上安装一个linux环境。然后在通晓一个整体的步骤之后,再详细介绍这些资料档如何制作。
我首先大概说明一下如何安装:
ipaq 将 flash 存贮器规划成 7 个 partition, 分别是 mtdblock0 ~ mtdblock6,如下表
usage size mount dir
mtdblock0 bootldr 256K (bootldr-0000-2.14.5)
mtdblock1 kernel 512K (zImage-2.4.0-rmk2-np1-hh1)
mtdblock2 params 256K (params-v20.bin)
mtdblock3 init 1M /dev, /etc, /lib/modules, /var (init-2-70.cramfs)
mtdblock4 root 3M /bin, /sbin, /lib (root-2-57.cramfs)
mtdblock5 usr 8M /usr (usr-2-61.cramfs)
mtdblock6 local 3M or 19M(FB) /usr/local
mtdblock{3,4,5} 用 cram文件系统, /usr/local 要给 user 写入, 所以保留为 ext2文件系统. root 和 init是整个系统基本的内容, run time 不需要写入的目录集中在 root, 需要写入的目录集中在 init, 而 init 的内容将会在开机 copy 到 ramfs。usr 只规划了 8MB, 你想调整 partition 的大小, 请修改kernel目录树中 drivers/mtd/sa1100_flash.c 关于设备划分的部分.
安装开始:
首先您得有一台linux pc机,而且支持串口通信,如果不支持,请重新编译kernel。
另外您还需要一个flash烧录工具软件jflash。这里可以下载windows版Jflash。
Jflash的source
http://www.lart.tudelft.nl/projects/jtag/jflash-linux.tar.gz
可以编译出linux下的jflash。
在新的assabet开发板子上是需要烧录bootloader,如果下载了bootldr-0000-2.14.5,则使用专用的JTAG接线将assabet板子和pc机连接(打印机接口),并开通电源,然后在linux主机下键入命令:
#./jflash-linux bootldr-0000-2.14.5
就会将bootldr烧录到assabet的flash中。具体的操作得看手册和多次尝试了。
具体烧录时遇到问题不会很多,如没有支持烧录的接口连线,那么您需要买专门烧录flash的板子了,用它来烧录bootldr.
也可以烧录blob,这是for LART的bootloader,下载:http://www.lart.tudelft.nl/lartware/blob/
具体的烧录操作请参考http://www.lart.tudelft.nl/projects/jtag/
烧录bootldr之后,接着就要烧录kernel,kernel是利用bootloader烧录的,bootloader通过串口和pc机通信。
这里说明一点,我使用的是blob,因为它灵活。而且编译也比较简单。有关blob的详细资料请参考blob source
code 中的Readme档案。
如何烧录blob:
我想最好就是使用JTAG接口线了,
1。使用JTAG接口线将Assabet与您的主机的并口相连
2。打开Assabet的电源
3。使用jflash工具:jflash-linux blob
4。重新开启Assabet的电源,只是将Assabet与主机使用串口相连,并且使用minicom,就可以看到blob启动时的输出信息。
要做好以上的工作,主要是准备jflash和blob,请在相关站点下载source,和查阅相关的资料。
如何使用blob:
1。准备工作,将Assabet与一个终端连接,一般就与pc机的串口相连,运行串口通信程序minicom,设置参数为9600波特,8位数据,无奇偶校验,1位停止位, 无起始位。(9600 8N1)。做好这些准备工作后,接通Assabet的电源,然后blob开始运行,并显示信息
--------------------------------------
blob version 2.0.3
Copyright (C) 1999 2000 2001 Jan-Derk Bakker and Erik Mouw
Copyright (C) 2000 Johan Pouwelse
blob comes with ABSOLUTELY NO WARRANTY; read the GNU GPL for details.
This is free software, and you are welcome to redistribute it
under certain conditions; read the GNU GPL for details.
Memory Map:
0x08000000 @ 0xC0000000 (8MB)
0x08000000 @ 0xC1000000 (8MB)
0x08000000 @ 0xC8000000 (8MB)
0x08000000 @ 0xC9000000 (8MB)
Loading blob from flash . done
Loading kernel from flash ....... done
Loading ramdisk from flash ............... done
Autoboot in progress, press any key to stop ...
--------------------------------------
这时可以键入任意键,就可以停在blob的命令方式下,否则将引导kernel(如果已经安装了kernel)
--------------------------------------
Autoboot aborted
Type "help" to get a list of commands
blob>
--------------------------------------
上面就是进入了blob的命令工作方式,关于blob的命令这里简单说明,具体请参考source中的readme。
* boot: 引导linux kernel。
* clock: 设置Sa1100的时钟和DRAM的频率
* download {blob|kernel|ramdisk} 通过串口下载 blob/kernel/ramdisk 的印象到RAM
* flash {kernel|ramdisk} 把 blob/kernel/ramdisk 从RAM烧录到flash中
* help 帮助信息
* reblob 从RAM中重新启动blob
* reboot 重新启动系统
* reload {blobkernel|ramdisk} 重新从Flash中调入 blob/kernel/ramdisk 到RAM
* reset 重新设置终端的状态
* speed 设置下载的速虑
* status 显示blob当前的状态
2。载入kernel:
在blob中键入命令 blob>download kernel,然后blob会改变串口传输速率到115200,并且等待串口输入,传输完成后,blob会自动切回到9600的速率。
---------------------------------------
Switching to 115200 baud
You have 60 seconds to switch your terminal emulator to the same speed and
start downloading. After that blob will switch back to 9600 baud.
---------------------------------------
在blob显示上面的信息后,请在PC主机上改变minicom的波特率到115200,然后在其他shell下使用令
uuencode zImage-2.4.0-rmk2-np1-hh1 zImage-2.4.0-rmk2-np1-hh1 > /dev/ttyS0
向串口写入kernel的Image。这里假设您所使用的串口是/dev/ttyS0.
传输完成,blob会显示如下的信息:
---------------------------------------
(Please switch your terminal emulator back to 9600 baud)
Received 65536 (0x00010000) bytes.
---------------------------------------
传输出错会显示
---------------------------------------
(Please switch your terminal emulator back to 9600 baud)
*** Uudecode receive failed
---------------------------------------
传输成功后,再将minicom切换到9600波特,在blob下输入命令
blob>flash kernel
将会把kernel写入到flash中,跟在blob所占用的flash区块的后面,完成后会显示
---------------------------------------
blob> flash kernel
Saving kernel to flash ..... .... done
---------------------------------------
3。下载ramdisk(init 和 root)
在blob中键入命令 blob>download ramdisk,
改变minicom的波特率到115200,然后在其他shell下使用令
uuencode init-2-70.cramfs init-2-70.cramfs > /dev/ttyS0
然后烧录到flash的0x00100000这个地址。
blob> flash ramdisk 0x00100000
一定要注意不能写错地址。
然后同样的方式下载root-2-57.cramfs,并烧录到0x00200000
blob>download ramdisk (uuencode root-2-57.cramfs root-2-57.cramfs > /dev/ttyS0 )
blob>flash ramdisk 0x00200000
为什么要烧到0x00100000和0x00200000,是因为从handhelds站点下载的kernel已经规划了flash,请参考前面的说明。使用blob作引导,就没有了bootldr所需要params,所以kernel和init之间的那256k flash是空的,当然如果你的kernel足够大,也可写到那里的。
4。安装usr:
由于usr这个印象比较大,当然您也可以使用串口传输并写到0x00500000。最好就是在上面的步骤都完成后,使用boot命令引导kernel,有时会出现问题,引导中断。那么可以重新打开电源,让blob自动引导,如果上面的步骤没有错误,一般就会启动了linux。可能会出现LCD的驱动有问题,LCD没有显示。那么就要参考后面讲到的如何编译kernel里的知识来修改驱动了。
还是通过minicom来与Assabet上的linux通讯,启动linux后,会自动在串口上打开一个终端,所以通过minicom来操作linux。
linux启动后,以root登录,不需要口令,然后使用ifconfig命令配置启动网卡,然后就可通过ftp将usr-2-61.cramfs下载到Assabet,使用命令
dd if=usr-2-61.cramfs of=/dev/mtdblock5
将usr-2-61.cramfs写到flash中。然后mount /dev/mtdblock5到/usr,就可以启动X了。
到了这里祝贺大家,您的嵌入式linux已经成功了!!!
上面是在已有资料的基础上来做的。大家多试几次之后,下面就开始讨论如何制作上面的这些资料
2. 编译kernel:
a) 如何得到source
b) 使用哪种文件系统和文件系统的划分(比较基本的事项)
c) LCD的支持
d) TouchScreen的支持
e) CF卡的支持
3. Xtiny的构建:
a) 取得source
b) 如何编译
c) 注意事项TouchScreen,ARM芯片的内存四字节存取限制
4. 窗口管理器
a) 如何选择
b) ??有待详细考虑
5. 整体文件系统的规划和制作
a) 如何划分
b) 如何制作
c) 注意事项
6. 交叉编译
a) gcc cross compile tools的获得toolchain
b) 如何进行cross compile
编译bootloader:
因为bootloader是在其他平台上执行的,所以一般在x86机子上要进行交叉编译。这就需要交叉编译的toolchain. 在后面将会介绍,这里是for ARM芯片的toolchain下载地址
ftp://ftp.handhelds.org/pub/linux/arm/toolchain/
如果你有arm芯片的pc,并且安装了linux,这样就可以在pc长编译bootloader而不需要交叉编译了。
这是请注意要修改Makefile中的CROSS_COMPILE = arm-linux- 这行,改为CROSS_COMPILE =
修改bootloader:
当硬件平台有所改动时,就应该修改bootloader,当由于我没有较好的硬件支持和修改的经验,所以也没有好的建议,如果有哪位这方面的经验还请共享个大家,一同交流。
kernel:
嵌入式的kernel会与pc机的有些不同,主要在设备驱动程序上(TouchScreen,LCD,CF card)。对于嵌入式的kernel,也有专人维护,每新出一kernel的新版,就会有一版新的嵌入式kernel推出。下载地址是:
ftp://ftp.handhelds.org/pub/linux/compaq/ipaq/
linux-2.4.0-rmk1-np1-hh1.tar.gz
-----------------------------------------------
Creating a new ext2 filesystem image
dd if=/dev/zero of=init-ramdisk.img bs=1k count=8k
mke2fs -i 1024 -b 1024 -m 3 -F -v init-ramdisk.img
mkdir temp
mount -o loop init-ramdisk.img temp
cd temp
(Do what you need to do.)
cd ..
umount temp
gzip -9 init-ramdisk.img
------------------------------------------------
Modifying an existing ext2 filesystem image
gunzip ramdisk-file.gz
mkdir temp
mount -o loop ramdisk-file temp
cd temp
(Do what you need to do.)
cd ..
umount temp
gzip -9 ramdisk-file