uC/TCP-IP分析

不管在使用socket的任何时候出现了以下任何一个严重的错误代码,socket必须立即closed()。 NET_SOCK_ERR_NOT_USED NET_SOCK_ERR_INVALID_FAMILY NET_SOCK_ERR_INVALID_PROTOCOL NET_SOCK_ERR_INVALID_TYPE NET_SOCK_ERR_INVALID_STATE NET_SOCK_ERR_FAULT

LPC2366 uC/OS & uC/TCP-IP

最近调试LPC2366+uC/OS+uC/TCPIP,因为是从别人那里拿来的的代码。烧写进去可以ping通。 但是连接远端服务器后不能连续发送,必须要等一段时间(100ms)的延时在发,不然跑着跑着程序会挂掉。 于是埋头google、看源码、调试参数、查文档。依然不行,只能解决到延时10ms发送出错后可以恢复。但是2366发送网络报文依然很慢。 折腾了1个星期。 今天终于试了最后一招(其实还有最最后一招),我们的代码是用git管理的。 git reset --hard OLD_VERSION 测试通过。 心态啊、心态。。。 PS: 最最后一招就是我去PORT Micriμm的2378的TCPIP工程。 最最最后一招就是买ZLG的协议栈。 优秀的开发风格和项目管理是做好项目的第一步。

Cross-compile tcpdump

tcpdump是用来debug网络的无上利器,虽然我不怎么会用。但是嵌入式板子上面还是带一个好。 看了busybox好像没有移植过去。看来只能自己编译了。 第一步当然要去下载最新版本。点击进入官网 tcpdump分为2块,一块是libpcap,一块是tcpdump。 编译libpcap 解压。我们不需要can,不需要bluetooth,指定linux版本为2.6。执行: [crayon-682432e7a9e3a897867745/] 编译tcpdump 解压。运行: [crayon-682432e7a9e40641376877/] 编译出来的tcpdump是不需要libpcap的。 That's all.

uC/TCP-IP NetSock_Conn返回超时

由于项目要求需要使用uC/TCP-IP做一个TCP Client端连接服务器。 出现了以下问题,烧写完程序后可以连接服务器,但是MCU复位后执行到NetSock_Conn会返回超时。 交叉编译了tcpdump,查看网络信息后发现出现超时的时候3次握手不完整。 使用netstat -a发现握手截至在FIN_WAIT1。当系统终止掉这次握手或者复位后,MCU总是可以连接到服务器,但是重连总是失败,错误码为超时。 google了基本没有人提到这个错误。初步结论可能是配置有误。但是增加了任务堆栈、调整任务优先级也没有效果。 之前有做过RM9200,于是打开代码发现都是使用的Server端。没有Client端。没办法,分别找了我们使用的MCU和RM9200的官方代码。终于在RM9200的code里面的Conn之前发现这样一条命令: [crayon-682432e7aa19f256534931/] 看名字就知道是设置连接超时,grep TTCP_CFG_MAX_CONN_TIMEOUT_MS发现为30000。依葫芦画瓢,问题解决。 原因就是系统默认的超时时间太短造成的。

Cross-crompile minicom

minicom需要ncurses,如果你的交叉编译环境自带的话会省很多事情。否则需要先编译ncurses。 不然会出现如下的错误信息: [crayon-682432e7aa2e1127214304/] 从http://www.gnu.org/software/ncurses/ncurses.html下载ncurses [crayon-682432e7aa2e3997422814/] 因为我们指定了prefix,ncurses会到错误的地方(prefix/share/terminfo)找terminfo。执行minicom的时候就会出现如下的错误信息: No termcap entry for vt102 所以需要修改TERMINFO默认寻找路径。 [crayon-682432e7aa2e4466753465/] 修改TERMINFO_DIRS和TERMINFO宏为"/usr/share/terminfo" [crayon-682432e7aa2e5249806980/] [crayon-682432e7aa2e6652186334/] 从http://alioth.debian.org/projects/minicom/下载minicom [crayon-682432e7aa2e7871477635/] [crayon-682432e7aa2e8255892504/] 就可以获得minicom 最后拷贝libncurses.so到/lib,拷贝文件/usr/share/terminfo/v/vt102即可。

Cross-compile pciutils

目前busybox的lspci不能显示足够可用的信息,需要重新交叉编译一个lspci。 下载pciutils源码 make 修改Makefile CROSS_COMPILE => ppc-linux- ZLIB => no DNS => no SHARED => no 修改lib/config.h和lib/config.mk 注释掉 PCI_ARCH_I386 PCI_HAVE_PM_INTEL_CONF PCI_HAVE_64BIT_ADDRESS 删掉lib下面所有的.o文件 重新make 搞定。

Freescale MPC8309调试

10/09/2011 第一步是连接仿真器。 打开ltib默认的MPC8309配置,修改 DDR大小为128M NOR Flash为8bit OK,连接上仿真器,仿真器居然没有8309的选项,郁闷,下载了8309的补丁包,EPPC_8.8_830X_b101126.exe。安装,可以选择8309了。又在freescale上瞄了一下,CW8.8.5的patch可以支持win7,这是个好消息,因为之前都是在虚拟机用的,贼不方便。安装好patch,在按照说明装好了驱动,又拿8315的板子连了一下,通过。 好的,连上8309,擦写Flash,显示”连接失败”。新建一个8309的工程,点击Debug->connect,显示无法复位CPU或者无法将CPU置于DEBUG模式,看来是CPU没有正常工作。 郁闷了,检查8309配置,复位配置字为1100,没问题;JTAG设计也没问题;复位没问题;晶振也没问题。最后发现PCI_SYNC_IN没有和PCI_SYNC_OUT连接,导致CPU没有时钟。还好PCI_SYNC_IN通过一个下拉电阻引了出来,不然这个板子就废掉了。 将33M时钟飞到PCI_SYNC_IN上,在次连接一下,成功!擦除Flash,成功!校验Flash,不对。到底是没擦除还是校验错呢?还好Flash上Busy信号接了灯,在擦一下,发现灯亮了,所以应该是校验错误。因为8309和8315是一样的,将8309的NOR Flash配置改成与8315一样。校验成功! 接着烧写u-boot,改为NOR Flash启动,串口显示启动信息,但是出现”Error in I2C Direction reg read”,搜索u-boot源码,原来freescale公版会先读一个EEPROM。注释掉。 这次显示了”Not a microcode”,然后就在打印NET:后停掉了。跟踪了代码,发现是在初始化QE的UEC的时候执行初始化TX&RX的时候一直没有等到命令执行完成。会不会和”Not a microcode”有关呢。查看源码发现这个是因为u-boot给QE下载微代码的时候打印的,因为我的u-boot是没有这个微代码的。但是后面程序有设置启动微码指令,注释掉。发现还是这个问题。 10/10/2011 难道是QE输入时钟的问题,我们接的是33M的,6倍频到198M。公版是25M,8倍频到200M。而MII的时钟是25M。 换成25M时钟,修改QE PLL倍频,发现还是一样。 会不会是8309必须需要一个微码呢?google、看QE的手册,没有什么可用的资料。在次检索ltib,突然在tools_8309som下面的nor_flashing目录下面发现一个好东西”iram_mpc8309_r1.bin”。哈哈,找到了。用USB TAP烧写到指定位置。”=>”提示符有了。ping了一下地址。发现没有读到PHY ID。…