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

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

1484     while(ior(db, DM9KS_EPCR)&0x1);    /* Wait read complete */

1485     iow(db, DM9KS_EPCR, 0x0);     /* Clear phyxcer read command */

1486 

1487     /* The read data keeps on REG_0D & REG_0E */

1488     return ( ior(db, DM9KS_EPDRH) << 8 ) | ior(db, DM9KS_EPDRL);

1489     

1490 }

1491 

1492 /*

1493    Write a word to phyxcer

1494 */

1495 static void phy_write(board_info_t *db, int reg, u16 value)

1496 {

1497     /* Fill the phyxcer register into REG_0C */

1498     iow(db, DM9KS_EPAR, DM9KS_PHY | reg);

1499 

1500     /* Fill the written data into REG_0D & REG_0E */

1501     iow(db, DM9KS_EPDRL, (value & 0xff));

1502     iow(db, DM9KS_EPDRH, ( (value >> 8) & 0xff));

1503 

1504     iow(db, DM9KS_EPCR, 0xa);    /* Issue phyxcer write command */

1505     while(ior(db, DM9KS_EPCR)&0x1);    /* Wait read complete */

1506     iow(db, DM9KS_EPCR, 0x0);    /* Clear phyxcer write command */

1507 }

1508 //====dmfe_ethtool_ops member functions====

1509 static void dmfe_get_drvinfo(struct net_device *dev,

1510                    struct ethtool_drvinfo *info)

1511 {

1512     //board_info_t *db = (board_info_t *)dev->priv;

1513     strcpy(info->driver, DRV_NAME);

1514     strcpy(info->version, DRV_VERSION);

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

1516 }

1517 static int dmfe_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)

1518 {

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

1520     spin_lock_irq(&db->lock);

1521     mii_ethtool_gset(&db->mii, cmd);

1522     spin_unlock_irq(&db->lock);

1523     return 0;

1524 }

1525 static int dmfe_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)

1526 {

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

1528     int rc;

1529 

1530     spin_lock_irq(&db->lock);

1531     rc = mii_ethtool_sset(&db->mii, cmd);

1532     spin_unlock_irq(&db->lock);

1533     return rc;

1534 }

1535 /*

1536 * Check the link state

1537 */

1538 static u32 dmfe_get_link(struct net_device *dev)

1539 {

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

1541     return mii_link_ok(&db->mii);

1542 }

1543 

1544 /*

1545 * Reset Auto-negitiation

1546 */

1547 static int dmfe_nway_reset(struct net_device *dev)

1548 {

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

1550     return mii_nway_restart(&db->mii);

1551 }

1552 /*

1553 * Get RX checksum offload state

1554 */

1555 static uint32_t dmfe_get_rx_csum(struct net_device *dev)

1556 {

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

1558     return db->rx_csum;

1559 }

1560 /*

1561 * Get TX checksum offload state

1562 */

1563 static uint32_t dmfe_get_tx_csum(struct net_device *dev)

1564 {

1565     return (dev->features & NETIF_F_HW_CSUM) != 0;

1566 }

1567 /* 

1568 * Enable/Disable RX checksum offload

1569 */

1570 static int dmfe_set_rx_csum(struct net_device *dev, uint32_t data)

1571 {

1572 #ifdef CHECKSUM

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

1574     db->rx_csum = data;

1575 

1576     if(netif_running(dev)) {

1577         dmfe_stop(dev);

1578         dmfe_open(dev);

1579     } else

1580         dmfe_init_dm9000(dev);

1581 #else

1582     printk(KERN_ERR 'DM9:Don't support checksumn');

1583 #endif

1584     return 0;

1585 }

1586 /* 

1587 * Enable/Disable TX checksum offload

1588 */

1589 static int dmfe_set_tx_csum(struct net_device *dev, uint32_t data)

1590 {

1591 #ifdef CHECKSUM

1592     if (data)

1593         dev->features |= NETIF_F_HW_CSUM;

1594     else

1595         dev->features &= ~NETIF_F_HW_CSUM;

1596 #else

1597     printk(KERN_ERR 'DM9:Don't support checksumn');

1598 #endif

1599 

1600     return 0;

1601 }

1602 //=========================================

1603 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,28)  /* for kernel 2.4.28 */

1604 static struct ethtool_ops dmfe_ethtool_ops = {

1605     .get_drvinfo        = dmfe_get_drvinfo,

1606     .get_settings        = dmfe_get_settings,

1607     .set_settings        = dmfe_set_settings,

1608     .get_link            = dmfe_get_link,

1609     .nway_reset        = dmfe_nway_reset,

1610     .get_rx_csum        = dmfe_get_rx_csum,

1611     .set_rx_csum        = dmfe_set_rx_csum,

1612     .get_tx_csum        = dmfe_get_tx_csum,

1613     .set_tx_csum        = dmfe_set_tx_csum,

1614 };

1615 #endif

1616 

1617 //#ifdef MODULE

1618 

1619 MODULE_LICENSE('GPL');

1620 MODULE_DESCRIPTION('Davicom DM9000/DM9010 ISA/uP Fast Ethernet Driver');

1621 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) 

