Articles of 驱动程序

如何在Linux中通过USB-to-RS232线与设备进行通信?

我最近有一个关于通过RS-232线与特定设备进行通信的项目。 由于我的电脑没有串口,因此我使用USB转RS232线作为设备和电脑之间的中介。 但是我是Linux驱动程序的新手,所以我很难理解它。 我在一个默认的工作驱动程序在Debian下工作,我已经testing了什么可以在硬件上完成,发现一切都很好。 现在的情况是如何发送命令到设备,并在C接收相应的数据。我读过一些书,我想也许映射USB端口是一个tty设备将工作。 我以正确的方式思考? 我有点困惑。 我下载了“minicom”的源代码并阅读了一些代码,但是我还是不太明白。 请帮我一下

检测到某个连接的USB设备

我正在使用Linux中的USB设备,并写了一个库来控制这个设备。 没有进入TOO的许多细节,设备使用一个标准的UART协议,所以我只需打开一个串行连接open ,configuration相关的参数,如波特率,停止位,奇偶校验等,并启动位 – 登记注册。 该库工作正常,但是,它的硬编码假设这个设备是/ dev / ttyUSB0。 也就是说,这是我通过open 。 如果打开失败,我退出。 我想要做的是检测这个设备是否存在,无论它是/dev/ttyUSB0 , /dev/ttyUSB1等,甚至检测这些设备是否有多个连接。 我可以编写代码来轮询设备上的某些寄存器,这些寄存器将返回序列号,产品ID等,这样我就可以检测到USB另一端的确是我的设备…但我怎样才能find一个列表连接的USB设备,在本地C? 还是有一个更优雅的方式来做到这一点,比如与内核模块的接口,或者什么? 我可以提供它实际使用的USB驱动程序,但是在查看代码时我有些迷失方向。 感谢您的任何见解。

如何将包含指针的结构从用户空间复制到内核

这是我得到的结构: struct my_struct { int size; int *buffer; }; 现在,我想使用copy_from_user用户空间中的variables复制到内核空间,但似乎不起作用。 我做的是这样的: 在用户空间中,我声明了一个variablesstruct my_struct data ,我将它初始化并传递给一个ioctl,并在内核中调用copy_from_user(&mydataInkernel, arg, sizeof(mydataInkernel)) ,然后为指针分配正确的内存并调用再次copy_from_user(mydataInkernel.buffer, arg + 4, mydataInkernel.size) 。 我不知道我在做什么错,但它不工作。 第一个副本是否也复制了mydataInkernel.buffer指向的所有数据? 有没有办法简单地使用copy_from_user来做到这一点? 更新1:对于我的架构上指针的大小,它的确是8个字节(x86_64)。 为了更清楚我正在编写一个设备驱动程序,这是为了使用ioctl从用户空间获取数据到内核空间的需要。 所以这里是我试图获得缓冲区的代码: ret_val = copy_from_user(dma_info, (ioctl_dma *)arg, sizeof(dma_info)); if (ret_val) printk(KERN_WARNING "COPY_FROM_USER failed !"); else ret_val = copy_from_user(dma_info->buffer, (ioctl_dma *)arg->buffer, dma_info->taille); if (ret_val) printk(KERN_WARNING "COPY_FROM_USER failed !"); else […]

在USB设备Linux内核模块中调用USB批量发送消息时出现问题

我有一个处理USB设备的内核模块。 发生这种情况的原因是,我可以成功地将USB批量消息发送到设备,但是该操作是在二进制属性的callback下进行的。 但是,当发生某些事情时,我需要做一个特定的操作。 发生这种情况时,我需要向设备发送批量消息。 发生的地方是自己的设备数据收入callback。 如果我在那个地方发送批量消息,我会感到内核恐慌。 有人能告诉我为什么吗? 如果这不是一个适当的地方做这样的操作,我可以放心地做到这一点? 我怎样才能在另一个地方发出信号? 一个计时器? 请咨询有关这个具体问题。

ARM字符设备驱动程序初始化不会创build/ dev /文件

