注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

CS89x0网络驱动程序分析(二)  

2012-09-25 20:39:43|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3、 net_send_packet

net_send_packet
      spin_lock_irqsave(&lp->lock, flags);//禁止中断,发送的时候不能发生中断
      netif_stop_queue(dev);//先阻止上层发送数据
      writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
      //将数据写到:dev->base_addr,也就是cs89x0的缓冲区
      //这个函数是一个循环,只有全部拷贝完才会执行下面的语句
     //由于在open函数里面已经开启了接收和发送功能,所以cs89x缓冲区里面的数据会被自动传输出去
      writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
      dev_kfree_skb (skb);//释放该skb,关于该skb详见注释1

注释1:
struct sk_buff 这个结构体用于记录传输的数据包的信息,我们看一看几个重要的成员:
struct sk_buff *next;  :下一个
struct sk_buff *prev;  :前一个
len                                       :实际数据的长度
data                                     :实际的数据

4、net_interrupt
上面就把数据包发送了出去,一旦对方收到数据,就会触发中断,调用中断处理函数来上报数据。我们假设本机为接收方,我们来查看其中断处理函数,分析一下如何上报数据!
net_interrupt
      ioaddr = dev->base_addr;
      lp = netdev_priv(dev);
      status = readword(dev->base_addr, ISQ_PORT)//读状态
      net_rx(dev);//如果是接收到一个数据包的话就调用这个函数
             skb = alloc_skb(length, GFP_ATOMIC);
             //把接收到的数据拷贝到skb->data
             skb_copy_to_linear_data(skb, (void *)(dev->mem_start + PP_RxFrame),length);
             netif_rx(skb);//将数据包上报给上层进行处理

到此为止,接收发送的流程我们就搞清楚了!我们稍微总结一下:当发送数据的时候,会在协议层将数据封装成skb,然后传递给驱动层,驱动层会解析skb,将数据拷贝到cs89x0的发送缓冲区,如果发送使能的话,就会自动将数据发送出去!当数据到达对方接收缓冲区后,就会产生一个中断,调用 中断处理函数,在中断处理函数中会将接收到的数据封装成skb,然后上报给协议层!接下来的事情就不是我们所关系的啦!

不过我们还有一个问题没有解决,那就是net_send_packet这个函数,他只是将数据拷贝到发送缓冲区,就结束了!也就是它只发送了一个包,并没有开始下一个包的发送,很显然由net_send_packet的调用者根据返回值来开始下一次数据传输,我们找下面的例子:
当返回值正常时,会执行以下语句:
__netif_tx_unlock(slave_txq);
      spin_unlock(&txq->_xmit_lock);//中断解锁
netif_wake_queue(dev);
      netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
             test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state)//这样又会允许上层发送数据了

好的,分析完毕,由于本人对cs8900的硬件知识不太清楚,所以将注意力集中在了框架的搭建上面!
  评论这张
 
阅读(560)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017