Articles of 驱动程序

Linux如何testingPCIe驱动程序?

我写了一个简单的PCIe驱动程序,我想testing它是否工作。 例如,如果可以写入和读取从设备使用的内存。 我怎样才能做到这一点? 哪些东西应该被certificate呢?

VirtualBox如何处理来宾Linux的中断?

我正在练习在VirtualBox guest Linux中编写简单的键盘驱动程序。 问题是,我的代码只是注册一个中断处理程序,并打印scancode到日志文件。 而且我不会将这些传入的扫描码发送到任何上层的代码,比如Linux input core 。 insmod ,我可以看到使用dmesg捕获的扫描码。 但为什么我的terminal仍然得到正确的input? terminal不应收到任何东西。 我的代码如下所示: static int __init init_simple_keyboard_driver(void) { free_irq (IRQ_1, NULL); return request_irq (IRQ_1, my_handler, …); } static irqreturn_t my_handler(int irq, void *dev_id) { unsigned char scancode = get_scancode_from_port_0x60(); printk(…scancode…); } 在insmod之后,我可以在内核日志中看到消息。 我的free_irq调用导致一些消息Can't free already freed IRQ 。 (我不知道为什么…它不应该被释放) atkbd司机抱怨说有人要求处理IRQ_1 。 那些扫描码可以正确打印。 [最奇怪的]主动控制台仍然得到正确的键盘input。 因此,我可以使用这个简单的驱动程序来执行一个rmmod 。 […]

Linux设备驱动程序 – 如何在closures文件时取消阻止读取线程?

我正在尝试为Linux实现一个字符设备驱动程序,并遇到麻烦。 简而言之,写入设备的数据被缓冲以供读取。 当没有数据可用时,通过“wait_event_interruptible”读取块的调用。 由写入处理程序接收的数据调用“wake_up_interruptible”。 释放处理程序还调用“wake_up_interruptible”来解锁读取器,但设置一个标志来指示驱动程序正在释放。 从用户空间我有一个可执行文件,打开驱动程序通过“打开”,然后启动另一个线程。 主线程继续调用“读”。 按照预期,没有数据可用于读取和呼叫块。 另一个线程hibernate一秒钟(为主线程提供足够的时间来读取和阻塞),调用“closures”,然后再次调用“closures”。 第一个调用返回“0”,而第二个返回“-1”(如预期)。 然而,我的驱动程序的释放处理程序从来没有被调用,我不明白如何解锁我的阅读线程,而不明确发送信号或写入一些数据到设备。 我的理解是,当驱动程序的最后一个句柄closures,其释放处理程序被调用。 我试图实现我认为是标准的用户空间行为 – 阻止从文件读取的线程将变得畅通无阻,并在asynchronousclosures时接收文件结束返回值。 我是否对用户空间中的文件级读取/closures有正确的理解? 我有正确的设备驱动程序了解吗? 我错过了别的吗? 我看了“Linux设备驱动程序第三版”,并不能完全find这个问题的答案。 我也search了谷歌,但似乎无法find答案。 你可以提供任何帮助表示赞赏。 我的内核版本是3.0.15。

如何确定USB设备的IRQ号码?

我是驾驶员发展新手。 但是,我购买了一个OSR USB FX2学习工具包,它附带了Windows内核/用户模式驱动程序的示例代码。 不过,我在Linux(Ubuntu 12)中编写驱动程序。 我已经成功地发送了控制命令并从设备接收到控制命令的返回。 我也能够通过设备支持的BULK OUT / IN端点成功发送和读取数据。 还有一个我还没有完成的实验。 该设备有以下端点: 1. BULK (OUT) –> Address 0x06 2. BULK (IN) –> Address 0x88 3. INTERRUPT (IN) –> Address 0x81 我无法弄清楚如何findINTERRUPT(IN)端点的IRQ号码 。 我明白如何使用以下方法安装IRQ处理程序: int request_irq (unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char * devname, void * dev_id); 并用正确的函数原型编写处理程序。 但是,我想知道如何find设备中断的IRQ行(IRQ编号)? 也就是说,如何确定上面的request_irq函数中参数unsigned int […]

