您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  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  
察察 工商 网安 举报有奖  警警  手机打开网站