嵌入式Linux自学阶段性总结(4)

2019-07-13 00:30发布

至此,qtopia编译完成了。下面要把刚才配置的-image目录挂在到开发板的-prefix目录下,让qpe运行起来,看到实际的手机greenphone界面。在开发板系统的/etc/init.d/rCS脚本中,增加/opt/qtopia/target/runqtopia &,运行启动qtopia的脚本。这个脚本实现要自己创建,并且增加运行权限 chmod +x runqtopia,该脚本内容如下:   #!/bin/sh   # created by leo feb, 10th, 2009 export set HOME=/root export set QTOPIADIR=/opt/qtopia/target export set QWS_KEYBOARD="USB:/dev/input/event1" export set QWS_MOUSE_PROTO="Tslib:/dev/h3600_tsraw" export set QWS_SIZE=800x480 export set PATH=$QTOPIADIR/bin:$PATH export set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTOPIADIR/lib:/usr/local/arm/3.4.1/arm-linux/lib export set QWS_DISPLAY="linuxFB:mmWidth35:mmHeight45:0"   ln -s /dev/fb0 /dev/fb/0 export set TSLIB_ROOT=/opt/tslib1.4-install export set TSLIB_TSEVENTTYPE=H3600 export set TSLIB_FBDEVICE=/dev/fb0 export set TSLIB_TSDEVICE=/dev/h3600_tsraw export set TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export set TSLIB_CONSOLEDEVICE=none export set TSLIB_CALIBFILE=/etc/pointercal export set TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts/ export set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib   if [ -f "/etc/pointercal" ]; then export set POINTERCAL_FILE=/etc/pointercal $QTOPIADIR/bin/qpe -qws else $TSLIB_ROOT/bin/ts_calibrate $QTOPIADIR/bin/qpe -qws fi     这样,启动了开发板就可以看到tslib的触摸屏校准界面,然后进去qtopia的手机界面。当然,也要确保linux内核配置了触摸屏驱动。如果运行中提示找不到某些库,则把主机上arm-linux-gcclib文件都添加到开发板的库环境中。   在主机上模拟运行qtopia的图形环境,可以这样SDK/bin/runqtopia,这个脚本会自己启动qvfb,然后启动qpe -qws。这里的SDK是编译主机版本的qtopia配置中设置的-SDK路径。   关于开发板挂载主机目录的方法:   ubuntu8.10上安装nfs-server:sudo apt-get install portmap nfs-kernel-server 在文本文件/etc/exports,写入: /mnt/arm_root_nfs *(rw,sync,no_root_squash) /mnt/arm_root_nfs 是要共享的目录; *代表所有的客户机都可以挂接此文件系统; rw 代表客户机以读写许可来挂接它们的根文件系统; no_root_squash 选项允许客户机以主机上root 身份挂接根文件系统。 然后重启nfs服务 /etc/init.d/portmap restart /etc/init.d/nfs-kernel-server restart 注意:每当修改了/etc/exports 都要重启服务以便修改生效。   下面的挂载分为两种: 第一种是目标系统根目录通过supervivi挂载在主机某个目录: 接上开发板串口及网线,打开minicom,在supervivi模式下,输入: param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.106:/mnt/arm_root_nfs ip=192.168.1.70:192.168.1.106:192.168.1.111:255.255.255.0:QQ2440V3.arm9.net:eth0:off" 注意事先设置主机静态IP192.168.1.106。另一种方法可以不设置静态IP,可以把主机和目标板连接到路由器上,不影响主机上网查资料,又可以让开发板挂载,而且不用要上网的时候修改网卡参数,插拔网线。但是此时不能用开发板附带的交叉网线,要用普通网线了。   第二种挂载类型,在开发板启动以后,在minicom或者超级中端中挂载某个目录。 mount -t nfs 192.168.1.106:/opt/qtopia/target/ /opt/qtopia/target/   ubuntu修改DHCP为静态IP的方法: /etc/network/interfaces文件中,把iface eth0 inet dhcp 改成以下内容就可以了 iface eth0 inet static address 192.168.1.106 netmask 255.255.255.0 gateway 192.168.1.255 nameserver 202.101.224.69 如果要上网,注意要修改回去。每次都要执行sudo /etc/init.d/networking restart 重启网卡。还有,每次ubuntu的帐户登录后,最好先重启一下nfs服务,命令如下: /etc/init.d/portmap restart /etc/init.d/nfs-kernel-server restart   5. 配置编译qt/x11-4.4.3qte-4.4.3   上面的qtopia编译好了,但是prefix目录下的qtcore/lib下的库,对于运行mscore-0.9.3是不可以的,因为mscore原本是运行在x11上的,有很多复杂高级的ui部件,而这些特征,在qtopia系统可能是没有的,比如菜单、状态栏、标题栏等类接口。所以,要移植mscore-0.9.3,我们还要配置编译主机和开发板两个版本的qte-4.4.3,这个过程比编译qtopia简单,在qte-opensource-4.4.3解压目录中运行的shell如下:   #Compile qte for x86 make confclean ./configure -prefix /opt/qt/qte4.4.3_x86 -qvfb -depths all make make install   #Compile qte for arm make confclean ./configure -release -prefix /opt/qt/qte4.4.3_arm -qvfb -qt-gif -xplatform qws/linux-arm-g++ -embedded arm -depths 4,8,16,32 -qt-kbd-usb -no-kbd-tty -no-mouse-linuxtp -qt-mouse-tslib -I /opt/tslib1.4-install/include -L /opt/tslib1.4-install/lib -verbose -silent make make install   Mscore0.9.3,在使用qte4.4.3_x86下面的库文件编译,可以不加修改的顺利通过。然后运行: /opt/qt/qte4.4.3/bin/qvfb -width 800 -height 600 & mscore_dir/build/mscore/mscore -qws 发现在framebuffer上运行编译好的mscore界面声音都很正常,和在x11下直接运行没有区别,增加了移植mscore-0.9.3的信心。 编译完成之后,在/opt/qt/下有两个版本目录,qte4.4.3_x86qte4.4.3_arm。但是比较他们的库文件,发现arm版本的qte没有编译出来QtDesigner工具以及附带的库文件,而这些库又都是mscore用到的,最终解决方法是编译两个版本的qte完成后,使用qte4.4.3/bin/qmake,在qte的源代码下tools/qtdesigner/目录下交叉编译出来qtdesigner和库,并且把其头文件和库文件都复制到qte4.4.3相应目录下去。   经验总结: 凡是用到了qmake的地方,要非常注意环境变量QMAKESPEC,是否设置成了需要的平台,如果是主机,unset这个变量.这个问题导致我重新编译qt-4.4.3 for embedded linux的时候,中断了两次.原来没有注意:QMAKESPEC设置的是arm平台,导致生成的moc等工具都是arm平台的,moc时出现语法错误. 环境变量QMAKESPEC设置为mkspecs/qws/下的配置文件,比如下面是对于x86,这是默认的   QMAKESPEC="/opt/qtopia/sdk/4.3.2/x86/qtopiacore/target/mkspecs/qws/linux-x86-g++"   另外,关于系统环境变量设置,ubuntu中的变量配置文件分别为: 1/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 2/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile,设置环境文件的环境变量。 3~/.bash_profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。/etc/bashrc:为每一个运行bash shell的用户执行此文件.bash shell被打开时,该文件被读取. 4~/.bashrc:该文件包含专用于你的bash shellbash信息,当登录时以及每次打开新的shell,该该文件被读取   在开发的过程当中,要平凡的配置LD_LIBRARY_PATH, PATH, QMAKESPEC等变量,我自己的变量都定义在~/.bashrc中,但是这个文件在每次打开终端时才会初始化,所以导致我双击打开eclipse后,编译的过程中找不到环境变量,最后只能从终端中通过命令打开。   另一个:对于ubuntu系统,默认的是不能通过root用户登录的,如果用sudo,或者直接su命令获得最高权限,也有可能出现问题。最后是在系统》系统管理》登录窗口中设置允许root身本登录。