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

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

 865     iow(db, DM9KS_RXCR, 0x00);    /* Disable RX */

 866 

 867     /* Dump Statistic counter */

 868 #if FALSE

 869     printk('nRX FIFO OVERFLOW %lxn', db->stats.rx_fifo_errors);

 870     printk('RX CRC %lxn', db->stats.rx_crc_errors);

 871     printk('RX LEN Err %lxn', db->stats.rx_length_errors);

 872     printk('RESET %xn', db->reset_counter);

 873     printk('RESET: TX Timeout %xn', db->reset_tx_timeout);

 874     printk('g_TX_nsr %xn', g_TX_nsr);

 875 #endif

 876 

 877     return 0;

 878 }

 879 

 880 static void dmfe_tx_done(unsigned long unused)

 881 {

 882     struct net_device *dev = dmfe_dev;

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

 884     int  nsr;

 885 

 886     DMFE_DBUG(0, 'dmfe_tx_done()', 0);

 887     

 888     nsr = ior(db, DM9KS_NSR);

 889     if (nsr & 0x0c)

 890     {

 891         if(nsr & 0x04) db->tx_pkt_cnt--;

 892         if(nsr & 0x08) db->tx_pkt_cnt--;

 893         if(db->tx_pkt_cnt < 0)

 894         {

 895             printk(KERN_DEBUG 'DM9KS:tx_pkt_cnt ERROR!!n');

 896             while(ior(db,DM9KS_TCR) & 0x1){}

 897             db->tx_pkt_cnt = 0;

 898         }

 899             

 900     }else{

 901         while(ior(db,DM9KS_TCR) & 0x1){}

 902         db->tx_pkt_cnt = 0;

 903     }

 904         

 905     netif_wake_queue(dev);

 906     

 907     return;

 908 }

 909 

 910 /*

 911   DM9000 insterrupt handler

 912   receive the packet to upper layer, free the transmitted packet

 913 */

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

 915 static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)

 916 #else

 917     #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)

 918     static irqreturn_t dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)

 919     #else

 920     static irqreturn_t dmfe_interrupt(int irq, void *dev_id) /* for kernel 2.6.20*/

 921     #endif

 922 #endif

 923 {

 924     struct net_device *dev = dev_id;

 925     board_info_t *db;

 926     int int_status,i;

 927     u8 reg_save;

 928 

 929     DMFE_DBUG(0, 'dmfe_interrupt()', 0);

 930 

 931     /* A real interrupt coming */

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

 933     spin_lock(&db->lock);

 934 

 935     /* Save previous register address */

 936     reg_save = inb(db->io_addr);

 937 

 938     /* Disable all interrupt */

 939     iow(db, DM9KS_IMR, DM9KS_DISINTR); 

 940 

 941     /* Got DM9000/DM9010 interrupt status */

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

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

 944 

 945     /* Link status change */

 946     if (int_status & DM9KS_LINK_INTR) 

 947     {

 948         netif_stop_queue(dev);

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

 950         {

 951             phy_read(db,0x1);

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

 953             {

 954                 /* wait for detected Speed */

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

 956                     udelay(1000);

 957                 /* set media speed */

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

 959                 else db->Speed =10;

 960                 break;

 961             }

 962             udelay(1000);

 963         }

 964         netif_wake_queue(dev);

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

 966     }

 967     /* Received the coming packet */

 968     if (int_status & DM9KS_RX_INTR) 

 969         dmfe_packet_receive(dev);

 970 

 971     /* Trnasmit Interrupt check */

 972     if (int_status & DM9KS_TX_INTR)

 973         dmfe_tx_done(0);

 974     

 975     if (db->cont_rx_pkt_cnt>=CONT_RX_PKT_CNT)

 976     {

 977         iow(db, DM9KS_IMR, 0xa2);

 978     }

 979     else

 980     {

 981         /* Re-enable interrupt mask */ 

 982         iow(db, DM9KS_IMR, DM9KS_REGFF);

 983     }

 984     

 985     /* Restore previous register address */

 986     outb(reg_save, db->io_addr); 

 987 

 988     spin_unlock(&db->lock); 

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

 990     return IRQ_HANDLED;

 991 #endif

 992 }

 993 

 994 /*

 995   Get statistics from driver.

 996 */

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

 998 {

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

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

1001     return &db->stats;

1002 }

1003 /*

1004  *    Process the ethtool ioctl command

1005  */

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

1007 {

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

1009     struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };

1010     u32 ethcmd;

1011 

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

1013         return -EFAULT;

1014 

1015     switch (ethcmd) 

1016     {

1017         case ETHTOOL_GDRVINFO:

1018             strcpy(info.driver, DRV_NAME);

1019             strcpy(info.version, DRV_VERSION);

1020 

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

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

1023                 return -EFAULT;

1024             return 0;

1025     }

1026 

1027     return -EOPNOTSUPP;

1028 }

1029 /*

1030   Process the upper socket ioctl command

1031 */

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

