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

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

 942     /* Save previous register address */

 943     reg_save = inb(db->io_addr);

 944 

 945     /* Disable all interrupt */

 946     iow(db, DM9KS_IMR, DM9KS_DISINTR); 

 947 

 948     /* Got DM9000/DM9010 interrupt status */

 949     int_status = ior(db, DM9KS_ISR);        /* Got ISR */

 950     iow(db, DM9KS_ISR, int_status);        /* Clear ISR status */ 

 951 

 952     /* Link status change */

 953     if (int_status & DM9KS_LINK_INTR) 

 954     {

 955         netif_stop_queue(dev);

 956         for(i=0; i<500; i++) /*wait link OK, waiting time =0.5s */

 957         {

 958             phy_read(db,0x1);

 959             if(phy_read(db,0x1) & 0x4) /*Link OK*/

 960             {

 961                 /* wait for detected Speed */

 962                 for(i=0; i<200;i++)

 963                     udelay(1000);

 964                 /* set media speed */

 965                 if(phy_read(db,0)&0x2000) db->Speed =100;

 966                 else db->Speed =10;

 967                 break;

 968             }

 969             udelay(1000);

 970         }

 971         netif_wake_queue(dev);

 972         //printk('[INTR]i=%d speed=%dn',i, (int)(db->Speed));    

 973     }

 974     /* Received the coming packet */

 975     if (int_status & DM9KS_RX_INTR) 

 976         dmfe_packet_receive(dev);

 977 

 978     /* Trnasmit Interrupt check */

 979     if (int_status & DM9KS_TX_INTR)

 980         dmfe_tx_done(0);

 981     

 982     if (db->cont_rx_pkt_cnt>=CONT_RX_PKT_CNT)

 983     {

 984         iow(db, DM9KS_IMR, 0xa2);

 985     }

 986     else

 987     {

 988         /* Re-enable interrupt mask */ 

 989         iow(db, DM9KS_IMR, DM9KS_REGFF);

 990     }

 991     

 992     /* Restore previous register address */

 993     outb(reg_save, db->io_addr); 

 994 

 995     spin_unlock(&db->lock); 

 996 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)

 997     return IRQ_HANDLED;

 998 #endif

 999 }

1000 

1001 /*

1002   Get statistics from driver.

1003 */

1004 static struct net_device_stats * dmfe_get_stats(struct net_device *dev)

1005 {

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

1007     DMFE_DBUG(0, 'dmfe_get_stats', 0);

1008     return &db->stats;

1009 }

1010 /*

1011  *    Process the ethtool ioctl command

1012  */

1013 static int dmfe_ethtool_ioctl(struct net_device *dev, void *useraddr)

1014 {

1015     //struct dmfe_board_info *db = dev->priv;

1016     struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };

1017     u32 ethcmd;

1018 

1019     if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))

1020         return -EFAULT;

1021 

1022     switch (ethcmd) 

1023     {

1024         case ETHTOOL_GDRVINFO:

1025             strcpy(info.driver, DRV_NAME);

1026             strcpy(info.version, DRV_VERSION);

1027 

1028             sprintf(info.bus_info, 'ISA 0x%lx %d',dev->base_addr, dev->irq);

1029             if (copy_to_user(useraddr, &info, sizeof(info)))

1030                 return -EFAULT;

1031             return 0;

1032     }

1033 

1034     return -EOPNOTSUPP;

1035 }

1036 /*

1037   Process the upper socket ioctl command

1038 */

1039 static int dmfe_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

1040 {

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

1042     #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) /* for kernel 2.6.7 */

1043     struct mii_ioctl_data *data=(struct mii_ioctl_data *)&ifr->ifr_data; 

1044     #endif

1045   int rc=0;

1046         

1047     DMFE_DBUG(0, 'dmfe_do_ioctl()', 0);

1048     

1049         if (!netif_running(dev))

1050             return -EINVAL;

1051 

1052         if (cmd == SIOCETHTOOL)

1053         rc = dmfe_ethtool_ioctl(dev, (void *) ifr->ifr_data);

1054     else {

1055         spin_lock_irq(&db->lock);

1056         #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) /* for kernel 2.6.7 */

1057             rc = generic_mii_ioctl(&db->mii, data, cmd, NULL);

1058         #else

1059             rc = generic_mii_ioctl(&db->mii, if_mii(ifr), cmd, NULL);

1060         #endif

1061         spin_unlock_irq(&db->lock);

1062     }

1063 

1064     return rc;

1065 }

