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

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

1246         }

1247 

1248         if (!GoodPacket)

1249         {

1250             // drop this packet!!!

1251             switch (db->io_mode)

1252             {

1253                 case DM9KS_BYTE_MODE:

1254                      for (i=0; i1255                         inb(db->io_data);

1256                     break;

1257                 case DM9KS_WORD_MODE:

1258                     tmplen = (rx.desc.length + 1) / 2;

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

1260                         inw(db->io_data);

1261                     break;

1262                 case DM9KS_DWORD_MODE:

1263                     tmplen = (rx.desc.length + 3) / 4;

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

1265                         inl(db->io_data);

1266                     break;

1267             }

1268             continue;/*next the packet*/

1269         }

1270         

1271         skb = dev_alloc_skb(rx.desc.length+4);

1272         if (skb == NULL )

1273         {    

1274             printk(KERN_INFO '%s: Memory squeeze.n', dev->name);

1275             /*re-load the value into Memory data read address register*/

1276             iow(db,DM9KS_MDRAH,MDRAH);

1277             iow(db,DM9KS_MDRAL,MDRAL);

1278             return;

1279         }

1280         else

1281         {

1282             /* Move data from DM9000 */

1283             skb->dev = dev;

1284             skb_reserve(skb, 2);

1285             rdptr = (u8*)skb_put(skb, rx.desc.length - 4);

1286             

1287             /* Read received packet from RX SARM */

1288             switch (db->io_mode)

1289             {

1290                 case DM9KS_BYTE_MODE:

1291                      for (i=0; i1292                         rdptr[i]=inb(db->io_data);

1293                     break;

1294                 case DM9KS_WORD_MODE:

1295                     tmplen = (rx.desc.length + 1) / 2;

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

1297                         ((u16 *)rdptr)[i] = inw(db->io_data);

1298                     break;

1299                 case DM9KS_DWORD_MODE:

1300                     tmplen = (rx.desc.length + 3) / 4;

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

1302                         ((u32 *)rdptr)[i] = inl(db->io_data);

1303                     break;

1304             }

1305         

1306             /* Pass to upper layer */

1307             skb->protocol = eth_type_trans(skb,dev);

1308 

1309 #ifdef CHECKSUM

1310         if((rxbyte&0xe0)==0)    /* receive packet no checksum fail */

1311                 skb->ip_summed = CHECKSUM_UNNECESSARY;

1312 #endif

1313         

1314             netif_rx(skb);

1315             dev->last_rx=jiffies;

1316             db->stats.rx_packets++;

1317             db->stats.rx_bytes += rx.desc.length;

1318             db->cont_rx_pkt_cnt++;

1319 #ifdef RDBG /* check RX FIFO pointer */

1320             u16 MDRAH1, MDRAL1;

1321             u16 tmp_ptr;

1322             MDRAH1 = ior(db,DM9KS_MDRAH);

1323             MDRAL1 = ior(db,DM9KS_MDRAL);

1324             tmp_ptr = (MDRAH<<8)|MDRAL;

1325             switch (db->io_mode)

1326             {

1327                 case DM9KS_BYTE_MODE:

1328                     tmp_ptr += rx.desc.length+4;

1329                     break;

1330                 case DM9KS_WORD_MODE:

1331                     tmp_ptr += ((rx.desc.length+1)/2)*2+4;

1332                     break;

1333                 case DM9KS_DWORD_MODE:

1334                     tmp_ptr += ((rx.desc.length+3)/4)*4+4;

1335                     break;

1336             }

1337             if (tmp_ptr >=0x4000)

1338                 tmp_ptr = (tmp_ptr - 0x4000) + 0xc00;

1339             if (tmp_ptr != ((MDRAH1<<8)|MDRAL1))

1340                 printk('[dm9ks:RX FIFO ERRORn');

1341 #endif

1342                 

1343             if (db->cont_rx_pkt_cnt>=CONT_RX_PKT_CNT)

1344             {

1345                 dmfe_tx_done(0);

1346                 break;

1347             }

1348         }

1349             

1350     }while((rxbyte & 0x01) == DM9KS_PKT_RDY);

1351     DMFE_DBUG(0, '[END]dmfe_packet_receive()', 0);

1352     

1353 }

1354 

1355 /*

1356   Read a word data from SROM

1357 */

1358 static u16 read_srom_word(board_info_t *db, int offset)

1359 {

1360     iow(db, DM9KS_EPAR, offset);

1361     iow(db, DM9KS_EPCR, 0x4);

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

1363     iow(db, DM9KS_EPCR, 0x0);

1364     return (ior(db, DM9KS_EPDRL) + (ior(db, DM9KS_EPDRH) << 8) );

1365 }

1366 

1367 /*

1368   Set DM9000/DM9010 multicast address

1369 */

1370 static void dm9000_hash_table(struct net_device *dev)

