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

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

 688     }

 689 #ifdef FLOW_CONTROL

 690     iow(db, DM9KS_BPTR, 0x37);

 691     iow(db, DM9KS_FCTR, 0x38);

 692     iow(db, DM9KS_FCR, 0x29);

 693 #endif

 694 

 695 #ifdef DM8606

 696     iow(db,0x34,1);

 697 #endif

 698 

 699     if (dev->features & NETIF_F_HW_CSUM){

 700         printk(KERN_INFO 'DM9KS:enable TX checksumn');

 701         iow(db, DM9KS_TCCR, 0x07);    /* TX UDP/TCP/IP checksum enable */

 702     }

 703     if (db->rx_csum){

 704         printk(KERN_INFO 'DM9KS:enable RX checksumn');

 705         iow(db, DM9KS_RCSR, 0x02);    /* RX checksum enable */

 706     }

 707 

 708 #ifdef ETRANS

 709     /*If TX loading is heavy, the driver can try to anbel 'early transmit'.

 710     The programmer can tune the 'Early Transmit Threshold' to get 

 711     the optimization. (DM9KS_ETXCSR.[1-0])

 712     

 713     Side Effect: It will happen 'Transmit under-run'. When TX under-run

 714     always happens, the programmer can increase the value of 'Early 

 715     Transmit Threshold'. */

 716     iow(db, DM9KS_ETXCSR, 0x83);

 717 #endif

 718  

 719     /* Set address filter table */

 720     dm9000_hash_table(dev);

 721 

 722     /* Activate DM9000/DM9010 */

 723     iow(db, DM9KS_IMR, DM9KS_REGFF); /* Enable TX/RX interrupt mask */

 724     iow(db, DM9KS_RXCR, DM9KS_REG05 | 1);    /* RX enable */

 725     

 726     /* Init Driver variable */

 727     db->tx_pkt_cnt         = 0;

 728         

 729     netif_carrier_on(dev);

 730 

 731 }

 732 

 733 /*

 734   Hardware start transmission.

 735   Send a packet to media from the upper layer.

 736 */

 737 static int dmfe_start_xmit(struct sk_buff *skb, struct net_device *dev)

 738 {

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

 740     char * data_ptr;

 741     int i, tmplen;

 742     u16 MDWAH, MDWAL;

 743     

 744     #ifdef TDBUG /* check TX FIFO pointer */

 745             u16 MDWAH1, MDWAL1;

 746             u16 tx_ptr;

 747     #endif

 748     

 749     DMFE_DBUG(0, 'dmfe_start_xmit', 0);

 750     if (db->chip_revision != 0x1A)

 751     {    

 752         if(db->Speed == 10)

 753             {if (db->tx_pkt_cnt >= 1) return 1;}

 754         else

 755             {if (db->tx_pkt_cnt >= 2) return 1;}

 756     }else

 757         if (db->tx_pkt_cnt >= 2) return 1;

 758     

 759     /* packet counting */

 760     db->tx_pkt_cnt++;

 761 

 762     db->stats.tx_packets++;

 763     db->stats.tx_bytes+=skb->len;

 764     if (db->chip_revision != 0x1A)

 765     {

 766         if (db->Speed == 10)

 767             {if (db->tx_pkt_cnt >= 1) netif_stop_queue(dev);}

 768         else

 769             {if (db->tx_pkt_cnt >= 2) netif_stop_queue(dev);}

 770     }else

 771         if (db->tx_pkt_cnt >= 2) netif_stop_queue(dev);        

 772 

 773     /* Disable all interrupt */

 774     iow(db, DM9KS_IMR, DM9KS_DISINTR);

 775 

 776     MDWAH = ior(db,DM9KS_MDWAH);

 777     MDWAL = ior(db,DM9KS_MDWAL);

 778 

 779     /* Set TX length to reg. 0xfc & 0xfd */

 780     iow(db, DM9KS_TXPLL, (skb->len & 0xff));

 781     iow(db, DM9KS_TXPLH, (skb->len >> 8) & 0xff);

 782 

 783     /* Move data to TX SRAM */

 784     data_ptr = (char *)skb->data;

 785     

 786     outb(DM9KS_MWCMD, db->io_addr); // Write data into SRAM trigger

 787     switch(db->io_mode)

 788     {

 789         case DM9KS_BYTE_MODE:

 790             for (i = 0; i < skb->len; i++)

 791                 outb((data_ptr[i] & 0xff), db->io_data);

 792             break;

 793         case DM9KS_WORD_MODE:

 794             tmplen = (skb->len + 1) / 2;

 795             for (i = 0; i < tmplen; i++)

 796         outw(((u16 *)data_ptr)[i], db->io_data);

 797       break;

 798     case DM9KS_DWORD_MODE:

 799       tmplen = (skb->len + 3) / 4;            

 800             for (i = 0; i< tmplen; i++)

 801                 outl(((u32 *)data_ptr)[i], db->io_data);

 802             break;

 803     }

 804     

 805 #ifndef ETRANS

 806     /* Issue TX polling command */

 807     iow(db, DM9KS_TCR, 0x1); /* Cleared after TX complete*/

 808 #endif

 809 

 810     #ifdef TDBUG /* check TX FIFO pointer */

 811             MDWAH1 = ior(db,DM9KS_MDWAH);

 812             MDWAL1 = ior(db,DM9KS_MDWAL);

 813             tx_ptr = (MDWAH<<8)|MDWAL;

 814             switch (db->io_mode)

 815             {

 816                 case DM9KS_BYTE_MODE:

 817                     tx_ptr += skb->len;

 818                     break;

 819                 case DM9KS_WORD_MODE:

 820                     tx_ptr += ((skb->len + 1) / 2)*2;

 821                     break;

 822                 case DM9KS_DWORD_MODE:

 823                     tx_ptr += ((skb->len+3)/4)*4;

 824                     break;

 825             }

 826             if (tx_ptr > 0x0bff)

 827                     tx_ptr -= 0x0c00;

 828             if (tx_ptr != ((MDWAH1<<8)|MDWAL1))

 829                     printk('[dm9ks:TX FIFO ERRORn');

 830     #endif

 831     /* Saved the time stamp */

 832     dev->trans_start = jiffies;

 833     db->cont_rx_pkt_cnt =0;

 834 

 835     /* Free this SKB */

 836     dev_kfree_skb(skb);

 837 

 838     /* Re-enable interrupt */

 839     iow(db, DM9KS_IMR, DM9KS_REGFF);

 840 

 841     return 0;

 842 }

 843 

 844 /*

 845   Stop the interface.

 846   The interface is stopped when it is brought.

 847 */

 848 static int dmfe_stop(struct net_device *dev)

 849 {

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

 851     DMFE_DBUG(0, 'dmfe_stop', 0);

 852 

 853     /* deleted timer */

 854     del_timer(&db->timer);

 855 

 856     netif_stop_queue(dev); 

 857 

 858     /* free interrupt */

 859     free_irq(dev->irq, dev);

 860 

 861     /* RESET devie */

 862     phy_write(db, 0x00, 0x8000);    /* PHY RESET */

 863     //iow(db, DM9KS_GPR, 0x01);     /* Power-Down PHY */

 864     iow(db, DM9KS_IMR, DM9KS_DISINTR);    /* Disable all interrupt */

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

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

推荐阅读最新更新时间:2024-11-03 00:27

S3C2440中断体系结构
一、S3C2440中断体系结构 1)ARM体系CPU的7种工作模式 用户模式(usr):ARM处理器正常的程序执行状态 快速中断模式(fiq):用于高速数据传输或通道处理 中断模式(irq):用于通用的中断处理 管理模式(svc):操作系统使用的保护模式 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护 系统模式(sys):运行具有特权的操作系统任务 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真 除用户模式外,其他6种工作模式都属于特权模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。
[单片机]
<font color='red'>S3C2440</font>中断体系结构
ARM920T(S3C2440)的中断系统
IRQ中断和快速中断FIQ区别 ARM920T内核有两个中断:IRQ中断和快速中断FIQ FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。 一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。 如果该中断设置为了IRQ,那么当该中断产生的时候,中断处理器通过IRQ请求线告诉ARM,ARM就知道有个IRQ中断来了,然后ARM切换到IRQ模式运行。类似的如果该中断设置为FIQ,那么当
[单片机]
s3c2440 ads程序移植到keil中(三) 初步完成
如果我把参数配置发生改变呢 然后再一次编译 要包错误 如下所示 其实我们到这里离 在s3c2440 ads程序移植到keil中(二)中看到这个网友不值提供了方法 而且提供了几个文件的下载地址 http://download.csdn.net/detail/googlemi/5176844 我直接下载下来了 把其中的2440init.s文件直接拷贝复制替代我工作中的2440init.s 该错误消失了 但是出现了 这一个错误 反正修改就能解决 然后 提示了一个错误 意思 就nand.c和nand.h 没有加上去 让后加上去了 编译成功没有错误 这种方式到此结束
[单片机]
<font color='red'>s3c2440</font> ads<font color='red'>程序</font><font color='red'>移植</font>到keil中(三) 初步完成
基于ARM9处理器S3C2440的GPS导航终端机的设计
0 引言     随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备.不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 1 GPS导航系统结构     本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。     嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就
[嵌入式]
学习笔记--- S3C2440 内存类设备接口接线与访问原理
在嵌入式里面所谓内存类接口有SDRAM接口,NORFLASH接口,DM9000网卡接口等 ,他们都有一个共同点就是可以直接连S3C2440内存控制器,数据总线,地址总线;这三者缺一不可。 内存类接口可以通过地址直接访问内部数据,当然他们都有自己的一段可访问的地址范围。S3C2440将其1G地址空间划分为8个bank,每个bank有128M,所以芯片提供了8个片选信号线,每个片选信号线对应一个bank,一个片选信号连接一个设备,所以每个设备可访问的地址的范围是128M空间,128M=2的27次方个字节,所以芯片上面的地址线只有27跟,最大只能到A26。理论上32位的CPU应该有32跟地址线,因为最大可以到0xffffffff=2
[单片机]
学习笔记--- <font color='red'>S3C2440</font> 内存类设备接口接线与访问原理
基于嵌入式CPU S3C2440的VGA显示系统设计
目前很多SOC厂商的微处理器芯片都集成了LCD控制器,如三星公司的S3C2410.S3C2440,Intel的Xscale系列等。大多数嵌入式系统也采用流行的LCD显示技术。但是在需要大屏幕显示、对分辨率要求不高的场合,如车间、厂房,采用大屏幕LCD则成本过高。另一方面,VGA显示技术因为技术发展成熟,成本低廉,仍在被大量使用,直到今天它仍是所有显示终端最为成熟的标准接口。如果让嵌入式处理器直接支持VGA显示器,则能很大地利用现有资源,节约系统成本。 1 基于S3C2440的VGA显示技术分析 通过分析VGA显示技术的时序逻辑与S3C2440内部集成LCD控制器驱动TFT LCD的时序逻辑,找出它们的共同点,分析在S3C244
[单片机]
基于嵌入式CPU <font color='red'>S3C2440</font>的VGA显示系统设计
02 Linux入门命令
1 shell解释器 shell解释器接收输入字符并马上显示,在输入回车后,根据字符串去查找命令。去哪找?去环境变量指定的路径去找。 # 显示环境变量 echo $PATH # 结果如下 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/bin 什么是命令?命令就是可执行程序。 shell解释器根据第一个字符串去找应用程序,把后面的字符串作为参数传给应用程序,然后执行应用程序。为了测试shell,写了如下的c测试代码。 #include std
[单片机]
02 Linux入门命令
s3c2440系统时钟详解
一、S3C2440系统时钟体系 S3C2440的时钟控制逻辑可以外接晶振,然后通过内部电路产生时钟源;也可以直接使用内部提供的时钟源,他们通过引脚的设置来选择。时钟逻辑给整个芯片提供了3中时钟:FCLK用于CPU核、HCLK用于AHB总线上设备,比如CPU核、存储器控制器、中断控制器、LCD控制器、DMA控制器和USB主机模块等;PCLK用于用于APB总线上的设备,比如看门狗、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI等。 AHB(Advanced High performance Bus)系统总线总线主要用于高性能模块(如CPU、DMA和DSP等);APB(Advanced Periph
[单片机]
<font color='red'>s3c2440</font>系统时钟详解
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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