我正在学习如何开发连接到USB1串行卡的简单驱动程序。 我想知道内核如何理解我的设备需要映射为/ dev / ebbchar。 如何更改为/ dev / ebbGV? 如果我连接另一个设备为什么我不查看/ dev / ebbchar但/ dev / tty0? 谢谢。 总之内核怎么理解,连接到USB1的板是ebbchar还是其他设备? 我的驱动程序的init函数是: static int __init ebbchar_init(void){ printk(KERN_INFO "EBBChar: Initializing the EBBChar LKM\n"); // Try to dynamically allocate a major number for the device — more difficult but worth it majorNumber = register_chrdev(0, ebbchar, &fops); if (majorNumber<0){ printk(KERN_ALERT "EBBChar […]
我有一个硬件设备,由I2C总线上的3个独立芯片组成。 我想将它们组合在一起,并将它们暴露给用户,作为一个逻辑设备。 用户会看到/sys某个目录所代表的逻辑设备,以及/sys/class/i2c-adapter/i2c-?/*下的I2C芯片所期望的节点。 其中一个芯片是MCP23017,据我所知,它已经有一个驱动程序( drivers/gpio/gpio-mcp23s08.c ),我想重复使用它。 另一个芯片是PCA9685,我想为这个在include/linux/pwm.h中使用PWM系统的芯片提供驱动。 第三个芯片是运行定制固件的MCU。 我应该如何构build一组驱动程序? 我的一个想法是注册一个平台驱动程序来呈现逻辑设备,并使用内部的I2C驱动程序。 这是一个好方法吗? 有更好的方法吗? 逻辑器件是电机驱动板和红外接收器。 我有一个简单的结构图 。 我正在寻找创build两个接口。 第一个类似于/sys/class/gpio ,其中电机可以被“导出”,然后通过读取和写入属性进行访问。 这对于shell脚本的访问以及连接到电机的系统的机械部分的快速debugging将是有用的。 第二个是/dev中的字符设备节点,其中数据可以以二进制格式读取或写入,对应用程序控制更有用。
我正在为操作系统类写一个“困”的设备驱动程序。 它的工作方式是,用户通过read() / write()访问设备。 当用户像这样write(fd, &wait, size)设备时: write(fd, &wait, size) ,设备进入睡眠wait的时间(以秒为单位)。 如果等待时间过期,则驱动程序的写入方法返回0,程序结束。 但是,如果用户在等待队列中进程处于睡眠状态时从驱动程序中读取数据,则驱动程序的写入方法将立即返回睡眠进程在超时发生之前等待的等待秒数。 另一个问题是创build了10个设备实例,并且这10个设备中的每一个必须是相互独立的。 因此,对设备1的读取只能唤醒设备1上的睡眠进程。 已经提供了许多代码,并且我主要负责主要为驱动程序write() read()和write()方法的任务。 我试图解决保持设备彼此独立的问题的方法是包含两个全局静态数组,其中一个是wait_head_queue_ttypes,另一个是Int (Bool标志)types。 当我通过open()打开设备时,这两个数组都是初始化的。 问题是,当我调用wake_up_interruptible() ,没有任何反应,程序在超时后终止。 这是我写的方法: ssize_t sleepy_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){ struct sleepy_dev *dev = (struct sleepy_dev *)filp->private_data; ssize_t retval = 0; int mem_to_be_copied = 0; if (mutex_lock_killable(&dev->sleepy_mutex)) { return -EINTR; […]
我注意到,当使用本地标量types(integer,short,char)或stdint提供的types时,似乎没有一致性和最佳实践:uint32_t uint16_t uint8_t。 这对我来说是非常麻烦的,因为驱动程序构成了需要可维护,一致,稳定和良好的内核的重要组成部分。 下面是一个在gcc中的例子(用于树莓派的爱好项目): // using native scalars struct fbinfo { unsigned width, height; unsigned vwidth, vheight; unsigned pitch, bits; int x, y; void *ptr; unsigned size; } __attribute__((aligned(16))); // using stdint scalars struct fbinfo { uint32_t width, height; uint32_t vwidth, vheight; uint32_t pitch, bits; int32_t x, y; uint32_t ptr; // convert to void* […]
我正在linux上编写一个usb驱动程序(用于游戏手柄),当我插入时,ti加载usbhid。 我怎样才能使它加载我的驱动程序(gp_driver)? 我做了解绑,并绑定到我的驱动程序技巧,但我不想每一次都这样做。 我应该有我的驱动程序已经加载? 我应该在驱动程序中编写代码吗? 我的驱动程序中有供应商和产品ID .. 谢谢
我是一名在Linux内核编程方面具有丰富经验的中级程序员。 在实习期间,我主要参与debugging内核和驱动程序代码。 我最近完成了罗伯特·洛夫的“内核开发”一书的研究。 我是通过Jonathan Corbet的“Linux设备驱动程序手册”的一半。 但是我现在面临一个令人不安的问题。 这些书都没有教会我如何真正写出真正的 (硬件)设备驱动程序。 LDD3e书告诉我如何编写基于内存的软件驱动程序和sysfs接口,我很擅长。 那么我从哪里开始? 有什么要求,我如何去做呢? PS:我已经开始阅读“Sreekrishnan Venkateswaran的基本Linux设备驱动程序”
我必须在8秒内检测可播放的媒体(audio,video和图像)是否已在具有30,000个文件的16GB笔驱动器上进行更改,以便随后插入。 其他文件,如pdf或纯文本不予考虑; 这是一个媒体播放器软件。 我试过ls -l和md5但需要10-11秒。 有没有人曾经解决过这个问题或任何策略,你可以build议? 内容可以改变的场景是用户可以popup笔驱动器,向其添加更多的歌曲,并重新插入相同的笔驱动器。 如果没有内容改变,那么我可以使用旧的数据库,从而节省游戏时间。 我不能依靠时间戳,因为在Windows系统上重命名文件不会改变修改时间。
我想logging设备驱动程序的所有读/写PCI事务。 有没有办法通过Linux命令或软件来做到这一点?
Ubuntu的11.04 64位[试了SuSE 32位,并得到同样的错误],我有gcc,并且可以编译正常的C程序..和linux头在/usr/src/linux-headers-2.6* 我downlaoded这个驱动程序: http : //qce-ga.sourceforge.net/#download下载,提取,跑了make all ,这是输出 matt: /d/dl/qc-usb-0.6.6 $ make all make -C "/lib/modules/2.6.38-8-generic/build" SUBDIRS="/home/matt/Desktop/dl/qc-usb-0.6.6" modules V=1 USER_OPT="-DHAVE_UTSRELEASE_H=" make[1]: Entering directory `/usr/src/linux-headers-2.6.38-8-generic' test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \ echo; \ echo " ERROR: Kernel configuration is invalid."; \ echo " include/generated/autoconf.h or include/config/auto.conf are missing.";\ echo " Run 'make […]
我一直在想如果用Python开发Linux内核模块(驱动程序)是可能的。 是吗?