我正在为ARM平台上的GPIO引脚编写驱动程序。 我的驱动程序正常工作,直到现在我通过手动mknod'ing设备文件避免了这个问题。 我的初始化代码: static int __init gpio_init (void) { void *ptr_error; if (register_chrdev(249, "gpio_device", &fops) < 0){ printk(KERN_INFO "Registering device failed\n"); return -EINVAL; } if ((device_class = class_create(THIS_MODULE, "gpio_device")) == NULL){ unregister_chrdev_region(DEV_T, 1); printk(KERN_INFO "Class creation failed\n"); return -EINVAL; } ptr_error = device_create(device_class, NULL, DEV_T, NULL, "gpio_device"); if (IS_ERR(ptr_error)){ class_destroy(device_class); unregister_chrdev_region(DEV_T, 1); printk(KERN_INFO "Device creation […]

Linux设备驱动程序

我有问题关于我的模块,它正确安装/初始化,但驱动程序的其他部分没有安装或显示在输出中。 static struct i2c_driver qt2120_dev { .probe = qt2120_probe, .remove = qt2120_remove, .owner = { .name = qt2120, .module = THIS_MODULE, } …. } static __init qt2120_init(){ prink("********init******"); ……. } module_init(qt2120_init) static int qt2120_probe(){ prink("********probe******"); ……. } static __devinit qt2120_remove(){ prink("********probe******"); ……. } 只有“/ * * init * ”出现在输出中。 根据输出已将模块安装到i2c。 "bus: i2c. qt2120 as qt2120/input" […]

自定义SPI驱动程序来实现lseek

我正在尝试实现用于定制硬件的SPI驱动程序。 我已经开始了一个spidev驱动程序的副本,它支持几乎所有我需要的东西。 我们使用的协议有三部分:命令位(读/写)地址和任意数量的数据。 我曾经假设,简单地添加lseekfunction将是最好的方式来做到这一点。 “寻找”到所需的地址,然后读取或写入任意数量的字节。 我在新驱动程序的file_operations中创build了一个自定义的.llseek,但是我从来没有见过这个函数被调用。 我尝试过使用fseek(),lseek()和pread(),而这些函数都没有调用新的my_lseek()函数。 每次电话报告“errno 29 ESPIPE Illegal Seek” 该设备在board.c文件中定义: static struct spi_board_info my_spi_board_info[] __initdata = { [0] = { .modalias = "myspi", .bus_num = 1, .chip_select = 0, .max_speed_hz = 3000000, .mode = SPI_MODE_0, .controller_data = &spidev_mcspi_config, }, … 我怀疑可能有一些与创builddev文件的方式,主要是因为我发现引用的例子filp-> f_pos static int myspi_llseek(struct file *filp, loff_t off, int whence) { […]

无法从linux内核获取copy_to_user的工作

我们有一个内核驱动程序和一个与这个驱动程序交互的用户空间应用程序。 用户空间应用程序使用posix_memalign分配内存块,并将这些地址传递给内核驱动程序,如下所示: struct dma_cmd { int cmd; int usr_buf_size; char *buf; }; struct set_mem_addr_cmd_struct { int channel_id; char *address; }; char* register_mem_for_channel(ssize_t f, int channelid) { struct dma_cmd cmd; char *buf = (char *)malloc(sizeof(struct set_mem_addr_cmd_struct)); cmd.usr_buf_size = sizeof(struct set_mem_addr_cmd_struct); cmd.cmd = CMD_SET_MEM_ADDR; (*(struct set_mem_addr_cmd_struct*)buf).channel_id = channelid; if ((channelid < 4)) char *addr; posix_memalign(&addr, 4*1024, 4*1024*8); […]

驱动程序是否使用Linux NAPI接口?

有没有办法确认Linux以太网驱动程序是否使用NAPI接口?

从内核模块写入和读取设备文件的代码?

我已经多次尝试下面的代码。 #include<linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/cdev.h> #include<asm/uaccess.h> #include<linux/semaphore.h> MODULE_LICENSE("DUAL BSD/GPL"); static int dev_open(struct inode *,struct file *); static int dev_release(struct inode *,struct file *); ssize_t dev_read(struct file *,char *, size_t ,loff_t *); ssize_t dev_write(struct file *,const char *,size_t ,loff_t *); static int major; int dev_major = 0; int dev_minor = 0; struct cdev *cdev; struct device […]