历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2021年02月22日 | cortex-a8 uboot系列:第十七章 uboot移植-网卡DM9000移植

2021-02-22 来源:eefocus

一、网卡基础知识

1.网卡芯片与开发板的连接方式

总线式连接方式,使用SROM总线接口。

clip_image002

开发板核心板,使用SROM控制器的bank1。因此有效地址是0x8800_0000 – 0xffff_ffff。

clip_image004

开发板上DM9000的连接。使用16-bit数据连接方式

clip_image006

网卡芯片有CS引脚,(CS就是chip_select,选线信号,主机向CS发送有效信号则从机芯片工作,主机向CS发送无效信号则从机芯片不工作)。这个引脚要接soc的srom控制器的片选引脚。


主机s5pv210的srom控制器每一个bank都有一个片选信号CSn(n=0-5),这里接CSn1,说明DM9000接的是srom的bank1。


所以,可以得到DM9000的总线基地址是0x8800_0000。

 

DM9000的CMD引脚,并接到了210的ADDR2引脚上。为低,表示16位数据线上发送的是地址,为高,表示16位数据线上发送的数据。因此,地址和数据是复用的。


也就是如果要往 DM9000的 0x04地址写入数据a。那么要执行以下两步


第一步:

ADDR2拉低,16位数据写0x04。

也就是  clip_image008

网线有8根线,但是实际只有4根有效通信线,另外4根都是GND,用来抗干扰的。4根通信线中管发送的是有2根(TX-和TX+),管接收的2根(RX+和RX-),因为网上传输的是差分信号。


210有SROM控制器,

clip_image010

2.Soc的SROM控制器

Bank和网卡芯片的CS引脚(SROM就是SRAM/ROM)。Soc的srom控制器其实就是soc提供的对外总线式连接sram/rom的接口。如果soc要外部外接一些sram/rom类的存储芯片(或者伪装成srom接口的芯片,如网卡芯片)就要通过srom控制器来连接。


SROM控制器有6个bank,地址和数据都是共有的,但是片选信号不是共用的。因此外部的SROM器件通过连接到自己的片选信号是否有效,从而决定地址和数据是否可用。


网卡接在srom中好处就是网卡芯片好像一个存储芯片一样,被扩展在soc的一个地址空间中,这样soc就可以直接用一个地址来访问网卡芯片的内部寄存器。

clip_image012

1)网卡芯片内部寄存器使用相对地址访问

网卡芯片内部很多寄存器有一个地址,这个地址是从0x00开始的,但是实际上soc不能用0地址去访问这个网卡的芯片的内部寄存器。


所以soc访问网卡芯片0地址寄存器的地址应该是:起始地址 + 0x00。其中起始地址就是网卡芯片对应接在srom控制器的bankn对应的基地址。


如使用的九鼎开发板,网卡芯片接在bank0,基地址就是0x8000_0000。那么soc使用0x8000_0000访问网卡芯片的0地址寄存器,使用0x8000_0004访问4地址的寄存器。


2)主机soc上网

其实就是操控网卡芯片内部的寄存器、缓冲区等资源来上网的。也就是soc是通过网卡芯片来间接上网的。

3)总结

实际上也是一种总线式连接方式。优势是soc内部不需要内置网卡控制器,所有的SFR全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像NAND/SD接口一样使用时序来访问。

从逻辑上看,网卡更像是soc内部串口等模块。

二、Uboot中驱动文件

在drivers/net目录下,有很多网卡驱动芯片,对于开发板使用的是DM9000,所以要查看dm9000.h和dm9000.c。这些驱动代码来自于linux kernel源代码。


这个驱动代码是linux内核中设计好的,因此不用修改,在uboot中可以直接使用的。而且因为linux驱动设计的很合理(数据和代码是分开的,这样驱动主要是代码,数据是由硬件开发板中的接法决定,数据由一定的数据结构提供),所以驱动本身具有可移植性。

 

网卡移植的关键:初始化

Uboot在第二阶段init_sequences中进行了一系列的初始化,其中就有网卡芯片的初始化。这个初始化是关键,在这里的初始化中只要将网卡芯片正确的初始化了,则网卡芯片就能正常工作。


在board/Samsung/smdkc110/smdkc110.c中的board_init函数,就对dm9000进行了初始化。

clip_image014

clip_image016

被注释掉的是三星提供的uboot中的代码,后面新增的是修改的代码。在三星原版中,使用的是SROM的bank5,但是开发板使用的是bank1,因此要对SROM控制器的bank1进行初始化。


SROM_BW设置SROM控制器的总配置。每4个位控制一个bank,对于使用的bank1,操作7-4位。因此要对这几位进行操作。

clip_image018

网卡工作在16-bit模式,所以  DataWidth1为1 。


原理图连接时,srom控制器的数据data15-0接到网卡的data15-0,所以是以字节对齐的,所以AddrMode1 为1。


至于第7位和第6位,和时序相关。这里都设置为1。


SROM_BCx, 设置各个bank的时序信息。

clip_image020

