Articles of 驱动程序

LabVIEW Linux C ++开发 – 初学者的问题

背景 在我们公司,我们与机械制造商合作,我们正在为他们生产的设备开发C ++ / Qt跨平台控制应用程序。 过去,我们曾经通过USB(虚拟COM端口)与他们的设备进行通信。 现在我们被告知这个制造商计划切换到LabVIEW(USB数据采集)。 因为今后我们会收到相关的信息,不过我想知道一些关于它的信息,并问你我在网上找不到的问题。 我很抱歉noob问题。 问题 1)什么是LabVIEW? 我是对的,它不是一个单一的设备,而是一堆硬件组件,驱动程序和标准? 2)谁是LabVIEW开发人员? 我已经读了多less时间需要学习LabVIEW ,但我不确定。 它是一个将LabVIEW组件组合在一起并为它们制作固件的人。 还是开发可与LabVIEW通信的用户应用程序的人员? 3)我认为问题2的第一部分将由我们的合作伙伴完成。 第二部分将在我们身上。 但谁创build通信协议? DAQ与PC驱动程序的通信方式有没有标准的方法,还是程序员开发通信协议? 4)我发现在National Instruments有linux的驱动程序 。 包含此驱动程序的一些API /库,可以包含在C ++代码中的标准方式,并用于与DAQ进行通信?

写入Linux设备驱动程序导致无限循环

我一直在编写一个可以从用户空间读取和写入的内核空间设备驱动程序。 开放,阅读,发布操作都是完美的。 我遇到的问题是用户空间代码应该访问设备驱动程序,并写入一些东西。 用户空间程序写入两个文件:1)一个.txt文件(并打印到控制台让用户知道它已完成),2)到设备驱动程序(也打印文本,让用户知道它也完成了)。 以下是完整的用户空间代码: int main() { FILE *fp; fp = fopen("./test.txt","w"); fputs("Test\n", fp); fclose(fp); printf("Printed to txt\n"); //Prints normally. fp = fopen("/dev/testchar", "w"); fputs("Test\n", fp); fclose(fp); printf("Printed to dev\n"); //Never gets to this point return 0; } 当我编译并运行代码时,程序吐出来了 Printed to txt 并挂起,直到ctrl + c被调用。 它永远不会超越第二个fputs() 。 在监测kern.log我看到无尽的呼叫写入设备驱动程序。 这里我已经从设备驱动程序中提取了相关的代码: static char msg[256] = {0}; […]

开始学习OpenGL。 在现代Linux上,这些概念是如何相关的?

我开始学习OpenGL,因为这是我select的硕士学位课程的一部分。 在课堂上,加速的3Dgraphics在MS Windows上练习(也许DX3d实际上用来代替OpenGL,不确定)。 不过,我已经使用了很多年的Linux了,而且我确信这是一个正确的开发环境,当你可以自由select的时候。 但据我所知,加速的3D,特别是驱动和硬件支持,在Linux上是一团糟。 所以,请帮助我把以下一堆概念组织成一个合理的结构,因为这是我能看到和理解事物的唯一途径。 首先是司机。 NVIDIA和AMD专有的,加上“nouveau”和一些开放的Radeon驱动程序,以及一个实验性的AMD开放但仍然是官方的。 这似乎很清楚。 其次,有一种叫做“mesa”的东西。 那是什么? 它只是为免费的驱动程序定义的,它是免费的驱动程序项目的一部分,还是定义和要求,无论使用哪种驱动程序? 在开发2)中,“opengl”究竟是什么,它包含在哪里:mesa,司机还有其他的东西? 它可以是专有的吗? 最后,考虑到以上三点,在现代Linux系统上获取和安装OpenGL意味着什么?

Linux的cdev与register_chrdev

我修改了一个驱动程序,碰到了LDD3中的cdev接口。 阅读http://lwn.net/Articles/195805/后,我比开悟更困惑。 从那里的评论 为了使设备实际出现在文件系统中,您必须调用device_create (class, parent_dev, devno, device_name) 。 为了调用device_create你需要有一个设备类对象:或者使用一个现有的类,或者用create_class (THIS_MODULE, class_name) 我认为这只适用于sysfs。 那么,新界面试图改变失败的东西,因此build议继续使用device_create ? 如果推荐使用cdev ,我该如何创buildsysfs条目? 我从来没有完全明白有一个设备类的好处,是否有一点,如果有,如何与cdev实现它?

在内核模块中执行shell命令

是否有可能在内核模块中执行shell命令。 我知道我们可以在用户空间C代码中使用system子程序来做到这一点。 我正在debugging有内存泄漏问题的内核模块。 在无限循环中执行insmod和rmmod module.ko之后,系统会在8G内存的几分钟之内内存不足。 在调用负责释放内存的API之前和之后,使用free命令知道内存状态会很有帮助,所以我可以知道API是否正常工作。 这是我debugging的方式。 如果还有其他方法,请分享。

在Linux内核模块中获取现有设备类(struct class)的指针

