Tag: linux device driver

在linux中断的上下文中运行用户线程

我正在编写一些自定义应用程序,并允许在linux内核中更改中断处理程序代码。 我有一个等待中断发生的用户线程。 如果发生中断,那么我想要做的第一件事就是执行该用户线程。 有没有办法让它发挥作用。 谢谢

Linux内核:可以无限期地打开流式DMA映射吗?

关于设备驱动程序编程的许多指南建议流式DMA映射(即由dma_map_single()和朋友创建的那些dma_map_single()在尽可能短的时间内保持打开状态,因为它们消耗资源(即如果平台有一个IOMMU映射资源,或者需要时弹跳缓冲区)。 在我的情况下,我正在使用一个支持64位DMA的PCIe设备,因此不需要反弹缓冲区(在这种情况下,似乎不需要IOMMU的特殊处理,这是正确的吗?)。 数据来自设备(即它与DMA_TO_CPU映射),当新数据通过中断可用时,设备通知我,此时我在访问刚刚向我发送DMA的数据之前触发dma_sync_for_cpu() 。 还有其他原因我不应该无限期地打开映射(当然,直到数据消费者关闭)?

Linux中的COM端口检测

请告诉我是否有任何API,系统调用,function(在Linux中),我可以使用我的C程序动态检测COM端口,即,只要在端口中插入USB调制解调器加密狗,我就能检测到COM端口在我的C程序中使用API​​,系统调用或函数。

Spidev不使用ioctl同时写/读

我希望找到一些帮助,即使这个问题可能是硬件而不是软件相关(我们会看到)。 我正在开发基于Freescales P1021处理器(ppc,e500v2核心)的定制电路板。 外部PCB将连接并可由SPI配置。 该外部PCB的规格读取为全双工模式下的2字节命令,并且只有最后一个字节用于在MISO上传输数据。 知道这一点,我目前正在准备一些软件来测试这个设备。 所以我从众所周知的spi_test程序开始。 root@p1021rdb:~# ./spi_test -D /dev/spidev32766.3 spi mode: 0 bits per word: 8 max speed: 500000 Hz (500 KHz) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 […]

如何以编程方式设置我的char设备的权限

我最近在工作中inheritance了一些代码,这是旧的2.4.X linux内核驱动程序,我的任务是让他们在更新的内核2.6或更高版本上工作。 我正在运行带有3.1.10内核的OpenSUSE 12.1。 我已经从register_chrdev()更新了原始代码以使用class_create()/ device_create()调用,我可以看到我的设备正确显示在/ dev中。 我目前的问题是我的设备的权限仅为用户设置为r / w: crw——- 1 root root 244, 0 Aug 7 07:57 gcanain 我知道我可以通过命令行“chmod”该文件,或者我可以设置udev权限……但无论如何都要以编程方式执行此操作,这样当我发出insmod命令时,dev将以正确的方式安装规则到位了吗? 是否有任何可能存在的API我可以调用来执行此操作,我在其中一个创建API中缺少任何选项? 只是为了澄清,我不想使用udev规则的部分原因是我不知道设备驱动程序的名称。 设备驱动程序在循环中生成,因此名称附加一个数字,nNumDevs几乎可以是任何东西: for (i = 0; i < nNumDevs; i++) { strcpy(Modname,GC_ANAIN_MODULE_NAME); strcat(Modname,"%d"); device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i); }

Linux内核:为什么’子类’结构将基类信息放在最后?

我正在阅读Linux内核上的Beautiful Code中的章节,作者讨论了Linux内核如何在C语言中实现inheritance(以及其他主题)。 简而言之,定义了一个“基础”结构,为了从中inheritance,“子类”结构将基类的副本放在子类结构定义的末尾 。 然后,作者花了几页来解释一个聪明而复杂的宏,以确定要从对象的基本部分转换为对象的子类部分要返回多少字节。 我的问题:在子类struct中,为什么不将struct struct声明为struct中的第一个东西,而不是最后一个 ? 首先放置基础结构的主要优点是从基类转换到子类时根本不需要移动指针 – 本质上,执行转换只是告诉编译器让代码使用’额外’子类struct在基类定义的东西之后放置的字段。 只是为了澄清我的问题,让我抛出一些代码: struct device { // this is the ‘base class’ struct int a; int b; //etc } struct usb_device { // this is the ‘subclass’ struct int usb_a; int usb_b; struct device dev; // This is what confuses me – // why put this […]

谁在驱动程序代码中调用“probe”函数?

我试图了解mcspi的omap2pandas板的驱动程序代码。 我不明白谁调用probe函数以及此驱动程序代码中的调用链是什么? 连接设备时如何通知驱动程序?

为UART启用和测试本地环回

我正在尝试进行UART内部回路测试并提出以下更改 #include #include #include #include #include #include #include #include #include #define CCSR_BASE 0xfe000000 #define UART1_BASE 0x11c000 #define UART1_LEN 0x1000 static volatile unsigned long *uartReg = MAP_FAILED; /* Map in registers. */ static unsigned long *initMapMem(int fd, unsigned long addr, unsigned long len) { return (unsigned long *) mmap(0, len, PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED|MAP_LOCKED, fd, addr); } int uartInitialise(void) […]

如何从C中的串行(SPI)连接读取数据?

我正在尝试编写一个程序,该程序将安装在Linux MCU(Raspberry Pi)上,该程序将读取从另一个MCU(我将自己构建的本地产品)的串行数据。 我已经研究过如何做到这一点,并认为我有“大局”,但仍然缺少一些东西。 首先,我需要启用内核模块并让自己访问设备: sudo modprobe spi_bcm2708 sudo chown `id -u`.`id -g` /dev/spidev0.* 从那里我可以使用这个着名的C文件来测试SPI连接。 所以现在连接就在那里,但我仍然需要从中读取串行数据。 根据这个问题的答案,我只需要: …打开相关端口进行读取,并使用read()获取数据。 然而,该答案中的代码片段似乎是通过设备驱动程序而不是通过SPI打开端口。 我的理解是我可以使用SPI从连接的MCU设备读取数据,并且我不需要为该设备编写自己的设备驱动程序。 这是真的? 如果是这样,我将如何从SPI连接中读取,以及该代码与上面链接的问题的答案中的代码有何不同? 如果我的理解不正确,并且我确实阅读了“通过”设备驱动程序,为什么我首先需要驱动程序? 这不是SPI希望绕过的吗? 提前致谢。

关于linux设备驱动程序中的register_chrdev_region()的问题

我正在学习使用register_chrdev_region(dev_t from, unsigned count, const char * name);内核模块register_chrdev_region(dev_t from, unsigned count, const char * name); 。 我注意到有或没有这个函数,我的内核模块按预期工作。 我用来测试的代码: first = MKDEV(MAJOR_NUM, MINOR_NUM); register_chrdev_region(first, count, DEVICE_NAME);//ops= &fops; mycdev->owner = THIS_MODULE; if (cdev_add(mycdev,first, count) == 0) {printk(KERN_ALERT “driver loaded\n”);} 我注释掉了register_chrdev_region(first, count, DEVICE_NAME);行register_chrdev_region(first, count, DEVICE_NAME); , printk消息仍然出现。 我试图在有或没有用户空间的情况下与驱动程序通信,两者都是成功的。 所以我的问题是,这个函数register_chrdev_region()仅用于使我的驱动程序成为一个好的内核公民,就像告诉其他人“我用完主要数字,请不要使用”? 我试着看一下内核源代码char_dev.c来理解这个function,但是我发现它太难理解了,有谁熟悉这个? 谢谢!