1066 

1067 /* Our watchdog timed out. Called by the networking layer */

1068 static void dmfe_timeout(struct net_device *dev)

1069 {

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

1071     int i;

1072     

1073     DMFE_DBUG(0, 'dmfe_TX_timeout()', 0);

1074     printk('TX time-out -- dmfe_timeout().n');

1075     db->reset_tx_timeout++;

1076     db->stats.tx_errors++;

1077     

1078 #if FALSE

1079     printk('TX packet count = %dn', db->tx_pkt_cnt);    

1080     printk('TX timeout = %dn', db->reset_tx_timeout);    

1081     printk('22H=0x%02x  23H=0x%02xn',ior(db,0x22),ior(db,0x23));

1082     printk('faH=0x%02x  fbH=0x%02xn',ior(db,0xfa),ior(db,0xfb));

1083 #endif

1084 

1085     i=0;

1086 

1087     while((i++<100)&&(ior(db,DM9KS_TCR) & 0x01))

1088     {

1089         udelay(30);

1090     }

1091         

1092     if(i<100)

1093     {

1094             db->tx_pkt_cnt = 0;

1095             netif_wake_queue(dev);

1096     }

1097     else

1098     {

1099             dmfe_reset(dev);

1100     }

1101 

1102 }

1103 

1104 static void dmfe_reset(struct net_device * dev)

1105 {

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

1107     u8 reg_save;

1108     int i;

1109     /* Save previous register address */

1110     reg_save = inb(db->io_addr);

1111 

1112     netif_stop_queue(dev); 

1113     db->reset_counter++;

1114     dmfe_init_dm9000(dev);

1115     

1116     db->Speed =10;

1117     for(i=0; i<1000; i++) /*wait link OK, waiting time=1 second */

1118     {

1119         if(phy_read(db,0x1) & 0x4) /*Link OK*/

1120         {

1121             if(phy_read(db,0)&0x2000) db->Speed =100;

1122             else db->Speed =10;

1123             break;

1124         }

1125         udelay(1000);

1126     }

1127     

1128     netif_wake_queue(dev);

1129     

1130     /* Restore previous register address */

1131     outb(reg_save, db->io_addr);

1132 

1133 }

1134 /*

1135   A periodic timer routine

1136 */

1137 static void dmfe_timer(unsigned long data)

