历史上的今天
返回首页

历史上的今天

今天是: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这个函数,这是在哪里调用的?

推荐阅读

史海拾趣

Chiefdom Electronic Co Ltd公司的发展小趣事

面对全球市场的日益开放和竞争,Chiefdom Electronic Co Ltd积极寻求与其他行业巨头的战略合作。通过与全球知名的电子产品制造商、芯片供应商等建立紧密的合作关系,公司不仅获得了更多的技术和市场资源,还进一步提升了自身的品牌影响力和市场份额。这些合作不仅帮助公司拓展了业务领域,还为其在全球电子行业中树立了良好的口碑。

General Semiconductor ( Vishay )公司的发展小趣事

1997年,Vishay正式进入分立半导体领域,收购了Lite-On Power Semiconductor公司65%的股份。这一举措标志着Vishay在半导体技术上的重大突破。随后,在1998年,Vishay又收购了TEMIC的半导体业务部分,包括特洛芬肯(Telefunken)和硅尼克斯(Siliconix)两家公司的大部分股份。这些收购为Vishay带来了先进的晶体管、二极管、光电子装置等半导体技术,进一步巩固了其在半导体领域的地位。

Fanstel公司的发展小趣事

Fanstel公司深知人才是企业发展的关键因素。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培养机制,为员工提供各种培训和学习机会,帮助他们提升自身素质和能力。同时,Fanstel还积极引进高端人才,打造了一支具有丰富经验和专业技能的研发团队。这些人才的加入为公司的技术创新和产品研发提供了有力支持。

Codeco Corporation Of Vermont公司的发展小趣事

在国内市场取得成功后,Codeco开始将目光投向国际市场。他们积极拓展海外业务,与多家国际知名企业建立合作关系。通过参加国际展会、设立海外分支机构等方式,Codeco的产品逐渐打入国际市场,赢得了广泛的认可。这一过程中,Codeco不仅提升了品牌知名度,也积累了丰富的国际化运营经验。

常州星海电子(Starsea)公司的发展小趣事

常州星海电子有限公司,自1990年成立以来,便以生产中英合资的各类二极管为起点,逐渐在电子行业中崭露头角。随着公司业务的不断发展和市场需求的增长,2016年,公司正式更名为常州星海电子股份有限公司,完成了从合资到股份制的转变。这一转变不仅标志着公司管理结构的升级,也预示着公司在未来市场中的更大发展。

APEM公司的发展小趣事

为了进一步拓展北美市场,APEM在1991年收购了位于美国波士顿的American Switch Corp.,并成立了子公司APEM COMPONENTS Inc.。这一收购使APEM得以在北美市场建立稳固的地位,为其全球扩张提供了有力支持。

问答坊 | AI 解惑

第9/15原创:事无巨细,无源蜂鸣器

事无巨细,无源蜂鸣器     CEPARK AVR学习板上,最简单的内容也许就是蜂鸣器了。当然如果你硬要用它来唱歌的话,那还是有点难度的。所以我们还是让它先发出“滴滴“声好了。      先来拓展拓展我们的知识吧(内容部 ...…

查看全部问答>

内存操作的疑问

wince6.0应用程序不能直接访问内存。这是为什么呀?什么原因呀?WINCE5可以吗?为什么不能仿问呀!用MAP成虚拟地址也不能仿问吗?…

查看全部问答>

sqlce如何在嵌入式设备上建立数据库以及sdf文件?

sqlce能在设备上直接创建和编辑数据库、或者sdf文件么?像access和sql server企业管理器一样的编辑数据库。如果行的话,应该怎么做?不行的话,能给我发一下创建数据库的代码么?谢谢!!!!…

查看全部问答>

STM32的库在哪里下载,到官网上怎么也打不开

而且怎么是个 flash player的画面,进度条100%后 没了反映,郁闷…

查看全部问答>

求救:T6963c的显示一直有一条横线向下刷

T6963c的显示一直有横线不停的从上向下刷,我在左上角显示的一个字符。只有当那条线刷到最上边时,看一下就没了,不过那个字符是msp430送到LCM的那个。 有没有高人指点一下,是那里出的问题?…

查看全部问答>

谁知道SimpliciTI协议里的RE网关转发该如何设计

我用的是SimpliciTI官方例子程序,RE的作用是当AP与ED由于距离太远而无法通信的情况下作为数据转发模块使AP与ED进行通信。RE收到AP的数据都会转发给ED,AP的数据包中包含有ED的ID号。目前存在的问题是AP发送的指令有不同的类型,有的指令发送一次出 ...…

查看全部问答>

QuartusII 管脚分配提示错误

no input node cannot be assigned to input pin,我已有输入node不知道为什么会这么提示,还请各位大侠提示一下,谢谢…

查看全部问答>

谁有LaunchPad的电路图啊 谢谢!!!

本科毕业时同学给了我套LaunchPad,最近想玩玩   可惜没有电路图…

查看全部问答>

TA疑问

这是MSP430F5438用户手册关于TA的连续增加方式的介绍,提到到达0FFFFh后回到0开始下一个周期。 这是Ti提供的例程,里面初始化时却对TA1CCR0赋值,并不是0FFFFh,我有点疑惑,两者存在矛盾呀…

查看全部问答>