1622 MODULE_PARM(mode, 'i');

1623 MODULE_PARM(irq, 'i');

1624 MODULE_PARM(iobase, 'i');

1625 #else

1626 module_param(mode, int, 0);

1627 module_param(irq, int, 0);

1628 module_param(iobase, int, 0);

1629 #endif           

1630 MODULE_PARM_DESC(mode,'Media Speed, 0:10MHD, 1:10MFD, 4:100MHD, 5:100MFD');

1631 MODULE_PARM_DESC(irq,'EtherLink IRQ number');

1632 MODULE_PARM_DESC(iobase, 'EtherLink I/O base address');

1633 

1634 /* Description: 

1635    when user used insmod to add module, system invoked init_module()

1636    to initilize and register.

1637 */

1638 int __init dm9000c_init(void)

1639 {

1640     volatile unsigned long *bwscon;     // 0x48000000

1641     volatile unsigned long *bankcon4;     // 0x48000014

1642     unsigned long val;

1643     

1644     iobase = (int)ioremap(0x20000000,1024);    /* 添加内存映射 */

1645 

1646     //2440使用的中断引脚为外部中断7,此处我们设置中断号

1647     irq = IRQ_EINT7;

1648     

1649         /* 设置S3C2440的memory controller */

1650     bwscon   = ioremap(0x48000000, 4);

1651     bankcon4 = ioremap(0x48000014, 4);

1652 

1653     /* DW4[17:16]: 01-16bit

1654      * WS4[18]   : 0-WAIT disable

1655      * ST4[19]   : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])

1656      */

1657     val = *bwscon;

1658     val &= ~(0xf<<16);

1659     val |= (1<<16);

1660     *bwscon = val;

1661 

1662     /*

1663      * Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号

1664      *              DM9000C的片选信号和CMD信号可以同时发出,

1665      *              所以它设为0

1666      * Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE

1667      *              DM9000C的T1>=0ns, 

1668      *              所以它设为0

1669      * Tacc[10:8] : 读写信号的脉冲长度, 

1670      *              DM9000C的T2>=10ns, 

1671      *              所以它设为1, 表示2个hclk周期,hclk=100MHz,就是20ns

1672      * Tcoh[7:6]  : 当读信号nOE变为高电平后,片选信号还要维持多长时间

1673      *              DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns

1674      *              DM9000C进行读操作时, nOE变为高电平之后, 数据线上的数据在6ns之内会消失

1675      *              我们取一个宽松值: 让片选信号在nOE放为高电平后,再维持10ns, 

1676      *              所以设为01

1677      * Tcah[5:4]  : 当片选信号变为高电平后, 地址信号还要维持多长时间

1678      *              DM9000C的片选信号和CMD信号可以同时出现,同时消失

1679      *              所以设为0

1680      * PMC[1:0]   : 00-正常模式

1681      *

1682      */

1683     //*bankcon4 = (1<<8)|(1<<6);    /* 对于DM9000C可以设Tacc为1, 对于DM9000E,Tacc要设大一点,比如最大值7  */

1684     *bankcon4 = (7<<8)|(1<<6);  /* TQ2440和MINI2440使用DM9000E,Tacc要设大一点  正常来说1也可以 */

1685 

1686     iounmap(bwscon);

1687     iounmap(bankcon4);

1688     

1689     

1690     switch(mode) {

1691         case DM9KS_10MHD:

1692         case DM9KS_100MHD:

1693         case DM9KS_10MFD:

1694         case DM9KS_100MFD:

1695             media_mode = mode;

1696             break;

1697         default:

[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