MP0_1CON寄存器,配置SROM控制器的GPIO的片选功能。将7-4位设置为0x20,表示MP01_1管脚为srom的bank1的片选引脚。

clip_image022

照理来说,还需要设定SROM控制器的地址和数据的GPIO的功能,但是对应的GPIO功能默认为就是SROM的地址和数据功能,因此可以不用设置。

clip_image024

基地址的配置

在smdkv210single.h中,关于DM9000有如下的宏定义。

clip_image026

表示基地址是0XA800_0000(因为使用的是bank5),CMD线接在了ADDR1。

根据所用开发板,修改为如下

clip_image028

基地址为0x8800_0000(bank1),CMD线接在了ADDR2,所以数据的地址是基地址+4。

 

但是上面这样,是不工作的。


需要将CONFIG_DM9000_BASE 定义为 0x88000300。

clip_image030

修改为88000300的原因,应该是和DM9000的芯片有关系,内部寄存器的偏移不是以0地址作为偏移,而是以0x300地址为偏移的。

 

Uboot中使用ping命令,测试网卡移植是否成功。

clip_image032

 

如果移植出现以下信息,说明SROM控制器的寄存器配置不正确。检查dm9000_pre_init函数(board/Samsung/smdkc110/smdkc110.c),寄存器设置是否正确。

clip_image034

 

三、Linux网卡驱动的典型工作方式

在linux系统中,网卡是一个设备,这个设备驱动工作后会生成一个设备名叫ethn(n是0、1、2……),无线网卡名字一般叫wlan0、wlan1……。

然后linux系统用一些专用命令来操作网卡,如ifconfig命令。


Linux下的应用程序如何使用网卡驱动来进行网络通信?最通用的方法就是socket借口。Linux系统中有一系列的API和库函数,提供了一个socket编程接口,linux下的应用程序都是通过socket来实现上网的,socket内部就是间接调用网卡驱动实现网络通信的。

Linux设计是非常完备的,应用层和驱动层是严格分离的。也就是说写网络编程应用层的人根本不用管驱动,只要会用socket接口即可;写底层驱动的人根本不用管应用层,只要面向linux的网络驱动框架模型即可。


Ping这样的命令实现的代码就是网络应用的应用程序,像dm9000.h和dm9000.c这样的代码属于驱动程序。在uboot中应用是直接调用驱动实现的,也就是说ping命令内部是直接调用了dm9000的网卡驱动中的函数来实现。


1.    Uboot的ping命令实现

实现函数是do_ping,在common/cmd_net.c中。

clip_image036

使用string_to_ip函数将输入的ip地址转化为IPaddr_t类型值。

clip_image038

然后调用NetLoop函数(netnet.c中)

函数前面的部分,都是在构建ping的包。

构建好后,使用PingStart函数(netnet.c),准备发送ping包。

clip_image040

 

最后调用PingSend函数(netnet.c),将包发出去。

clip_image042

前面在构建数据,最后使用ArpRequest函数(netnet.c),将ARP包发送。因为ping使用的是ARP包。

clip_image044

函数在之前也在做数据的处理,最后调用eth_send函数(drivers/net/dm9000x.c中),将数据包发送出去。可以看出,这个函数是和具体的网卡芯片有关的。

clip_image046

这个函数,将指定的包,发送给DM9000网卡,网卡在将该包发送到网络中。

clip_image048

 

这样,就完成了ping的ARP包的发送。

剩下,就是要接收从网络回发的ARP包。

在net_loop函数的后面,调用eth_rx函数(drivers/net/dm9000x.c中)对网络数据包进行接收。可以看出这个接收函数和具体网卡有关的。

clip_image050

四、启动内核

使用tftp命令,将镜像下载到内存中,然后使用bootm命令运行内核。

但是要将串口改为串口2。

而且启动参数设置要如下:clip_image051


推荐阅读

史海拾趣

静芯微电子(ElecSuper)公司的发展小趣事

静芯微电子(ElecSuper)成立于XXXX年,由一群富有远见和热情的电子工程师共同创立。公司从一开始就专注于ESD(静电放电)/TVS(瞬态电压抑制器)系列器件的研发,致力于为客户提供高质量的静电保护和电压稳定解决方案。通过不断的技术创新和产品优化,静芯微电子逐渐在ESD/TVS领域取得了突破,并积累了大量的客户基础。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

在快速发展的电子行业中,FTDI始终保持着高度的警惕性和创新精神。面对假冒芯片的威胁,公司采取了强有力的打击措施以维护用户权益和市场口碑。同时,为了更好地满足市场需求,FTDI不断加强技术团队建设,引进经验丰富的工程师和有潜力的大学毕业生,不断提升自身的研发实力和技术水平。此外,公司还密切关注市场动态和技术趋势,以便及时调整战略方向并推出具有竞争力的新产品。通过这些努力,FTDI在电子行业中持续保持着领先地位。

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

COTO TECHNOLOGY公司的发展小趣事

