哈哈,没想到现阶段的移植就是东拼西凑,多亏u-boot丰富的驱动,先辈们辛勤的劳动成果啊 ^_^

      板子是GX-ARM9-2410EP增强型嵌入式教学实验系统,相当垃圾,资料缺少、不全不说,还骗人,两块Nor Flash,SST 39VF800A、INTEL E28F320,分明是1M和4M大小,偏说成2M AMD线性FLASH和8M Intel线性FLASH,我就奇怪学校怎么回买这种东西...

        言归正传,下面是具体的移植过程:

1.硬件 s3c2410 ,64M SDRAM,INTEL E28F320 4M Nor Flash ,CS8900和DM9000双网卡(暂用CS8900);

2.基本配置,使用#make s3c2410_config 。这时的板已经可以启动,可以通过网卡下载内核,可以设置启动参数启动 Linux2.6了,但还不能读写Nor Flash,存储环境变量。

3.配置Nor Flash,主要是修改 board/s3c2410/flash.c 。用 Source-Navigator 或者 grep 可以找到很多带INTEL E28F320驱动的flash.c文件。这里参考http://www.sjsunny.com/jsfw/Linux/06.htm ,将board/CMI/flash.c的Nor Flash借过来。删除write_short()和wirte_buff()函数,将board/ep7312/flash.c的wirte_word()和wirite_buff()函数拷过来(与CMI的写机制不通)。加入以下语句:

#defin ASH_BASE0_PRELIM CFG_FLASH_BASE

修改FLASH_BLOCK_SIZE为0x20000(块大小128K)。修改 include/s3c2410.h ,可以在最后的 #endif  /* __CONFIG_H */ 前添加以下常量定义来覆盖原来的值:

#define PHYS_FLASH_SIZE        0x01000000  /* 16 MB */

#define CFG_FLASH_BASE         PHYS_FLASH_1

#define CFG_MONITOR_BASE   PHYS_FLASH_1

#define CFG_MAX_FLASH_SECT 128   /* 128K*128=16M  */

#define CFG_FLASH_ERASE_TOUT   (2*CFG_HZ) /* Timeout for Flash Erase */

#define CFG_FLASH_WRITE_TOUT  (2*CFG_HZ) /* Timeout for Flash Write */

#define    CFG_ENV_IS_IN_FLASH    1

#define CFG_ENV_ADDR           (PHYS_FLASH_1 + 0x80000)   /* 变量存放地址 */

#define CFG_ENV_SIZE       0x20000  /* 变量存放空间的大小,应和块大小一致,不然saveenv时提示边界问题。     */
至此,Nor Flash已完全驱动起来。

WEIBING # saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
...............................................................................e
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
WEIBING #

4.DM9000网卡驱动移植,有100M的不用总觉得不爽 ^_^
这一步可以参考 include/configs/scb9328.h 这个文件,删除CS8900的定义,添加以下语句:
#define CONFIG_DRIVER_DM9000  1
#define CONFIG_DM9000_BASE  0x0a000300
#define DM9000_IO   CONFIG_DM9000_BASE
#define DM9000_DATA   (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT

最主要是 CONFIG_DM9000_BASE 这个地址的值,有硬件的接线决定,最后的300是DM9000复位后默认工作方式为I/ O 连接的基址,可以参考 http://msa.vnu.edu.tw/~merlin/932embed/tftp.ppt 。

5.关于flash刷写。配置好的flash信息如下,

WEIBING # flinfo

Bank # 1: Intel 28F320J3A (32Mbit) 16-Bit
  Size: 4 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00020000      00040000      00060000      00080000 (RO)
    000A0000      000C0000      000E0000      00100000      00120000
    00140000      00160000      00180000      001A0000      001C0000
    001E0000      00200000      00220000      00240000      00260000
    00280000      002A0000      002C0000      002E0000      00300000
    00320000      00340000      00360000      00380000      003A0000
    003C0000      003E0000

u-boot和参数存放的00000000块和00080000块都标记为只读,修改需要先关闭flash 保护,如烧写u-boot自身:

WEIBING # tftpboot 30008000 u-boot.bin
dm9000 i/o: 0xa000300, id: 0x90000a46
MAC: 00:80:00:80:00:80
could not establish link  ( 这里好像有问题,反应很慢,但传输速度真的比CS8900的10M快多了^_^ )
TFTP from server 202.192.33.100; our IP address is 202.192.33.120
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: #####################
done
Bytes transferred = 106548 (1a034 hex)
protect off all

