亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

Linux網絡設備驅動編程

添加時間:2010-11-21  添加: admin 
在此僅僅討論網絡設備驅動的一般寫法,有關硬件部分的相關代碼由于硬件規格不同,予以省略。有什么地方錯誤,或補充,歡迎大家提出。

  1, 驅動模塊的加載和卸載

  如果網絡設備(包括wireless)是PCI規范的,則先是向內核注冊該PCI設備(pci_register_driver),然后由pci_driver數據結構中的probe函數指針所指向的偵測函數來初始化該PCI設備,并且同時注冊和初始化該網絡設備。

  如果網絡設備(包括wireless)是PCMCIA規范的,則先是向內核注冊該PCMCIA設備(register_pccard_driver),然后driver_info_t數據結構中的attach函數指針所指向的偵測函數來初始化該PCMCIA設備,并且同時注冊和初始化該網絡設備。

  static int __init tg3_init(void)

  {

  //先注冊成PCI設備,并初始化,如果是其他的ESIA,PCMCIA,用其他函數

  return pci_module_init(&tg3_driver);

  }

  static void __exit tg3_cleanup(void)

  {

  pci_unregister_driver(&tg3_driver);//注銷PCI設備

  }

  module_init(tg3_init); //驅動模塊的加載

  module_exit(tg3_cleanup); //驅動模塊的卸載

  申明為PCI設備:

  static struct pci_driver tg3_driver = {

  .name = DRV_MODULE_NAME,

  .id_table = tg3_pci_tbl, //此驅動所支持的網卡系列,vendor_id, device_id

  .probe = tg3_init_one, //初始化網絡設備的回調函數

  .remove = __devexit_p(tg3_remove_one), //注銷網絡設備的回調函數

  .suspend = tg3_suspend, //設備掛起函數

  .resume = tg3_resume //設備恢復函數

  };

  2,PCI設備探測函數probe,初始化網絡設備

  static int __devinit tg3_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)

  {

  //初始化設備,使I/O,memory可用,喚醒設備

  pci_enable_device(pdev);

  //申請內存空間,配置網卡的I/O,memory資源

  pci_request_regions(pdev, DRV_MODULE_NAME);

  pci_set_master(pdev);

  //設置DMA屬性

  pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff);

  //網卡 I/O,memory資源的啟始地址

  tg3reg_base = pci_resource_start(pdev, 0);

  //網卡I/O,memory資源的大小

  tg3reg_len = pci_resource_len(pdev, 0);

  //分配并設置網絡設備

  dev = alloc_etherdev(sizeof(*tp));

  //申明為內核設備模塊

  SET_MODULE_OWNER(dev);

  //初始化私有結構中的各成員值

  tp = dev->priv;

  tp->pdev = pdev;

  tp->dev = dev;

  ……

  //鎖的初始化

  spin_lock_init(&tp->lock);

  //映射I/O,memory地址到私有域中的寄存器結構

  tp->regs = (unsigned long) ioremap(tg3reg_base, tg3reg_len);

  dev->irq = pdev->irq;

  //網絡設備回調函數賦值

  dev->open = tg3_open;

  dev->stop = tg3_close;

  dev->get_stats = tg3_get_stats;

  dev->set_multicast_list = tg3_set_rx_mode;

  dev->set_mac_address = tg3_set_mac_addr;

  dev->do_ioctl = tg3_ioctl;

  dev->tx_timeout = tg3_tx_timeout;

  dev->hard_start_xmit= tg3_start_xmit;

  //網卡的MAC地址賦值dev->addr

  tg3_get_device_address(tp);

  //注冊網絡設備

  register_netdev(dev);

  //把網絡設備指針地址放入PCI設備中的設備指針中

  pci_set_drvdata(pdev, dev);

  }

  3,注銷網絡設備

  static void __devexit tg3_remove_one(struct pci_dev *pdev)

  {

  struct net_device *dev = pci_get_drvdata(pdev);

  //注銷網絡設備

  unregister_netdev(dev);

  //取消地址映射

  iounmap((void *) ((struct tg3 *)(dev->priv))->regs);

  //釋放網絡設備

  kfree(dev);

  //釋放PCI資源

  pci_release_regions(pdev);

  //停用PCI設備

  pci_disable_device(pdev);

  //PCI設備中的設備指針賦空

  pci_set_drvdata(pdev, NULL);

  }

<
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站