1371 {

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

1373     struct dev_mc_list *mcptr = dev->mc_list;

1374     int mc_cnt = dev->mc_count;

1375     u32 hash_val;

1376     u16 i, oft, hash_table[4];

1377 

1378     DMFE_DBUG(0, 'dm9000_hash_table()', 0);

1379 

1380     /* enable promiscuous mode */

1381     if (dev->flags & IFF_PROMISC){

1382         //printk(KERN_INFO 'DM9KS:enable promiscuous moden');

1383         iow(db, DM9KS_RXCR, ior(db,DM9KS_RXCR)|(1<<1));

1384         return;

1385     }else{

1386         //printk(KERN_INFO 'DM9KS:disable promiscuous moden');

1387         iow(db, DM9KS_RXCR, ior(db,DM9KS_RXCR)&(~(1<<1)));

1388     }

1389         

1390     /* Receive all multicast packets */

1391     if (dev->flags & IFF_ALLMULTI){

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

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

推荐阅读最新更新时间:2024-11-10 08:47

S3C2440 外部按键中断解析
学习bootloader制作的过程中,学到 “通过按键进入中断控制LED亮灭”的实验时,自己所用的开发板和视频讲解中的不同,于是琢磨了一下中断涉及到的各个寄存器,并进行编码尝试,最终完成了实验,达到了通过按键以中断方式控制LED亮灭的目的。2440属于非向量中断方式,和6410、210的向量中断方式对于中断的处理有一些不同,因此本文的讲解并不完全适合6410和210。 一、概念 中断分为两大类:外部中断和内部中断。 1、外部中断:S3C2440的24个外部中断占用GPF0~GPF7(EINT0~EINT7)、 GPG0~GPG15(EINT8~EINT23)。使用这些引脚
[单片机]
<font color='red'>S3C2440</font> 外部按键中断解析
S3C2440启动方式
S3C2440支持nor flash和nand flash两种方式启动,它是通过引脚OM1和OM0控制的。 如果是从nor flash启动,因为复位后,ARM将PC指针设置为0,那么nor flash肯定要连到bank0上。如果从nand flash启动,S3C2440是这样做的,nand flash控制器自动的将nand flash前4K代码复制到叫做Stepping Stone地方,因为这个地方是处于0地址的,那么我们的启动代码就需要注意了,通过这4k代码要将整个u-boot代码复制到SDRAM中,这样我们u-boot才能正常启动。
[单片机]
S3C2440 开发板实战(5):定时器中断
一、定时器大体结构 查看芯片手册,可以找到以下定时器结构框图 从做到右看,对该图进行分析:(不考虑) Prescaler:定时器0和1共享一个8位分频器,而定时器2、3、4共享另一个8位分频器。分频器将输入的PCLK分频为:PCLK/(prescaler+1)。 Clock divider & MUX:每个定时器有一个时钟分频器,它产生5个不同的分频信号(1/2,1/4,1/8,1/16,和TCLK)。每个定时器块从时钟分频器接收自己的时钟信号,时钟分频器从相应的8位分频器接收时钟。8位分频器是可编程的,根据加载值对PCLK进行划分,存储在TCFG0和TCFG1寄存器中。此时定时器的时钟频率为:Timer input
[单片机]
<font color='red'>S3C2440</font> 开发板实战(5):定时器中断
十六、S3C2440裸机—UART
16.1 介绍   UART(Universal Asynchronous Receiver Transmitter),通用异步收发器,用来传输穿行数据时   UART 之间以全双工方式传输数据,连线方法只有 3 根电线:TXD 用于发送数据,RXD 用于接收数据,GND用于给双方提供参考地。      串口数据线以 “位”为最小单位传输数据。帧(frame)由具有完整意义的、不可分割的若干位组成,它包含开始位、数据位、校验位和停止位。   UART 使用标准的 TTL/CMOS 逻辑电平(0~5V、0~3.3V、0~2.5V 或 0~1.8V)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常
[单片机]
十六、<font color='red'>S3C2440</font>裸机—UART
S3C2440-WDT
当系统运行受到外部干扰或者系统错误,程序有时会出现跑飞,导致整个系统瘫痪。他会设置一段时间,当超出这段 时间,从程序中跳出进入中断处理程序。WatchDog本质上是一种定时器,那么普通定时器拥有的特性它也应该具备,是的当它计时超时时也会引起事件的发生,只是这个事件除了可以是系统中断外,他也可以是一个系统重启信号(Reset Signal)。可以这么说,能发送系统重启信号的定时器我们就叫它WatchDog。看门狗定时器中断是我们不希望看到的,因此我们要想方设法避免它发生。主要的方法就是在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始记时,这种方法俗称喂狗。 S3C2440看门狗定时器的功能: 作为常规时钟,
[单片机]
S3C2440-WDT
S3c2440代码重定位详解1---段的概念重定位的引入
S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SRAM发送命令,但是不能直接给Nand Flash发送命令 NAND启动过程 假如把程序烧写到Nand Flash上,即向Nand Flash烧入* bin* 文件,CPU是无法从Nand Flash中取代码执行的。 为什还可以使用NAND启动? 上电后,Nand启动硬件会自动把Nand Flash前4K复制到SRAM; CPU从0地址运行SRAM; 如果我的程序大于4K怎么办? 前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位) NOR启动过程 如果从Nor Flash启动,会出现什么问题? 将拨动开关
[单片机]
<font color='red'>S3c2440</font>代码重定位详解1---段的概念重定位的引入
S3C2440外接SDRAM
CPU提供了一组用于SDRAM的信号: SDRAM时钟有效信号SCKE; SDRAM时钟信号SCLK0/SCLK1; 数据掩码信号DQM0/DQM1/DQM2/DQM3; SDRAM片选信号nSCS0(它与nGCS6是同一引脚的两个功能); SDRAM行地址选通脉冲信号nSRAS; SDRAM列地址选通脉冲信号nSCAS; 写允许信号nWE(它不是专用于SDRAM的). SDRAM内部就是一个存储阵列,先确定一个行,然后确定一个列; SDRAM一般有4个L-Bank. 可以想象SDRA
[单片机]
<font color='red'>S3C2440</font>外接SDRAM
【ARM】s3c2440之gpio按键控制
功能 通过GPIO,实现按键1点亮LED1,按键2点亮LED2…… 说明 1)因为2440的按键只涉及行,所以在扫描按键时比2410简单了很多 2)在进行移位操作之前,必须进行数据寄存器的初始化,否则会出错(硬件特性) 源码 /***************************************************************************** *****函数名:main() *****功 能:通过GPIO,实现按键1点亮LED1,按键2点亮LED2 *****说 明: *********************************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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