......

erase 0 1a0ff

......

cp.b 30008000 0 1a0ff

......

reset

......

      使用一段时间后,感觉u-boot与ppcboot相比进步很大,功能丰富且稳定。好,bootloader也暂告一段落,内核、内核...



      Qt Hello World 出来后,马不停蹄开始自己的linux移植。开发板原来的bootloader是ppcboot2.0,能用就先不理它,第一步是直接跳到内核编译。编译很快(与Qt相比 ^_^ ),通过ppcboot下载到内存,问题就出来了。执行
tftp 30008000 zImage
bootm 30008000
后,直接跳回原来的系统启动,没有从新内核启动。而执行 go 30008000 确可以跳到新内核,这里有点不解。可是新内核也有问题,就是串口在内核的默认名称已改为 ttySAC0 ,而可能ppcboot的传给内核的默认参数是console=ttyS0 。尝试通过boom 30008000 console=ttySAC0 传递,结果如上。尝试修改 ppcboot/lib_arm/armlinux.c 的 boot_cmd 参数,新问题有出现,编译不通过。看来不得不先搞定bootloader,ppcboot太旧了,试一下u-boot吧。最新的为下载是u-boot-1.2.0.tar.bz2,可惜,3.4.1和2.95.3的交叉编译都不通过。暂改用u-boot-1.1.5.tar.bz2 。这里又有一个问题,关于交叉编译链的路径问题。我原本存放在/arm/2.95.3/bin这个目录里,执行

make CROSS_COMPILE=/arm/2.95.3/bin/arm-linux-
      得到一小堆错误就停止,如下:

