设为首页 加入收藏

TOP

Linux2.6.39下DM9K驱动源码分析(三)
2014-11-24 13:59:59 来源: 作者: 【 】 浏览:1
Tags:Linux2.6.39 DM9K 驱动 源码 分析
哪里获取
db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//dm9k平台设备所所使用的IO地址资源
db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);//dm9k平台设备所所使用的IO数据资源
db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); //dm9k平台设备所所使用中断资源

if (db->addr_res == NULL || db->data_res == NULL ||
db->irq_res == NULL) {
dev_err(db->dev, "insufficient resources\n");
ret = -ENOENT;
goto out;
}
//获取dm9k平台设备所使用的中断号
db->irq_wake = platform_get_irq(pdev, 1);
if (db->irq_wake >= 0) {
dev_dbg(db->dev, "wakeup irq %d\n", db->irq_wake);
//申请中断
ret = request_irq(db->irq_wake, dm9000_wol_interrupt,
IRQF_SHARED, dev_name(db->dev), ndev);
if (ret) {
dev_err(db->dev, "cannot get wakeup irq (%d)\n", ret);
} else {

/* test to see if irq is really wakeup capable */
ret = irq_set_irq_wake(db->irq_wake, 1);
if (ret) {
dev_err(db->dev, "irq %d cannot set wakeup (%d)\n",
db->irq_wake, ret);
ret = 0;
} else {
irq_set_irq_wake(db->irq_wake, 0);
db->wake_supported = 1;
}
}
}
/*计算上面所获取到的IO地址平台资源的大小*/
iosize = resource_size(db->addr_res);
//为IO地址空间分配IO内存
db->addr_req = request_mem_region(db->addr_res->start, iosize,
pdev->name);//物理

if (db->addr_req == NULL) {
dev_err(db->dev, "cannot claim address reg area\n");
ret = -EIO;
goto out;
}
//在访问IO内存之前必须映射IO内存
db->io_addr = ioremap(db->addr_res->start, iosize);//虚拟地址

if (db->io_addr == NULL) {
dev_err(db->dev, "failed to ioremap address reg\n");
ret = -EINVAL;
goto out;
}

iosize = resource_size(db->data_res);
db->data_req = request_mem_region(db->data_res->start, iosize,
pdev->name);

if (db->data_req == NULL) {
dev_err(db->dev, "cannot claim data reg area\n");
ret = -EIO;
goto out;
}

db->io_data = ioremap(db->data_res->start, iosize);

if (db->io_data == NULL) {
dev_err(db->dev, "failed to ioremap data reg\n");
ret = -EINVAL;
goto out;
}
/* fill in parameters for net-dev structure */
ndev->base_addr = (unsigned long)db->io_addr;//初始化IO基地址
ndev->irq = db->irq_res->start; //初始化irq


/**根据DM9000的数据位宽,初始化读写数据帧的函数指针初始化net_device给其结构中的成员变量和成员函数赋值*/
/* ensure at least we have a default set of IO routines */
dm9000_set_io(db, iosize);
/*根据platform的定义(16bit),再次初始化读写数据帧的函数指针*/
/* check to see if anything is being over-ridden */
if (pdata != NULL) {
/* check to see if the driver wants to over-ride the
* default IO width */
/****IOctl flag在驱动加载的时候被传入********/
if (pdata->flags & DM9000_PLATF_8BITONLY)
dm9000_set_io(db, 1);

if (pdata->flags & DM9000_PLATF_16BITONLY)
dm9000_set_io(db, 2);

if (pdata->flags & DM9000_PLATF_32BITONLY)
dm9000_set_io(db, 4);

/* check to see if there are any IO routine
* over-rides */
/*检查看看是否有任何IO常规越权*/
if (pdata->inblk != NULL)
db->inblk = pdata->inblk;

if (pdata->outblk != NULL)
db->outblk = pdata->outblk;

if (pdata->dumpblk != NULL)
db->dumpblk = pdata->dumpblk;

db->flags = pdata->flags;
}


/

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux2.6.39在S3C2440上的移植 下一篇Java 如何创建/删除/修改/复制目..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: