我们都知道liunx内核是通过platform模型来管理驱动和设备的,linux内核已经集成了相应的关于dm9000网卡的驱动程序,而我们要做的移植就是根据不同类型的板子把相应的设备资源添加或修改进内核,使内核能将驱动和设备来联系起来。
首先我们进入到arch/arm/mach-s3c2440/mach-smdk2440.c这个文件中,
找到这一段代码
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
'&s3c_device_dm9000,'
...
}
加入高亮部分
然后第二步vi arch/arm/plat-s3c24xx/devs.c
添加头文件#include
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = S3C2410_CS4 + 0x300,
.end = S3C2410_CS4 + 0x300 + 0x3,
.flags = IORESOURCE_MEM,
},
[1]={
.start = S3C2410_CS4 + 0x300 + 0x4, //CMD pin is A2
.end = S3C2410_CS4 + 0x300 + 0x4 + 0x7c,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ,
},
};
其中有dm9000所对应的内存空间,所使用的中断,和相应的地址线和数据线。
static struct dm9000_plat_data s3c_device_dm9000_platdata = {
.flags= DM9000_PLATF_16BITONLY,
};
16位的数据总线
struct platform_device s3c_device_dm9000 = {
.name= "dm9000",
.id= 0,
.num_resources= ARRAY_SIZE(s3c_dm9000_resource),
.resource= s3c_dm9000_resource,
.dev= {
.platform_data = &s3c_device_dm9000_platdata,
}
};
相应的设备的名字和id
然后在include/asm-arm/plat-s3c24xx/devs.h中添加
extern struct platform_device s3c_device_dm9000;
以便其他c文件来使用其设备信息
最后vi drivers/net/dm9000.c
找到dm9000_open函数
dm9000_open(struct net_device *dev)
{
board_info_t *db = netdev_priv(dev);
- unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
+ unsigned long irqflags;
+
+ /* Modified by guowenxue, 2011.08.30 */
+ db->irq_res->flags |= IRQ_TYPE_EDGE_RISING;
+ irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
+ irq_set_irq_type(dev->irq, IRQ_TYPE_EDGE_RISING);
if (netif_msg_ifup(db))
dev_dbg(db->dev, "enabling %s\n", dev->name);
...
};
修改一下关于中断的一些操作。
接下来就是一些linux内核的配置了,不详述。
OK 移植完成。