随着电子行业的不断发展,小型化、集成化成为产品设计的趋势。COTO TECHNOLOGY紧跟时代潮流,于1983年成功研发出史上首款表面贴装干簧继电器。这一技术的突破不仅提高了产品的生产效率,更使得COTO的产品在小型化方面走在了行业前列。这一创新不仅增强了COTO在市场上的竞争力,也进一步巩固了其在干簧继电器领域的领导地位。

客益(Guestgood)公司的发展小趣事

进入上世纪六十年代,COTO TECHNOLOGY迎来了一个重大的转折点。公司开始探索线圈绕组以外的领域,通过引入簧片继电器,成功扩展了产品线。这一创新举措不仅丰富了公司的产品种类,更重要的是,它为公司打开了新的市场领域。到了七十年代,COTO更是凭借开发出的首款获得专利的低热电动势簧片继电器,一跃成为业界领先的干簧继电器制造商。

Harbour Industries公司的发展小趣事

背景:20世纪末,随着电子技术的飞速发展,Handok敏锐地捕捉到了半导体行业的崛起机遇。公司决定投入大量研发资源,专注于开发新型半导体材料和技术。

发展:经过数年的潜心研究,Handok成功研发出一种具有更高导电性和稳定性的新型半导体材料,这一创新成果迅速获得了业界的广泛关注。公司迅速将这项技术应用于生产,推出了一系列高性能的半导体产品,迅速占领了市场的一席之地。

影响:Handok的技术革新不仅推动了公司自身的快速发展,还对整个半导体行业产生了深远的影响,促进了整个产业链的升级和转型。

问答坊 | AI 解惑

LED3216“大屏电子钟”V1.0发布【图】

几天前LED3216点阵屏控制板完工(见LED3216点阵屏控制板【图】),一有硬件就迫不及待地尝试写了这个电子钟的程序,很惭愧,移花接木随便搞了下,马上就要回家了,没时间弄了。因为只想搞出现象来,导致程序结构混乱,不具有代表性,升级也困难。以 ...…

查看全部问答>

求在深圳嵌入式硬件设计者(个人),急急急!...

求在深圳嵌入式硬件设计...我们要做i.MX51(Arm Cortex A8)产品.请有相关经验者与我联系,合作形式多样可选.谢谢!!!QQ705489316 要做的产品为:10.1寸的带触摸屏的平板电脑(类似于iPad) …

查看全部问答>

用PB5制作CE系统时出错

这是警告 BUILD: [00:0000000008:WARNS ] Directory: E:\\WINCE500\\PRIVATE\\OSINTERNAL\\TEST\\HAL\\ does not exist. BUILD: [00:0000000020:WARNS ] Directory: E:\\WINCE500\\platform\\common\\src\\inc E:\\WINCE500\\public\\common\\o ...…

查看全部问答>

请教Cherishny兄

http://topic.eeworld.net/u/20090807/18/56aa3841-49c4-486a-813e-c639c0e05214.html?41788,从您的回复中看出我们问题很相识,希望得到回复,给您发消息未见回复。…

查看全部问答>

嵌入式软件开发网论坛 单片机开发

欢迎进入嵌入式软件开发网站讨论单片开发的相关问题 嵌入式软件开发网站首页 http://www.embeddedsoft.cn/ 嵌入式软件开发网站论坛 http://www.embeddedsoft.cn/bbs…

查看全部问答>

WinCE下开发GIS怎样快速绘制

用GDI绘图速度不能满足要求,请问有没有更好的方法绘图啊,谢谢啦…

查看全部问答>

想在虚拟机里建个WIN98的驱动开发环境,不知需要准备那些工具?

本来买本教材,不幸的是它里面是用ms v7.0、masm及98DDK来讲解例子的。我从网上找到的98DDK和书里用的DDK还有点不一样。另外我想在虚拟机上做驱动开发调试不知该怎么做?…

查看全部问答>

LM3S中断Bit-banding技术

Bit-banding技术, 即给每个bit位建立一个对应的别名,通过别名来直接访问此bit 1MB的RAM给了32MB的别名空间,一个Byte也就需要8个别名,却给了32个空间,所以将别名空间的低2位不用,常为0.这样就使1MB的RAM空间和32MB的别名空间一一对应了. &n ...…

查看全部问答>

【MSP430共享】激光瓦斯监控系统显示终端的研究

瓦斯监测对于煤矿安全具有重要作用, 煤矿井下终端和监控分站之间的通信对完成瓦斯监测任务起到重要作用 。本系统采用低功耗单片机 MS P 4 3 0   F 1 4 7和 R S 4 8 5总线完成煤矿井下监控分站与远程终端的通信。传感器检测到的瓦斯浓度 ...…

查看全部问答>

大一新手求前辈指导一问题

没什么基础,但还是动手做点东西。 一个传感器,返回高低电平(高4.7v  低0.2v) 想用单片机读取返回信号。 可是发现,直接用单片机管脚接开发板上的VCC,单片机可以检测到高电平啊,但是接传感器的返回信号就是无法识别的样子,用电 ...…

查看全部问答>