1033 {

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

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

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

1037     #endif

1038   int rc=0;

1039         

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

1041     

1042         if (!netif_running(dev))

1043             return -EINVAL;

1044 

1045         if (cmd == SIOCETHTOOL)

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

1047     else {

1048         spin_lock_irq(&db->lock);

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

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

1051         #else

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

1053         #endif

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

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

推荐阅读最新更新时间:2024-11-10 01:21

裸机系列——s3c2440之触摸屏
平台:mini2440 触摸屏:索尼x-35 3.5寸触摸屏 1.0、触摸屏与lcd 触摸屏与lcd是俩个独立的屏在lcd中已经讲过了,但是这里在提一下,主要是涉及到一个触摸屏校正的问题,我以前一直很是不解我手指点的什么东西电脑是怎么知道的,直到我弄触摸屏的时候在明白,原来是因为lcd与触摸屏分开但是他们之间有对应关系,简单的说就是一个触摸屏的坐标点对应lcd的一个像素点,这样当我们按下触摸屏后,系统通过计算得到该地方的坐标,然后通过对应关系找到相应位置的lcd显示的内容。因为触摸屏和lcd是独立的,总是因为一些物理的原因会有一些位置上的改变,所以这种对应关系不是不变的,我们可以通过开机的时候的校验来确定这种关系,比如
[单片机]
冲孔打桩机的自动控制系统设计
0 引言 冲孔打桩机主要由桩锤、支架、卷扬机以及其他辅助设备组成,其工作原理是利用冲孔打桩机的卷扬机构,将电动机输出动力的回转运动转变为往复运动,通过钢丝绳来带动桩锤的提升,并在一定高度时使桩锤自由下落,利用桩锤的冲击作用冲挤土层或破碎岩石,同时钻渣随泥浆(或用取渣桶)排出,最后在地基土中形成桩孔。施工人员在桩孔内放置钢筋笼,灌注混凝土而制成桩。 目前,冲孔打桩机的打桩作业均由人工手动机械式操纵来完成。操作人员在工作过程中需要频繁对离合装置、刹车装置等控制部件进行操纵,劳动强度很大。随着微电子技术和自动控制理论的发展,将自动控制技术应用于冲孔打桩机,实现打桩的全自动化或半自动化,使操作人员从繁琐重复的体力劳动中解放出来成为
[单片机]
冲孔打桩机的自动控制系统设计
学习笔记--- S3C2440 对NANDFLASH操作原理与测试代码分析
首先来看一下NANDFLASH接口: 图上看出只有数据口和控制口,没有地址线,所以它不能像网卡,SDRAM那样统一寻址,它的操作方法步骤: 1 使能芯片 2 发操作指令(读,写,擦,复位) 3 发操作地址 5 等待忙信号释放(只有读) 6 发送数据(写),接收数据(读) 7 等待忙信号,低电平忙 8 禁能芯片 这些控制信号线都是通过软件设置寄存器,然后硬件自动产生其他控制线的控制信号; 操作信号含义如下: R/B :读/忙状态线 CE : 片选 CLE :发送指令信号 ALE :发送地址信号 WE:写信号 RE:读信号 这里要注意的: 1 数据按字节传输,刚好8位
[单片机]
学习笔记--- <font color='red'>S3C2440</font> 对NANDFLASH操作原理与测试代码分析
S3C2440移植uboot之编译烧写uboot
文章目录 移植环境 获取uboot 更新交叉编译工具 配置环境变量 移植环境 主 机:VMWare–ubuntu16.04 开发板:S3C2440 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2012.04.01.tar.bz2 获取uboot 进入https://www.denx.de/wiki/U-Boot下载uboot 一直往下拉选择如下 将下载好的压缩包解压到任意文件夹,并创建source insight工程。将下载好的u-boot-2012.04.01.tar_2.bz2放到ubuntu服务器/work/system中。执行以下命令解压uboot: cd
[单片机]
<font color='red'>S3C2440</font><font color='red'>移植</font>uboot之编译烧写uboot
s3c2440串口调试函数
#include 2440addr.h #include stdarg.h #include string.h #include stdlib.h #include stdio.h #include ctype.h #define TXD0READY (1 2) #define RXD0READY (1) #define UART_CLK 50000000 // UART0的时钟源设为PCLK #define UART_BAUD_RATE 115200 // 波特率 #define UART_BRD ((UART_CLK / (UART_BAUD_RAT
[单片机]
s3c2440烧写第一步
开发板是jz2440。 视频是韦东山的,看了那么久,讲解的很全面,包括openJtag,并口,串口的连接以及驱动安装等,唯独不讲怎么安装jlink的驱动,也是很奇怪了。毕竟新人,怀着忐忑的心情下载了Jflash,终于看到了教程里面相关界面,于是接下来可以按部就班的烧写了。 烧写所需软件:SecureCRT 5.2,J-LINK v4.90(两个软件都没考虑版本)。 烧写所需文件:s3c2440.jflash,uboot.bin。 接线准备:连接jlink,连接usb-com1(串口),开发板flash开关拨到nor flash一侧。 第一步:1、打开Jflash,选择File- Open data file -
[单片机]
<font color='red'>s3c2440</font>烧写第一步
s3c2440的系统时钟
下面内容是《ARM处理器裸机开发实战—机制而非策略》里的,以s3c2440开发板为例 系统时钟是整个电路的心脏。 总体来说,与s3c2440处理器有关的时钟主要有4种:Fin、FCLK、HCLK和PCLK。 Fin: 外部输入的晶振频率 FCLK: 主要用于CPU核 HCLK: 主要用在与AHB总线互连的设备上(存储器控制器、lcd控制器、dma) PCLK: 主要用在与APB总线互连的低速设备上(uart adc 定时器) S3c2440系统时钟概述 S3c2440处理器的系统时钟分为两部分,外部有时钟输入引脚,内部有2个锁相环将外部输入时钟倍频到处理器工作所需要的时钟。锁相环相当于一个时钟变换电
[单片机]
<font color='red'>s3c2440</font>的系统时钟
s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
前提: norflash初始化正常,能够正常从nor上执行。 cpu总是从0地址读取指令执行程序。当cpu设置成nor启动时,0地址对应nor。cpu从nand启动时,0地址对应sram。 1.读取norFlash 我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表: 下面简单的举一些例子: 1)复位(reset): 往任何一个地址写入F0即可。 2)读ID: 很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册上的命令表
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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