QNX MX27 LITEKIT板 FEC网卡驱动移植笔记

前段时间在MX27 LITEKIT板上移植了串口驱动,把QNX操作系统跑起来以后,最近把FEC网卡驱动也移植上来了,有了网卡,开发、调试就方便多了,下面是移植过程中的一些记录,希望对大家有用。
在任何东西都不修改的情况下,编译了网卡驱动加载,会提示bus error,xtang告诉我DDK里面已经调用过ThreadCtl来获得I/O权限了,因此不是这个的问题,我对照linux的fec网卡驱动代码,发现有时钟获得的相关代码,于是找到FEC时钟相关的寄存器PCCR0,使能FEC时钟,再访问FEC的寄存器地址空间就不会出现总线错误了;
能正常访问寄存器以后,还是不能正常工作,于是就对照linux BSP里面的代码,发现需要设置GPIO的管脚功能,因为GPIO有很多复用功能,所以需要把FEC相关的管脚设置为FEC对应的功能;
在设置了GPIO的FEC功能后,我发现使用ifconfig已经能够看到en0接口了,也就是说网络驱动的注册已经成功了,我试验了这么一个功能,ifconfig en0 192.168.1.230,然后ping自己,也是ping的通的,但是ping远端机器不通,这
使我开始怀疑PHY芯片驱动部分(mii.c)有问题,反复的看了驱动中的mii.c文件,又看了MX27芯片资料的FEC部分,看来看去好像只有一个MSCR寄存器的设置值得怀疑,因为它是设置MII与PHY芯片通信的时钟频率的,它上面提到要求FEC_MDC的频率要小于等于2.5MHz,因此我尝试去找IPGCLK的频率值,因为FEC_MDC是从这个频率分频得到的,但是搜遍了整个MX27的文档也没有找到IPGDIV(IPGCLK从高频时钟的分频系数)位于哪个寄存器,感觉很是纳闷,
于是就从小到大,每个值挨着试验,都不行,然后再翻了翻PHY芯片的资料,也没有发现什么;
我还怀疑过中断的问题,不过在中断处理函数中用printf语句打印了几条消息出来就把这个怀疑排除了。后来我又从主机ping板子,发现能触发FEC的接收中断,因此我推测接收通路应该差不多了,问题出在网络发送路径上面,于是重新怀疑我的GPIO功能设置那部分代码,于是便发现问题了,先发现的是PTD_GIUS设置的问题,也就是FEC_MDIO管脚的设置忘记了,代码如下,开始的时候忘记写横线以下的几行代码了:
// PD0~PD7 and PD9~PD16 are all GPIO function, only PD8 is
multiplexed function(alternate function)
fecGpioVal = in32(iobase+PTD_GIUS);
// PD8 is not GPIO function, it is alternate function
fecGpioVal |= 0x0001feff;
out32(iobase+PTD_GIUS, fecGpioVal);

// set PD8 to multiplexed alternate function
fecGpioVal = in32(iobase+PTD_GIUS);
// PD8 is is alternate function
fecGpioVal &= ~FEC_MDIO;
out32(iobase+PTD_GIUS, fecGpioVal);
然后发现了所有的FEC输出管脚配置寄存器OCR1、OCR2的设置都出错了,本来相应位应该设置为00的,全设置为11了,修改正确以后,网络就正常了。
不过调试过程中发现即使找不到PHY芯片,不能通过MII的两根串行线对PHY芯片进行配置,网络照样可以通,我试过FTP,是可以正常工作的。
总之,QNX BSP for MX27ADS board的FEC网卡驱动在往MX27 LITEKIT板上移植的时候,添加FEC相应管脚的设置代码,然后使能FEC的时钟就可以了,其它地方不用改动,其实这些操作也可以放到boot里面。
加载驱动用的命令就是BSP说明文档里面的:
io-net -dmcimx27 irq=50 -ptcpip
然后用命令:
ifconfig en0 192.168.1.230 配置IP地址(我主机IP是192.168.1.122),网卡就可以正常使用了。

有了网络以后,就会方便很多,开启qconn进程,在QNX图形开发环境下就可以通过网络连接到目标板了,包括目标板的进程信息、文件系统、CPU运行时钟频率、内存使用情况等等都可以在图形环境下查看了,还可以方便的拷贝文件,就象在PC机本身上面一样方便,甚至还可以直接打开文本文件进行编辑和保存,调试和运行程序也很方便,不过现在我运行程序正常,但是调试连接目标板的时候老是提示time out,连不上,现在还搞不清楚怎么回事,可能是目标板系统配置哪里有问题!

移植这个网络驱动折腾了几天,原因主要是GPIO那里的代码写错了,犯了个低级错误,看来还是别在头脑昏昏的时候写程序为好!

你好,我看了你的笔记,很羡慕。
我正在想在at91sam9263上把DM9000驱动移植,但现在不知道怎么入手,请问你是在什么基础上做的这个工作,还有你提到DDK,这个工具在哪里可以下到?
期待着你的回复,最近被网络的问题折腾好久了。