发新话题
打印

在intel arm assabet上作linux嵌入式

我想从头说清楚如何来在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

      
除了努力挣钱,你还努力过什么???

TOP

   好      

TOP

忘了重要的一点

忘了一点,在安装了kernel和init,usr之后,启动kernel时要使用blod得命令boot来引导,并且需要加上参数
noinitrd root=/dev/mtdblock4 init=/linuxrc console=ttySA0
因为使用kernel是为bootldr准备的,bootldr会自动传递这些参数的,所以使用blob时需要手动的传递参数。当然也可以在编译kernel就把参数连编进去。      
除了努力挣钱,你还努力过什么???

TOP

      

TOP

发新话题