<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 業(yè)界動(dòng)態(tài) > [ARM筆記](méi)設備驅動(dòng)概述

[ARM筆記](méi)設備驅動(dòng)概述

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏

  2.2.3 網(wǎng)絡(luò )設備驅動(dòng)

本文引用地址:http://dyxdggzs.com/article/201611/340660.htm

  網(wǎng)絡(luò )設備和字符設備、塊設備不同,系統對其有專(zhuān)門(mén)的處理函數和機制。所有的網(wǎng)絡(luò )驅動(dòng)程序都遵循通用的接口,設計時(shí)采用的是面向對象的方法。把所有網(wǎng)絡(luò )設備都抽象為一個(gè)接口對象。由數據結構struct device來(lái)表示網(wǎng)絡(luò )設備在內核中的運行情況,即網(wǎng)絡(luò )設備接口,該結構提供了對所有網(wǎng)絡(luò )設備的操作集合。它由以dev_base為頭指針的設備鏈表來(lái)集中管理所有網(wǎng)絡(luò )設備。該設備鏈表中的每個(gè)元素代表一個(gè)網(wǎng)絡(luò )設備接口。數據結構device中有很多提供給系統訪(fǎng)問(wèn)和協(xié)議層調用的設備方法,包括提供給設備初始化和向系統注冊用的init函數、打開(kāi)和關(guān)閉網(wǎng)絡(luò )設備的open和stop函數、處理數據包發(fā)送的函數hard_start_xmit,以及中斷處理函數等。一般來(lái)講,一個(gè)網(wǎng)絡(luò )設備最基本的方法有初始化(initialize)、發(fā)送和接收。初始化,當把驅動(dòng)程序載入系統的時(shí)候會(huì )調用此程序,主要完成檢測設備、配置和初始化硬件、初始化device結構中的變量等。設備驅動(dòng)各函數是網(wǎng)絡(luò )設備接口層net_device數據結構的具體成員,它通過(guò)hard_start_xmit()函數啟動(dòng)發(fā)送操作,并通過(guò)網(wǎng)絡(luò )設備上的中斷觸發(fā)接收操作。

  下編寫(xiě)網(wǎng)絡(luò )設備驅動(dòng)的主體工作是完成net_device結構體的填充以及成員函數的實(shí)現,底層最核心的工作是:發(fā)送數據包和接收數據包,接收數據包是由中斷觸發(fā)的。發(fā)送數據包函數的典型結構如下——網(wǎng)絡(luò )設備驅動(dòng)發(fā)送數據包的典型結構。

  int xxx_tx(struct sk_buff *skb, struct net_device *dev)

  {

  int len;

  char *data, shortpkt[ETH_ZLEN];

  /* 獲得有效數據指針和長(cháng)度 */

  data = skb->data;

  len = skb->len;

  if (len < ETH_ZLEN)

  {

  /* 如果幀長(cháng)小于以太幀最小長(cháng)度,補0 */

  memset(shortpkt, 0, ETH_ZLEN);

  memcpy(shortpkt, skb->data, skb->len);

  len = ETH_ZLEN;

  data = shortpkt;

  }

  dev->trans_start = jiffies; /* 記錄發(fā)送時(shí)間戳 */

  /* 設置硬件寄存器讓硬件把數據包發(fā)送出去 */

  xxx_hw_tx(data, len, dev);

  //...

  }

  接收數據包的典型結構如下——網(wǎng)絡(luò )設備驅動(dòng)接受數據包的典型結構。

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

  {

  //...

  switch (status &ISQ_EVENT_MASK)

  {

  case ISQ_RECEIVER_EVENT:

  /* 獲取數據包 */

  xxx_rx(dev);

  break;

  /* 其他類(lèi)型的中斷 */

  }

  }

  static void xxx_rx(struct xxx_device *dev)

  {

  //...

  length = get_rev_len (...);

  /* 分配新的套接字緩沖區 */

  skb = dev_alloc_skb(length + 2);

  skb_reserve(skb, 2); /* 對齊 */

  skb->dev = dev;

  /* 讀取硬件上接收到的數據 */

  insw(ioaddr + RX_FRAME_PORT, skb_put(skb, length), length >> 1);

  if (length &1)

  skb->data[length - 1] = inw(ioaddr + RX_FRAME_PORT);

  /* 獲取上層協(xié)議類(lèi)型 */

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

  /*把數據包交給上層 */

  netif_rx(skb);

  /* 記錄接收時(shí)間戳 */

  dev->last_rx = jiffies;

  //...

  }

  2.3 Linux設備文件的創(chuàng )建

  Linux是一種類(lèi)Unix系統,Unix的一個(gè)基本特點(diǎn)是“一切皆為文件”,它抽象了設備的處理,將所有的硬件設備都像普通文件一樣看待,也就是說(shuō)硬件可以跟普通文件一樣打開(kāi)、關(guān)閉和讀寫(xiě)。系統中的設備都用一個(gè)特殊文件代表,叫做設備文件。在 Linux2.4以后的內核版本中引入了設備文件系統(devfs),所有的設備文件作為一個(gè)可以?huà)煅b的文件系統,這樣就可以被文件系統進(jìn)行統一管理,從而設備文件就可以?huà)煅b到任何需要的地方。

  在前面也講過(guò),字符設備和塊設備都可以通過(guò)文件節點(diǎn)來(lái)存取,而與字符設備和塊設備不同,網(wǎng)絡(luò )設備的訪(fǎng)問(wèn)是通過(guò)Socket而不是設備節點(diǎn),在系統里根本就不存在網(wǎng)絡(luò )設備節點(diǎn),所以在此我們僅討論塊設備和字符設備。

  那么如何在內核中創(chuàng )建設備文件的掛載節點(diǎn)呢?簡(jiǎn)單的說(shuō),設備文件是由系統調用創(chuàng )建的,在命令行中,mknod命令會(huì )調用同名的程序來(lái)創(chuàng )建文件節點(diǎn)。rename和unlink系統調用可以用于移動(dòng)和刪除節點(diǎn),相應的命令是mv和rm。在使用cp命令時(shí)加上-R或-a參數,可以創(chuàng )建一個(gè)與原設備節點(diǎn)具有同樣屬性的節點(diǎn)。mknod命令,該命令形式如下:

  #mknod [OPTION] NAME TYPE [MAJOR MINOR]

  說(shuō)明:option選項設置,最常用的就是-m,基本上可以不用;name自定義設備名稱(chēng);type設備類(lèi)型,有b和c還有p;MAJOR主設備號;MINOR次設備號。

  mknod命令建立一個(gè)目錄項和一個(gè)特殊文件的對應索引節點(diǎn)。第一個(gè)參數Name項是設備的名稱(chēng),選擇一個(gè)描述性的設備名稱(chēng)。



關(guān)鍵詞: ARM Linux

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>