tag:blogger.com,1999:blog-59748391005913338462024-03-14T07:59:02.071+01:00The King is goneMaxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.comBlogger240125tag:blogger.com,1999:blog-5974839100591333846.post-34534471217107450532011-01-07T22:20:00.000+01:002011-01-07T22:20:58.437+01:00Move to ShanghaiIn a short time, Max will move to Shanghai. <br />
Since blogger is blocked by Chinese government, Max has to switch to a lcoal blog service provider in China and continue the writing.<br />
<br />
New blog link: <a href="http://thekingisgone.72pines.com/">http://thekingisgone.72pines.com/</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-28645638124497041372011-01-04T22:56:00.000+01:002011-01-04T22:56:45.029+01:00A script for build Qt application for board arm-A script build-armsys-6410.sh to build the Qt application for board armsys6410.<br />
<ul><li>Cross-compiler is located at /usr/local/arm/4.2.2-eabi/usr/bin</li>
<li>Built Qt by the cross-compiler is installed at /usr/local/qt-4.7.1-armsys-6410/bin/qmake</li>
<li>Built Tslib by the cross-compiler is installed at /usr/local/tslib/lib</li>
</ul><br />
<br />
<div style="color: #b45f06; font-family: "Courier New",Courier,monospace;">export PATH=/usr/local/arm/4.2.2-eabi/usr/bin:$PATH</div><div style="color: #b45f06; font-family: "Courier New",Courier,monospace;">make clean</div><span style="color: #b45f06; font-family: "Courier New",Courier,monospace;">/usr/local/qt-4.7.1-armsys-6410/bin/qmake LIBS+=-L/usr/local/tslib/lib\ -lts</span><br style="color: #b45f06; font-family: "Courier New",Courier,monospace;" /><span style="color: #b45f06; font-family: "Courier New",Courier,monospace;">make</span>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-44659100713432032632011-01-04T22:39:00.000+01:002011-01-04T22:39:15.610+01:00Fullscreen of Qt ApplicationSee the nice tutorial at Meego<br />
<a href="http://wiki.meego.com/QML/Full-screen_applications">http://wiki.meego.com/QML/Full-screen_applications</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-59876336739484161622011-01-03T21:49:00.003+01:002011-01-03T22:44:03.627+01:00Find all files newer than a givne file<pre></pre><pre></pre><pre>find . -type f -newer ./include/linux/sonet.h -not -empty -print | xargs ls -l | less
</pre>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-18633398637051114942011-01-02T19:29:00.001+01:002011-01-02T19:30:29.312+01:00U-Boot Arguments of armsys-6420<b>NFS boot:</b><br />
<blockquote style="color: #b45f06;"> setenv bootargs "root=/dev/nfs nfsroot=192.168.2.118:/home/max/work/arena/rootf/armsys6410/root/ ip=192.168.2.10:192.168.2.118:192.168.2.1:255.255.255.0:armsys.hzlitai.com:eth0:off console=ttySAC0,115200"</blockquote>Here /home/localhost/armsys6410/root is the file system located at my host machine. 192.168.2.10 is the static ip of board, while 192.168.2.118 should be ip of host machine, 192.168.2.1 is the gateway of the LAN, if the board is directly connect to host, the gateway ip is same as host ip, i.e, 192.168.2.118 here.<br />
<br />
<b>boot from nandflash </b><br />
<blockquote><div style="color: #b45f06;">setenv bootargs "root=/dev/mtdblock2 rootfstype=yaffs2 console=ttySAC0,115200" </div><div style="color: #b45f06;">setenv bootcmd nand read 0xc0008000 0x100000 0x300000\;bootm 0xc0008000 </div></blockquote>After changing the bootargs, run the following commands to save it and reboot again.<br />
<blockquote><div style="color: #b45f06;">>saveenv</div><span style="color: #b45f06;">>reset</span></blockquote>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com1tag:blogger.com,1999:blog-5974839100591333846.post-63369165941993958082011-01-01T13:59:00.004+01:002011-01-01T15:17:13.183+01:00tslib Error & Solution<b>Task</b>: Build Qt 4.7.1 for board armsys-6410. <br />
<br />
<b>Toolchain</b>: supplier provided toolchain (4.2.2-eabi-arm)<br />
<br />
<b>Error</b>: When start a Qt example, the following error message show <br />
<br />
<div style="color: red;">QWSTslibMouseHandlerPrivate: ts_config() failed with error: 'No such file or directory'</div><div style="color: red;">Please check your tslib installation!</div><br />
The problem is solved by following:<br />
<br />
Download & build the latest tslib again from http://tslib.berlios.de/<span style="color: #b45f06;"></span><br />
<span style="color: #b45f06;"><br />
</span><br />
<blockquote style="color: #b45f06;"><span style="color: #b45f06;">> tar xzvf tslib-1.4.gz</span><br />
<span style="color: #b45f06;"> > cd tslib</span><br />
<span style="color: #b45f06;"> >./autogen.sh</span><br />
<span style="color: #b45f06;"> >./configure -host=arm-linux -prefix=/usr/local/tslib</span></blockquote><blockquote style="color: #b45f06;">>make<br />
>make install</blockquote>Qt was successfully build with the toolchain: <br />
<blockquote style="color: #b45f06;">./configure -prefix /usr/local/qt-4.7.1-armsys-6410 -embedded arm -xplatform qws/linux-arm-g++ -depths 16 -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib -R /usr/local/tslib/lib -xmlpatterns -exceptions</blockquote><blockquote style="color: #b45f06;">make<br />
make install</blockquote>Copy the installed Qt into root file system, which will be nfs mounted by board<br />
<blockquote style="color: #b45f06;">sudo cp -rf /usr/local/qt-4.7.1-armsys-6410 /home/max/work/arena/rootf/armsys6410/root/usr/local/ </blockquote>Start the board by nfs mounting /home/max/work/arena/rootf/armsys6410/root/<br />
I use minicom here, the parameters are<br />
<blockquote style="color: #b45f06;">setenv bootargs "root=/dev/nfs nfsroot=192.168.2.118:/home/max/work/arena/rootf/armsys6410/root/ ip=192.168.2.10:192.168.2.118:192.168.2.1:255.255.255.0:armsys.hzlitai.com:eth0:off console=ttySAC0,115200" </blockquote>Check the device file of touchscreen. Assume the device of board is /dev/input/event1<br />
<blockquote><span style="color: #b45f06;">cat /dev/input/event1| hexdump</span></blockquote>Now when you move the mouse in the touchscreen, the similar texts will be displayed on the console. It means that /dev/input/event1 is the correct device file of touchscreen on board.<br />
<br />
<div style="color: #b45f06;">...</div><div style="color: #b45f06;">0000300 7cc6 3a50 bb73 000b 0003 0001 1f94 0000 </div><div style="color: #b45f06;">0000310 7cc6 3a50 bb7d 000b 0000 0000 0000 0000 <br />
0000320 7cc6 3a50 cee6 000b 0003 0000 0fbb 0000 <br />
0000330 7cc6 3a50 cefa 000b 0003 0001 1fff 0000 <br />
0000340 7cc6 3a50 cf03 000b 0000 0000 0000 0000 <br />
0000350 7cc6 3a50 e269 000b 0001 014a 0000 0000 <br />
0000360 7cc6 3a50 e27c 000b 0003 0018 0000 0000 <br />
0000370 7cc6 3a50 e281 000b 0000 0000 0000 0000 <br />
....</div><br />
Add following enviromental variables into /etc/profile<br />
<div style="color: #b45f06;"><br />
</div><span style="color: #b45f06;">export TSLIB_ROOT=/usr/local/tslib</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export TSLIB_TSDEVICE=/dev/input/event1</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export TSLIB_CALIBFILE=/etc/pointercal</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export TSTS_INFO_FILE=/sys/devices/virtual/input/input0/uevent</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export QWS_MOUSE_PROTO=tslib:/dev/input/event1</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export QWS_KEYBOARD=TTY:/dev/tty1</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export HOME=/root</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export QTDIR=/usr/local/qt-4.7.1-armsys-6410</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export QPEDIR=/usr/local/qt-4.7.1-armsys-6410</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export PATH=$PATH:/usr/local/tslib/lib:$QTDIR/bin</span><br style="color: #b45f06;" /><span style="color: #b45f06;"> export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/tslib/lib:/usr/local/lib:$LD_LIBRARY_PATH</span><br />
<br />
<br />
<br />
<br />
<span style="color: #0c343d;"><br />
</span><br />
Run calibration again.<br />
<blockquote><span style="color: #b45f06;">/usr/local/tslib/bin/ts_calibrate </span></blockquote>Try a Qt example,<br />
<blockquote style="color: #b45f06;">/usr/local/qt-4.7.1-armsys-6410/examples/widgets/calculator/calculator -qws</blockquote><br />
The error messages didn't show again.<br />
<br />
<b>References</b><br />
<br />
Nice man doc of tslib<br />
<a href="http://www.blogger.com/post-edit.g?blogID=5974839100591333846&postID=6336916594199395808">http://www.blogger.com/post-edit.g?blogID=5974839100591333846&postID=6336916594199395808</a><br />
<div style="color: #cc0000;"><br />
</div>About <span style="font-family: Courier New;">QWS_MOUSE_PROTO</span> <br />
<a href="http://doc.qt.nokia.com/4.7-snapshot/qt-embedded-pointer.html">http://doc.qt.nokia.com/4.7-snapshot/qt-embedded-pointer.html</a><br />
<br />
homepage of tslib<br />
<a href="http://tslib.berlios.de/">http://tslib.berlios.de/</a><br />
<br />
minicom nfs copy kernel to board<br />
<a href="http://www.armsystem.com.cn/bbs/redirect.php?fid=29&tid=12260&goto=nextnewset">http://www.armsystem.com.cn/bbs/redirect.php?fid=29&tid=12260&goto=nextnewset</a><br />
<br />
<a href="http://www.qtcentre.org/threads/23353-Qt-Embedded-4.5-TsLib-and-TSC-10-touch-screen-%28Solved">http://www.qtcentre.org/threads/23353-Qt-Embedded-4.5-TsLib-and-TSC-10-touch-screen-(Solved</a>)Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-2499194939633648742010-12-27T21:52:00.005+01:002010-12-30T23:25:55.844+01:00Build Qt 4.7 for armsys-6410=======================<br />
<b style="color: #b45f06;">Install the crossing toolchain</b><br />
=======================<br />
refer to chapter 4 安装交叉编译器<br />
<br />
交叉编译工具链的安装文件为“ARMSYS6410-B基础配置光盘资料\Linux相关\linux2.6标准版\交叉编译器”目录下的 cross-4.2.2-eabi.tar.bz2.<br />
<br />
<blockquote style="color: #b45f06;">>tar xjvf cross-4.2.2-eabi.tar.bz2 –C /usr/local/arm<br />
>export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin</blockquote><br />
=======================<br />
<b style="color: #b45f06;">Build tslib (touch screen)</b><br />
=======================<br />
<br />
Install necessary tools<br />
<blockquote style="color: #b45f06;">> apt-get install autoconf automake libtool</blockquote><br />
Download souce of tslib from http://tslib.berlios.de/<span style="color: #b45f06;"><br />
</span><br />
<br />
Build tslib<br />
<blockquote><span style="color: #b45f06;">> tar xzvf tslib-1.4.gz</span><br />
<span style="color: #b45f06;"> > cd tslib</span><br />
<span style="color: #b45f06;"> >./autogen.sh</span><br />
<span style="color: #b45f06;"> >./configure -host=arm-linux -prefix=/usr/local/tslib <span style="color: red;">-enable-input=no</span></span> (wrong???)</blockquote><blockquote><span style="color: #cc0000;">tslib will be install at /usr/local/tslib. If get error, you may comment out the line " '#define malloc rpl_malloc" in config.h</span></blockquote><blockquote style="color: #b45f06;">>make<br />
>make install</blockquote>Reference: <a href="http://blog.chinaunix.net/u2/75270/showart_1793535.html">http://blog.chinaunix.net/u2/75270/showart_1793535.html</a><br />
<br />
=======================<br />
<b style="color: #b45f06;">Build Qt 4.7.1</b><br />
=======================<br />
<br />
Download qt-4.7.1<br />
<blockquote style="color: #b45f06;">>wget http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.1.tar.gz <br />
>tar xfzv qt-everywhere-opensource-src-4.7.tar </blockquote><br />
Configure the Qt Embedded. <br />
<blockquote style="color: #b45f06;">>./configure -prefix /usr/local/qt-4.7.1-armsys-6410 -embedded arm -xplatform qws/linux-arm-g++ -depths 16 -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib -R /usr/local/tslib/lib -xmlpatterns -exceptions</blockquote><ul><li>-qt-mouse-tslib: Qt will use tslib for touch screen</li>
<li>-I/usr/local/tslib/include: lib path of tslib</li>
<li>-L/usr/local/tslib/lib: includepath of tslib</li>
<li>-qconfig nocursor: no cursor is shown in touch screen</li>
<li>-xplatform qws/linux-arm-g++: see <a href="http://doc.qt.nokia.com/main-snapshot/qt-embedded-crosscompiling.html">http://doc.qt.nokia.com/main-snapshot/qt-embedded-crosscompiling.html</a></li>
</ul><br />
Build Qt<br />
<blockquote><span style="color: #b45f06;">>make</span><br />
<span style="color: #b45f06;">>make install</span></blockquote>Reference: <a href="http://doc.qt.nokia.com/main-snapshot/qt-embedded-crosscompiling.html">http://doc.qt.nokia.com/main-snapshot/qt-embedded-crosscompiling.html</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-65855335956377524832010-12-20T23:46:00.000+01:002010-12-20T23:46:30.912+01:00A walkaround: assign a static IP to eth0 for nfs remotely start systemI tried to boot the target board "armsys6410" by remotely loading a root file system through nfs. According to the given user manual, the argument of u-boot is<br />
<br />
<blockquote><span style="color: #b45f06;">setenv bootargs "root=/dev/nfs nfsroot=192.168.253.2:/hom/localhost/armsys6410/root/ ip=192.168.253.12:192.168.253.2:192.168.253.2:255.255.255.0:armsys.hzlitai.com:eth0:off console=ttySAC0,115200"</span></blockquote>Here /home/localhost/armsys6410/root is the file system located at my host machine. 192.168.253.12 is the static ip of board, while 192.168.253.2 should be static ip of host machine.<br />
<br />
The problem of mine is I cannot fix a static IP to eth0, when I use at the same time wlan0. I didn't find a ultimate solution for the problem. Here is just walkaround:<br />
<br />
Precondition: minicom has been correctly configured, serial port and cross-over cable have been correctly connected between host and target.<br />
<br />
1) reset the board<br />
2) press any key to suspend the booting (I use u-boot here)<br />
3) >sudo ifconfig eth0 192.168.253.2 netmask 255.255.255.0 up<br />
4) in minicom, input "reset"<br />
<br />
<br />
Then the board can start with given root file systemMaxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-91178006741363862782010-12-20T22:07:00.003+01:002010-12-20T22:08:49.475+01:00Setup minicom for mini2440<span style="color: red;"></span><br />
For windows, it is recommended to use Hyperterminal for serial port communication. In order to develop under linux via nfs, a terminal software 'Minicom' is installed and applied instead of Hyperterminal. The USB to serial adapter is used for my laptop. The following items are related for Minicom.<br />
<ul><li>Install minicom package</li>
<li>Check if there is active serial ports:</li>
</ul><div style="color: #b45f06;">>dmesg | grey tty</div><div style="color: #b45f06;">[ 0.004000] console [tty0] enabled</div><div style="color: #b45f06;">[ 1.174860] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A</div><div style="color: #b45f06;">[ 2237.927394] usb 3-1: pl2303 converter now attached to ttyUSB0</div><br />
<ul><li>Check read/write permissions on /dev/ttyUSB0 file: </li>
</ul><div style="color: #b45f06;">>ls -la /dev | grep ttyUSB0</div><div style="color: #b45f06;">crw-rw---- 1 root dialout 188, 0 2009-10-10 13:59 ttyUSB0</div><br />
<ul><li>If the permissions are not set as above, it can be configured as below:</li>
</ul><div style="color: #b45f06;">>chown root /dev/ttyUSB0</div><div style="color: #b45f06;">>chgrp dialout /dev/ttyUSB0</div><div style="color: #b45f06;">>chmod 660 /dev/ttyUSB0</div><br />
<ul><li>Add debian user in the dialout group (for me the user is 'lp')</li>
</ul><div style="color: #b45f06;">>adduser lp dialout</div><br />
<ul><li>To see which users are members of the dialout group, open the /etc/group file and look for th eline beginning with dialout</li>
</ul><div style="color: #b45f06;">>cat /etc/group | grep dialout</div><br />
<ul><li>Start and configure minicom under superuser mode</li>
</ul><div style="color: #b45f06;">>minicom -s </div><div style="color: #b45f06;">>Select 'Select port setup'</div><div style="color: #b45f06;">>Change Serial Device from '/dev/ttyS1' to '/dev/ttyUSB0'</div><div style="color: #b45f06;">>Set Hardware Flow Control from 'Yes' to 'No'</div><span style="color: blue;"><span style="color: #b45f06;">>'Save setup as ...' mini2440_config</span>'</span><br />
<br />
<ul><li>Start minicom using 'mini2440_config'</li>
</ul><div style="color: #b45f06;">>minicom mini2440_config</div><br />
<ul><li>Leave minicom</li>
</ul><div style="color: #b45f06;">>Ctrl A->X</div><br />
<span style="color: red;">IMPORTANT NOTES:</span><br />
<span style="color: red;"> If you use a linux system in vmware, this configuration may not work. You need to </span><br />
<ol style="color: red;"><li>check if your vmware is a bridged network</li>
<li>disable your firewall in your host machine.</li>
<li>read<a href="http://blog.sina.com.cn/s/blog_5ddb672b0100e3df.html" rel="nofollow"> this tutorial</a>.</li>
</ol>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-35883580961709072472010-11-20T20:24:00.000+01:002010-11-20T20:24:30.173+01:00Several Patent Search Engines<div> </div><ul><li>Free Patents Online: <a href="http://www.freepatentsonline.com/">http://www.freepatentsonline.com/</a></li>
<li>Patent Storm: <a href="http://www.patentstorm.us/">http://www.patentstorm.us/</a></li>
<li>Google Patents: <a href="http://www.google.com/patents">http://www.google.com/patents</a></li>
<li>United States Patent: <a href="http://www.uspto.gov/">http://www.uspto.gov/</a></li>
<li>World Intellectual Property Organization: <a href="http://www.wipo.int/">http://www.wipo.int/</a></li>
</ul>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-76813855391391474632010-11-17T22:53:00.004+01:002010-11-23T21:43:17.184+01:00Build an Angstrom Image & Toolcain for mini2440According to the tutorial in [1], an Angstrom image has been successfully bitbaked for mini2440. But an Angstrom toolchain is still missing. Analog to [2], the following commands can bitbake a compatible toolchain for this image.<br />
<br />
>source source-me.txt<br />
>bitbake meta-toolchain<br />
<br />
The toolchain can be found at "angstrom-dev/deploy/glibc/sdk"<br />
<br />
<div style="color: #b45f06; font-family: Arial,Helvetica,sans-serif;">angstrom-2010.7-test-20101117-i686-linux-armv4t-linux-gnueabi-toolchain-extras.tar.bz2<br />
angstrom-2010.7-test-20101117-i686-linux-armv4t-linux-gnueabi-toolchain.tar.bz2</div><br />
To install the toolchains:<br />
<div style="color: #b45f06;">> tar -C / -jxvf *.tar.bz2</div><br />
The toolchain is installed at /usr/local/angstrom/arm/<br />
To use the toolchain, source the script[3]:<br />
<span style="color: #b45f06;">></span><span class="command" style="color: #b45f06;"><strong>.</strong></span><span style="color: #b45f06;"> /usr/local/angstrom/arm/environment-setup</span><br />
<br />
Reference:<br />
[1] <a href="http://www.electronics.diycinema.co.uk/embedded/mini2440/configuring-open-embedded-to-bake-angstrom-images-for-the-mini2440/">http://www.electronics.diycinema.co.uk/embedded/mini2440/configuring-open-embedded-to-bake-angstrom-images-for-the-mini2440/</a><br />
[2] <a href="http://groups.google.com/group/beagleboard/browse_thread/thread/b11d9c53d6f09536/33c537f7d08f1952">http://groups.google.com/group/beagleboard/browse_thread/thread/b11d9c53d6f09536/33c537f7d08f1952</a><br />
[3] <a href="http://docs.openembedded.org/usermanual/html/ch05s08.html">http://docs.openembedded.org/usermanual/html/ch05s08.html</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-62414798669952215302010-10-31T20:24:00.000+01:002010-10-31T20:24:11.020+01:00Update date&time in Debian>sudo apt-get update<br />
>sudo apt-get install ntpdate<br />
>sudo ntpdate ntp.ubuntu.comMaxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-36957538906225890612010-09-29T22:53:00.001+02:002010-09-29T22:54:17.836+02:00The first charactor of 'ls -l'<ul><li><span style="color: #e69138;">-</span> normal file</li>
<li><span style="color: #b45f06;">d</span> directory</li>
<li><span style="color: #b45f06;">s</span> socket file</li>
<li><span style="color: #b45f06;">l</span> link file</li>
<li><span style="color: #b45f06;">c</span> character special</li>
<li><span style="color: #b45f06;">p</span> fifo (named pipe)</li>
<li><span style="color: #b45f06;">b</span> block speical </li>
</ul><b>Reference:</b><br />
<a href="http://www.thegeekstuff.com/2009/07/linux-ls-command-examples/">http://www.thegeekstuff.com/2009/07/linux-ls-command-examples/</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-39885380321900786662010-09-29T22:47:00.000+02:002010-09-29T22:47:47.254+02:00Solve Warning of minicom: unable to open an initial console.<b>The situation is:</b><br />
I want to use nfs system on my linux host (debian, squezze) to start the embedded device (mini2440). The system can successfully start but the minicom didn't work any more. A warning message was reported:<br />
<div style="color: #b45f06;"><br />
</div><span style="color: #b45f06;">Warning: unable to open an initial console.</span><br />
<b><br />
</b><br />
<b>The reason: </b><br />
The nfs system on my linux host has no /dev/console. <br />
<br />
<b>The solution:</b><br />
>cp -rf /dev/console $rootf/dev/<br />
<br />
<b>Reference:</b><br />
<a href="http://kerneltrap.org/node/6854">http://kerneltrap.org/node/6854</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-26664456469121183802010-09-21T23:05:00.000+02:002010-09-21T23:05:49.688+02:00Configure with --host, --target and --build optionsWhen people configure a project like './configure', man often meets these three confusing options, which are more related with cross-compilation<br />
<br />
<ul><li>--host: In which system the generated program will run.</li>
<li>--build: In which system the program will be built.</li>
<li>--target: this option is only used to build a cross-compiling toolchain. When the tool chain generates executable program, in which target system the program will run.</li>
</ul><span style="color: #e69138;">An example of tslib</span> (a mouse driver library)<br />
'./configure --host=arm-linux --build=i686-pc-linux-gnu': the dynamically library is built on a x86 linux computer but will be used for a embedded arm linux system.<br />
<div style="color: #e69138;"><br />
</div><div style="color: #e69138;">An example of gcc:</div>'./configure --target=i686-pc-linux-gnu --host=arm-linux --build=i686-pc-linux-gnu':<br />
<ul><li>A gcc compiler is build on x86 linux computer. [--build]</li>
<li>The gcc will be executed on an embedded arm linux system.[--host]</li>
<li>But the gcc will generate the binary program, which run in a x86 linux system. [--target]</li>
</ul><br />
Reference:<br />
<a href="http://matrix.wearlab.de/en/wiki/index.php?title=ArmCrossCompiler&redirect=no">http://matrix.wearlab.de/en/wiki/index.php?title=ArmCrossCompiler&redirect=no</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com4tag:blogger.com,1999:blog-5974839100591333846.post-53716514641474790732010-09-21T11:36:00.003+02:002010-09-21T11:46:07.717+02:00Increase fsck fequency at startupTotally disable forced fsck at startup is a bad idea. But it takes more than 5 minutes to scanning a huge disk for every 24 times boot. Why not just change the fequency of forced fsck? The solution is using tune2fs.<br />
<br />
1) Check your disk.<br />
>df<br />
/dev/sda1 7850996 5316724 2135460 72% /<br />
tmpfs 257324 0 257324 0% /lib/init/rw<br />
udev 252876 144 252732 1% /dev<br />
tmpfs 257324 0 257324 0% /dev/shm<br />
<br />
So, my disk is /dev/sda1<br />
2) Configure the fequency of forced fsck.<br />
<ul><li>sudo tune2fs -c 100 /dev/sda1 (100 boot)</li>
<li>sudo tune2fs -i 365d /dev/sda1 (365 day)</li>
</ul><br />
<b>Reference:</b><br />
<a href="http://ubuntuforums.org/archive/index.php/t-1066069.html">http://ubuntuforums.org/archive/index.php/t-1066069.html</a><br />
<ul></ul>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-68489116632534105302010-09-20T14:37:00.002+02:002010-09-20T14:38:45.167+02:00The Basic of PCMPCM stands for "Pulse Code Modulation". In plain text, an analog signal is sampled and the samples is encoded into a stream of PCM word. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqnoLqaaV5uWmH_9jfBcRR4GtWSUPvyFgBmp_gF7_CJa2USTFtq857VRj_oPRlZEFbMqDNMRqFRIYdOSWqdTHyzcyoS9ej7zV0pgHx5UFyEo9kbVRhHJLyJfeSzcALZaBz5b3aLAYfU7rU/s1600/pcm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqnoLqaaV5uWmH_9jfBcRR4GtWSUPvyFgBmp_gF7_CJa2USTFtq857VRj_oPRlZEFbMqDNMRqFRIYdOSWqdTHyzcyoS9ej7zV0pgHx5UFyEo9kbVRhHJLyJfeSzcALZaBz5b3aLAYfU7rU/s400/pcm.JPG" width="400" /></a></div><br />
PCM data is relatively immune against noise during transmission because the reciever need only to tell "1" or "0" states of the inputing stream.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.aerodesign.de/peter/2000/PCM/ppm_nois.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="368" src="http://www.aerodesign.de/peter/2000/PCM/ppm_nois.gif" width="400" /></a></div><br />
<b>Reference: </b><br />
<ul><li><a href="http://telemetry-products.com/sites/default/files/PCM_Tutorial.pdf">PCM tutorial</a> </li>
</ul>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-37022822847601684172010-09-20T12:52:00.001+02:002010-09-20T14:20:25.637+02:00High impedance of outputIn digital circuit, the output line has usually three states, namely, 0, 1 and high impedance.<br />
In the state of 0 or 1, the output line has a low impedance. When the output in the high impedance state, the output line will be effectively removed from the rest of circuit. In such way, it allows multiple circuits to share the same output line.Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-21590323573545758042010-09-20T12:17:00.000+02:002010-09-20T12:17:39.499+02:00ArbiterAbiter is an eletronic device to determine the order of access to a shared resource, when the resource is almost at the same time requested by several processores.Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-49686809594533517952010-09-20T11:21:00.002+02:002010-09-20T11:31:53.868+02:00How SPI worksBased on <a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus">SPI wiki</a>, a short summary of SPI mechimism.<br />
<br />
<div style="color: #e69138;"><b>Four logic signals.</b></div><ul><li>SCLK — Serial Clock (output from master)</li>
<li>MOSI/SIMO — Master Output, Slave Input (output from master)</li>
<li>MISO/SOMI — Master Input, Slave Output (output from slave)</li>
<li>SS — <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Slave_Select" title="Slave Select">Slave Select</a> (<a href="http://en.wikipedia.org/wiki/Logic_level" title="Logic level">active low</a>; output from master)</li>
</ul><div class="separator" style="clear: both; text-align: center;" ><a href="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/SPI_single_slave.svg/381px-SPI_single_slave.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img style="background-color : #cccccc;" border="0" height="99" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/SPI_single_slave.svg/381px-SPI_single_slave.svg.png" width="320" /></a></div><br />
<br />
<div style="color: #e69138;"><b>Data transimission:</b></div><br />
During each SPI clock cycle, a <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Full_duplex" title="Full duplex">full duplex</a> data transmission occurs:<br />
<ul><li>the master sends a bit on the MOSI line; the slave reads it from that same line</li>
<li>the slave sends a bit on the MISO line; the master reads it from that same line</li>
</ul><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/SPI_8-bit_circular_transfer.svg/500px-SPI_8-bit_circular_transfer.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img style="background-color : #cccccc;" border="0" height="128" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/SPI_8-bit_circular_transfer.svg/500px-SPI_8-bit_circular_transfer.svg.png" width="320" /></a></div>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-74486397473290357902010-09-20T10:15:00.002+02:002010-09-20T11:32:39.653+02:00Scanning algorithm for 3 x 4 Keypad MatrixWhen a keypad is connected with a microprocessor, e.g 8051, a scanning algorithm is used to detect the pressed keys. See shown in <a href="http://www.dnatechindia.com/index.php/Tutorials/8051-Tutorial/Interfacing-Matrix-Keypad-to-8051.html">[1]</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dnatechindia.com/images/stories/matrix_keypad1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="http://www.dnatechindia.com/images/stories/matrix_keypad1.jpg" width="320" /></a></div><br />
<div style="color: #e69138; text-align: left;"><b>Scanning algorithm </b></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">1.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Start.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">2.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Make All Pins High.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">3.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Make Column 1 pin low.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">4.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 1 is low, if yes then Switch 1 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">5.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 2 is low, if yes then Switch 4 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">6.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 3 is low if yes then Switch 7 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">7.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 4 is low if yes then Switch 10 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">8.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Make Column 1 Pin high & Column 2 Pin Low. </span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">9.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 1 is low, if yes then Switch 2 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">10.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 2 is low, if yes then Switch 5 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">11.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 3 is low if yes then Switch 8 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">12.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 4 is low if yes then Switch 11 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">13.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Make Column 2 Pin high & Column 3 Pin Low. </span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">14.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 1 is low, if yes then Switch 3 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">15.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if Row 2 is low, if yes then Switch 6 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">16.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 3 is low if yes then Switch 9 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">17.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Check if row 4 is low if yes then Switch 12 has been pressed.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">18.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Make column 3 pin high</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in;"><span style="font-size: small;">19.</span><span style="font: 7pt 'Times New Roman';"> </span><span style="font-size: small;">Stop</span></div><b>Reference: </b><br />
[1]http://www.dnatechindia.com/index.php/Tutorials/8051-Tutorial/Interfacing-Matrix-Keypad-to-8051.htmlMaxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com2tag:blogger.com,1999:blog-5974839100591333846.post-64732366012297854652010-09-19T00:43:00.001+02:002010-09-19T00:44:14.545+02:00Show Laptop battery status on Linuxgnome-power-manager is good software to manager and show status of battery and power consumption.Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com1tag:blogger.com,1999:blog-5974839100591333846.post-49319847479862410572010-09-18T20:57:00.001+02:002010-09-18T20:58:12.470+02:00Useful tools for the problem 'undefined reference to..'<div style="color: #e69138;"><b>ldd: prints the shared libraries required by each program or shared library specified on the command line.</b></div>[example] <br />
>ldd /usr/lib/libACE.* <br />
librt.so.1 => /lib/librt.so.1 (0x4819f000)<br />
libdl.so.2 => /lib/libdl.so.2 (0x481ae000)<br />
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x481ba000)<br />
libm.so.6 => /lib/libm.so.6 (0x48295000)<br />
libc.so.6 => /lib/libc.so.6 (0x48342000)<br />
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x48469000)<br />
libpthread.so.0 => /lib/libpthread.so.0 (0x4847d000)<br />
/lib/ld-linux.so.3 (0x40071000)<br />
<br />
<div style="color: #e69138;"><b>nm: list symbols from object files</b></div>[example]<br />
>nm -C -u libwx_baseu-2.8.so<br />
<br />
<div style="color: #e69138;"><b>readelf: Displays information about ELF files.</b></div>[example] <br />
>readelf -s /lib/libdl.so.2 <br />
<br />
Symbol table '.dynsym' contains 39 entries:<br />
Num: Value Size Type Bind Vis Ndx Name<br />
0: 00000000 0 NOTYPE LOCAL DEFAULT UND <br />
1: 00000830 0 SECTION LOCAL DEFAULT 10 <br />
2: 00000000 200 FUNC GLOBAL DEFAULT UND strerror@GLIBC_2.4 (4)<br />
....Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-82756967517744949232010-09-18T20:45:00.001+02:002010-09-18T20:48:01.589+02:00Solve 'undefined reference to' problemTo learn how to use scratchbox2 for cross-compilation, I attempted to repeat the steps in the wiki [2]. Everything works fine, until I tested the example '<span class="mw-headline">More complicated example: with libraries</span>'. The example failed to link to library ACE:<br />
<br />
<div style="color: red;">max@dev1:~/work/arena/sheeva_debian/source$ sb2 gcc -lACE test.o -o test<br />
/home/max/work/arena/sheeva_debian/debian_rootfs/lib/libdl.so.2: undefined reference to `_dl_tls_get_addr_soft@GLIBC_PRIVATE</div><br />
The reason is inconsistent version of dynamical libraries installed in scratchbox system. The scratchbox system has following settings<br />
<ul><li>OS: Debian, lenny </li>
<li>CPU architecture: arm</li>
<li>toolchain: arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu from www.codesourcery.com</li>
<li>Root file system: downloaded from <a href="http://www.mediafire.com/sheeva-with-debian">http://www.mediafire.com/sheeva-with-debian</a></li>
</ul>I checked the library dependency as followings:<br />
1) Since the '-lACE' is used, so we check the dependency of libACE by<br />
<br />
max@dev1:~/work/arena/sheeva_debian/source$ sb2 -eR ldd /usr/lib/libACE.so<br />
librt.so.1 => /lib/librt.so.1 (0x4819f000)<br />
<span style="color: red;">libdl.so.2 => /lib/libdl.so.2 (0x481ae000)</span><br />
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x481ba000)<br />
libm.so.6 => /lib/libm.so.6 (0x48295000)<br />
libc.so.6 => /lib/libc.so.6 (0x48342000)<br />
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x48469000)<br />
libpthread.so.0 => /lib/libpthread.so.0 (0x4847d000)<br />
/lib/ld-linux.so.3 (0x40071000)<br />
<br />
2) According to the error messages, libdl.so has a undefined reference, therefore, I continue to check the dependency of libdl.so.2<br />
<br />
max@dev1:~/work/arena/sheeva_debian/source$ sb2 -eR ldd /lib/libdl.so.2<br />
<span style="color: red;">libc.so.6 => /lib/libc.so.6</span> (0x4807f000)<br />
/lib/ld-linux.so.3 (0x40071000)<br />
<br />
3) Obviously, libc.so.6 is a symbolic link to the real library /lib/libc.so.6. You can also check the 'undefined reference' reported in link error by<br />
<br />
max@dev1:~/work/arena/sheeva_debian/source$ sb2 -eR readelf -s /lib/libdl.so.2 | grep -i _dl_tls_get_addr_soft@GLIBC_PRIVATE<br />
10: 00000000 164 FUNC GLOBAL DEFAULT UND <span style="color: red;">_dl_tls_get_addr_soft@GLIBC_PRIVATE</span> (6)<br />
<br />
<br />
It seems that two libraries is involved:<br />
<br />
<ul><li>/usr/lib/libACE.so </li>
<li>/lib/libdl.so.2</li>
</ul><br />
According to statement in [1]:<br />
<br />
<blockquote>When you link a shared library against other shared libraries (e.g. link <code>libwx_baseu-2.8.so</code> against <code>libstdc++.so</code>), the linker records versioned symbols used by <code>libwx_baseu</code> and provided by <code>libstdc++</code>.<br />
If at runtime you use a different copy of <code>libstdc++</code> (one which doesn't provide the same versioned symbol(s)), you get a (dynamic) liking error and the program doesn't run at all (this is preferable to a "mystery" crash later on).</blockquote>The reason is these two libraries are inconsistent. The solution: reinstall the packages that contains the two libraries.<br />
<br />
<br />
After checking the in www.debian.org, I found the involved packages in lenny.<br />
<ul><li>/usr/lib/<span class="keyword">libdl.so -></span> <a href="http://packages.debian.org/lenny/libc6-dev">libc6-dev</a> </li>
<li>/usr/lib/<span class="keyword">libACE.so</span> <a href="http://packages.debian.org/lenny/libace-dev">-> libace-dev</a></li>
</ul>Let's reinstall it by<br />
> sb2 -eR apt-get install --reinstall libace-dev libc6-dev<br />
<br />
The example is successfully linked.<br />
<br />
References:<br />
[1] <a href="http://stackoverflow.com/questions/2643738/elf-linking-why-do-i-get-undefined-references-in-so-files">http://stackoverflow.com/questions/2643738/elf-linking-why-do-i-get-undefined-references-in-so-files</a><br />
[2] <a href="http://www.plugcomputer.org/plugwiki/index.php/Scratchbox2_based_cross_compiling">http://www.plugcomputer.org/plugwiki/index.php/Scratchbox2_based_cross_compiling</a>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0tag:blogger.com,1999:blog-5974839100591333846.post-83467527618506267862010-09-17T22:30:00.002+02:002010-09-18T18:29:52.054+02:00Virtualbox comes back to live after upgrade from lenny to squeezeAfter upgrade from <a href="http://jingfenghanmax.blogspot.com/2010/09/upgrade-from-lenny-to-squeeze.html">lenny to squeeze</a>, the installed virtualbox didn't work any more. Try to load the module manually <br />
<pre> </pre><pre>>modprobe vboxdrv</pre><pre></pre>The following messages are shown:<br />
<br />
<pre>WARNING: The character device /dev/vboxdrv does not exist.
Please install the virtualbox-ose-modules package for your kernel and
load the module named vboxdrv into your system.
You will not be able to start VMs until this problem is fixed.</pre><pre> </pre><pre> </pre><br />
The most important thing is to installed the right linux-headers packages. For the updated system (squeeze) with a kernel 2.6.32-5-686,<br />
<br />
>sudo apt-get install linux-headers-2.6-686<br />
<br />
DKMS will build the VirtualBox OSE modules for your system.<br />
<br />
<pre>>modprobe vboxdrv</pre><pre>>virtualbox</pre><pre></pre><pre></pre>Virtualbox comes back ...<br />
<br />
<b>References:</b><br />
<ul><li><a href="http://wiki.debian.org/VirtualBox">http://wiki.debian.org/VirtualBox</a></li>
</ul>Maxhttp://www.blogger.com/profile/15351108112794045724noreply@blogger.com0