- 论坛徽章:
- 0
|
一. 根据原理图,确认网卡的地址和中断号
地址:0x19000000
中断号: EINT9
二. 修改drivers/net/cs89x0.c,指定CS8900A使用的资源
#elif defined(CONFIG_ARCH_S3C2410)
#include
#include3c2410/regs-mem.h>
#define S3C24XX_PA_CS8900 0x19000000
static unsigned int netcard_portlist[] __initdate = {0, 0};
static unsigned int cs8900_irq_map[] = {IRQ_EINT9, 0, 0, 0};
#else
三. 修改入口函数cs89x0_probe
1. 定义变量,用来保存寄存器的值:
int irq;
int io;
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon3;
#endif
2. 设置MAC,总线宽度等:
io = dev->base_addr;
irq = dev->irq;
#if defined(CONFIG_ARCH_S3C2410)
if(netcard_portlist[0])
return -ENODEV;
netcard_portlist[0] = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M)+0x300;
dev->dev_addr[0] = 0x08;
dev->dev_addr[1] = 0x89;
dev->dev_addr[2] = 0x89;
dev->dev_addr[3] = 0x89;
dev->dev_addr[4] = 0x89;
dev->dev_addr[5] = 0x89;
oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(33C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3;
oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3);
*((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c;
#endif
if (net_debug)
printk("cs89x0:cs89x0_probe(0x%x)\n", io);
3. 出错退出
out:
#if defined(CONFIG_ARCH_S3C2410)
iounmap(netcard_portlist[0]);
netcard_portlist[0] = 0;
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3;
#endif
free_netdev(dev);
四. 注册中断处理程序,指定中断触发方式,修改net_open函数
#if 0
writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
#endif
write_irq(dev, lp->chip_type, dev->irq);
#if defined(CONFIG_ARCH_S3C2410)
ret = request_irq(dev->irq, &net_interrupt, IRQF_TRIGGER_RISING, dev->name, dev);
#else
ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
#endif
五. 在drivers/net/cs89x0.c中适当的位置加上CONFIG_ARCH_S3C2410宏编译开关,可以参考CONFIG_ARCH_PNX010X:
1. net_open(struct net_device *dev)
{
struct net_local *lp = netdev_priv(dev);
int result = 0;
int i;
int ret;
#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410) /* uses irq#1, so this won't work */
if (dev->irq
2. #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_ARCH_S3C2410)
if (((1 irq) & lp->irq_map) == 0) {
printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
dev->name, dev->irq, lp->irq_map);
ret = -EAGAIN;
goto bad_out;
}
#endif
3. #if defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_ARCH_S3C2410)
result = A_CNF_10B_T;
#endif
六. 全局变量static int io;改为static unsigned int io;
七. 内核配置文件修改:
修改drivers/net/kconfig中的描述
config CS89x0
tristate "CS89x0 support"
depends on (NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X)) || ARCH_S3C2410
八. 使用CS8900A网卡,在内核目录下执行make menuconfig后,选中
九. 设置从NFS启动:
ckz24x0 > set bootargs noinitrd root=/dev/nfs console=ttySAC0 nfsroot=192.168.6.240:/home/ckz/work/src/fs_mini ip=192.168.6.239:192.168.6.240:192.168.6.1:255.255.255.0::eth0:off
以上的命令意思:
Ip=::::::
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93882/showart_1869908.html |
|