1138 {

1139     struct net_device * dev = (struct net_device *)data;

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

1141     DMFE_DBUG(0, 'dmfe_timer()', 0);

1142     

1143     if (db->cont_rx_pkt_cnt>=CONT_RX_PKT_CNT)

1144     {

1145         db->cont_rx_pkt_cnt=0;

[1].. [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]
关键字:S3C2440  dm9000  网卡驱动  程序移植 引用地址:S3C2440实现dm9000网卡驱动程序移植

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

推荐阅读最新更新时间:2024-11-13 23:25

S3C2440时钟系统详解
在讲述系统时钟之前,因为这些设备都是挂靠在系统时钟上的,所以必须先说系统时钟,S3C2440的时钟系统如下 外部时钟源分两种,晶振或者外部频率,由om3-2选择,时钟电路根据两种选择也有两种 我们来分析时钟图可以得到以下结论: 经过选择的外部时钟进入MPLL,进行锁相环倍频,经过锁相环之后的时钟MPLL_IN分成了三股,分别是FCLK,HCLK,PCLK.这其中HCLK和PCLK又是从HCLK分频得到的,最后ARM920T这个系统内核模块得到了两个时钟HCLK和FCLK,DMA控制器,LCD控制器,内存控制器,总线控制器,外部nand控制器和TIC,摄像头接口都来自于HCLK时钟,LCD控制器,nand控制器,cam摄像头
[单片机]
<font color='red'>S3C2440</font>时钟系统详解
了解S3C2440触摸屏驱动的原理及其应用
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用
[单片机]
了解<font color='red'>S3C2440</font>触摸屏<font color='red'>驱动</font>的原理及其应用
STM32网络通信之DM9000了解
简介: 3.3V 供电,IO端口最高支持5V,提供两个接口,一个是可以以8、16、32这三种不同的方式与处理器相连接的接口,一个是与EEPROM连接的I2C接口,如此在外接的EEPROM中可以存放要缓存的数据信息。此外,DM9000内部有一个16K缓存数据区,分为发送FIFO缓冲区和接收FIFO缓冲区。 DM9000有三类寄存器,数据寄存器、状态寄存器和控制寄存器。 常用到的寄存器有6个: (1)网络控制寄存器 NCR 作用:对DM9000芯片的网络相关功能的配置,各位解释如下: (2)网络状态寄存器 NSR 作用: 寄存器的各位表示网络连接状态,通过这些标志位判断芯片的状态,写驱动的时候,一般会用到连接
[单片机]
STM32网络通信之<font color='red'>DM9000</font>了解
s3c2440实时时钟中断
s3c2440实时时钟(RTC)中,定义了两个中断源:报警中断和时间节拍中断。前面有网友问到了这两个中断的用法,最近我抽出时间对这两个中断研究了一番,发现这两个中断都很实用。现在就给大家介绍一下它们的用法。 时间节拍中断,顾名思义,就像一个节拍器,可以等时性的控制节拍。因此它类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。时间节拍中断的周期公式为:(n+1) 128,单位是秒,即每隔这么长时间,会中断一次。其中n的值为1~127,它存储在寄存器TICNT的低6位中,当寄存器TICNT的第7位被置1时,表示开启时间节拍中断,这时n递减,当减为0时,进入时间节拍中断。 报警中断可以
[单片机]
基于S3C2440嵌入式系统的以太网接口电路设计方案
文章主要介绍了一个基于三星ARM9芯片S3C2440嵌入式系统的以太网接口电路设计方案,采用了工业级以太网控制器DM9000AEP成功实现了嵌入式系统网络数据交换。论文在重点阐述了网络接口电路基础之上,对Windows CE系统控制软件部分DM9000AEP的驱动程序和注册表项进行了具体分析。 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显着的优势。本文提出了一种基于DM9000AE网络接口
[单片机]
基于<font color='red'>S3C2440</font>嵌入式系统的以太网接口电路设计方案
S3C2440——使用URAT0中断方式发送和接收字符串
设置中断向量表 ;文件ASM_Interrupt.s ;(1)设置中断向量表 Mode_USR EQU 0x50 ;IRQ中断开放,FIQ中断关闭 Mode_FIQ EQU 0xD1 ;关闭IRQ、FIQ中断 Mode_IRQ EQU 0xD2 ;关闭IRQ、FIQ中断 Mode_SVC EQU 0xD3 ;关闭IRQ、FIQ中断 GET 2440Reg_addr.inc AREA MyCode, CODE,READONLY IMPORT Uart_Init IMPORT INT_UART0 ENTRY ;设置中断向量表 B
[单片机]
S3C2440时钟电源管理
S3C2440的时钟可以选用晶振(XTAL),也可以使用外部时钟(EXTCLK),由系统复位时,在复位信号上升沿对引脚OM3、OM2所测的状态来确定。由于我所用的开发板这两个引脚接地,故外部晶振作为主锁相环(MPLL)和usb锁相环(UPLL)的时钟源。 含有两个锁相环MPLL、UPLL产生系统所需要的不同频率的时钟 MPLL: 为CPU产生FCLK时钟 为AHB产生HCLK时钟 为APB产生PCLK时钟 UPLL: 为usb(Host and Device)产生UCLK(48M) FCLK,HCLK和 PCLK FCLK是提供给ARM920T 的时钟。 HCLK 是提供给用于 ARM920T,存储器控制器,中断控
[单片机]
<font color='red'>S3C2440</font>时钟电源管理
linux 2.6.32 在arm9(s3c2440)平台的移植
板子用的友善的mini2440, 起初按照光盘提供的手册, 照猫画虎,,,,,,,,,但是遇到各种问题, 很多未解决.....原因是还没理解每层目录的Makefile和Kconfig的关系, 以及在Kernel Configure菜单树中对应的选项, 以及对nand_flash设备的结构体的意义没搞清楚,~ so~ 在http://www.kernel.org/ 下载2.6.32的源代码. 编译器用的arm-linux-gcc 4.1.2 . 1 内核代码/uboot代码中中机器码的定义位置,在/root/linux-2.6.32/arch/arm/tools/mach-types 和 uboot/include/asm-
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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