找不到linux / modversions.h

我正在尝试安装串行设备的驱动程序,当我运行安装可执行文件时出现此错误: cc -DLINUX -c -DMODVERSIONS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -m64 -mcmodel=kernel -I/usr/src/linux-3.8.0-27-generic/include -I/usr/src/linux-2.4/include -I/usr/src/linux/include -D__SMP__ npreal2.c npreal2.c:40:31: **fatal error: linux/modversions.h: No such file or directory** compilation terminated. search论坛后,我没有find任何解决办法。 我注意到/usr/src/linux-3.8.0-27-generic/include/config中有一个modversions.h,但不在linux文件夹中。 请帮忙!

实现网卡的内核旁路

我的情况: 我希望网卡上收到的数据尽快到达我的应用程序。 我已经得出结论,最好的(如最低延迟)解决scheme是在我的用户空间中实现networking堆栈。 networkingstream量可以是专有协议(如果它使得networking堆栈更容易写入),因为它只是在两台本地计算机之间。 1)什么是我的networking堆栈需要实现的function的最低限度清单? 2)我需要删除/禁用当前在我的Linux中的任何networking堆栈/我将如何做到这一点? 3)我如何写驱动程序? 我认为我需要find驱动程序代码的确切位置,然后代替被调用的驱动程序/networking堆栈,而是将数据发送到我可以从应用程序访问的一块内存中。

内核驱动程序,ioremap在MMU-less系统中是必需的?

所以,当涉及到内核驱动程序,我是一个新手,并有一个关于ioremap函数的问题。 我正在编写一个驱动程序,用于访问使用ARM Cortex-M3和FPGA架构的SoC上的定制VHDL模块中定义的某些寄存器。 看例子,我认为我应该使用ioremap,但是由于Cortex-M3没有MMU,所以我没有看到这一点,如下例所示: /* Physical addresses */ static u32* rcu_trig_recv_physaddr = ((u32 *) 0x50040000); static int rcu_trig_recv_size = 0x10; // size of 16 for testing /* Virtual addresses */ static u32* rcu_trig_recv_virtbase = NULL; /*removed code not relevant for the question*/ static int __init rcumodule_init(void) { int iResult = 0; // holding result of […]

我想利用PCA9685芯片驱动beaglebone黑色的舵机,我看到有一个linux驱动程序,但是如何在C / C ++中使用。 任何例子?

所以我有一个Beaglebone黑色,以及一个伺服/ led控制器http://www.adafruit.com/product/815 。 我想从运行在Debian Linux上的C / C ++程序来控制它。 我看到在内核“pwm_pca9685”中包含了一个驱动程序,它确实在/sys目录中创build了一些项目,但似乎没有任何意义。 所以我知道,至less我需要告诉模块i2c芯片有什么地址,那么我该怎么做,然后怎么发送各种pwm命令到芯片?

如何在Linux中发送PCIe读取请求TLP

就像标题一样,我想知道是否可以在Linux中手动向设备发送PCIe读取请求TLP。 对于这个读取请求TLP有没有可能,我的驱动程序将定义TLP大小和TLP标记?

源代码/司机android手机的开放

Android手机的源代码有多开放? 我想不出一个制造商可以closures他们的驱动程序的方式,因为他们必须符合GPLv2作为Linux内核的许可证。 或者他们使用大量的用户空间代码,他们可以select自己的许可证? 我试图得到的信息是:获得一个“便宜”的智能手机(htc wildfire-s)和在其上运行Linux的function是多么的困难。 我的意思是,每个硬件function都可以轻松访问,无需实现自己的驱动程序并对设备进行逆向工程(假设设备已经生根)。