历史上的今天
今天是:2024年10月25日(星期五)
2021年10月25日 | mini2440上dm9000驱动分析(二)
2021-10-25 来源:eefocus
二、下面说一下 mini2440_dm9k_resource 中的几个地址是怎么计算得来的。地址的计算在驱动移植中也是一个重要的部分。地址的计算在网上的博客中很少有介绍的,自己看了很久才琢磨明白。
DM9000 MINI2440 功能描述
SD0 DATA0 数据信号
| |
SD15 DATA15 数据信号
CMD ADDR2 识别为地址还是数据
INT EINT7 中断
IOR# nOE 读命令使能
IOW# nWE 写命令使能
AEN nGCS4 片选使能
1. dm9000的使能管教AEN与nGCS4相连,nGCS4从2440的数据手册中可以看到,它对应的地址就是从0x20000000开始的。 0x300 是从dm9000的数据手册中得来的,手册中讲到dm9000的IO有8个起始地址偏移0x300、0x310、0x320...0x370,不知为何这里用的是0x300.
2. 上面的resource array中,第0项是代表io_addr,addr2为0的话,正好对应到addr2addr1addr0 是 3-0这个范围,也就是第0项.end 是 +3 的原因。同理,可以得到为什么io_data是4 ~7
3. 读写dm9000的寄存器时,都是分两步进行操作。先写地址,即向io_addr写入希望操作的dm9000的寄存器的地址,然后下一步在进行读取或者写入的操作。第一步是在io_addr操作,第二步是在io_data操作。这两个连续的步骤,乍一看好像是明白的,但是仔细想又想不明白这样操作的理由
三、 接下来看dm9000_open(struct net_device *dev) 函数。
/*
* Open the interface.
* The interface is opened whenever "ifconfig" actives it.
*/
static int
dm9000_open(struct net_device *dev)
{
board_info_t *db = netdev_priv(dev);
unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
if (netif_msg_ifup(db))
dev_dbg(db->dev, "enabling %sn", dev->name);
/* If there is no IRQ type specified, default to something that
* may work, and tell the user that this is a problem */
if (irqflags == IRQF_TRIGGER_NONE)
dev_warn(db->dev, "WARNING: no IRQ resource flags set.n");
irqflags |= IRQF_SHARED;
if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev))
return -EAGAIN;
/* Initialize DM9000 board */
dm9000_reset(db);
dm9000_init_dm9000(dev);
/* Init driver variable */
db->dbug_cnt = 0;
mii_check_media(&db->mii, netif_msg_link(db), 1);
netif_start_queue(dev);
dm9000_schedule_poll(db);
return 0;
}
在这个函数中,申请中断资源,dm9000只有一个中断号,产生两种中断:收到包、发送完毕。netif_start_queue表示允许上层进行发包,dm9000_schedule_poll表示 开始周期性额调用dm9000_poll_work.前面在probe函数中, 只是初始化了phy_poll函数,在open函数中,才开始调用,这也才更符合情理。这里我们看到了mii_check_media函数,如果我们将这里的这个函数注销掉,会发生什么情况?经检测,这里将mii_check_media注销后,对驱动并没有明显的影响。在m9000_poll_work函数中注销了mii_check_media,驱动也不受影响。
问题:1. struct device, net_device 分别的应用场合是什么,好像net_device是与sysfs打交道更多。 ?
2. 每次insmod 驱动时,都会显示下面的log,为什么会多次调用dm9000_hash_table这个函数呢?是网络的哪部分函数调用的?
3. dm9000 dm9000: entering dm9000_init_dm9000 dm9000 dm9000: entering dm9000_hash_table dm9000 dm9000: entering dm9000_hash_table 加载模块时,会显示多次进入dm9000_hahs_table这个函数,这是在哪里调用的?
史海拾趣
|
事无巨细,无源蜂鸣器 CEPARK AVR学习板上,最简单的内容也许就是蜂鸣器了。当然如果你硬要用它来唱歌的话,那还是有点难度的。所以我们还是让它先发出“滴滴“声好了。 先来拓展拓展我们的知识吧(内容部 ...… 查看全部问答> |
|
sqlce能在设备上直接创建和编辑数据库、或者sdf文件么?像access和sql server企业管理器一样的编辑数据库。如果行的话,应该怎么做?不行的话,能给我发一下创建数据库的代码么?谢谢!!!!… 查看全部问答> |
|
T6963c的显示一直有横线不停的从上向下刷,我在左上角显示的一个字符。只有当那条线刷到最上边时,看一下就没了,不过那个字符是msp430送到LCM的那个。 有没有高人指点一下,是那里出的问题?… 查看全部问答> |
|
我用的是SimpliciTI官方例子程序,RE的作用是当AP与ED由于距离太远而无法通信的情况下作为数据转发模块使AP与ED进行通信。RE收到AP的数据都会转发给ED,AP的数据包中包含有ED的ID号。目前存在的问题是AP发送的指令有不同的类型,有的指令发送一次出 ...… 查看全部问答> |
|
no input node cannot be assigned to input pin,我已有输入node不知道为什么会这么提示,还请各位大侠提示一下,谢谢… 查看全部问答> |




