#elif defined(CONFIG_ARCH_S3C44B0)
static int once = 0;
if (once)
return -ENXIO;
if (base_addr == 0) {
dev->base_addr = base_addr = ARM_NE2000_BASE;
dev->irq = ARM_NE2000_IRQ;
once++;
}
其中,ARM_NE2000_BASE和ARM_NE2000_IRQ是在配置内核的时候定义的。
(2)ne_probe是被Space.c调用的,这里网卡的检测是从./drivers/net/Space.c的ethif_probe函数中实现的,关键代码如下:
if (probe_list(dev, eisa_probes) == 0)
return 0;
eisa_probes :在前面定义成全局
static struct devprobe eisa_probes[] __initdata = {
#ifdef CONFIG_DE4X5???????????? /* DEC DE425, DE434, DE435 adapters */
{de4x5_probe, 0},
#endif
…………
{NULL, 0},
};
添加的函数是:
if (probe_list(dev, arm_probes) == 0)
return 0;
并定义:
static struct devprobe arm_probes[] __initdata = {
#ifdef CONFIG_ARM
{ne_probe, 0},
#endif
{NULL, 0},
(3)地址偏移的问题
同样是在ne.c中ne_probe1的代码中。为了更好地说明所修改的地方,首先应该先介绍一下硬件的配置和连接。这里8019在S3C44B0的Bank 5上,工作在跳线模式,所以起始基地址就是0x0a000600。还有一点需要特别注意的是:8019工作在16位模式下,数据线一对一地连接,地址线错开一位,即8019的A0连接S3C44B0的A1……这样,8019的基地址(Reg0的地址)是0x0a000600,Reg1的地址就是0x0a000602……所以地址不是连续增加的,那么对应的驱动程序要做相应的修改。
#elif defined(CONFIG_ARM)
#define EI_SHIFT(x) ((x)*2)
其中EI_SHIFT可以查看到8390.h的定义。
也有直接访问外部的代码,所以要添加的还有:
#ifdef CONFIG_ARM
regd = inb_p(ioaddr + 0x0d*2);
outb_p(0xff, ioaddr + 0x0d*2); :函数outb_p和inb_p访问外部IO的函数
#else
regd = inb_p(ioaddr + 0x0d);
outb_p(0xff, ioaddr + 0x0d);
这样就被解决了地址偏移的问题,这里采用预处理来添加自己的代码,不直接在原有的代码上修改,可以保证代码的完整性和可移植性,也较容易比较和发现问题。
主程序和μClinux中的系统文件放在同一个程序下,进行编译即可。为了提高执行效率,可以根据实际应用修改μClinux的部分常用代码,甚至剪切掉某些不必要的代码。
基于μClinux的网络构件的设计方案在硬件上简洁可靠;软件可维护性好,可扩展性好,有利于系统的后续开发,降低了系统设计的复杂性。随着嵌入式产品研究的深入,网络接口芯片的研究也会快速发展,使智能化产品的设计更趋向简单、标准、成熟。可以看出,嵌入式μClinux操作系统与网络将会得到更大的发展和更广阔的应用。