欢迎来到坤驰科技官方网站!
扫描二维码

全国咨询电话:
400-000-4026

当前位置:首页 » 技术支持 » 高速数据采集卡之PCI总线驱动

高速数据采集卡之PCI总线驱动

文章出处:坤驰科技网责任编辑:坤驰科技市场部作者:坤驰科技人气:-发表时间:2015-10-06 09:10:00

  北京坤驰科技有限公司主要提供高速数据采集卡、模块、系统与解决方案,网址www.queetest.cn

  PCI总线是现在非常流行的计算机总线,学会它的驱动设计方法很重要。相信曾经想学习PCI总线驱动的人有这么一个经历,就是去看那些讲解PCI总线驱动的书籍和资料的时候,会被里面繁杂的内容所击败,又是什么配置空间又是什么枚举的,还没开始真正的去写PCI的驱动,到这里就已经开始打退堂鼓了。其实,只要你认真下去,虽然有些东西看不明白,但是对于你写PCI的驱动来说,似乎“不那么重要”。因为,Linux内核对PCI总线已经有了完美的支持,你所需要做的内容是非常小的一部份。

  Linux下的PCI总线,在系统上电的时候会逐一的扫描系统中存在的设备(包括设备和桥),总线号中断号都是这个时候分配给设备的,如果你是初学者,这个过程如果不是很明白,你大可以先略过,去找一个带有PCI总线的开发板,接上PCI的设备,让系统重启扫描一遍,再配合下面会给出的PCI总线驱动框架,你就会明白很多。

  众所周知,Linux2.6内核引入了总线驱动模型这一概念,如此,很多基于总线的设备驱动就分成了总线驱动和设备驱动两部分。其实PCI总线驱动跟2.6内核里面的platform总线有类似之处,只不过platform总线的匹配方式是名字匹配,也就是设备名和驱动名一致。PCI总线的匹配方式不只一种,最常见的就是厂商号和设备号。当你加载PCI驱动的时候,驱动程序会把系统中已经存在的设备的厂商号和设备号与驱动程序中的对比,如果一致,则会注册PCI总线驱动并进行下一步操作。

  对于PCI总线上电扫描过程,推荐去看一篇博客,http://blog.csdn.net/linuxdrivers/article/details/5849698,他讲的详细一点。

  下面是我写的一个PCI总线的驱动程序,注意是总线驱动程序,这里并没有实现具体的设备驱动。基于PCI总线的设备有很多种,但就PCI总线驱动这一块来说,都大同小异,实现了PCI总线驱动之后,再去继续做具体的设备驱动。

  程序如下(在2.6.31至3.1.4内核都可以运行成功):

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  //设备相关

  #defineMY_VENDOR_ID0x168c//厂商号

  #defineMY_DEVICE_ID0x002a//设备号

  #defineMY_PCI_NAME"MYPCIE"//自己起的设备名

  staticintdebug=1;

  module_param(debug,int,S_IRUGO);

  #defineDBG(msg...)do{\

  if(debug)\

  printk(msg);\

  }while(0)

  structpcie_card

  {

  //端口读写变量

  intio;

  longrange,flags;

  void__iomem*ioaddr;

  intirq;

  };

  /*设备中断服务*/

  staticirqreturn_tmypci_interrupt(intirq,void*dev_id)

  {

  structpcie_card*mypci=(structpcie_card*)dev_id;

  printk("irq=%d,mypci_irq=%d\n",irq,mypci-
  returnIRQ_HANDLED;

  }

  /*探测PCI设备*/

  staticint__initmypci_probe(structpci_dev*dev,conststructpci_device_id*ent)

  {

  intretval=0;//,intport,intmask;

  structpcie_card*mypci;

  if(pci_enable_device(dev))

  {

  printk(KERN_ERR"IOError.\n");

  return-EIO;

  }

  /*分配设备结构*/

  mypci=kmalloc(sizeof(structpcie_card),GFP_KERNEL);

  if(!mypci)

  {

  printk("In%s,kmallocerr!",__func__);

  return-ENOMEM;

  }

  /*设定端口地址及其范围,指定中断IRQ*/

  mypci-
  if(mypci-{

  printk("IRQis%d,it'sinvalid!\n",mypci-
  gotoout_mypci;

  }

  mypci-
  mypci-
  mypci-
  DBG("PCIbaseaddr0isio%s.\n",(mypci-

 

 

  若您有高速数据采集板卡定制需求,请联系我们:400-000-4026
 

  关于坤驰科技:
  坤驰科技是专注于
高速数据采集与信号处理、高速数据存储与记录的高科技公司。坤驰科技为用户提供成熟的标准高速数据采集产品与技术,也可为用户提供定制化的高速信号采集解决方案。目前坤驰科技服务过的研究所、科研单位已达近百家。高速数据采集产品线涵盖PCIExpress、cPCI、PXIe、VPX、USB等总线,包含高速AD、DA平台、FPGA、DSP处理平台,SATA/SSD、Flash存储平台等。
  全国咨询电话:400-000-4026
 

  公司官方网站:http://www.queentest.cn