一、Linux device driver 的概念x0dx0ax0dx0a系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:x0dx0ax0dx0a1、对设备初始化和释放;x0dx0ax0dx0a2、把数据从内核传送到硬件和从硬件读取数据;x0dx0ax0dx0a3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据;x0dx0ax0dx0a4、检测和处理设备出现的错误。x0dx0ax0dx0a在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。x0dx0ax0dx0a已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。x0dx0ax0dx0a最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。x0dx0ax0dx0a二、实例剖析x0dx0ax0dx0a我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把下面的C代码输入机器,你就会获得一个真正的设备驱动程序。x0dx0ax0dx0a由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如 open,read,write,close?, 注意,不是fopen, fread,但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结构:x0dx0ax0dx0aSTruct file_operatiONs {x0dx0ax0dx0aint (*seek) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*read) (struct inode * ,struct file *, char ,int);x0dx0ax0dx0aint (*write) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*readdir) (struct inode * ,struct file *, struct dirent * ,int);x0dx0ax0dx0aint (*select) (struct inode * ,struct file *, int ,select_table *);x0dx0ax0dx0aint (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);x0dx0ax0dx0aint (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);x0dx0ax0dx0aint (*open) (struct inode * ,struct file *);x0dx0ax0dx0aint (*release) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fsync) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fasync) (struct inode * ,struct file *,int);x0dx0ax0dx0aint (*check_media_change) (struct inode * ,struct file *);x0dx0ax0dx0aint (*revalidate) (dev_t dev);x0dx0ax0dx0a}x0dx0ax0dx0a这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。x0dx0ax0dx0a下面就开始写子程序。x0dx0ax0dx0a#include
㈡ linux系统中没有USB驱动怎么办
要启用 Linux USB 支持,首先进入"USB support"节并启用"Support for USB"选项(对应模块为usbcore.o)。尽管这个步骤相当直观明了,但接下来的 Linux USB 设置步骤则会让人感到糊涂。特别地,现在需要选择用于系统的正确 USB 主控制器驱动程序。选项是"EHCI" (对应模块为ehci-hcd.o)、"UHCI" (对应模块为usb-uhci.o)、"UHCI (alternate driver)"和"OHCI" (对应模块为usb-ohci.o)。这是许多人对 Linux 的 USB 开始感到困惑的地方。
要理解"EHCI"及其同类是什么,首先要知道每块支持插入 USB 设备的主板或 PCI 卡都需要有 USB 主控制器芯片组。这个特别的芯片组与插入系统的 USB 设备进行相互操作,并负责处理允许 USB 设备与系统其它部分通信所必需的所有低层次细节。
Linux USB 驱动程序有三种不同的 USB 主控制器选项是因为在主板和 PCI 卡上有三种不同类型的 USB 芯片。"EHCI"驱动程序设计成为实现新的高速 USB 2.0 协议的芯片提供支持。"OHCI"驱动程序用来为非 PC 系统上的(以及带有 SiS 和 ALi 芯片组的 PC 主板上的)USB 芯片提供支持。"UHCI"驱动程序用来为大多数其它 PC 主板(包括 Intel 和 Via)上的 USB 实现提供支持。只需选择与希望启用的 USB 支持的类型对应的"?HCI"驱动程序即可。如有疑惑,为保险起见,可以启用"EHCI"、"UHCI" (两者中任选一种,它们之间没有明显的区别)和"OHCI"。( 赵明注:根据文档,EHCI已经包含了UHCI和OHCI,但目前就我个人的测试,单独加EHCI是不行的,通常我的做法是根据主板类型加载UHCI或OHCI后,再加载EHCI这样才可以支持USB2.0设备)。
启用了"USB support"和适当的"?HCI"USB 主控制器驱动程序后,使 USB 启动并运行只需再进行几个步骤。应该启用"Preliminary USB device filesystem",然后确保启用所有特定于将与 Linux 一起使用的实际 USB 外围设备的驱动程序。例如,为了启用对 USB 游戏控制器的支持,我启用了"USB Human Interface Device (full HID) support"。我还启用了主"Input core support" 节下的"Input core support"和"Joystick support"。
一旦用新的已启用 USB 的内核重新引导后,若/proc/bus/usb下没有相应USB设备信息,应输入以下命令将 USB 设备文件系统手动挂装到 /proc/bus/usb:
# mount -t usbdevfs none /proc/bus/usb
为了在系统引导时自动挂装 USB 设备文件系统,请将下面一行添加到 /etc/fstab 中的 /proc 挂装行之后:
none /proc/bus/usb usbdevfs defaults 0 0
模块的配置方法.
在很多时候,我们的USB设备驱动并不包含在内核中。其实我们只要根据它所需要使用的模块,逐一加载。就可以使它启作用。
首先要确保在内核编译时以模块方式选择了相应支持。这样我们就应该可以在/lib/moles/2.4.XX目录看到相应.o文件。在加载模块时,我们只需要运行modprobe xxx.o就可以了(modprobe主要加载系统已经通过depmod登记过的模块,insmod一般是针对具体.o文件进行加载)
对应USB设备下面一些模块是关键的。
usbcore.o要支持usb所需要的最基础模块usb-uhci.o(已经提过)usb-ohci.o(已经提过)uhci.o另一个uhci驱动程序,我也不知道有什么用,一般不要加载,会死机的ehci-hcd.o(已经提过 usb2.0)hid.oUSB人机界面设备,像鼠标呀、键盘呀都需要usb-storage.oUSB存储设备,U盘等用到
相关模块
ide-disk.oIDE硬盘ide-scsi.o把IDE设备模拟SCSI接口scsi_mod.oSCSI支持
注意kernel config其中一项:
Probe all LUNs on each SCSI device
最好选上,要不某些同时支持多个口的读卡器只能显示一个。若模块方式就要带参数安装或提前在/etc/moles.conf中加入以下项,来支持多个LUN。
add options scsi_mod max_scsi_luns=9
sd_mod.oSCSI硬盘sr_mod.oSCSI光盘sg.oSCSI通用支持(在某些探测U盘、SCSI探测中会用到)
常见USB设备及其配置
在Linux 2.4的内核中已经支持不下20种设备。它支持几乎所有的通用设备如键盘、鼠标、modem、打印机等,并不断地添加厂商新的设备象数码相机、MP3、网卡等。下面就是几个最常见设备的介绍和使用方法:
USB鼠标:
键盘和鼠标属于低速的输入设备,对于已经为用户认可的PS/2接口,USB键盘和USB鼠标似乎并没有太多更优越的地方。现在的大部分鼠标采用了PS/2接口,不过USB接口的鼠标也越来越多,两者相比,各有优势:一般来说,USB的鼠标接口的带宽大于PS/2鼠标,也就是说在同样的时间内,USB鼠标扫描次数就要多于PS/2鼠标,这样在定位上USB鼠标就更为精确;同时USB接口鼠标的默认采样率也比较高,达到125HZ,而PS/2接口的鼠标仅有40HZ(Windows 9x/Me)或是60HZ(Windows NT/2000)。
对于USB设备你当然必须先插入相应的USB控制器模块:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
USB鼠标为了使其正常工作,您必须先插入模块usbmouse.o和mousedev.o
modprobe usbmouse
modprobe mousedev
若你把HID input layer支持和input core 支持也作为模块方式安装,那么启动hid模块和input模块也是必要的。
modprobe hid
modprobe input
USB键盘:
一般的,我们现在使用的键盘大多是PS/2的,USB键盘还比较少见,但是下来的发展,键盘将向USB接口靠拢。使用USB键盘基本上没有太多的要求,只需在主板的BIOS设定对USB键盘的支持,就可以在各系统中完全无障碍的使用,而且更可以真正做到在即插即用和热插拔使用,并能提供两个USB连接埠:让您可以轻易地直接将具有USB接头的装置接在您的键盘上,而非计算机的后面。
同样你当然必须先插入相应的USB控制器模块:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
然后您还必须插入键盘模块usbkbd.o,以及keybdev.o,这样usb键盘才能够正常工作。此时,运行的系统命令:
modprobe usbkbd
modprobe keybdev
同样若你把HID input layer支持和input core 支持也作为模块方式安装,那么启动hid模块和input模块也是必要的。
U盘和USB读卡器:
数码存储设备现在对我们来说已经是相当普遍的了。CF卡、SD卡、Memory Stick等存储卡已经遍及我们的身边,通常,他们的读卡器都是USB接口的。另外,很多MP3、数码相机也都是USB接口和计算机进行数据传递。更我们的U盘、USB硬盘,作为移动存储设备,已经成为我们的必须装备。
在Linux下这些设备通常都是以一种叫做usb-storage的方式进行驱动。要使用他们必须加载此模块
modprobe usb-storage
当然,usbcore.o 和usb-uhci.o或usb-ohci也肯定是不可缺少的。另外,若你系统中SCSI支持也是模块方式,那么下面的模块也要加载
modprobe scsi_mod
modprobe sd_mod
在加载完这些模块后,我们插入U盘或存储卡,就会发现系统中多了一个SCSI硬盘,通过正确地mount它,就可以使用了(SCSI硬盘一般为/dev/sd?,可参照文章后面的常见问题解答)。
mount /dev/sda1 /mnt
Linux支持的其他USB设备。
MODEM--(比较常见) 网络设备 摄像头--(比较常见)例如ov511.o 联机线--可以让你的两台电脑用USB线实现网络功能。usbnet.o 显示器--(我没见过) 游戏杆 电视盒--(比较常见) 手写板--(比较常见) 扫描仪--(比较常见) 刻录机--(比较常见) 打印机--(比较常见)
注意:
上面所说的每个驱动模块,并不是都要手动加载,有很多系统会在启动或你的应用需要时自动加载的,写明这些模块,是便于你在不能够使用USB设备时,可以自行检查。只要用lsmod确保以上模块已经被系统加载,你的设备就应该可以正常工作了。当然注意有些模块已经以内核方式在kernel启动时存在了(这些模块文件在/lib/moles/2.4.XX中是找不到的)。
输入相关命令
㈢ Manjaro20.0配置TR4527打印机和扫描仪驱动
【注】Manjaro 系统日常使用问题可以上 Manjaro 官方论坛 上逛一逛,说不定具有解决办法。
Arch Linux AUR 源已经提供了 TR4527 打印机驱动程序 cnijfilter2 ,详情参见 地址 。
在终端手动安装该驱动程序即可:
Arch Linux AUR 源已经提供了 TR4527 扫描仪驱动程序 scangearmp2 ,详情参见 地址 。
在终端手动安装该驱动程序即可:
㈣ 怎么在Linux上安装打印机驱动
linux桌面下可照如下步骤添加打印机:
请您点击左下角图标(即开始按钮),从系统主内菜单中选中“系容统设置”,在其中选
在左侧的列表中,选择“新建打印机”,然后在右侧选择“新建打印机”按钮,之后 进入选择打印机的界面,这时,系统就会自动扫描出当前网络中可用的打印机,将结果显示在左侧列表中。
从列出的可用打印机中,选择您要配置的那一台,点击右下角的“前进”按钮,进入 “设置打印机类型”的界面。
从列表中选择对应的打印机型号,比如“HP”、“Canon”等。
如果列表中没有您打印机的类型,请选择“General”。然后点击“前进”按钮,进入 “添加打印机具体驱动型号”的界面,左侧列表是打印机的型号,右侧列表是系统中目前 可用的所有驱动程序(左边选择哪个型号,右边就显示它对应的驱动程序)。
点击“前进”按钮,依次填写:
“打印机名称” (可自己命名)
“描述” (可不填写)
“位置” (可自己定义)
㈤ 奔图打印机Linux系统下怎样使用扫描功能,新手小
有多种方法,比较常见的有两种: 1、可以先安装打印机程序,然后根据提示接通打印机数据线和电源,它会自动安装以下驱动程序。 2、直接在控制面板-打印机-添加打印机。然后自己搜索所对应的打印机驱动程序。
㈥ linux下如何安装Epson驱动,急。谢谢
有Epson的for linux驱动么?有就解压,安装。
CUPS是很多Linux发行版缺省的开源打印系统,你装上这个CUPS,再选择支持Epson的打印驱动包,就Ok了。
㈦ deepin linux 如何安装V19 扫描仪
图文开始深度系统(Deepin Linux)在...并将下载的Deepin Linux镜像加载为DVD驱动器,以便于专安装。如下图:(配属置...
tangwumo.com
Deepin教程:简述深度安装器专家模式_Linux教程_Linux公社...
现在使用深度安装器安装Deepin 2014,用户只需要填写用户信息、选择安装的硬盘或者分区即可完成安装配置,...
www.linuxidc.com
D
㈧ linux系统 libreoffice怎么调出扫描仪
首先安装扫描仪的驱动,安装sane软件包。
LibreOffice中,按菜单“插入---媒体---扫描”。
㈨ 扫描驱动如何下载
安装扫描仪驱动时,需要先清楚自己扫描仪的型号,在浏览器搜索自己型号的扫描仪驱动下载,点进去找到下载地址,选择本地下载后便可下载到电脑上,之后将文件夹点开,选择set up按钮,安装好即可。
安装完成后,需要将扫描仪上的USB 接口连接在电脑上,然后重启计算机,重启后打开电脑的控制面板,选择设备和打印机选项,点击“添加新硬件”,点击下一步,将扫描仪添加在电脑上便可以使用。
㈩ 扫描仪怎么安装使用
扫描仪在日常生活中的应用越来越广泛了,那么你了解过扫描仪怎么安装使用了吗?下面就由我为你介绍一下吧,希望大家喜欢!
1、在日常生活中的扫描仪也是运用越来越广泛了。我们办公所以的扫描仪,一般就是独立的或者一体机带有扫描的功能(一体机,就是把打印机、扫描仪、传真等功能集合到一台设备上面的机器)。其实他们的安装方法都是大同小异的,我们这里介绍独立扫描仪的安装。
2、在我的电脑里面,打开控制面板。找到"扫描仪和照相机“,双击,进入扫描仪的窗口
3、点击”添加图像处理设备“,进入安装扫描仪的向导。
4、这里的选择你安装的扫描仪品牌和型号。
5、这里需要注意了,这个端口是你扫描仪的链接端口,不能选择错误。如果你选择错误了,下一步使用的时候就出问题了。如果你实在不清楚是什么,那么建议你选择自动检测吧。
6、下面,直接点击”下一步“,跟随向导,直到安装完成。
1.打开扫描仪开关时,扫描仪发出异常响声。
这是因为有些型号的扫描仪有锁,其目的是为了锁紧镜组,防止运输中震动,因此在打开扫描仪电源开关前应先将锁打开。
2.扫描仪接电后没有任何反应。
有些型号的扫描仪是节能型的,只有在进入扫描界面后灯管才会亮,一旦退出后会自动熄灭。
3.扫描时显示“没有找到扫描仪”。
此现象有可能是由于先开主机,后开扫描仪所导致,可重新启动计算机或在设备管理中刷新即可。
4.扫描仪的分辨率与打印机的分辨率是否是一个概念?应该怎样根据扫描仪的分辨率选购打印机?
扫描仪的分辨率的单位严格定义应当是ppi,而不是dpi。ppi是指每英寸的pixel数,对于扫描仪来说,每一pixel不是0或1这样简单的描述关系,而是24bit、 36bit或CMYK(1004)的描述。打印机的分辨率的dpi中的d是指英文中的dot,每一个dot没有深浅之分,只是0或1的概念,而对于扫描仪来说,1个pixel需要若干个4种dot(CMYK)来描述,即一点的色彩由不同的dot的`疏密程度来决定。所以扫描仪的dpi与打印机的dpi概念不同。用1440dpi的打印机输出1:l的图像,扫描时用100-150dpi左右的扫描即可。
5.扫描仪在扫描时出现“硬盘空间不够或内存不足”的提示。
首先,确认硬盘及内存是否够,若空间很大,请检查您设定的扫描分辨率是否太大造成文件数据量过大。
6. 扫描使噪音奇大。
拆开机器盖子,找一些缝纫机油滴在卫生纸上将镜组两条轨道上的油垢擦净,再将缝纫机油滴在传动齿轮组及皮带两端的轴承上(注意油量适中),最后适当调整皮带的松紧。
7. 扫描时间过长。
检查硬盘剩余容量,将硬盘空间最佳化,先删除无用的TMP文档,做Scandisk,再做Defrag或Speed Disk。请注意:如果最终实际扫描分辨率的设定,高于扫描仪的光学分辨率,则扫描速度会变慢,这是正常现象。
1.网上下载驱动程序并安装,要知道扫描仪的型号,一般扫描仪的型号都在机身的侧面或者正面写着;
2.下载驱动搜索扫描仪驱动程序,点击下载;
3.安装驱动下载完成点击”安装“进行程序安装,点击“Next”;
4.安装完成弹出的窗口点击”finish“,即完成了扫描仪驱动程序的安装;
第一步:下载好驱动程序软件,运行。
第二步:接受安装协议,下一步。
第三步:如下IP地址,下一步。
第四步:找到了设备,下一步。
第五步:等待安装完成,桌面上出现扫描仪的图标。
第六步:打开快捷方式 就可以扫描了。