在Linux内核模块中获取现有设备类( struct class )的指针 大家好! 我正在尝试在现有设备类中注册一个设备,但是我无法获得指向现有类的指针。 内核版本是Linux 3.3.6。 我可以在模块中创build一个类,获取指向它的指针,然后使用它来注册设备: *cl = class_create(THIS_MODULE, className); dev_ret = device_create(*cl, NULL, *dev, NULL, driverName); 不过,我需要在另一个模块的同一个类中注册另一个设备,但是我找不到一个指向现有类的指针。 而且我不能在其他模块中再次创build类,因为由于类已经存在,所以class_create返回NULL,而不是指向device_create所需的类的指针。 我发现在: http://lwn.net/Articles/102500/ 通过名称返回指向类的指针的函数: struct class * class_find(char * name) 但是,当我尝试编译函数编译器说,它不存在。 我以为这个function是由内核输出(我的模块有许可证GPL),但它似乎不是。 也许我需要包含一些标题? 我试着重写这个函数,因为它的代码是在上面的链接中列出的。 但是当我尝试迭代class_subsys : list_for_each_entry(this_class, &class_subsys.kset.list, subsys.kset.kobj.entry) 现在找不到符号class_subsys 。 我再次认为它被导出到内核。 我不知道什么是缺less的。 一些标题? 我做错了吗? 还有另一个function呢? 我想,如果我可以从头开始遍历sysfs ,我可以得到一个指向现有类的指针。 但是我也没有find如何开始遍历sysfs 。 我见过的所有函数都需要一个指向kobject或kset的指针来开始遍历。 但是我没有指向sysfs或内核对象的根,所以我不能开始遍历树来获得一个类的指针。 任何人都可以指出我正确的方向吗?

在Linux中注册一个声卡驱动程序

我想写一个虚拟的声卡驱动程序,将被Linux系统用于audio播放和捕获。 驱动程序应使用缓冲区来读取/写入audio数据。 我写了以下基本的驱动程序: #include <linux/module.h> #include <linux/kernel.h> #include <linux/sound.h> #include <linux/sysctl.h> #include <linux/device.h> #include <linux/slab.h> /* kmalloc() */ #include <linux/gfp.h> #include <asm/uaccess.h> /* copy_from/to_user */ #include <linux/major.h> #include <linux/fs.h> #include <linux/pci.h> #include <linux/err.h> #include <sound/core.h> static char* mod_name = "prosip"; MODULE_LICENSE("GPL"); MODULE_VERSION("0.0.1111"); MODULE_AUTHOR("DD-DDD"); MODULE_DESCRIPTION("proSip Virtual Sound Card"); // static int ver_major = 133; static int […]

使用Linux usb批量传输内核驱动程序和硬件环回性能非常差(〜0.4MB / s)

我正在为一个自定义的USB设备编写一个Linux内核驱动程序,它将使用批量端点,一切似乎都正常,但是,我正在获得非常慢的数据速率。 具体来说,写入和读取10MB的数据需要大约25秒的时间。 我在一台embedded式系统和一台运行在合理PC上的Linux VM上试了这个,结果相似。 我正在使用赛普拉斯的EZ-USB FX2开发套件作为目标板。 它正在运行设置两个输出端点和两个输出端点的bulkloop固件。 每个端点都是双缓冲的,并支持512个字节的窗口。 固件通过main()中的while(1)循环轮询端点,不hibernate,当这些数据可用自动查找器时,将数据从out复制到endpoints中。 我被告知这可以使用他们特定的应用程序公平地在Windows上移动数据,但是没有机会validation这一点。 我的代码(下面的相关部分)在设备探测例程中调用称为bulk_io的函数。 这个函数创build一个数字(URB_SETS),用来尝试向设备写入512个字节。 在1到32之间更改此数字不会改变性能。 他们都从同一个缓冲区复制。 对out端点的每个写入操作的callback处理程序用于在相应的端点上创build读取urb。 读callback创build另一个写urb,直到我一次达到我想要运行的写/读请求的总数(20,000)。 我现在正在努力将callback函数中的大部分操作推到下半部分,以防止其他中断。 我也在考虑重写赛普拉斯FX2的批量循环固件,以使用中断而不是轮询。 这里有什么不寻常的东西让表演如此之低? 先谢谢你。 请让我知道如果你想看到更多的代码,这只是一个testing赛普拉斯FX2的I / O的裸机驱动程序。 这是出端点写callback函数: static void bulk_io_out_callback0(struct urb *t_urb) { // will need to make this work with bottom half struct usb_dev_stat *uds = t_urb->context; struct urb *urb0 = usb_alloc_urb(0,GFP_KERNEL); if (urb0 == NULL) { […]

写一些东西给Linux的设备?

我正在学习linux hid驱动程序编程,我知道如何从隐藏设备读取消息 但是,我很困惑如何写一些东西到设备? 如USB HID键盘,我可以使用X SET或其他一些程序来控制键盘的LED,如何存档? 任何提示,请! 感谢提前。

如何区分内核的软locking和用户空间的softlockup?

我有下面的locking。 这是否表明slic_test pid 5207是罪犯,还是仅仅是因为内核中的当前macros仍然指向将系统调用到我的驱动程序中的用户空间进程? 此外 – irq事件戳0 … irq事件戳代表什么? 它不能是自启动以来的中断次数… 88798秒之后绝对超过了0 … 系统是禁用CONFIG_SMP的单处理器。 [88798.449628] BUG: soft lockup – CPU#0 stuck for 61s! [slic_test:5207] [88798.449628] Modules linked in: slic_xxxx leds_xxxx vortex86_spi dm_mirror dm_log dm_multipath dm_mod ohci_hcd ehci_hcd r6040 vortex86_wdt vortex86_gpio [last un] [88798.449628] irq event stamp: 0 [88798.449628] hardirqs last enabled at (0): [<00000000>] 0x0 [88798.449628] […]