platform: s3c2440 + linux 2.6.18
经过两个月的努力终于把 ISP1582 的驱动成功移植到 linux2.6.18 上面了,可以正常读写文件了,但还有一些小DUG.写操作的速度只有 800Kb/s, 还没有做优化处理,速度介于1.1 到 2.0 之间.读操作和删除的速度可以达到2.0的.呵呵.
直接拿到原厂的代码 PORT 上去后,通过ISP1582写大文件到 Mass storage(Nand Flash)上USB BUS会出现复位的情况,PC端提示 无法复制 / 路径太深 / 参数不正确 等错误.
其实这就是一个不同步的问题,当PC端写数据到 Mass Storage时,传输一段数据后,PC端就和 ISP1582 这边不同步了.ISP1582 请求一个 31 byte 命令时,PC端总是发 512 byte 的数据过来,在等待 9S 之后,导致 ISP1582出现复位,然后出断掉的地方继续传送(驱动程序有丢包的处理),所以有时也可以传送成功.
解决这个不同步最简单的方法就是在读写 IO端口时加一个 200ns 的延时,这样同步问题就解决了.上面提到的速度没有达到2.0也是因为这个延时的原因,因为每次读/写操作时都有 一段延时,导致速度慢了下来,其实不需要每次读/写 IO 端口都延时 200ns, 只需要每次读 buffer_status 时加延时就可以,这样传输的速度应该就会提上去了,不过我还没有找到在哪里加,理论上是应该这样子的.
同时,还出现另外一个问题,上面加 200ns 延时的方法只适用于时钟频率为 300M的,当把频率调到 405M 时就不可以这样做了,至少要加 一个 5us的延时才可以保证 ISP1582 不出现复位,但这样速度是不能忍受的,传输速度就跟串口差不多.
要使本驱动能正常工作在 405M上,必须更改 BANK1(因为我是用CS1 连接到 ISP1582 的 CS线上的) 一些相关的时序,如 Tacs,Tcos,Tacc,Tacp等,因为300M 的 HCLK 和 405M 的 HCLK 的周期是不同,405M 的一个HCLK的周期更短,所以要将 对应的CLK个数加 1 或 2才能工常工作,否则还是会不断出现复位的状况.
原代码不方面公开,如果哪位朋友遇到同样的问题可以大家讨论一下.
阅读(2006) | 评论(2) | 转发(0) |