因需要测试CAN,2.6内核没有包含MCP251x的驱动。
把3.0的驱动移植到2.6中改动比较多,索性直接使用3.0的内核。
linux官方已直接支持mini2440,使用默认的配置编译就可以工作。
但发现网络性能很差,抓包发现数据经常有错误。
考虑到使用原来的程序网络都正常,怀疑是因为总线速率过快的原因。
对比友善之臂发布的2.6.32的dm9000的驱动,发现里面有添加时序配置的部分。
把这部分添加到3.0内核的dm9000驱动中,问题解决。
代码片段:
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
static int __init
dm9000_init(void)
{
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
#include <mach/regs-mem.h>
#endif
static int __init
dm9000_init(void)
{
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif