最近耗时多天,成功的将RT3070驱动。并解决了socket的网络编程,成功的在BA9G10上面实现了USB wif。连上家里的无线路由器,通过ubuntu下面建立的服务端程序,将BA9G10中的数据成功读取到PC机上面了。其过程的艰辛和曲折说起来是满眼血泪史啊。下面将记录其中解决问题的大致过程。
最开始设计方案时,为了整体的方便。我借用了外面开发板的文件系统。本来是为了偷懒的,不知道最后我为这件事情付出了沉重的代价。开始在编译RT3070驱动时,我直接将别人的文件系统加载到BA9G10中。在加载驱动时,我发现他们提供的文件系统版本过老,我用的编译器是SBC的arm-none-linux-guneabi-gcc的4.72版本。他提供的文件系统不支持iwlist 无线搜索命令和iwconfig无线配置命令。这下我傻眼了,如果没有这个命令。我根本就没法将无线wifi连接到wireless router。我去hp的官网找打hp支持开发的开放实验里面的wireless tool29,算是最新版本了。我自己交叉编译了iwlist,和iwconfig。然后通过zmodem下载到老版本的文件系统中。在执行的时候提示-sch iwlist command not find。纠结了。我用arm-none-linux-guneabi-readelf。结果提示加载了两个库。但是这两个库在glibc里面有这两个库。这样看来,还是编译版本的问题。编译出来的两个版本的库没办法加载运行。这样我就只有硬着头皮来自己定制自己的文件系统了。
本来定制文件系统是一件比较简单的事情,但是当初也是为了偷懒。用了SBC 的IDE集成交叉编译工具链。结果导致了一个问题,就是编译完成在链接的时候没法找到crt0.o、crtn.o等链接库。就因为这个问题,浪费了我整整的5天时间,包括端午节3天假和接下来的2天周末。最后在一家外国论坛上面发现了解决这个问题的方法,其实是很简单的事情。SBC提供prifix的安装地址。通过arm-none-linux-guneabi-gcc -v命令可以查看编译器的设置。最后发现只要将工具链放到prifix的/opt/codesourery这个目录下。问题就解决了。刚刚开始我设置了LD_LIBRARY、LIBRARY 修改了ld.config文件,都无效。我觉得这个可能是SBC做工具链的一个bug。就这个问题把我给整得趴下了。
在解决交叉编译环境后,在编译busybox就是一件很简单的事情了。我建立的文件系统是基于busybox1.21.0这个最新版本的文件系统。交叉编译器也是最新的4.72版本。所以有很多问题的出现都是比较扯淡的。不过以后就有经验了。
在完成busybox的安装后,开始了自己定制文件系统。这个过程中遇到数据不对的情况,网上提供的解决方案都比较好。最后就是修改了下编译方法,make ARCH=arm CROSS_COMPILE= arm-none-linux-guneabi-。并且在make install的过程中也要添加后面的命令。这样就很简单的解决了数据不对。在修改hostname过程中遇到有乱码的问题。这个问题比较简单,原来是我输入过程中带入了中文字符。最后将书法切换后再制作文件系统,好像问题就解决了。下面是定制出来的文件系统的效果图:
在完成文件系统后,接下来是把usb wifi连接到无线路由器。这个工作也是比较轻松的。主要是命令操作。不过在linux系统下面有几个东西让我长见识了就是system(void);这个函数和popen();这个函数。觉得很强大,可以直接操作linux下面的shell命令。我在后面的socket编程中用到了,感觉爽。
原计划是将所有的操作都写在shell里面,通过linux文件系统里面的启动初始加载来实现自启动的。不过后来我发现有上面的两个函数,结果所有的命令我都可以直接通过这两个函数来实现。
Socket编程,这个我是现炒现卖,以前没搞过。看了吴秦的一篇博客,觉得他写得很好。然后也有例程。我是就看到他的例程来写的socket的建立 、连接和侦听等。不过到wireless wifi上面又不一样。Socket是建立在tcp/ip上面的。所以我们操作起来也相当的简单。理解下什么是socket,socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
我在理解socket编程后,然后自己写了一个ubuntu下面的linux C的wifi_server监听虚拟机下面的6666这个端口。然后在BA9G10中启动wifi_app,这是一个客户端程序。在建立者两套连接后开始测试。客户端请求连接到服务器端。在这个过程中也遇到了一个小问题,就是在BA9G10中能ping通ubuntu安装的虚拟的地址。好像ping使用的Icmp方式。但是客户端却不能connect服务器端。这个问题我还纠结了下,刚刚开始我在fedora里面弄的,我觉得能ping通说明连接都没有问题了。那问题可能出在那里呢?唯一的可能性就是防火墙阻止了我的connected包。不过我想关fedora的防火墙,但是在关闭过程中遇到问题了。后面我看到关ubuntu的防火墙比较容易,用ufw disable就解决了。于是我就换到ubuntu下面来了。然后再连接的时候,就能连上了。可以在服务端拷贝客户端的数据,所有验证成功。这个部分的图到时补上。
慢慢来,技术无止境,只为玩玩而已!希望每天都有进步!