/arm/2.95.3/bin/arm-linux-gcc -Wa,-gstabs -D__ASSEMBLY__ -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0x33F80000  -I/arm/u-boot-1.1.5/include -fno-builtin -ffreestanding -nostdinc -isystem include -pipe  -DCONFIG_ARM -D__ARM__ -mapcs-32 -march=armv4 -mabi=apcs-gnu -c -o lowlevel_init.o lowlevel_init.S
arm-linux-gcc: installation problem, cannot exec `cpp0': No such file or directory
as: unrecognized option `-marmv4'
make[1]: *** [lowlevel_init.o] Error 1
make[1]: Leaving directory `/arm/u-boot-1.1.5/board/smdk2410'
make: *** [board/smdk2410/libsmdk2410.a] Error 2
      改用3.4.1编译,

make CROSS_COMPILE=/arm/3.4.1/bin/arm-linux-

      提示链接错误,搜索后发现网上大多是因为u-boot采用软浮点的问题,但改了-msoft-float 这项后问题依旧:

                -Map u-boot.map -o u-boot
lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):_udivsi3.S:67: relocation truncated to fit: R_ARM_PLT32 __div0
lib_arm/libarm.a(_umodsi3.o)(.text+0xa8):_umodsi3.S:79: relocation truncated to fit: R_ARM_PLT32 __div0
make: *** [u-boot] Error 1

      就这般无奈,一天过去。早上继续搜索,不负有心人啊,终于发现是目录问题,换回2.95.3编译成功。

ln -s /arm/2.95.3 /usr/local/arm/2.95.3

      竟然目录的位置与编译结果有关,不知是否与编译这个 cross toolchain 时的设置有关?尝试将3.4.1作同样的软链接,可惜错误依旧...这些都留到日后研究吧,下一步先搞定linux 2.6.19.2 ......


可恶的虚拟机

2007-01-27

    昨晚刚写完Qtopia Core的Hello World,兴奋不久有碰到麻烦。本来就一个共享的小问题,但我偏不信搞不定它,于是,一天过去了...

    搬到另一个实验室后,重新安装过虚拟机,以为导致/mnt/hgfs目录为空的原因就在这里。之前执行vmware-config-tools.pl就可以看到共享目录,这次确怎么都不行,包括安装最新版的vmware和vmware tools。

    另外一个异常是启动时有SELinux和hgfs的冲突提示,可以从 /var/log/message | grep hgfs看到,如下:

Jan 27 17:25:06 RHAS kernel: SELinux: initialized (dev vmware-hgfs, type vmware-hgfs), not configured for labeling

    马上google,问题终于有答案,确定是因为SELinux与vmware-hgfs的不兼容( 问题在中间的横杠- )。参见连接:http://www.vmware.com/community/message.jspa?messageID=274108

    里面有两种解决办法,一是修改SELinux的策略文件,让vmware-hgfs通过,二是直接禁止SELinux。当然,我选择后者,修改 /boot/grub/grub.conf ,在最后的kernel处加入selinux=0 ,如下:

kernel /vmlinuz-2.6.9-22.EL ro selinux=0 root=/dev/VolGroup00/LogVol00

郁闷一天,终于又搞定一个拦路虎...下次观察要细心,几次都漏了开机的提示...

Tag: Linux


一不小心,又过三天......

        这个Hello World可真不容易,本以为考完试可以在实验室全情投入,想不到第三天就要封闭...幸好朋友的实验室还可以用,电脑配置也不错 ^_^

        Qtopia Core 4是QT/embedded的最新版,网上找很久都没有相关教材,尽是QT/embedded 2的版本。我刚学,干脆就直接上最新版 ^_^ 费了不少时间,作个记录,方便有需要的朋友...

        我的目标平台是三星的s3c2410,linux2.4内核,开发平台是RHEL.AS.v4.0.Update2,直接从ftp://ftp.scau.edu.cn/linux_unix/VMware_OS/RedHat_AS_4/Red Hat Enterprise Linux 4.vmdk下载的虚拟机镜像。经过这三天的使用,我认为虚拟机构建的系统有两个特点:一是慢,编译整个Qtopia Core 4用了近五个小时,而真机只需一个半钟;二是使用方便,可以直接在windows通过pietty连接,一边查资料,一边配置系统,而且工作环境改变时只需将镜像直接移到另外一台电脑,马上可以工作 ^_^

下面是Qtopia Core 4移植过程:

        1.  下载交叉编译链ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2。不要用cross-2.95.3,Qtopia Core 4指明要3.2以上的版本。网上的教程大多就拿cross-2.95.3编译QT/embedded 2的...解压缩到/usr/local/arm目录下

tar xjvf linux-gcc-3.4.1.tar.bz2 -C /

设置交叉编译的环境变量:

echo 'export PATH=/usr/local/arm/3.4.1/bin:$PATH' >> /root/.bashrc

        2.  下载Qtopia Core 4的源代码,建议到www.qtopia.org.cn下载,速度比www.trolltech.com快,迅雷速度就不错。我下的是qtopia-core-opensource-src-4.2.2.tar.gz,解压

tar zxvf qtopia-core-opensource-src-4.2.2.tar.gz

cd qtopia-core-opensource-src-4.2.2

./configure -embedded arm -xplatform qws/linux-arm-g++ -depths  4,8,12,16 -no-qt3support 

gmake  (这个过程最漫长...)

gmake install  (需root 权限)

设置Qt的环境变量:

echo 'export PATH=/usr/local/Trolltech/QtopiaCore-4.2.2-arm/bin:$PATH' >> /root/.bashrc

这样还有一个字体目录的问题,搞了很久才找到原因,后面讲述。

        3.  编译Hello World,代码参考Qt的文档,保存未 hello.cc 。

qmake -project

qmake

make

将文件移到目标平台,我是通过nfs mount到/mnt/nfs目录下

 mount -t nfs -o nolock 202.192.33.100:/home/nfs /mnt/nfs

export QTDIR=/mnt/nfs

export LD_LIBRARY_PATH=$QTDIR/lib

$QTDIR/lib里面放程序要用到的库和字体

lrwxrwxrwx  1 root root      18 Jan 25 20:39 /home/nfs/new/lib/libQtCore.so.4 -> libQtCore.so.4.2.2
-rwxr-xr-x  1 root root 2082044 Jan 25 20:38 /home/nfs/new/lib/libQtCore.so.4.2.2
lrwxrwxrwx  1 root root      17 Jan 24 21:44 /home/nfs/new/lib/libQtGui.so.4 -> libQtGui.so.4.2.2
-rwxr-xr-x  1 root root 7100212 Jan 24 21:42 /home/nfs/new/lib/libQtGui.so.4.2.2
lrwxrwxrwx  1 root root      21 Jan 25 20:36 /home/nfs/new/lib/libQtNetwork.so.4 -> libQtNetwork.so.4.2.2
-rwxr-xr-x  1 root root  369700 Jan 25 20:35 /home/nfs/new/lib/libQtNetwork.so.4.2.2

        可以根据提示从/usr/local/Trolltech/QtopiaCore-4.2.2-arm/lib/复制过来,注意软链接。如提示缺失libstdc++.so.6等库文件,可从/usr/local/arm/3.4.1/arm-linux/lib复制过来。

        最后一个问题就是刚才提到的字体问题。网上的教程都是说将fontdir放到$QTDIR/lib/fonts目录下即可。但我编译的这个版本总不行,提示 Cannot find font definition file /usr/local/Trolltech/QtopiaCore?

        尝试多次后才发现这个目录就是QtopiaCore的安装目录。创建一个软链接搞定

ln -s /mnt/nfs /usr/local/Trolltech/QtopiaCore-4.2.2-arm

        文档提示可以用-prefix 指定安装目录,但这也不是办法,configure --help里相关的还有-R和-rpath,可以指定链接库位置。只是虚拟机太慢,现在不敢随便乱make了。

没想到一个 Hello World 用了3天......

Tag: Qtopia ARM


        快考试了,好不容易搜到这个网站电磁场与电磁波,电子科技大学的精品课程。内容做得相当不错,尤其是它的网络课程,界面干净、清爽,配上直观的图像解析,比老师的板书容易理解多了。里面总结也不错,还有相当多的例题,要是早发现这个网站,上课就不用老发呆 ^_^
Tag: 学习


操作系统的最后一个实验,实现简单的命令解析和系统调用。

实验内容:

(1)parse应提供一个命令提示符,如parse>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符parse>。当用户没有输入时,parse需要一直处于随时等待输入状态,同时再屏幕上显示一些必要的信息。

(2)如果用户提交了一个内部命令,parse应当按照下面的描述执行相应动作。
 quit:结束所有的子进程并退出parse.
 disp: 显示命令行后的所有字符。
 list:列出当前目录下的所有文件。
 changedir:改变当前目录到所输入目录。

(3)分析用户输入
    1)分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。如用户输入的某些地方出错了,parse应提供合理的出错信息。
    2)就像shell一样,parse每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。

#include <stdio.h>
#include <fcntl.h>
char compare(char *);
void input(char arg[][20],int *);
int main() {
char arg[5][20];
int i,argc,exit;
exit=0;
while(exit==0) {
        input(arg,&argc);
        printf("the command is %s\n",arg[0]);
        switch(compare(arg[0])) {
                case 'q':{//quit
   exit=1;
                        break;
                }
                case 'd':{//disp
                for(i=1;i<argc;i++)
   printf("%s ",arg[i]);
  printf("\n");
                        break;
                }
                case 'l':{//list
   if(fork()==0)
                         execlp("ls","ls",NULL);
   
                        break;
                }
                case 'c':{//changedir
                        chdir(arg[1]);
   if(fork()==0)
                         execlp("pwd","pwd",NULL);
                        break;
                }
                case 'e':{
                        printf("enter error\n");
                        break;
                }
        }
 wait(NULL);
 }
}
char compare(char *str) {
        //printf("%s\n",str);
        if(strcmp(str,"quit")==0)return 'q';
        if(strcmp(str,"disp")==0)return 'd';
        if(strcmp(str,"list")==0)return 'l';
        if(strcmp(str,"changedir")==0)return 'c';
        else return 'e';
}
void input(char arg[][20],int *argc) {
char *cmd_s,*cmd_e,cmd[100];
int i=0,cmd_l=0;
        cmd_s=cmd_e=cmd;
        printf("weibing>");
        fgets(cmd,sizeof(cmd),stdin);
        for(i=0;*cmd_e!='\0'&&i<5;cmd_e++) {
                if(*cmd_e==' '||*cmd_e=='\n') {
                        strncpy(arg[i],cmd_s,cmd_l=cmd_e-cmd_s);
                        arg[i][cmd_l]='\0';
                        cmd_s=cmd_e+1;
                        i++;
                }
        }
        strcpy(arg[i],cmd_s);
        *argc=i+1;
}

Tag: 代码

系分成绩

2007-01-05

成绩终于出来,意料之中,论文超低分 ^_^

专业: 系统分析师
上午成绩: 48 
下午成绩: 56 
论  文: 9 
是否通过: 否

Tag: 琐事

分页共1页 1