最近,在 帮一个客户把他购买的Segger公司的embOS从K60移植到K64上。就在移植的过程中,发现在K60上能正常工作的ENET驱动程序到K64上却不能工作。然而,FSL官方的驱动程序(KSDK1.1)既能在K60上运行,也能在K64上运行,我们也没有看到专门的文档说明K60和K64的同种外设模块之间的差异。那么,究竟是什么原因导致embOS的ENET驱动程序在K64上不能正常运行呢?
经过对程序进行跟踪调试,并且反复比较embOS的驱动程序和FSL官方的驱动程序,以及逐字逐句地研究数据手册,终于发现:原来K64的ENET模块并非完全照搬K60的,而是缩减了一些功能,具体的有两点差异,说明如下:
1. K60的ENET模块既支持小端模式(little endian),也支持大端模式(big endian),它可以通过寄存器ENET_ECR中的DBSWP位来进行设置;
而K64的只能支持小端模式,虽然它的寄存器ENET_ECR中也有DBSWP位,但是这一位必须设置为“1”,手册上原文如下:
另外,在K64的ENET模块介绍中,也多次这样提示只支持小端模式。
问题小结:FSL的官方驱动程序设置的是小端模式,所以在K60和K64上都能正常运行;而embOS的驱动程序设置的是大端模式(大概是为了跟K60的早期版本兼容吧,因为早期版本没有DBSWP位,只能支持大端模式),所以在K64上就不能工作了。
2. K60的发送数据缓冲区的起始地址虽然在手册上写的是必须按8字节对齐(原文如下),但是实际调试时发现不对齐也能工作;而K64的却是“说到做到”了,不对齐就不干活了。(从以下两者描述中,也能看到大小端模式的不同)
K60发送缓冲区的起始地址描述 K64发送缓冲区的起始地址描述 问题小结:embOS的驱动程序(准确地说应该是IP协议栈,因为发送数据缓冲区的指针是从上层传递给ENET驱动程序的)在设计的时候可能忽略了这个要求,所以它虽然在K60上能正常工作,但是一到“较真”的K64上就不行了。
by Zhiqiang Fu(b17589@freescale.com)---IMM FAE China
K60和K64的ENET模块的差异.pdf
(405.45 KB)
|