<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cnnbboy&#039;s Dream</title>
	<atom:link href="http://blog.cnnbboy.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.cnnbboy.com</link>
	<description>Time waits for no one</description>
	<lastBuildDate>Sat, 28 Aug 2010 04:06:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MeeGo源码下载——改良版</title>
		<link>http://blog.cnnbboy.com/?p=278</link>
		<comments>http://blog.cnnbboy.com/?p=278#comments</comments>
		<pubDate>Sat, 28 Aug 2010 04:06:52 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[MeeGo学习]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[repo]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=278</guid>
		<description><![CDATA[MeeGo渐渐地完善起来，以后系统上研究的平台也将主要是将是它，毕竟是使用Qt作为主框架，内心里还是很喜欢的。
目前MeeGo的源码还没有直接的包可以下载，只能在http://meego.gitorious.org/上通过git获得，网上有利用android的repo实现全部源码下载的过程，但是如果照搬的话，在我这边的网络环境下，会一直卡在12%，并且有人尝试使用美国的VPN下载，照样卡在12%。
经过昨天的研究，发现使用很简单的办法就可以完成，当然下载花费的时间依然很久。
首先，把网上原版的方法先说明下：
Linux环境（Ubuntu）
1.安装git和curl
使用命令 sudo apt-get install git-core curl，这两个是最基本的工具，用处也很清晰，源码管理工具和web工具
2.安装repo
获取android源码下载使用的工具repo，使用python编写，当然不一定只能用于android的源码下载，只要使用git管理的源码，都应当能使用
curl http://android.git.kernel.org/repo ~/repo
使用curl下载repo
chmod a+x ~/repo
给repo加上可执行和拥有者等权限
mv ~/repo /usr/bin
直接扔到/usr/bin目录，也不用考虑环境变量的问题了，而且只是单纯的小工具，不会影响系统整体
3下载meego源码
首先自然是创建一个文件目录来存放源码，使用命令
mkdir -pv ~/meego
然后进入该源码目录
cd ~/meego
其次初始化代码库
repo init -u git://gitorious.org/repo-for-meego/meego_manifest.git
这其中会让你输入姓名和邮件地址，只要输入可用即可，最后还会选择颜色，输入颜色单词回车即可
最后就是同步代码
repo sync
Windows环境(Cygwin)
1.安装Cygwin，除了默认的，还要安装好以下的packages
*Net-&#62;curl
*Devel-&#62;git*(git,git-completion,git-gui,gitk)
*Libs-&#62;libreadline,libiconv
*Editors-&#62;vim
*Python-&#62;python
这些包如果对于安装过Cygwin的同学来说，很简单，如果不知道，请去参考网上Cygwin的教程
2.安装repo工具
跟前面linux一样的步骤，三个命令即可
curl http://android.git.kernel.org/repo ~/repo
chmod a+x ~/repo
mv ~/repo /usr/bin
3.下载meego源码
更前面linux一模一样，也是四个命令
mkdir -pv ~/meego
cd ~/meego
repo init -u git://gitorious.org/repo-for-meego/meego_manifest.git
repo sync
不管是在linux下还是cygwin下，其实步骤都是类似，但是如果安装以上的步骤，很有可能是下到12%时，就出错断了，因此还要加上一个步骤：
修改下载协议，把原有的http协议改为git协议
vi ~/meeg/.repo/manifest.xml
把其中的fetch=&#8221;http://git.gitorious.org&#8221;修改为fetch=&#8221;git://git.gitorious.org&#8221;
然后保存退出，再次执行repo sync
这时就应当能保证MeeGo源码的正常下载
PS：我下载一共花费了12小时，真是相当漫长的时间啊
]]></description>
			<content:encoded><![CDATA[<p>MeeGo渐渐地完善起来，以后系统上研究的平台也将主要是将是它，毕竟是使用Qt作为主框架，内心里还是很喜欢的。<br />
目前MeeGo的源码还没有直接的包可以下载，只能在http://meego.gitorious.org/上通过git获得，网上有利用android的repo实现全部源码下载的过程，但是如果照搬的话，在我这边的网络环境下，会一直卡在12%，并且有人尝试使用美国的VPN下载，照样卡在12%。<br />
经过昨天的研究，发现使用很简单的办法就可以完成，当然下载花费的时间依然很久。<br />
首先，把网上原版的方法先说明下：<br />
<strong>Linux环境（Ubuntu）</strong><br />
<strong>1.安装git和curl</strong><br />
使用命令 sudo apt-get install git-core curl，这两个是最基本的工具，用处也很清晰，源码管理工具和web工具<br />
<strong>2.安装repo</strong><br />
获取android源码下载使用的工具repo，使用python编写，当然不一定只能用于android的源码下载，只要使用git管理的源码，都应当能使用<br />
curl http://android.git.kernel.org/repo ~/repo<br />
使用curl下载repo<br />
chmod a+x ~/repo<br />
给repo加上可执行和拥有者等权限<br />
mv ~/repo /usr/bin<br />
直接扔到/usr/bin目录，也不用考虑环境变量的问题了，而且只是单纯的小工具，不会影响系统整体<br />
<strong>3下载meego源码</strong><br />
首先自然是创建一个文件目录来存放源码，使用命令<br />
mkdir -pv ~/meego<br />
然后进入该源码目录<br />
cd ~/meego<br />
其次初始化代码库<br />
repo init -u git://gitorious.org/repo-for-meego/meego_manifest.git<br />
这其中会让你输入姓名和邮件地址，只要输入可用即可，最后还会选择颜色，输入颜色单词回车即可<br />
最后就是同步代码<br />
repo sync<span id="more-278"></span><br />
<strong>Windows环境(Cygwin)</strong><br />
<strong>1.安装Cygwin，除了默认的，还要安装好以下的packages</strong><br />
*Net-&gt;curl<br />
*Devel-&gt;git*(git,git-completion,git-gui,gitk)<br />
*Libs-&gt;libreadline,libiconv<br />
*Editors-&gt;vim<br />
*Python-&gt;python<br />
这些包如果对于安装过Cygwin的同学来说，很简单，如果不知道，请去参考网上Cygwin的教程<br />
<strong>2.安装repo工具</strong><br />
跟前面linux一样的步骤，三个命令即可<br />
curl http://android.git.kernel.org/repo ~/repo<br />
chmod a+x ~/repo<br />
mv ~/repo /usr/bin<br />
<strong>3.下载meego源码</strong><br />
更前面linux一模一样，也是四个命令<br />
mkdir -pv ~/meego<br />
cd ~/meego<br />
repo init -u git://gitorious.org/repo-for-meego/meego_manifest.git<br />
repo sync<br />
不管是在linux下还是cygwin下，其实步骤都是类似，但是如果安装以上的步骤，很有可能是下到12%时，就出错断了，因此还要加上一个步骤：<br />
修改下载协议，把原有的http协议改为git协议<br />
vi ~/meeg/.repo/manifest.xml<br />
把其中的fetch=&#8221;http://git.gitorious.org&#8221;修改为fetch=&#8221;git://git.gitorious.org&#8221;<br />
然后保存退出，再次执行repo sync<br />
这时就应当能保证MeeGo源码的正常下载<br />
PS：我下载一共花费了12小时，真是相当漫长的时间啊</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=278</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ok6410开发板开发环境搭建－使用dnw2烧写镜像文件</title>
		<link>http://blog.cnnbboy.com/?p=268</link>
		<comments>http://blog.cnnbboy.com/?p=268#comments</comments>
		<pubDate>Sun, 22 Aug 2010 16:00:49 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[嵌入式Linux]]></category>
		<category><![CDATA[dnw2]]></category>
		<category><![CDATA[OK6410]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=268</guid>
		<description><![CDATA[最近，ok6410环境慢慢折腾好，发现水平的确在提高，当年折腾qq2440时真是无知得很啊。
最近发现网上有了Linux版本的DNW，而且已经是DNW2了，研究了下，的确是蛮用的。
虽然是针对2410及2440开发板的，但是修改后，6410的开发板也是能使用的，并且已经在ok6410上试验过了。
1.准备工作
首先要安装libusb，这在ubuntu底下非常方便，只要使用命令：
sudo apt-get install libusb-dev
就可以
其次是获取源码，去http://fayaa.com/code/view/13007/下载源码，另存为dnw2.c，存放到自定义目录即可
2.编译dnw2
编译dnw2也是十分简单，进入存放dnw2.c的目录，然后使用命令
gcc dnw2.c -o dnw2 -lusb
只要前面libusb顺利安装了，就可以编译成功
编译后，会有dnw2可执行文件产生
3.使用dnw2烧写镜像文件
3.1使用kermit连接到开发板后,打开开发板电源，然后按回车进入uboot的命令行模式
3.2顺利进入命令模式后，输入 dnw c0008000,回车
3.3在存放dnw2可执行文件的目录下，执行 ./dnw2 path/file，pat/file指的是镜像位置的所在目录和命令，顺利的话，文件就开始向开发板上传
3.4上传完毕后，就擦除 Nandflash:在命令行中输入 nand erase 100000 300000 ,回车，这里的erase后两个参数指的是物理地址，根据文档里是要烧写的镜像文件决定，切勿照搬
3.5将内存的内核映像文件烧写到 Nandflash:
在命令行中输入 nand write.e c0008000 100000 300000 ,回车，这里 write.e后面两个参数也跟遵循上面所述。
按照这样的步骤完成后，就可以顺利完成烧写，我在ok6410上试验一次即顺利通过，有了这个dnw2这个小程序，以后就不用切换到windows环境下去了，对于开发的效率有着极大的帮助。
PS:其实查看了dnw2的源码，整个实现不是很复杂，关键是熟悉这些东西的人才能写出来，第一个奉献者总是伟大的，后面还有使用Qt加了GUI界面的dnw2，不过十分简陋。打算研究透彻后使用Qt重写一边，以便同时支持2440和6410。
]]></description>
			<content:encoded><![CDATA[<p>最近，ok6410环境慢慢折腾好，发现水平的确在提高，当年折腾qq2440时真是无知得很啊。<br />
最近发现网上有了Linux版本的DNW，而且已经是DNW2了，研究了下，的确是蛮用的。<br />
虽然是针对2410及2440开发板的，但是修改后，6410的开发板也是能使用的，并且已经在ok6410上试验过了。<br />
1.准备工作<br />
首先要安装libusb，这在ubuntu底下非常方便，只要使用命令：<br />
sudo apt-get install libusb-dev<br />
就可以<br />
其次是获取源码，去http://fayaa.com/code/view/13007/下载源码，另存为dnw2.c，存放到自定义目录即可<br />
2.编译dnw2<br />
编译dnw2也是十分简单，进入存放dnw2.c的目录，然后使用命令<br />
gcc dnw2.c -o dnw2 -lusb<br />
只要前面libusb顺利安装了，就可以编译成功<br />
编译后，会有dnw2可执行文件产生<br />
3.使用dnw2烧写镜像文件<br />
3.1使用kermit连接到开发板后,打开开发板电源，然后按回车进入uboot的命令行模式<br />
3.2顺利进入命令模式后，输入 dnw c0008000,回车<br />
3.3在存放dnw2可执行文件的目录下，执行 ./dnw2 path/file，pat/file指的是镜像位置的所在目录和命令，顺利的话，文件就开始向开发板上传<br />
3.4上传完毕后，就擦除 Nandflash:在命令行中输入 nand erase 100000 300000 ,回车，这里的erase后两个参数指的是物理地址，根据文档里是要烧写的镜像文件决定，切勿照搬<br />
3.5将内存的内核映像文件烧写到 Nandflash:<br />
在命令行中输入 nand write.e c0008000 100000 300000 ,回车，这里 write.e后面两个参数也跟遵循上面所述。</p>
<p>按照这样的步骤完成后，就可以顺利完成烧写，我在ok6410上试验一次即顺利通过，有了这个dnw2这个小程序，以后就不用切换到windows环境下去了，对于开发的效率有着极大的帮助。</p>
<p>PS:其实查看了dnw2的源码，整个实现不是很复杂，关键是熟悉这些东西的人才能写出来，第一个奉献者总是伟大的，后面还有使用Qt加了GUI界面的dnw2，不过十分简陋。打算研究透彻后使用Qt重写一边，以便同时支持2440和6410。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=268</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ok6410开发板开发环境搭建－NFS文件启动</title>
		<link>http://blog.cnnbboy.com/?p=259</link>
		<comments>http://blog.cnnbboy.com/?p=259#comments</comments>
		<pubDate>Sat, 21 Aug 2010 15:57:46 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[嵌入式Linux]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[OK6410]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=259</guid>
		<description><![CDATA[
最近利用一切业余时间学习，真是相当艰辛的过程。
系统：Ubuntu10.04
开发板：飞凌OK6410
1. 准备 NFS 文件系统目录
启动 nfs 服务之前,必须在 Linux 虚拟机上准备好 NFS 共享目录。
例如我们采用 ubuntu 的“/forlinx/root”作为 NFS 共享目录,将用户基础资料光盘中
“linux2.6.28/filesystem/OK6410_yaffs2_v1.0.tgz”压缩文件拷贝到这个目录下,
然解压缩,得到根文件系统所需要目录。
在虚拟机上打开一个终端,输入以下命令:
mkdir /forlinx/root
将 OK6410_yaffs2_v1.0.tgz 文件拷贝到该目录下,解压:
tar –zxf OK6410_yaffs2_v1.0.tgz
2. 设置主机 IP
这里我们将 Linux 虚拟机的 IP 设置为 192.168.0.231
3. 配置 NFS 服务
在虚拟机上新建一个终端,依次输入以下命令:
sudo apt-get install portmap
sudo apt-get install nfs-kernel-server
sudo gedit /etc/exports
在弹出的文本编辑器中编辑 exports 文件,在最后一行添加:
/forlinx *(rw,sync,no_root_squash)
4. 启动 NFS 服务
sudo /etc/init.d/portmap restart
sudo /etc/init.d/nfs-kernel-server restart
5. 在开发板上设置并保存启动参数
在 u-boot 命令行下输入以下命令设置 u-boot 启动参数:
setenv bootargs "root=/dev/nfs rw [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		PRE.cjk { font-family: "Norasi", monospace } 		P { margin-bottom: 0.21cm } --></p>
<pre style="margin-bottom: 0.5cm;"><span style="font-family: Norasi;"><span style="font-size: small;">最近利用一切业余时间学习，真是相当艰辛的过程。</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">系统：</span></span><span style="font-family: Norasi;"><span style="font-size: small;">Ubuntu10.04</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">开发板：飞凌</span></span><span style="font-family: Norasi;"><span style="font-size: small;">OK6410</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">1. </span></span><span style="font-family: Norasi;"><span style="font-size: small;">准备 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件系统目录</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">启动 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">nfs </span></span><span style="font-family: Norasi;"><span style="font-size: small;">服务之前</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">必须在 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">Linux </span></span><span style="font-family: Norasi;"><span style="font-size: small;">虚拟机上准备好 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">共享目录。</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">例如我们采用 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">ubuntu </span></span><span style="font-family: Norasi;"><span style="font-size: small;">的“</span></span><span style="font-family: Norasi;"><span style="font-size: small;">/forlinx/root”</span></span><span style="font-family: Norasi;"><span style="font-size: small;">作为 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">共享目录</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">将用户基础资料光盘中</span></span>
“<span style="font-family: Norasi;"><span style="font-size: small;">linux2.6.28/filesystem/OK6410_yaffs2_v1.0.tgz”</span></span><span style="font-family: Norasi;"><span style="font-size: small;">压缩文件拷贝到这个目录下</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">然解压缩</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">得到根文件系统所需要目录。</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">在虚拟机上打开一个终端</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">输入以下命令</span></span><span style="font-family: Norasi;"><span style="font-size: small;">:</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">mkdir /forlinx/root</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">将 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">OK6410_yaffs2_v1.0.tgz </span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件拷贝到该目录下</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">解压</span></span><span style="font-family: Norasi;"><span style="font-size: small;">:</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">tar –zxf OK6410_yaffs2_v1.0.tgz</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">2. </span></span><span style="font-family: Norasi;"><span style="font-size: small;">设置主机 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">IP</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">这里我们将 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">Linux </span></span><span style="font-family: Norasi;"><span style="font-size: small;">虚拟机的 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">IP </span></span><span style="font-family: Norasi;"><span style="font-size: small;">设置为 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">192.168.0.231</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">3. </span></span><span style="font-family: Norasi;"><span style="font-size: small;">配置 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">服务</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">在虚拟机上新建一个终端</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">依次输入以下命令</span></span><span style="font-family: Norasi;"><span style="font-size: small;">:</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">sudo apt-get install portmap</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">sudo apt-get install nfs-kernel-server</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">sudo gedit /etc/exports</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">在弹出的文本编辑器中编辑 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">exports </span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,</span></span><span style="font-family: Norasi;"><span style="font-size: small;">在最后一行添加</span></span><span style="font-family: Norasi;"><span style="font-size: small;">:</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">/forlinx *(rw,sync,no_root_squash)</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">4. </span></span><span style="font-family: Norasi;"><span style="font-size: small;">启动 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">服务</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">sudo /etc/init.d/portmap restart</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">sudo /etc/init.d/nfs-kernel-server restart</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">5. </span></span><span style="font-family: Norasi;"><span style="font-size: small;">在开发板上设置并保存启动参数</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">在 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">u-boot </span></span><span style="font-family: Norasi;"><span style="font-size: small;">命令行下输入以下命令设置 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">u-boot </span></span><span style="font-family: Norasi;"><span style="font-size: small;">启动参数</span></span><span style="font-family: Norasi;"><span style="font-size: small;">:</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">setenv bootargs "root=/dev/nfs rw nfsroot=192.168.0.231:$rootpath
ip=192.168.0.232:192.168.0.231:192.168.0.201:255.255.255.0:witech.com.cn:eth0:off console=ttySAC0,115200"</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">saveenv</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">(这个Uboot</span></span><span style="font-family: Norasi;"><span style="font-size: small;">变量参数最为关键，依次为</span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS</span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件系统所在目标机的</span></span><span style="font-family: Norasi;"><span style="font-size: small;">IP</span></span><span style="font-family: Norasi;"><span style="font-size: small;">，开发板</span></span><span style="font-family: Norasi;"><span style="font-size: small;">IP</span></span><span style="font-family: Norasi;"><span style="font-size: small;">，
</span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS</span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件系统所在目标机的</span></span><span style="font-family: Norasi;"><span style="font-size: small;">IP</span></span><span style="font-family: Norasi;"><span style="font-size: small;">，路由网关，掩码</span></span><span style="font-family: Norasi;"><span style="font-size: small;">)</span></span>
<span style="font-family: Norasi;"><span style="font-size: small;">重新启动开发板</span></span><span style="font-family: Norasi;"><span style="font-size: small;">,Linux </span></span><span style="font-family: Norasi;"><span style="font-size: small;">内核启动后会自动挂载 </span></span><span style="font-family: Norasi;"><span style="font-size: small;">NFS </span></span><span style="font-family: Norasi;"><span style="font-size: small;">文件系统。</span></span></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=259</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu服务器下终端乱码问题</title>
		<link>http://blog.cnnbboy.com/?p=254</link>
		<comments>http://blog.cnnbboy.com/?p=254#comments</comments>
		<pubDate>Fri, 06 Aug 2010 12:40:27 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[Ubuntu学习]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=254</guid>
		<description><![CDATA[这几日又从gentoo奔波到ubuntu上了，真是瞎折腾
不过虚拟机的确是个好东西，装了下ubunut服务器10.04版，相当不错，在装的第二个虚拟机时，选择了中文，于是发现完毕后进入终端乱码。
于是干脆改成英文，改良下网上的办法。
添加英文字符编码的方法
1. 直接使用locale-gen
在终端输入命令：
sudo locale-gen en_US.UTF-8
即可完成中文字符集的添加。完成后可以转到
/usr/lib/locale/，下面已经有一个en_US.UTF-8文件夹；在超级终端输入命令：
cat /var/lib/locales/supported.d/local，可以发现文件中多了一行：en_US.UTF-8 UTF-8。说明添加成功。
2. 通过修改/var/lib/locales/supported.d/local文件
在终端输入命令行
sudo gedit /var/lib/locales/supported.d/local
可以看到如下内容：
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8
在文件尾添加中文字符集
en_US.UTF-8 UTF-8
保存后退出。在终端输入命令：
sudo dpkg-reconfigure locales
Generating locales...
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8... done
en_GB.UTF-8... done
en_HK.UTF-8... done
en_IE.UTF-8... done
en_IN.UTF-8... done
en_NZ.UTF-8... done
en_PH.UTF-8... done
en_SG.UTF-8... done
en_US.UTF-8... done
en_ZA.UTF-8... done
en_ZW.UTF-8... done
zh_CN.GBK... done
zh_CN.UTF-8... up-to-date
zh_HK.UTF-8... done
zh_SG.UTF-8... done
zh_TW.UTF-8... done
Generation complete.
即可生成相应文件：/usr/lib/locale/en_US.uft8/
输入命令sudo vi /etc/default/locale
修改为：
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
最后重启ubuntu，终端显示正常了，没有中文的乱码方块了。
]]></description>
			<content:encoded><![CDATA[<pre>这几日又从gentoo奔波到ubuntu上了，真是瞎折腾</pre>
<pre>不过虚拟机的确是个好东西，装了下ubunut服务器10.04版，相当不错，在装的第二个虚拟机时，选择了中文，于是发现完毕后进入终端乱码。</pre>
<pre>于是干脆改成英文，改良下网上的办法。</pre>
<pre>添加英文字符编码的方法
1. 直接使用locale-gen
在终端输入命令：
sudo locale-gen en_US.UTF-8
即可完成中文字符集的添加。完成后可以转到</pre>
<pre>/usr/lib/locale/，下面已经有一个en_US.UTF-8文件夹；在超级终端输入命令：</pre>
<pre>cat /var/lib/locales/supported.d/local，可以发现文件中多了一行：en_US.UTF-8 UTF-8。说明添加成功。</pre>
<pre>2. 通过修改/var/lib/locales/supported.d/local文件
在终端输入命令行
sudo gedit /var/lib/locales/supported.d/local
可以看到如下内容：
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8</pre>
<pre>在文件尾添加中文字符集
en_US.UTF-8 UTF-8</pre>
<pre>保存后退出。在终端输入命令：</pre>
<pre>sudo dpkg-reconfigure locales</pre>
<pre>Generating locales...
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8... done
en_GB.UTF-8... done
en_HK.UTF-8... done
en_IE.UTF-8... done
en_IN.UTF-8... done
en_NZ.UTF-8... done
en_PH.UTF-8... done
en_SG.UTF-8... done
en_US.UTF-8... done
en_ZA.UTF-8... done
en_ZW.UTF-8... done
zh_CN.GBK... done
zh_CN.UTF-8... up-to-date
zh_HK.UTF-8... done
zh_SG.UTF-8... done
zh_TW.UTF-8... done
Generation complete.</pre>
<pre>即可生成相应文件：/usr/lib/locale/en_US.uft8/
输入命令sudo vi /etc/default/locale</pre>
<pre>修改为：</pre>
<pre>LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
最后重启ubuntu，终端显示正常了，没有中文的乱码方块了。</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=254</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gentoos使用感受</title>
		<link>http://blog.cnnbboy.com/?p=251</link>
		<comments>http://blog.cnnbboy.com/?p=251#comments</comments>
		<pubDate>Sat, 31 Jul 2010 14:20:14 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[生活]]></category>
		<category><![CDATA[gnetoo]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=251</guid>
		<description><![CDATA[最近，由于在项目组老大的要求，在gentoo下好好的折腾了yum，被折磨得够呛的。
通过使用gentoo，其实对自己的linux水平的提高有着非常大的帮助。
比如gentoo，虽然只是发行版之一，但是对使用人员的要求跟ubuntu完全不一样，如果说ubuntu是傻瓜数码相机的话，那gentoo就可以说是单反。个人感觉是，如果ubuntu是面向所有用户，那gentoo就是面向开发人员的。
而最重要的体会是，不管用哪个发行版的linux，如何去除浮华的表面，深刻掌握本质才是最重要的。
关于这点，其实去学习LFS，尝试搭建会遇到很多挫折，当然也能学到非常多的东西。
关于LFS，可以去http://trac.cross-lfs.org/。
希望产品上市后，能抽出时间来尝试嵌入式上的LFS。
]]></description>
			<content:encoded><![CDATA[<p>最近，由于在项目组老大的要求，在gentoo下好好的折腾了yum，被折磨得够呛的。</p>
<p>通过使用gentoo，其实对自己的linux水平的提高有着非常大的帮助。</p>
<p>比如gentoo，虽然只是发行版之一，但是对使用人员的要求跟ubuntu完全不一样，如果说ubuntu是傻瓜数码相机的话，那gentoo就可以说是单反。个人感觉是，如果ubuntu是面向所有用户，那gentoo就是面向开发人员的。</p>
<p>而最重要的体会是，不管用哪个发行版的linux，如何去除浮华的表面，深刻掌握本质才是最重要的。</p>
<p>关于这点，其实去学习LFS，尝试搭建会遇到很多挫折，当然也能学到非常多的东西。</p>
<p>关于LFS，可以去http://trac.cross-lfs.org/。</p>
<p>希望产品上市后，能抽出时间来尝试嵌入式上的LFS。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=251</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ok6410开发板开发环境搭建－串口</title>
		<link>http://blog.cnnbboy.com/?p=245</link>
		<comments>http://blog.cnnbboy.com/?p=245#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:39:01 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[C-kermit]]></category>
		<category><![CDATA[OK6410]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=245</guid>
		<description><![CDATA[系统：Ubuntu9.10
开发板：飞凌OK6410
最近购入一块新的开发板，芯片是基于三星的S3C6410，ARM11，使用之后发现，速度果然很不错，跟ARM9的S3C2440不可同日而语。飞凌的开发板质量很不错，跟友善之臂相比，谁比较好一目了然，当然，这二家的主要市场不太一样，友善之臂主要面向的是学生市场，价格自然要低些，但是一份价格一份货，如果要作为产品开发，自然还是要选择可靠点。不过，我纯粹是拿来学习，增长功力的。
当然，新的开发板，总要为它搭建下开发环境，虽然已经是比较熟练了，但是记录下来，既可以当作笔记，也可以帮助其他人。
飞凌的开发板比较偏向wince，自然wince的支持就比较好，而linux上就稍微薄弱了点，linux版的用户手册里甚至没记录怎么linux下进行串口的连接，只简单描述了如何用windows的超级终端连接。
一般来说，在linux下可以使用minicom和C-kerimit两款通讯软件，而我个人比较偏向C-kermit，实际开发中，我也一直使用C-kermit，原因有两个，第一，当我第一次搭开发环境时，我选择了minicom，结果在ubuntu下既乱码，显示效果又很奇怪，折腾了很久才搞定；第二，C-kermit的确是一个很强大的软件，而且配合Uboot可以完成许多特性，并且显示效果也不错，所以就一直用到了现在。
目前，ubuntu里已经集成了C-kermit,使用命令kermint就可以打开，如果需要自己编译安装，可以去官网地址下载源码包。
C-kermit官网：http://www.columbia.edu/kermit/
官网上还附带了使用手册，可以帮助来学习这个强大的工具。
第一步，就是先配置使用的参数，当然可以打开kermit后来来配置，然后一开始配置好就可以省去很多麻烦。
如果选择全局的参数配置，就使用命令：
#sudo vi /etc/kermit/kermrc
如果只针对当前的用户，就使用命令：
#vi ~/.kermrc
打开文件后，把配置参数写入进入，网上通用的参数如下：
#----- kermrc for /dev/ttyUSB0 -------------------
#设置通信的目标串口，由于我的笔记本没有串口，使用了USB转串口，所以设备为/dev/ttyUSB0
set line /dev/ttyUSB0
#设置波特率
set speed 115200
#关闭通信监视
set carrier-watch off
#设置没有握手协议
set handshake none
#数据流控制为无
set flow-control none
#设置保守安全及缓慢的传输设置
robust
#设置可以传输二进制文件
set file type bin
#限制传输文件名
set file name lit
#设置接受文件包的大小为1000字节
set rec pack 1000
#设置传输文件包的大小为1000字节
set send pack 1000
#设置窗口大小
set window 5
#---------end------------------------------------
这些参数就足够保证能初步连上OK6410，当然，C-kermit其实还有更多参数，并且在配置里还可以定制不同情况下的参数，这些属于题外话，在以后可以慢慢探讨。
第二步，就是打开命令进行连接，不过这之前，可以先了解下C-kermit的知识。
kermit有两种模式，一种为终端模式，一种为命令模式处于终端模式时，显示从串口发回来的数据，处于命令模式时，显示命令提示符，并等待用户输入命令后，执行命令。运行kermit，进入命令模式，输入"connect"并回车，进入终端模式。在终端模式按下Ctrl + \, 再按下C 返回命令模式



常用命令connect : 连接串口设备，连接成功后进入终端模式，简写为cquit: 退出kermit， 简写为qsend: 使用kermit协议发送文件，与uboot传送文件时使用run : 运行外部命令，我们将用这个命令调用xmodem发送文件。?   : 显示全部命令!   : 运行一个shell,需要临时离开kermit进行其它的作业的时候，可以使用叹号命令。结果操作时使用exit退出shell，返回kermit。
了解了这些知识，可以去连接OK6410了。
最后，以运行C-kermint并且连接上OK6410来结束本篇文章，在未来还可以探讨在裸机的情况下将Uboot传输进去。
# kermit
?Not confirmed - robust
Command stack:
1. File  : /home/wangchen/.kermrc [...]]]></description>
			<content:encoded><![CDATA[<pre>系统：Ubuntu9.10</pre>
<pre>开发板：飞凌OK6410</pre>
<pre>最近购入一块新的开发板，芯片是基于三星的S3C6410，ARM11，使用之后发现，速度果然很不错，跟ARM9的S3C2440不可同日而语。飞凌的开发板质量很不错，跟友善之臂相比，谁比较好一目了然，当然，这二家的主要市场不太一样，友善之臂主要面向的是学生市场，价格自然要低些，但是一份价格一份货，如果要作为产品开发，自然还是要选择可靠点。不过，我纯粹是拿来学习，增长功力的。</pre>
<pre>当然，新的开发板，总要为它搭建下开发环境，虽然已经是比较熟练了，但是记录下来，既可以当作笔记，也可以帮助其他人。</pre>
<pre>飞凌的开发板比较偏向wince，自然wince的支持就比较好，而linux上就稍微薄弱了点，linux版的用户手册里甚至没记录怎么linux下进行串口的连接，只简单描述了如何用windows的超级终端连接。</pre>
<pre>一般来说，在linux下可以使用minicom和C-kerimit两款通讯软件，而我个人比较偏向C-kermit，实际开发中，我也一直使用C-kermit，原因有两个，第一，当我第一次搭开发环境时，我选择了minicom，结果在ubuntu下既乱码，显示效果又很奇怪，折腾了很久才搞定；第二，C-kermit的确是一个很强大的软件，而且配合Uboot可以完成许多特性，并且显示效果也不错，所以就一直用到了现在。</pre>
<pre>目前，ubuntu里已经集成了C-kermit,使用命令kermint就可以打开，如果需要自己编译安装，可以去官网地址下载源码包。</pre>
<pre>C-kermit官网：http://www.columbia.edu/kermit/</pre>
<pre>官网上还附带了使用手册，可以帮助来学习这个强大的工具。</pre>
<pre>第一步，就是先配置使用的参数，当然可以打开kermit后来来配置，然后一开始配置好就可以省去很多麻烦。</pre>
<pre>如果选择全局的参数配置，就使用命令：</pre>
<pre>#sudo vi /etc/kermit/kermrc</pre>
<pre>如果只针对当前的用户，就使用命令：</pre>
<pre>#vi ~/.kermrc</pre>
<pre>打开文件后，把配置参数写入进入，网上通用的参数如下：</pre>
<pre>#----- kermrc for /dev/ttyUSB0 -------------------
#设置通信的目标串口，由于我的笔记本没有串口，使用了USB转串口，所以设备为/dev/ttyUSB0
set line /dev/ttyUSB0</pre>
<pre>#设置波特率
set speed 115200</pre>
<pre>#关闭通信监视
set carrier-watch off</pre>
<pre>#设置没有握手协议
set handshake none</pre>
<pre>#数据流控制为无
set flow-control none</pre>
<pre>#设置保守安全及缓慢的传输设置
robust</pre>
<pre>#设置可以传输二进制文件
set file type bin</pre>
<pre>#限制传输文件名
set file name lit</pre>
<pre>#设置接受文件包的大小为1000字节
set rec pack 1000</pre>
<pre>#设置传输文件包的大小为1000字节
set send pack 1000</pre>
<pre>#设置窗口大小
set window 5</pre>
<pre>#---------end------------------------------------</pre>
<pre>这些参数就足够保证能初步连上OK6410，当然，C-kermit其实还有更多参数，并且在配置里还可以定制不同情况下的参数，这些属于题外话，在以后可以慢慢探讨。</pre>
<pre>第二步，就是打开命令进行连接，不过这之前，可以先了解下C-kermit的知识。</pre>
<pre>kermit有两种模式，一种为终端模式，一种为命令模式<br id="hs3e" />处于终端模式时，显示从串口发回来的数据，处于命令模式时，显示命令提示符，并等待用户输入命令后，执行命令。<br id="p5s8" />运行kermit，进入命令模式，输入"connect"并回车，进入终端模式。<br id="r73q" />在终端模式按下Ctrl + \, 再按下C 返回命令模式<br id="w6vy" /><br id="j.g_" /></pre>
<div id="ma_6" style="padding: 1em 0pt; text-align: left;">
<pre><img id="y5qu" style="width: 229px; height: 74px;" src="http://docs.google.com/File?id=dc66rv46_7ggq6qtc5" alt="" /></pre>
</div>
<pre><br id="ib1d" />常用命令<br id="qig8" />connect : 连接串口设备，连接成功后进入终端模式，简写为c<br id="zjnx" />quit: 退出kermit， 简写为q<br id="igw-" />send: 使用kermit协议发送文件，与uboot传送文件时使用<br id="anwp" />run : 运行外部命令，我们将用这个命令调用xmodem发送文件。<br id="jtue" />?   : 显示全部命令<br id="n2s3" />!   : 运行一个shell,需要临时离开kermit进行其它的作业的时候，可以使用叹号命令。结果操作时使用exit退出shell，返回kermit。</pre>
<pre>了解了这些知识，可以去连接OK6410了。</pre>
<pre>最后，以运行C-kermint并且连接上OK6410来结束本篇文章，在未来还可以探讨在裸机的情况下将Uboot传输进去。</pre>
<pre># kermit
?Not confirmed - robust
Command stack:
1. File  : /home/wangchen/.kermrc (line 5)
0. Prompt: (top level)
?No keywords match - sendd
Command stack:
1. File  : /home/wangchen/.kermrc (line 9)
0. Prompt: (top level)
C-Kermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/wangchen/Desktop/) C-Kermit&gt;c
Connecting to /dev/ttyUSB0, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
OK</pre>
<pre>U-Boot 1.1.6 (Jan 14 2010 - 00:48:10) for SMDK6410</pre>
<pre>****************************************
**    u-boot 1.1.6                    **
**    Updated for TE6410 Board        **
**    Version 1.0 (10-01-15)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************</pre>
<pre>CPU:     S3C6410 @532MHz
Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode)
Board:   SMDK6410
DRAM:    128 MB
Flash:   0 kB
NAND:    256 MB
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  0</pre>
<pre>NAND read: device 0 offset 0x100000, size 0x300000
3145728 bytes read: OK
Boot with zImage</pre>
<pre>Starting kernel ...</pre>
<pre>Uncompressing Linux............................................................................................................................................. done, booting the kernel.
Linux version 2.6.28.6 (jkeqiang@ubuntu) (gcc version 4.2.2) #213 Sun May 9 23:07:10 PDT 2010
CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: SMDK6410
Memory policy: ECC disabled, Data cache writeback
CPU S3C6410 (id 0x36410101)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000
S3C64XX: HCLKx2=266000000, HCLK=133000000, PCLK=66500000
div1: 00000555
mout_apll: source is fout_apll (1), rate is 532000000
mout_epll: source is fout_epll (1), rate is 24000000
mout_mpll: source is mpll (1), rate is 532000000
mmc_bus: source is dout_mpll (1), rate is 44333333
mmc_bus: source is dout_mpll (1), rate is 44333333
mmc_bus: source is dout_mpll (1), rate is 44333333
usb-host-bus: source is mout_epll (0), rate is 24000000
uclk1: source is dout_mpll (1), rate is 66500000
spi-bus: source is mout_epll (0), rate is 24000000
spi-bus: source is mout_epll (0), rate is 24000000
audio-bus0: source is mout_epll (0), rate is 24000000
audio-bus1: source is mout_epll (0), rate is 24000000
audio-bus2: source is mout_epll (0), rate is 24000000
irda-bus: source is mout_epll (0), rate is 24000000
s3c64xx: 15728640 bytes SDRAM reserved for fimc at 0x505a3000
s3c64xx: 8388608 bytes SDRAM reserved for pp at 0x514a3000
s3c64xx: 8388608 bytes SDRAM reserved for tv at 0x51ca3000
s3c64xx: 6291456 bytes SDRAM reserved for mfc at 0x524a3000
s3c64xx: 8388608 bytes SDRAM reserved for jpeg at 0x52aa3000
s3c64xx: 8388608 bytes SDRAM reserved for cmm at 0x532a3000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
Kernel command line: root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
s3c24xx_serial_init_ports: initialising ports=4...
console [ttySAC0] enabled
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128MB = 128MB total
Memory: 70784KB available (3908K code, 494K data, 272K init)
SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Calibrating delay loop... 530.84 BogoMIPS (lpj=1327104)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 316 bytes
NET: Registered protocol family 16
S3C6410: Initialising architecture
S3C DMA-pl080 Controller Driver, (c) 2006-2007 Samsung Electronics
Total 32 DMA channels will be initialized.
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 4, 81920 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
NET: Registered protocol family 1
NetWinder Floating Point Emulator V0.97 (double precision)
yaffs May  9 2010 18:05:41 Installing.
msgmni has been set to 138
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
S3C_LCD clock got enabled :: 133.000 Mhz
LCD TYPE :: LTE480WV will be initialized
Window[0] - FB1: map_video_memory: clear ff000000:0007f800
FB1: map_video_memory: dma=57180000 cpu=ff000000 size=0007f800
Window[0] - FB2: map_video_memory: clear ff03fc00:0003fc00
FB2: map_video_memory: dma=571bfc00 cpu=ff03fc00 size=0003fc00
[DEBUG]logo_lines 34, vc-&gt;vc_bottom 34
Console: switching to colour frame buffer device 60x34
fb0: s3cfb frame buffer device
Window[1] - FB1: map_video_memory: clear ff080000:0007f800
FB1: map_video_memory: dma=57200000 cpu=ff080000 size=0007f800
Window[1] - FB2: map_video_memory: clear ff0bfc00:0003fc00
FB2: map_video_memory: dma=5723fc00 cpu=ff0bfc00 size=0003fc00
fb1: s3cfb frame buffer device
Window[2] - FB1: map_video_memory: clear ff100000:0003fc00
FB1: map_video_memory: dma=57140000 cpu=ff100000 size=0003fc00
fb2: s3cfb frame buffer device
Window[3] - FB1: map_video_memory: clear ff140000:0003fc00
FB1: map_video_memory: dma=57280000 cpu=ff140000 size=0003fc00
fb3: s3cfb frame buffer device
enter s3c6410_leds_init
leds initialized
s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
brd: module loaded
loop: module loaded
PPP generic driver version 2.4.2
dm9000 Ethernet Driver
eth%d: con201 Invalid ethernet MAC address. using default config,  Please set using ifconfig
eth0: dm9000 at f7b00300,f7b00304 IRQ 108 MAC: 00:e0:4a:bc:15:e7
Linux video capture interface: v2.00
s3c-fimc: controller 0 registered successfully
s3c-fimc: controller 1 registered successfully
printk ov965x_init
s3c-fimc: info ov965x_init
S3C6400 MFC Driver, (c) 2007 Samsung Electronics
S3C6400 MFC Driver, (c) 2007 Samsung Electronics
S3C PostProcessor Driver v3.12, (c) 2009 Samsung Electronics
S3C6410 TV encoder Driver, (c) 2008 Samsung Electronics
S3C6410 TV encoder Driver init OK.
S3C6410 TV scaler Driver, (c) 2008 Samsung Electronics
S3C6410 TV scaler Driver init OK.
S3C Rotator Driver, (c) 2008 Samsung Electronics
s3c_rotator_probe called
s3c_rotator_probe success
S3C JPEG Driver, (c) 2007 Samsung Electronics
s3c_g2d_probe called
s3c_g2d_probe Success
S3C G2D Init : Done
S3C G3D Driver, (c) 2007-2009 Samsung Electronics
s3c_g3d version : 0x1050000
S3C G3D Init : Done
S3C CMM Driver, (c) 2008 Samsung Electronics
Driver 'sd' needs updating - please use bus_type methods
S3C NAND Driver, (c) 2008 Samsung Electronics
S3C NAND Driver is using software ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00040000 : "Bootloader"
0x00040000-0x00400000 : "Kernel"
0x00400000-0x05400000 : "Rootfs"
0x05400000-0x10000000 : "File System"
Samsung SoC SPI Driver loaded for SPI-0
Max,Min-Speed [33250000, 129882]Hz
Irq=80    IOmem=[0x7f00bfff-0x7f00b000]    DMA=[Rx-33, Tx-34]
Samsung SoC SPI Driver loaded for SPI-1
Max,Min-Speed [33250000, 129882]Hz
Irq=81    IOmem=[0x7f00cfff-0x7f00c000]    DMA=[Rx-35, Tx-36]
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
s3c-udc : S3C HS USB OTG Device Driver, (c) 2008-2009 Samsung Electronics
s3c-udc : version 15 March 2009 (DMA Mode)
mice: PS/2 mouse device common for all mice
gpio keys driver.
input: gpio-keys as /class/input/input0
S3C Touchscreen driver, (c) 2008 Samsung Electronics
S3C TouchScreen got loaded successfully : 12 bits
input: S3C TouchScreen as /class/input/input1
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410_rtc: tick irq 34, alarm irq 92
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
s3c2440-i2c s3c2440-i2c: slave address 0x10
s3c2440-i2c s3c2440-i2c: bus frequency set to 377 KHz
[OV965X]ov965x_attach_adapter.
[CAM]s3c_fimc_register_camera,cam-&gt;id=0
parent clock for camera: 266.000 MHz, divisor: 11
[CAM]RESET CAM.[CAM]Reset and init reg!1cam-&gt;client=0
[CAM]Reset and init reg!1
[CAM]Reset and init reg!3
s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (44333333 Hz)
[SDHCI]to add external irq as a card detect signal......
[SDHCI]if (pdata-&gt;cfg_ext_cd)......
mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA
[SDHCI]request_irq......
sdhci: card inserted.
s3c-sdhci s3c-sdhci.1: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 2: mmc_bus (44333333 Hz)
[SDHCI]to add external irq as a card detect signal......
mmc1: SDHCI controller on samsung-hsmmc [s3c-sdhci.1] using ADMA
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.18rc3.
ASoC version 0.13.2
WM9713/WM9714 SoC Audio Codec 0.15
playback: 1, capture : 1
asoc: AC97 HiFi &lt;-&gt; s3c64xx-ac97 mapping ok
[WM9713]Open speaker volume.
ALSA device list:
#0: SMDK6400 (WM9713)
TCP cubic registered
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
s3c2410-rtc s3c2410-rtc: setting system clock to 2000-01-04 22:07:28 UTC (947023648)
mtd-&gt;size = 5000000 blocks = 280
cheaking bad block...............
.................................................................................................................................................................................
bad block at 1620000
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 272K
skip bad block b1
*************************************
http://www.witech.com.cn
*************************************
mkdir: cannot create directory '/mnt/disk': File exists
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs: restored from checkpoint
yaffs_read_super: isCheckpointed 1
Try to bring eth0 interface up......eth0: link down
Done</pre>
<pre>Starting Qtopia, please waiting...
touch...</pre>
<pre>Please press Enter to activate this console.
[root@OK6410 /]#</pre>
<pre>参考文章：</pre>
<pre><span style="color: #000000;"><a href="http://docs.google.com/Doc?id=dc66rv46_2mqcz29f9">(1)Linux环境下配置AT91RM9200固件下载工具</a></span></pre>
<pre><span style="color: #000000;"><a href="http://blog.21ic.com/user1/4692/archives/2008/45206.html">(2)kermit使用</a></span></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=245</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wpa_gui程序分析(三)</title>
		<link>http://blog.cnnbboy.com/?p=240</link>
		<comments>http://blog.cnnbboy.com/?p=240#comments</comments>
		<pubDate>Sat, 29 May 2010 09:54:02 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[Qt学习]]></category>
		<category><![CDATA[wpa_supplicant]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=240</guid>
		<description><![CDATA[紧接着上章未完结的，继续分析WpaGui类中的函数。
void processMsg(char *msg)
从名字 上可以看出，这是处理消息的函数，处理的消息当然是wpa_supplicant向上层传递的函数。从前面的文章的分析我们可以得知，控制 wpa_supplicant的主要发式就是使用特定接口，将特定的命令字符串传送过去，而wpa_supplicant作为反馈的是及时的字符串消息， 以及当完成某项任务后的消息。比如，当扫描完成后，wpa_supplicant就会发送WPA_EVENT_SCAN_RESULTS表示已经可以接受 扫描结果了。而该函数，自然就根据wpa_spplicant发送过来的消息做相对应的处理。
void processCtrlReq(const char *req)
用来处理界面上用户发出的请求，具体有UserDataRequest类来完成。
void receiveMsgs()
既然要处理消息，就首先要获得消息，该函数就是用来接受wpa_supplicant发送过来的消息。
void connectB()
从字面上来看，是用来进行连接的，其实如果用网络链接的术语来说，是进行关联，使用的是REASSOCIATE命令让wpa_supplicant去连接上无线网络。
void selectNetwork( const QString &#38;sel )
用来选择无线网络，非常好理解，使用SELECT_NETWORK命令操作。
void enableNetwork(const QString &#38;sel)
void disableNetwork(const QString &#38;sel)
这两个函数是想对应的，在连接一个无线网络之前，首先要使这个网络的参数配置可用，如果不想使用，则可以使它不可用。分别使用ENABLE_NETWORK和DISABLE_NETWORK命令。
void editNetwork(const QString &#38;sel)
void editSelectedNetwork()
void editListedNetwork()
配 置无线网络的各项参数，具体部分由NetworkConfig来完成，而editSelectNetwork()是配置选择好的无线网络，是通过调用 editNetwork()实现的，editListedNetwork()也同样是通过调用editNetwork()实现，作用是配置已经列出来的无 线网络。
void triggerUpdate()
触发更新，用来更新网络的状态和参数。
void addNetwork()
增加一个新的网络，一般可以用来连接隐藏的无线网络，具体实现也是由NetworkConfig()完成。
void removeNetwork(const QString &#38;sel)
void removeSelectedNetwork()
void removeListedNetwork()
与上面配置无线网络的三个函数类似，但作用不同在于是移除无线网络的配置。当从一个地点到里另外一个地点后，原有的无线网络可能会不存在，但是它的配置参数依旧还存在，这时可以使用这几个函数来移除无线网络无效的配置。使用的是REMOVE_NETWORK命令。
void enableAllNetworks()
void disableAllNetworks()
简单的两个函数，使全部配置好的无线网络可用或不可用，是在原来的ENABLE_NETWORK和DISABLE_NETWORK命令基础上，加上all参数来表示对全部网络生效。
void removeAllNetworks()
移除全部网络，是REMOVE_NETWORK命令后加上all的参数实现。
void saveConfig()
其实配置一个网络，在过程中都是在内存中进行的，如果这是没有保存，关闭程序的话，当下次重新启动时，会发现认为配置好的网络参数依旧不存在。而saveConfig()函数的作用就是将内存中的配置保存到文件中，使用的是SAVE_CONFIG命令。
以上就是大部分WpaGui类中函数的分析，其实还有很多函数并没有详细介绍，但是有一部分是与win下套接字变成有关，我并不是非常了解，还有一部分只是单纯的与程序的运行，比如隐藏在系统托盘上等有关，对我们了解wpa_gui的整体框架并不是有很大的帮助。
最后可以总结下，其实wpa_gui就是为wpa_supplicant底层程序增加了一套Qt4的图形交互界面，而这样的构架可以在对未来我们实际项目的设计上有一定的帮助，比如如何做到后台功能和前台界面的分离，如何做到跨平台，都有某种程度的启发。
]]></description>
			<content:encoded><![CDATA[<p>紧接着上章未完结的，继续分析WpaGui类中的函数。</p>
<p>void processMsg(char *msg)</p>
<p>从名字 上可以看出，这是处理消息的函数，处理的消息当然是wpa_supplicant向上层传递的函数。从前面的文章的分析我们可以得知，控制 wpa_supplicant的主要发式就是使用特定接口，将特定的命令字符串传送过去，而wpa_supplicant作为反馈的是及时的字符串消息， 以及当完成某项任务后的消息。比如，当扫描完成后，wpa_supplicant就会发送WPA_EVENT_SCAN_RESULTS表示已经可以接受 扫描结果了。而该函数，自然就根据wpa_spplicant发送过来的消息做相对应的处理。</p>
<p>void processCtrlReq(const char *req)</p>
<p>用来处理界面上用户发出的请求，具体有UserDataRequest类来完成。</p>
<p>void receiveMsgs()</p>
<p>既然要处理消息，就首先要获得消息，该函数就是用来接受wpa_supplicant发送过来的消息。</p>
<p>void connectB()</p>
<p>从字面上来看，是用来进行连接的，其实如果用网络链接的术语来说，是进行关联，使用的是REASSOCIATE命令让wpa_supplicant去连接上无线网络。</p>
<p>void selectNetwork( const QString &amp;sel )</p>
<p>用来选择无线网络，非常好理解，使用SELECT_NETWORK命令操作。</p>
<p>void enableNetwork(const QString &amp;sel)</p>
<p>void disableNetwork(const QString &amp;sel)</p>
<p>这两个函数是想对应的，在连接一个无线网络之前，首先要使这个网络的参数配置可用，如果不想使用，则可以使它不可用。分别使用ENABLE_NETWORK和DISABLE_NETWORK命令。</p>
<p>void editNetwork(const QString &amp;sel)</p>
<p>void editSelectedNetwork()</p>
<p>void editListedNetwork()</p>
<p>配 置无线网络的各项参数，具体部分由NetworkConfig来完成，而editSelectNetwork()是配置选择好的无线网络，是通过调用 editNetwork()实现的，editListedNetwork()也同样是通过调用editNetwork()实现，作用是配置已经列出来的无 线网络。<br />
void triggerUpdate()</p>
<p>触发更新，用来更新网络的状态和参数。</p>
<p>void addNetwork()</p>
<p>增加一个新的网络，一般可以用来连接隐藏的无线网络，具体实现也是由NetworkConfig()完成。</p>
<p>void removeNetwork(const QString &amp;sel)</p>
<p>void removeSelectedNetwork()</p>
<p>void removeListedNetwork()</p>
<p>与上面配置无线网络的三个函数类似，但作用不同在于是移除无线网络的配置。当从一个地点到里另外一个地点后，原有的无线网络可能会不存在，但是它的配置参数依旧还存在，这时可以使用这几个函数来移除无线网络无效的配置。使用的是REMOVE_NETWORK命令。</p>
<p>void enableAllNetworks()</p>
<p>void disableAllNetworks()</p>
<p>简单的两个函数，使全部配置好的无线网络可用或不可用，是在原来的ENABLE_NETWORK和DISABLE_NETWORK命令基础上，加上all参数来表示对全部网络生效。</p>
<p>void removeAllNetworks()</p>
<p>移除全部网络，是REMOVE_NETWORK命令后加上all的参数实现。</p>
<p>void saveConfig()</p>
<p>其实配置一个网络，在过程中都是在内存中进行的，如果这是没有保存，关闭程序的话，当下次重新启动时，会发现认为配置好的网络参数依旧不存在。而saveConfig()函数的作用就是将内存中的配置保存到文件中，使用的是SAVE_CONFIG命令。</p>
<p>以上就是大部分WpaGui类中函数的分析，其实还有很多函数并没有详细介绍，但是有一部分是与win下套接字变成有关，我并不是非常了解，还有一部分只是单纯的与程序的运行，比如隐藏在系统托盘上等有关，对我们了解wpa_gui的整体框架并不是有很大的帮助。</p>
<p>最后可以总结下，其实wpa_gui就是为wpa_supplicant底层程序增加了一套Qt4的图形交互界面，而这样的构架可以在对未来我们实际项目的设计上有一定的帮助，比如如何做到后台功能和前台界面的分离，如何做到跨平台，都有某种程度的启发。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=240</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wpa_gui程序分析(二)</title>
		<link>http://blog.cnnbboy.com/?p=233</link>
		<comments>http://blog.cnnbboy.com/?p=233#comments</comments>
		<pubDate>Sun, 23 May 2010 08:14:38 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[wpa_supplicant]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=233</guid>
		<description><![CDATA[在大致了接Wpa_gui的框架以及与wpa_supplicant交互的接口后，就可以详细分析源码。
正如前面所说的，WpaGui类是最为核心的部分，通过对该类源码的分析，就可以帮助我们了解整个程序，甚至是与wpa_supplicant的交互。
WpaGui类一共由三个文件组成：wpagui.ui,wpagui.h,wpagui.cpp。
wpagui.ui自然是由Qt设计器设计的界面文件，这部分不需要了解太多，使用Qt设计器打开后就可以看到控件和布局的细节部分。
wpagui.h头文件则声明变量函数等，因为函数可以在后面对wpagui.cpp文件的分析中,我将变量按照类型排列来分析：
QApplication *app;
定义了一个QApplicant的指针，用来在程序运行时指向wpagui对象的父对象。
ScanResults *scanres;
Peers *peers;
EventHistory *eh;
UserDataRequest *udr;
AddInterface *add_iface;
WpaMsgList msgs;
这些类已经在前面作过介绍，在这里声明了对应指针以便接下来实例化。
char *ctrl_iface;
char *ctrl_iface_dir;
bool networkMayHaveChanged;
struct wpa_ctrl *monitor_conn;
struct wpa_ctrl *ctrl_conn;
QSocketNotifier *msgNotifier;
QTimer *timer;
int pingsToStatusUpdate;
这里声明的是与wpa_supplican交互时所需要用到的变量
QAction *disconnectAction;
QAction *reconnectAction;
QAction *eventAction;
QAction *scanAction;
QAction *statAction;
QAction *showAction;
QAction *hideAction;
QAction *quitAction;
QAction *addInterfaceAction;
这里声明的是QAction的指针，实例化后来对应执行相应的动作
QMenu *tray_menu;
QSystemTrayIcon *tray_icon;
QMenu和QSystemTrayIcon的指针，用于程序隐藏于系统托盘时
bool ackTrayIcon;
bool startInTray;
bool wpsRunning;
bool connectedToService;
bool inTray;
判断各种状态的bool值变量
QString bssFromScan;
QString的字符串，用于获得扫描后使用bss得到的结果
#ifdef CONFIG_NATIVE_WINDOWS
QAction *fileStartServiceAction;
QAction *fileStopServiceAction;
bool serviceRunning();
#endif /* CONFIG_NATIVE_WINDOWS */
ifdef的宏，用于处理在windows平台时的行为。
wpagui.cpp里主要是各个函数的实现，通过这些函数，就能勾勒出系统运行全貌的大概，因此对每个函数一一进许分析:
static int wpagui_printf(const char *, &#8230;)
该静态函数的作用等同于printf，用于在向wpa_supplicant发送命令时接受不知名的反馈并打印出来。
WpaGui(QApplication *app, QWidget *parent = 0, const char *name [...]]]></description>
			<content:encoded><![CDATA[<p>在大致了接Wpa_gui的框架以及与wpa_supplicant交互的接口后，就可以详细分析源码。</p>
<p>正如前面所说的，WpaGui类是最为核心的部分，通过对该类源码的分析，就可以帮助我们了解整个程序，甚至是与wpa_supplicant的交互。</p>
<p>WpaGui类一共由三个文件组成：wpagui.ui,wpagui.h,wpagui.cpp。</p>
<p>wpagui.ui自然是由Qt设计器设计的界面文件，这部分不需要了解太多，使用Qt设计器打开后就可以看到控件和布局的细节部分。</p>
<p>wpagui.h头文件则声明变量函数等，因为函数可以在后面对wpagui.cpp文件的分析中,我将变量按照类型排列来分析：</p>
<p>QApplication *app;</p>
<p>定义了一个QApplicant的指针，用来在程序运行时指向wpagui对象的父对象。</p>
<p>ScanResults *scanres;</p>
<p>Peers *peers;</p>
<p>EventHistory *eh;</p>
<p>UserDataRequest *udr;</p>
<p>AddInterface *add_iface;</p>
<p>WpaMsgList msgs;<br />
这些类已经在前面作过介绍，在这里声明了对应指针以便接下来实例化。</p>
<p>char *ctrl_iface;</p>
<p>char *ctrl_iface_dir;</p>
<p>bool networkMayHaveChanged;</p>
<p>struct wpa_ctrl *monitor_conn;</p>
<p>struct wpa_ctrl *ctrl_conn;</p>
<p>QSocketNotifier *msgNotifier;</p>
<p>QTimer *timer;</p>
<p>int pingsToStatusUpdate;<br />
这里声明的是与wpa_supplican交互时所需要用到的变量</p>
<p>QAction *disconnectAction;</p>
<p>QAction *reconnectAction;</p>
<p>QAction *eventAction;</p>
<p>QAction *scanAction;</p>
<p>QAction *statAction;</p>
<p>QAction *showAction;</p>
<p>QAction *hideAction;</p>
<p>QAction *quitAction;</p>
<p>QAction *addInterfaceAction;</p>
<p>这里声明的是QAction的指针，实例化后来对应执行相应的动作</p>
<p>QMenu *tray_menu;</p>
<p>QSystemTrayIcon *tray_icon;</p>
<p>QMenu和QSystemTrayIcon的指针，用于程序隐藏于系统托盘时</p>
<p>bool ackTrayIcon;</p>
<p>bool startInTray;</p>
<p>bool wpsRunning;</p>
<p>bool connectedToService;</p>
<p>bool inTray;</p>
<p>判断各种状态的bool值变量</p>
<p>QString bssFromScan;</p>
<p>QString的字符串，用于获得扫描后使用bss得到的结果</p>
<p>#ifdef CONFIG_NATIVE_WINDOWS</p>
<p>QAction *fileStartServiceAction;</p>
<p>QAction *fileStopServiceAction;</p>
<p>bool serviceRunning();</p>
<p>#endif /* CONFIG_NATIVE_WINDOWS */</p>
<p>ifdef的宏，用于处理在windows平台时的行为。</p>
<p>wpagui.cpp里主要是各个函数的实现，通过这些函数，就能勾勒出系统运行全貌的大概，因此对每个函数一一进许分析:</p>
<p>static int wpagui_printf(const char *, &#8230;)</p>
<p>该静态函数的作用等同于printf，用于在向wpa_supplicant发送命令时接受不知名的反馈并打印出来。</p>
<p>WpaGui(QApplication *app, QWidget *parent = 0, const char *name = 0,Qt::WFlags fl = 0);</p>
<p>WpaGui类的构造函数，作用自然很清晰，就是实例化各个对象指针，连接了各个信号与槽，初始化了变量值，并且调用了如updateStatus()的函数。</p>
<p>~WpaGui()</p>
<p>WpaGui类的析构函数，作用也很清晰，就是在程序运行完毕时释放内存，作清理工作。</p>
<p>languageChange()</p>
<p>使用了Qt设计器的retranslateUi()函数用于语言的切换</p>
<p>parse_argv()</p>
<p>参数的解析函数，用于解析程序被执行时获取的参数，参数可以用来设定与wpa_supplicant交互用的套接字口及是否启动隐藏于任务栏。</p>
<p>openCtrlConnection(const char *ifname)</p>
<p>建立ctrl连接函数，在与wpa_supplicant交互前，首先要使用wpa_supllicant的接口来建立连接，该函数会通过默认的参 数或者程序执行时提供的参数，到指定目录下去寻找套接口文件，一旦找到，就建立连接。一般情况下，会建立两个连接，一个用于发送命令，一个用于监视状态， 也就是头文件里声明的变量monitor_conn和ctrl_conn;</p>
<p>ctrlRequest(const char *cmd, char *buf, size_t *buflen)</p>
<p>ctrl请求函数，用于向wpa_supplicnat发送各种命令，该函数需要openCtrlConnection函数先建立了与 wpa_supplicant的连接才能正常执行，使用发送命令的连接ctrl_conn来发送，函数内其实使用的是在前篇文章中提到的 wpa_ctrl_request接口函数。</p>
<p>wpaStateTranslate(char *state)</p>
<p>该函数的作用十分简单，就是将获得的状态字符串使用tr函数国际化。</p>
<p>updateStatus()</p>
<p>状态更新函数，使用ctrlRequest函数向wpa_supplicant发送STATUS命令，当执行成功后，wpa_supplicant会反馈具有固定格式的字符串，程序可以根据自己的需要来解析字符串，该函数解析完字符串后即将所需要的信息显示界面上。</p>
<p>updateNetworks()</p>
<p>类似于updateStatue函数，但是也有所不同，它更新的是wifi的network，使用的是LIST_NETWORKS命令，机制也十分 简单，当wpa_supplicant连接过或连接上一个wifi的ap，它会在定义好的配置文件里保存下该wifi节点的各种属性，而 LIST_NETWORKS命令使wpa_supplicant去读取该配置文件，然后反馈回去。updateNetworks()在封装了这一步骤的同 时，将读取出来的各个wifi的信息显示在界面上。</p>
<p>helpIndex()，helpContents()，helpAbout()</p>
<p>这几个函数只是打印帮助索引和内容，以及显示关于信息。</p>
<p>disconnect()</p>
<p>断开连接函数，当有与wifi的连接存在时，使用该函数即可断开网络连接，实际上是向wpa_supplicant发送了DISCONNECT命令。</p>
<p>scan()</p>
<p>扫描函数，用于扫描周边的wifi节点，实际上上是有ScanResults类来执行。</p>
<p>eventHistory()</p>
<p>事件历史函数，同上个类似，也是有EventHistory类来执行。</p>
<p>ping()</p>
<p>这个函数在WpaGui类中占了相当重要的地位，我们知道，wpa_supplicant的运行实际上是个循环，WpaGui类设置了一个定时器，每过1秒就将执行ping函数，而后在该函数里将调用如updateStatus的函数来进行整体内容的更新。</p>
<p>str_match(const char *a, const char *b)</p>
<p>封装了strcmp函数用于字符串的对比。</p>
<p>通过以上函数，我们可以大致得发现，程序运行的关键在于向wpa_supplicant发送命令，然后得到反馈信息的字符串，最后处理。由于的WpaGui类函数众多，剩余的函数我会在第三部分继续分析。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=233</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wpa_gui程序分析(一)</title>
		<link>http://blog.cnnbboy.com/?p=230</link>
		<comments>http://blog.cnnbboy.com/?p=230#comments</comments>
		<pubDate>Sat, 15 May 2010 09:47:00 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=230</guid>
		<description><![CDATA[很久没写blog了，在忙于一个非常大的项目，虽然充满了激情在做，但是劳累之余，技术的总结少了很多。
最近对于Wi-Fi上层的应用开发获取了很多知识，并且有部分和Qt产生了一定的联系，其中Wpa_gui就是其中之一。
Wpa_gui是一个基于Wpa_supplicant的无线连接管理工具，可以简单的认为是由wpa_supplicant＋Qt的一个小型软 件，它可以运行在linux，Windows及Unix操作系统下，作为配置连接无线网络使用。目前，在最新的Ubuntu系统下面，已经自动集成了该软 件。
其中具体界面可以查看：http://hostap.epitest.fi/wpa_supplicant/wpa_gui.html
如果要获取该软件，可以去网站http://hostap.epitest.fi/wpa_supplicant/，获取wpa_supplicant的源码包，在源码包里就包含了wpa_gui的源码，并且包含了分别由Qt3和Qt4完成界面，以供不同的Qt环境使用。
获取源码包后，解压，可以获得wpa_supplicant-0.x.x目录，Wpa_gui的Qt4源码目录位于其中的wpa_supplicant/wpa_gui-qt4下，可以使用Q他Creator打开对应的工程文件wpa_gui.pro，方便阅读分析。
该工具的本质其实就是为wpa_supplicant提供了一个友好的用户界面，交互的操作由Qt4提供，而实际的功能则由底层的wpa_supplicant完成。在wpa_gui源码中，可以发现，整个源码由以下几个类构成：
AddInterface类：用于增加硬件的驱动接口
EventListModel类：用来构成事件的模型
EventHistory类：用来纪录事件
NetworkConfig类：用来配置无线连接的参数
Peers类：显示搜索到的无线路由
ScanResults类：用来处理得到的扫描结果
StringQuery类：处理字符串询问
UserDataRequest类：处理用户的数据请求
WpaGui类：最核心的类，整合其他所有类，并且与wpa_supplicant进行数据报文的交换
WpaMsg类：简单的存储消息
可以说，整个源代码的类很少，代码量也不大，但是通过对其研究，却可以初步帮助我们学下Qt4作为前台界面，后台程序实现功能的一种模式。在这个程 序类里面，最主要的的类就是WpaGui类，是整个程序的核心，并且该类里实现了与wpa_supplicant交互的功能，因此主要的分析就是围绕 WpaGui类进行。
首先要知道怎么样与后台的wpa_supplicant进行交互，wpa_supplicant本身就提供了一套C/C++的接口，供外面程序调 用，接口的头文件为wpa_ctrl.h，在WpaGui类的cpp文件中，可以清楚的看见include的头文件里，有#include &#8220;common/wpa_ctrl.h&#8221;。
在wpa_ctrl.h头文件中，包含一组宏定义的事件消息和8个函数接口。由于wpa_supplicant交互的方式是基于数据报文的，通过向外界发送事先定义好的事件消息，而外面这根据这些事件消息来确定下步要执行的动作。
譬如：#define WPA_EVENT_CONNECTED &#8220;CTRL-EVENT-CONNECTED &#8221;
当Wpa_gui程序从wpa_supplicant获得这个宏定义消息后，就可以确定已经连接上确定的Wifi网络了，而在获得消息后，外面程序则可以使用8个函数接口来操作wpa_spplicant的行为。
而这些函数接口为：
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
void wpa_ctrl_close(struct wpa_ctrl *ctrl);
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
char *reply, size_t *reply_len,
void (*msg_cb)(char *msg, size_t len));
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
int wpa_ctrl_detach(struct wpa_ctrl *ctrl);
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);
int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);
wpa_ctrl_open接口用来打开wpa_supplicant的控制接口，在UNIX系统里使用UNIX domain sockets，而在Windows里则是使用UDP sockets，当然接口的路径并不是固定的，可以根据配置文件内的路径设置来改变。
wpa_ctrl_close接口自然是用于关闭控制接口。
wpa_ctrl_request接口是用来发送控制命令至wpa_supplicant，并且会接受命令成功执行与否的反馈消息。这是一个堵塞的动作，一般会至少等待2秒钟用来接受反馈的回复消息。如果有未经主动请求的消息接受，堵塞的时间则会更长。
wpa_ctrl_attach接口是为控制接口注册一个事件监视，但注册成功后就可以开始接口事件消息。
wpa_ctrl_detach接口则是取消控制接口的事件监视。
wpa_ctrl_recv接口是在控制接口的事件监视注册成功后，用来接受事件消息，这是一个堵塞的操作，当没有可用的消息时，就会一直堵塞。
wpa_ctrl_pending接口是用来检测是否有即将到来的事件消息。
wpa_ctrl_get_fd接口则是来获得控制接口的文件描述符号。
了解了以上这些，就可以为全面深入Wpa_gui作一个铺垫。
]]></description>
			<content:encoded><![CDATA[<p>很久没写blog了，在忙于一个非常大的项目，虽然充满了激情在做，但是劳累之余，技术的总结少了很多。</p>
<p>最近对于Wi-Fi上层的应用开发获取了很多知识，并且有部分和Qt产生了一定的联系，其中Wpa_gui就是其中之一。</p>
<p>Wpa_gui是一个基于Wpa_supplicant的无线连接管理工具，可以简单的认为是由wpa_supplicant＋Qt的一个小型软 件，它可以运行在linux，Windows及Unix操作系统下，作为配置连接无线网络使用。目前，在最新的Ubuntu系统下面，已经自动集成了该软 件。</p>
<p>其中具体界面可以查看：http://hostap.epitest.fi/wpa_supplicant/wpa_gui.html</p>
<p>如果要获取该软件，可以去网站http://hostap.epitest.fi/wpa_supplicant/，获取wpa_supplicant的源码包，在源码包里就包含了wpa_gui的源码，并且包含了分别由Qt3和Qt4完成界面，以供不同的Qt环境使用。</p>
<p>获取源码包后，解压，可以获得wpa_supplicant-0.x.x目录，Wpa_gui的Qt4源码目录位于其中的wpa_supplicant/wpa_gui-qt4下，可以使用Q他Creator打开对应的工程文件wpa_gui.pro，方便阅读分析。</p>
<p>该工具的本质其实就是为wpa_supplicant提供了一个友好的用户界面，交互的操作由Qt4提供，而实际的功能则由底层的wpa_supplicant完成。在wpa_gui源码中，可以发现，整个源码由以下几个类构成：</p>
<p>AddInterface类：用于增加硬件的驱动接口</p>
<p>EventListModel类：用来构成事件的模型</p>
<p>EventHistory类：用来纪录事件</p>
<p>NetworkConfig类：用来配置无线连接的参数</p>
<p>Peers类：显示搜索到的无线路由</p>
<p>ScanResults类：用来处理得到的扫描结果</p>
<p>StringQuery类：处理字符串询问</p>
<p>UserDataRequest类：处理用户的数据请求</p>
<p>WpaGui类：最核心的类，整合其他所有类，并且与wpa_supplicant进行数据报文的交换</p>
<p>WpaMsg类：简单的存储消息</p>
<p>可以说，整个源代码的类很少，代码量也不大，但是通过对其研究，却可以初步帮助我们学下Qt4作为前台界面，后台程序实现功能的一种模式。在这个程 序类里面，最主要的的类就是WpaGui类，是整个程序的核心，并且该类里实现了与wpa_supplicant交互的功能，因此主要的分析就是围绕 WpaGui类进行。</p>
<p>首先要知道怎么样与后台的wpa_supplicant进行交互，wpa_supplicant本身就提供了一套C/C++的接口，供外面程序调 用，接口的头文件为wpa_ctrl.h，在WpaGui类的cpp文件中，可以清楚的看见include的头文件里，有#include &#8220;common/wpa_ctrl.h&#8221;。</p>
<p>在wpa_ctrl.h头文件中，包含一组宏定义的事件消息和8个函数接口。由于wpa_supplicant交互的方式是基于数据报文的，通过向外界发送事先定义好的事件消息，而外面这根据这些事件消息来确定下步要执行的动作。</p>
<p>譬如：#define WPA_EVENT_CONNECTED &#8220;CTRL-EVENT-CONNECTED &#8221;</p>
<p>当Wpa_gui程序从wpa_supplicant获得这个宏定义消息后，就可以确定已经连接上确定的Wifi网络了，而在获得消息后，外面程序则可以使用8个函数接口来操作wpa_spplicant的行为。</p>
<p>而这些函数接口为：</p>
<p>struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);</p>
<p>void wpa_ctrl_close(struct wpa_ctrl *ctrl);</p>
<p>int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,<br />
char *reply, size_t *reply_len,<br />
void (*msg_cb)(char *msg, size_t len));</p>
<p>int wpa_ctrl_attach(struct wpa_ctrl *ctrl);</p>
<p>int wpa_ctrl_detach(struct wpa_ctrl *ctrl);</p>
<p>int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);</p>
<p>int wpa_ctrl_pending(struct wpa_ctrl *ctrl);</p>
<p>int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);<br />
wpa_ctrl_open接口用来打开wpa_supplicant的控制接口，在UNIX系统里使用UNIX domain sockets，而在Windows里则是使用UDP sockets，当然接口的路径并不是固定的，可以根据配置文件内的路径设置来改变。</p>
<p>wpa_ctrl_close接口自然是用于关闭控制接口。</p>
<p>wpa_ctrl_request接口是用来发送控制命令至wpa_supplicant，并且会接受命令成功执行与否的反馈消息。这是一个堵塞的动作，一般会至少等待2秒钟用来接受反馈的回复消息。如果有未经主动请求的消息接受，堵塞的时间则会更长。</p>
<p>wpa_ctrl_attach接口是为控制接口注册一个事件监视，但注册成功后就可以开始接口事件消息。</p>
<p>wpa_ctrl_detach接口则是取消控制接口的事件监视。</p>
<p>wpa_ctrl_recv接口是在控制接口的事件监视注册成功后，用来接受事件消息，这是一个堵塞的操作，当没有可用的消息时，就会一直堵塞。</p>
<p>wpa_ctrl_pending接口是用来检测是否有即将到来的事件消息。</p>
<p>wpa_ctrl_get_fd接口则是来获得控制接口的文件描述符号。</p>
<p>了解了以上这些，就可以为全面深入Wpa_gui作一个铺垫。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=230</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>2009年总结 我的大学，我的梦</title>
		<link>http://blog.cnnbboy.com/?p=223</link>
		<comments>http://blog.cnnbboy.com/?p=223#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:02:16 +0000</pubDate>
		<dc:creator>cnnbboy</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://blog.cnnbboy.com/?p=223</guid>
		<description><![CDATA[放在2010年的第四天来总结过去的2009年，似乎时间上有点晚了，但是最近忙碌的工作和在职研究生双重的生活，让我更加感觉到时间的宝贵。回想这一年，发现过得非常的快，快到很多事情似乎还在眼前，但其实过去很久了。仔细想想，发生的事还是蛮多的：
一.考研失败，这件事充分地证明了两个道理，第一个，去强做不感兴趣的事，效率会很差，第二个，没有努力，就没有结果。
二.毕业设计作的很认真，但最后去发现，程序不关键，导师盯的是论文，这真是大学教育莫大的悲哀，论文写得好能找到工作？
三.找工作远远没有想象的那么难，而唯一的前提是，你有实力。实力的来源就是大学里别人通宵玩游戏，我通宵写程序。（跟牛人比不了，牛人时每妙脑袋都在编程序）。
四.运气非常好，工作五个月后，经过推荐准备去盛大创新院，非常意外，其实觉得自己很菜，真的，很菜。但是，机遇来了，一定抓住。
五.毕业了，就这样大学毕业了，带着一丝茫然地毕业了。
其实大事就这么点，中间夹杂着无数的小事，最让我难以想象的地方就是，我的毕业和我的工作。曾经无比地讨厌痛恨学校，觉得这样的学校我永远不会去怀念。可出来才发现，四年的生活，最美好的青春，朋友们，亲亲老婆，都凝聚在那里。有时，吃着外面的快餐时，想起了学校的鸭排饭，放一勺子辣椒粉，再好吃不过。
而盛大创新院，更是想不到，那样的地方，是一个牛人云集的场所，而机遇，带给我加入奋斗的机会，并且，能去做感兴趣的工作，对于刚出来的学生来说，真是梦幻的开始。
新的一年已经开始，寄托着我对新工作的无限希望，我的大学生涯结束了，我的新的梦想，新的奋斗，开始了。
]]></description>
			<content:encoded><![CDATA[<p>放在2010年的第四天来总结过去的2009年，似乎时间上有点晚了，但是最近忙碌的工作和在职研究生双重的生活，让我更加感觉到时间的宝贵。回想这一年，发现过得非常的快，快到很多事情似乎还在眼前，但其实过去很久了。仔细想想，发生的事还是蛮多的：</p>
<p>一.考研失败，这件事充分地证明了两个道理，第一个，去强做不感兴趣的事，效率会很差，第二个，没有努力，就没有结果。</p>
<p>二.毕业设计作的很认真，但最后去发现，程序不关键，导师盯的是论文，这真是大学教育莫大的悲哀，论文写得好能找到工作？</p>
<p>三.找工作远远没有想象的那么难，而唯一的前提是，你有实力。实力的来源就是大学里别人通宵玩游戏，我通宵写程序。（跟牛人比不了，牛人时每妙脑袋都在编程序）。</p>
<p>四.运气非常好，工作五个月后，经过推荐准备去盛大创新院，非常意外，其实觉得自己很菜，真的，很菜。但是，机遇来了，一定抓住。</p>
<p>五.毕业了，就这样大学毕业了，带着一丝茫然地毕业了。</p>
<p>其实大事就这么点，中间夹杂着无数的小事，最让我难以想象的地方就是，我的毕业和我的工作。曾经无比地讨厌痛恨学校，觉得这样的学校我永远不会去怀念。可出来才发现，四年的生活，最美好的青春，朋友们，亲亲老婆，都凝聚在那里。有时，吃着外面的快餐时，想起了学校的鸭排饭，放一勺子辣椒粉，再好吃不过。</p>
<p>而盛大创新院，更是想不到，那样的地方，是一个牛人云集的场所，而机遇，带给我加入奋斗的机会，并且，能去做感兴趣的工作，对于刚出来的学生来说，真是梦幻的开始。</p>
<p>新的一年已经开始，寄托着我对新工作的无限希望，我的大学生涯结束了，我的新的梦想，新的奋斗，开始了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cnnbboy.com/?feed=rss2&amp;p=223</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
