S3C2440实现dm9000网卡驱动程序移植

发布者:xi24最新更新时间:2024-08-05 来源: cnblogs关键字:S3C2440  dm9000  网卡驱动  程序移植 手机看文章 扫描二维码
随时随地手机看文章

 391         id_val |= inb(iobase + 4) << 24;

 392 

 393         if (id_val == DM9KS_ID || id_val == DM9010_ID) {

 394             

 395             /* Request IO from system */

 396             if(!request_region(iobase, 2, dev->name))

 397                 return -ENODEV;

 398 

 399             printk(KERN_ERR' I/O: %x, VID: %x n',iobase, id_val);

 400             dm9000_found = TRUE;

 401 

 402             /* Allocated board information structure */

 403             memset(dev->priv, 0, sizeof(struct board_info));

 404             db = (board_info_t *)dev->priv;

 405             dmfe_dev    = dev;

 406             db->io_addr  = iobase;

 407             db->io_data = iobase + 4;   

 408             db->chip_revision = ior(db, DM9KS_CHIPR);

 409             

 410             chip_info = ior(db,0x43);

 411             if((db->chip_revision!=0x1A) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -ENODEV;

 412                         

 413             /* driver system function */                

 414             dev->base_addr         = iobase;

 415             dev->irq         = irq;

 416             dev->open         = &dmfe_open;

 417             dev->hard_start_xmit     = &dmfe_start_xmit;

 418             dev->watchdog_timeo    = 5*HZ;    

 419             dev->tx_timeout        = dmfe_timeout;

 420             dev->stop         = &dmfe_stop;

 421             dev->get_stats         = &dmfe_get_stats;

 422             dev->set_multicast_list = &dm9000_hash_table;

 423             dev->do_ioctl         = &dmfe_do_ioctl;

 424 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,28)

 425             dev->ethtool_ops = &dmfe_ethtool_ops;

 426 #endif

 427 #ifdef CHECKSUM

 428             //dev->features |=  NETIF_F_IP_CSUM;

 429             dev->features |=  NETIF_F_IP_CSUM|NETIF_F_SG;

 430 #endif

 431             db->mii.dev = dev;

 432             db->mii.mdio_read = mdio_read;

 433             db->mii.mdio_write = mdio_write;

 434             db->mii.phy_id = 1;

 435 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)

 436             db->mii.phy_id_mask = 0x1F; 

 437             db->mii.reg_num_mask = 0x1F; 

 438 #endif

 439             //db->msg_enable =(debug == 0 ? DMFE_DEF_MSG_ENABLE : ((1 << debug) - 1));

 440             

 441             /* Read SROM content */

 442             for (i=0; i<64; i++)

 443                 ((u16 *)db->srom)[i] = read_srom_word(db, i);

 444 

 445             /* Get the PID and VID from EEPROM to check */

 446             id_val = (((u16 *)db->srom)[4])|(((u16 *)db->srom)[5]<<16); 

 447             printk('id_val=%xn', id_val);

 448             if (id_val == DM9KS_ID || id_val == DM9010_ID) 

 449                 HasEEPROM =1;

 450             

 451             /* Set Node Address */

 452             for (i=0; i<6; i++)

 453             {

 454                 if (HasEEPROM) /* use EEPROM */

 455                     dev->dev_addr[i] = db->srom[i];

 456                 else    /* No EEPROM */

 457                     dev->dev_addr[i] = MAC_addr[i];

 458             }

 459         }//end of if()

 460         iobase += 0x10;

 461     }while(!dm9000_found && iobase <= DM9KS_MAX_IO);

 462 

 463     return dm9000_found ? 0:-ENODEV;

 464 }

 465 

 466 

 467 /*

 468   Open the interface.

 469   The interface is opened whenever 'ifconfig' actives it.

 470 */

 471 static int dmfe_open(struct net_device *dev)

 472 {

 473     board_info_t *db = (board_info_t *)dev->priv;

 474     u8 reg_nsr;

 475     int i;

 476     DMFE_DBUG(0, 'dmfe_open', 0);

 477 

 478     if (request_irq(dev->irq,&dmfe_interrupt,0,dev->name,dev)) 

 479         return -EAGAIN;

 480 

 481     /* Initilize DM910X board */

 482     dmfe_init_dm9000(dev);

 483 #ifdef DM8606

 484     // control DM8606

 485     printk('[8606]reg0=0x%04xn',dm8606_read(db,0));

 486     printk('[8606]reg1=0x%04xn',dm8606_read(db,0x1));

 487 #endif 

 488     /* Init driver variable */

 489     db->reset_counter     = 0;

 490     db->reset_tx_timeout     = 0;

 491     db->cont_rx_pkt_cnt    = 0;

 492     

 493     /* check link state and media speed */

 494     db->Speed =10;

 495     i=0;

 496     do {

 497         reg_nsr = ior(db,DM9KS_NSR);

 498         if(reg_nsr & 0x40) /* link OK!! */

 499         {

 500             /* wait for detected Speed */

 501             mdelay(200);

 502             reg_nsr = ior(db,DM9KS_NSR);

 503             if(reg_nsr & 0x80)

 504                 db->Speed =10;

 505             else

 506                 db->Speed =100;

 507             break;

 508         }

 509         i++;

 510         mdelay(1);

 511     }while(i<3000);    /* wait 3 second  */

 512     //printk('i=%d  Speed=%dn',i,db->Speed);    

 513     /* set and active a timer process */

 514     init_timer(&db->timer);

 515     db->timer.expires     = DMFE_TIMER_WUT;

 516     db->timer.data         = (unsigned long)dev;

 517     db->timer.function     = &dmfe_timer;

 518     add_timer(&db->timer);    //Move to DM9000 initiallization was finished.

 519      

 520     netif_start_queue(dev);

 521 

 522     return 0;

 523 }

 524 

 525 /* Set PHY operationg mode

 526 */

 527 static void set_PHY_mode(board_info_t *db)

 528 {

 529 #ifndef DM8606

 530     u16 phy_reg0 = 0x1000;/* Auto-negotiation*/

 531     u16 phy_reg4 = 0x01e1;

 532 

 533     if ( !(db->op_mode & DM9KS_AUTO) ) // op_mode didn't auto sense */

 534     { 

 535         switch(db->op_mode) {

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ..[20]
关键字:S3C2440  dm9000  网卡驱动  程序移植 引用地址:S3C2440实现dm9000网卡驱动程序移植

上一篇:s3c2440的USB热插拔驱动问题
下一篇:S3C实现DMA驱动程序编写

推荐阅读最新更新时间:2024-11-05 22:18

关于S3C2440存储器地址分配和启动流程分析
学习嵌入式,最开始应该了解就是地址空间的分配,真正搞清楚每个地址代表的位置,才有了入门的基础。 1、地址分配(27根线如何寻找1G空间) S3C2440集成了丰富了外设控制器(LCD控制器、USB Device控制器、USB Host控制器、NAND FLASH控制器、I2C控制器、SPI控制器等)。要控制这些外设就要设置相应控制器的寄存器以产生相应的驱动时序。学习S3C2440,主要是如何配置寄存器。 下面是S3C2440特殊功能寄存器地址: #define rBANKCON0 (*(volatileunsigned *)0x48000004) //Boot ROM control #define rBANKCON1 (*(vo
[单片机]
基于嵌入式Linux的倒车影音系统设计
  引言   电子信息与数字图像处理技术目前已被广泛地应用在各个领域,车载系统的信息化已成为现代汽车业的重要标志。现在的倒车雷达系统可以为驾驶者提供许多帮助,多数采用超声波测距技术,可以直接显示出车尾与障碍物之间的距离。但由于超声波的散射特性,如果地面有尖锐的突起或存在横在半空的棱角状物体,系统就不能有效地“察觉”。假如能为现有的倒车系统增加一个可视功能,那么驾驶员在倒车时不必回头就可清楚车后的情况。本文设计了一种可视化安全倒车系统,该系统采用嵌入式Linux操作系统内核驱动USB摄像头实现车后状况实时监控,通过判断超声波测距是否达到阈值来启动语音报警功能。   1 系统方案设计   如图1所示,系统由主控模块、超声波收发模
[单片机]
基于嵌入式Linux的倒车影音系统设计
S3C2440+ADS1.2+H_JTAG 实现单步调试
1: 设置H_JTAG如下: 使之出现 2: 在ADS中debug,出现AXD调试界面,设定连接目标版 然后 下载镜像文件 接下来就可单步调试观察 TQ2440上的变化了 现在只会按照别人的操作 ,具体为什么这样做,尤其对那些JTAG 比如 H JTAG JTAG Jlink ...还不清楚
[单片机]
S3C2440的定时器详解
S3C2440A有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚的内部定时器。定时器0还包含用于大电流驱动的死区发生器 定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK 每个定时器有它自己的由定时器时钟驱动的16位递减计数器。当递减计数器到达零时,产生定时器中断请求通知CPU定时器操作已经完成。当
[单片机]
<font color='red'>S3C2440</font>的定时器详解
014_STM32程序移植之_L298N电机驱动模块
更改注意: STM32程序移植之L298N电机驱动模块 引脚连接图 STM32引脚 L298N引脚 功能 PA6 ENA 马达A的PWM PA7 ENB 马达B的PWM PA2 IN1 控制马达A PA3 IN2 控制马达A PA4 IN3 控制马达B PA5 IN4 控制马达B 注意 电源输入12V L298N的资料在这里 程序移植,刚才已经移植成功了,上面的是资料 注意,控制PWM 控制方向 在第二点的资料中只有IN1和IN2是因为原理是一样的,L298N总共有两个输出,所有有两个PWM输入还有IN1到IN
[单片机]
014_STM32<font color='red'>程序</font><font color='red'>移植</font>之_L298N电机<font color='red'>驱动</font>模块
一种嵌入式无线智能家居网关系统的设计方案
  0 引言   智能家居系统是为适应现代化家庭生活而形成的一个形式多样化的网络系统。它是现代3C技术(计算机技术,通信技术,控制技术)与传统家居系统相结合的产物,是家居信息化未来的发展方向。智能家居网络通常包括智能家居网关,外部网,安防设备等。智能家居网关与其他4个部分连接,交互信息,对它们进行统一的管理。此外,智能家居网关还接入外部网络,使用户能够远程实时控制管理家庭内部网络。   在本文中,智能家居网络是指应用于家庭环境的无线传感器网络。在家庭中,部署各种传感器,例如红外传感器,烟雾传感器,RFID门磁传感器来监测家庭的一些环境信息,这些传感器通过自组织方式就构建了智能家居网络。所以本文设计的智能家居网关主要是实现WSN
[单片机]
一种嵌入式无线智能家居网关系统的设计方案
S3C2440裸机------LCD_框架与准备
1.框架 2.准备工作 我们需要准备一个支持norfalsh和nandflash启动的程序,当我们的程序小于4K时,我们可以把nandflash的程序拷贝到片内4K内存,但是现在我们的程序大于4K,这时候我们要把程序拷贝到SDRAM里面。
[单片机]
<font color='red'>S3C2440</font>裸机------LCD_框架与准备
ARM9处理器S3C2440的GPS导航终端机的设计
0 引言 随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备.不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 1 GPS导航系统结构 本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。   嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就
[汽车电子]
ARM9处理器<font color='red'>S3C2440</font>的GPS导航终端机的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved