当前位置: 技术问答>linux和unix
请教2.6内核下的pci卡的驱动写法,分数绝对不是问题,要多少有多少。
来源: 互联网 发布时间:2015-11-03
本文导语: 小弟我才学linux和他的驱动,有好多问题搞不清楚,向大家请教。 我为一块pci卡写驱动,这块卡是视频直播编码器,定期产生编完码的数据,存在卡上的内存里。然后我写的驱动定期把数据读给用户进程。 假设最简...
小弟我才学linux和他的驱动,有好多问题搞不清楚,向大家请教。
我为一块pci卡写驱动,这块卡是视频直播编码器,定期产生编完码的数据,存在卡上的内存里。然后我写的驱动定期把数据读给用户进程。
假设最简单的情况,一个主机上插2块卡,每块卡支持两路,每路2个通道,一个音频,一个视频。每块卡上有32m内存用于存储产生的音视频数据。
请问我的驱动应该怎么个框架?我的设想如下:
首先,初始化,找到机器上插的这些卡。然后为每块卡调用pci_enable_device。然后再设置dma。
接着用户进程调用我的open。这里有俩个做法。1,给编码器下命令,再启动一个定时器,定期把卡上的数据读到主机的内核空间。2,给编码器下命令,然后什么也不做。
接着用户进程调用我的read,把数据读走,用dma方式。如果open采用方式1,那么用户从内核空间读走那些数据。如果open采用方式2,那么从pci卡直接读到用户进程空间。
读的时候分成两步,第一步发现是否有新数据,没有的话直接跳过,有的话启动一个dma,然后退出。第二步是有一个dma中断服务程序得到数据已经传送完毕的信号,做下一步处理。
整个情况就这么简单。
=====================================================================================
我有以下问题。
1,这两种情况哪种更好?
2,怎么在设备内存和主机内存作映射?
我知道要调用pci_resource_start和pci_resource_len得到pci卡上地址的起始,然后使用request_mem_region和ioremap和mmap或者别的什么函数。我对这个不明白,谁能写个很简单纳的例子说明?
3,怎么实现dma?我也不明白。
4,怎么响应dma的中断?
请大家给出简单的例子,谢谢。
我为一块pci卡写驱动,这块卡是视频直播编码器,定期产生编完码的数据,存在卡上的内存里。然后我写的驱动定期把数据读给用户进程。
假设最简单的情况,一个主机上插2块卡,每块卡支持两路,每路2个通道,一个音频,一个视频。每块卡上有32m内存用于存储产生的音视频数据。
请问我的驱动应该怎么个框架?我的设想如下:
首先,初始化,找到机器上插的这些卡。然后为每块卡调用pci_enable_device。然后再设置dma。
接着用户进程调用我的open。这里有俩个做法。1,给编码器下命令,再启动一个定时器,定期把卡上的数据读到主机的内核空间。2,给编码器下命令,然后什么也不做。
接着用户进程调用我的read,把数据读走,用dma方式。如果open采用方式1,那么用户从内核空间读走那些数据。如果open采用方式2,那么从pci卡直接读到用户进程空间。
读的时候分成两步,第一步发现是否有新数据,没有的话直接跳过,有的话启动一个dma,然后退出。第二步是有一个dma中断服务程序得到数据已经传送完毕的信号,做下一步处理。
整个情况就这么简单。
=====================================================================================
我有以下问题。
1,这两种情况哪种更好?
2,怎么在设备内存和主机内存作映射?
我知道要调用pci_resource_start和pci_resource_len得到pci卡上地址的起始,然后使用request_mem_region和ioremap和mmap或者别的什么函数。我对这个不明白,谁能写个很简单纳的例子说明?
3,怎么实现dma?我也不明白。
4,怎么响应dma的中断?
请大家给出简单的例子,谢谢。
|
问题1:
答:采用方法2较好。如果采用方法1,用户长时间没有读数据,那么卡产生的大量数据会占用大量的内存空间,迟早会把整个内存空间吃光。
问题2、3、4
建议你读一读《Linux 设备驱动程序》这本书。第二版有中文版,主要针对2.4内核。第三版有英文版,针对2.6内核。虽然我没看第三版,但在2.4内核中对pci总线已经有很好的支持,相信这几个问题的解决办法差别不大。
答:采用方法2较好。如果采用方法1,用户长时间没有读数据,那么卡产生的大量数据会占用大量的内存空间,迟早会把整个内存空间吃光。
问题2、3、4
建议你读一读《Linux 设备驱动程序》这本书。第二版有中文版,主要针对2.4内核。第三版有英文版,针对2.6内核。虽然我没看第三版,但在2.4内核中对pci总线已经有很好的支持,相信这几个问题的解决办法差别不大。