键盘 驱动 linux,linux系统的电脑

大家好,键盘 驱动 linux相信很多的网友都不是很明白,包括linux系统的电脑也是一样,不过没有关系,接下来就来为大家分享关于键盘 驱动 linux和linux系统的电脑的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

Linux下USB驱动详解linux中usb驱动

Linux操作系统已经在各个行业应用非常广泛,本文将详细讨论Linux下USB驱动,以及数据传输过程中涉及到的技术概念。

USB驱动指的是系统的驱动软件,他的作用是将使用者的输入转换成计算机可以识别的信号并进行处理,使用者可以通过接口手柄或者操作键盘等设备与计算机进行通信,USB驱动把系统和使用者之间架起一座桥梁。

Linux中的USB驱动也一样,它负责外设的识别、驱动加载、连接状态记录等功能,让系统可以和外设通信及使用外设功能。

在 Linux系统中,USB驱动分为两个模块:usbcore和 usbfs,它们组成Linux的USB核心,提供所有的USB驱动支持。

USBcore通过一系列的函数和datastructure来支持USB树,并定义 USB的控制和状态转移机制,以及数据传输的异步机制;而 usbfs属于用户空间,它和USBcore配合完成了USB设备的初始化,设备管理和设备配置的工作,其机制如下图:

图 1 Linux的 USB驱动工作流程示意图

常用的usbcore函数主要有:

usb_register():对USB设备进行初始化,注册usbcore设备。

usb_deregister():将usbcore设备注销掉,处理USB设备移除时的正确操作。

usb_alloc_urb():动态分配urb缓冲区,用来传输USB控制和数据报文。

usb_submit_urb():把urb报文传到USB设备驱动模块中去,实现数据传输。

usb_read():从USB设备读取数据。

usb_write():向USB设备写入数据。

usb_bulk_msg():应用程序发送和接收USB数据报文。

数据传输过程中,USB还采用了如下协议:

1. USB设备认证协议(USB Device Authentication Protocol)

2. USB设备识别协议(USB Device Enumeration Protocol)

3. USB设备数据传输协议(USB Device Data Transfer Protocol)

4. USB设备管理协议(USB Device Management Protocol)

以上就是Linux下USB驱动和USB通信协议的基础概念,它们对USB的通信是至关重要的,是使用USB设备的前提。本文的介绍仅作为对Linux下的USB驱动和USB数据传输机制的简单了解,更多内容请关注文章末尾的参考文献。

参考文献:

[1] USB技术基础.(2009, June 16). Retrieved from

[2]西瓜小王子.(2016, May 24). USB接口及其在Linux下的驱动. Retrieved from

linuxvga驱动linuxvga

linux登录黑屏?

答解决方法如下

1、在启动时,GRUB上GRUB引导命令后面加上一个VGA=791,这样进去屏幕分辩率就是1024*768。

kernel(hd0,0)/linuxroot=/dev/ramramdisk_size=65536devfs=mount,allvga=791

initrd(hd0,0)/initrd

boot

2、在黑屏时。按Ctrl+Alt+F2进入另一个shell,运行yast,选择hardware-GraphicsandMonitor,里面有两个选项,第一个是text模式,第二个是图形模式,还有change和reprobe选项,但change选项是用不了的(如果你能用就最好不过了。直接更改属性,把分辨率调低点,accept,退出重启就行了),这时候先切换成为text模式,退出重启;重启后应该还是用不了的,再次按Ctrl+Alt+F2进入控制台,运行yast,此时再在上述的选项处进行change就OK了

3、在黑屏时,按ctrl+alt+F2进入控制台。直接输入init3。然后输入init5

4、GRUB4DOS

好多人多系统启动SUSE喜欢用它引导SUSE。

编辑menu.lst

kernel(hdx,y)/linuxvga=791

initrd(hdx,y)/initrd

boot

5、修改xorg.conf

按ctrl+alt+F2进入shell

#vi/etc/x11/xorg.conf

section“Monitor”

HorizSync31.5-70.0

VertRefresh50.0-100.0

Linux系统的图形界面的形式有哪几种?

1.XWindowXWindow是由麻省理工学院(MIT)推出的窗口系统,简称X,它旨在建立不依赖于特定硬件系统的图形和文字显示窗口系统的标准。

1987年9月,MIT推出了X系统的11版,称为X11,它的出现标志着计算机工作站的一个新时代的到来。现在几乎所有的工作站都采用了X窗口的标准,几乎所有的工作站上的应用软件都采用了基于XWindow的软件平台。同时,微机的X系统也日益增多。X窗口系统之所以能受到人们的广泛青睐,是与其优越的特点分不开的。首先,它不依赖与硬件系统的特点,使我们在任意一种计算机上用X系统开发的图形软件,可以不需任何修改或只需极少改动就能移植到几十种其它类型的计算机上。其次,X是一种基于网络的窗口系统,采用X的应用软件可以在由不同机器组成的网络上运行。我们能方便地在远程计算机上运行软件,而将结果显示到本机上。2.SVGALibSVGALib是Linux上底层的图形库,也是Linux系统中最早出现的非X图形支持库,它支持标准的VGA图形模式和一些其他的模式,SVGALib的缺点是程序必须以root权限登录,并且它是基于图形卡的,所以不是所有的硬件都支持它。自从framebuffer这个孪生姐妹诞生后,许多软件由只支持SVGALib改变为同时支持两者,甚至一些流行的高层函数库如QT和GTK只支持Framebuffer,作为一个老的图形支持库,SVGALib目前的应用范围越来越小,尤其是在Linux内核增加了FrameBuffer驱动支持之后。3.FrameBufferFrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。该驱动程序的设备文件一般是/dev/fb0、/dev/fb1等等。4.LibGGIGGI,即GeneralGraphicsInterface,是新一代的图形支持库。GGI的主要功能特性有:可在FrameBuffer,SVGALib,X等设备上运行,在这些设备上是二进制兼容的;在所有平台上提供了一致的输入设备接口,比如鼠标和键盘;与LinuxThreads线程库兼容,接口线程安全;提供异步绘制模式,可提高屏幕刷新速度;提供良好的颜色处理接口;接口简单易用;采用共享库机制,实现底层支持库的动态装载;GGI的主要不足在于安装和配置较为复杂。

小红帽LINUX系统的分辨率怎么调?

XWindow分辨率,开始菜单里“系统设置”——“显示”,先设置“硬件”里的显示器型号,如果没有与实际一致的,就选一个相近的,然后更改分辨率字符控制台更改分辨率:修改/boot/grub/grub.conf,在kernel后加上vga=ask重启后会提示选择显示模式:比如想选择800*600*32的显示模式,输入u回车即可如果以后都想使用此模式,修改/boot/grub/grub.conf,将kernel后的vga=ask改为vga=0x343

如何在Linux系统安装显卡驱动?

给你总结一下吧!

1.先看硬件列表,用lspci,找到VGA那一行,确定型号2.网上找相应型号的驱动并下载3.安装之前,要禁掉X-serveri:方法为:vim/etc/X11/xorg.conf禁掉其中device部分4.重启系统,以root登录5.找到驱动文件,执行:sudosh./*.run(或其他格式)

6.startx启动X-server

Linux系统中USB驱动程序的工作流程详解

1.USB主机

在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。

因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。Linux内核USB核心负责USB驱动管理和协议处理的主要工作。主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。

2.USB设备

Linux内核中USB设备侧驱动程序分为3个层次:UDC驱动程序、Gadget API和Gadget驱动程序。UDC驱动程序直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。当前Gadget API是UDC驱动程序回调函数的简单包装。Gadget驱动程序具体控制USB设备功能的实现,使设备表现出网络连接、打印机或USB Mass Storage等特性,它使用Gadget API控制UDC实现上述功能。Gadget API把下层的UDC驱动程序和上层的Gadget驱动程序隔离开,使得在Linux系统中编写USB设备侧驱动程序时能够把功能的实现和底层通信分离。

3.层次

在USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。USB设备程序绑定到接口上。

对于这四个层次的简单描述如下:

(1)设备通常具有一个或多个的配置

(2)配置经常具有一个或多个的接口

(3)接口没有或具有一个以上的端点

4.端点

USB通信最基本的形式是通过端点(USB端点分中断(Interrupt)、批量(Bulk)、等时(ISO)、控制(Control)四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动执行哪一个驱动程序的Probe。

5.数据结构

(1)USB设备:对应数据结构struct usb_device

(2)配置:struct usb_host_config(任一时刻,只能有一个配置生效)

(3)USB接口:struct usb_interface(USB核心将其传递给USB设备驱动,并由USB设备驱动负责后续的控制。一个USB接口代表一个基本功能,每个USB驱动控制一个接口。所以一个物理上的硬件设备可能需要一个以上的驱动程序。)

(4)端点: struct usb_host_endpoint,它所包含的真实端点信息在另一个结构中:struct usb_endpoint_descriptor(端点描述符,包含所有的USB特定数据)。

6. USB端点分类

USB通讯的最基本形式是通过一个称为端点的东西。一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点))。端点可被看作一个单向的管道。

USB端点有 4种不同类型,分别具有不同的数据传送方式:

(1)控制CONTROL

控制端点被用来控制对USB设备的不同部分访问.通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB设备都有一个控制端点称为端点 0,被 USB核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备.

(2)中断INTERRUPT

每当 USB主机向设备请求数据时,中断端点以固定的速率传送小量的数据。此为USB键盘和鼠标的主要的数据传送方法。它还用以传送数据到USB设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备.

(3)批量BULK

批量端点用以传送大量数据。这些端点通常比中断端点大得多.它们普遍用于不能有任何数据丢失的情况。USB协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包,它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。

(4)等时ISOCHRONOUS

等时端点也批量传送大量数据,但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中,并且更多依赖于保持持续的数据流。如音频和视频设备等等。

控制和批量端点用于异步数据传送,而中断和等时端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据,USB核心为它们保留了相应的带宽。

7. endpoint

C/C++ Code复制内容到剪贴板structusb_host_endpoint{structusb_endpoint_descriptordesc;//端点描述符structlist_headurb_list;//此端点的URB对列,由USB核心维护void*hcpriv;structep_device*ep_dev;/*Forsysfsinfo*/unsignedchar*extra;/*Extradescriptors*/intextralen;intenabled;};

当调用USB设备驱动调用usb_submit_urb提交urb请求时,将调用int usb_hcd_link_urb_to_ep(struct usb_hcd*hcd, struct urb*urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,对应数据结构struct usb_hcd)

8. urb

所有USB通讯均为请求--响应模式,USB设备不会主动向Host发送数据。写数据:USB设备驱动发送urb请求给USB设备,USB设备不需要回数据。读数据:USB设备驱动发送urb请求给USB设备,USB设备需要回数据。

USB设备驱动通过urb和所有的 USB设备通讯。urb用 struct urb结构描述(include/linux/usb.h)。

urb以一种异步的方式同一个特定USB设备的特定端点发送或接受数据。一个 USB设备驱动可根据驱动的需要,分配多个 urb给一个端点或重用单个 urb给多个不同的端点。设备中的每个端点都处理一个 urb队列,所以多个 urb可在队列清空之前被发送到相同的端点。

一个 urb的典型生命循环如下:

(1)被创建;

(2)被分配给一个特定 USB设备的特定端点;

(3)被提交给 USB核心;

(4)被 USB核心提交给特定设备的特定 USB主机控制器驱动;

(5)被 USB主机控制器驱动处理,并传送到设备;

(6)以上操作完成后,USB主机控制器驱动通知 USB设备驱动。

urb也可被提交它的驱动在任何时间取消;如果设备被移除,urb可以被USB核心取消。urb被动态创建并包含一个内部引用计数,使它们可以在最后一个用户释放它们时被自动释放。

8.1提交 urb

一旦 urb被正确地创建并初始化,它就可以提交给 USB核心以发送出到 USB设备.这通过调用函数sb_submit_urb实现.

int usb_submit_urb(struct urb*urb, gfp_t mem_flags);

参数:

struct urb*urb:指向被提交的 urb的指针

gfp_t mem_flags:使用传递给 kmalloc调用同样的参数,用来告诉 USB核心如何及时分配内存缓冲

因为函数 usb_submit_urb可被在任何时候被调用(包括从一个中断上下文), mem_flags变量必须正确设置.根据 usb_submit_urb被调用的时间,只有 3个有效值可用:

GFP_ATOMIC

只要满足以下条件,就应当使用此值:

1)调用者处于一个 urb结束处理例程,中断处理例程,底半部,tasklet或者一个定时器回调函数.

2)调用者持有自旋锁或者读写锁.注意如果正持有一个信号量,这个值不必要.

3) current-state不是 TASK_RUNNING.除非驱动已自己改变 current状态,否则状态应该一直是TASK_RUNNING.

GFP_NOIO

驱动处于块 I/O处理过程中.它还应当用在所有的存储类型的错误处理过程中.

GFP_KERNEL

所有不属于之前提到的其他情况

在 urb被成功提交给 USB核心之后,直到结束处理例程函数被调用前,都不能访问 urb结构的任何成员

8.2 urb结束处理例程

如果 usb_submit_urb被成功调用,并把对 urb的控制权传递给 USB核心,函数返回 0;否则返回一个负的错误代码.如果函数调用成功,当 urb被结束的时候结束处理例程会被调用一次.当这个函数被调用时, USB核心就完成了这个urb,并将它的控制权返回给设备驱动.

只有3种结束urb并调用结束处理例程的情况:

(1)urb被成功发送给设备,且设备返回正确的确认.如果这样, urb中的status变量被设置为 0.

(2)发生错误,错误值记录在 urb结构中的 status变量.

(3)urb从 USB核心unlink.这发生在要么当驱动通过调用 usb_unlink_urb或者 usb_kill_urb告知 USB核心取消一个已提交的 urb,或者在一个 urb已经被提交给它时设备从系统中去除.

9.探测和断开

在 struct usb_driver结构中,有 2个 USB核心在适当的时候调用的函数:

(1)当设备插入时,如果 USB核心认为这个驱动可以处理(USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序),则调用探测(probe)函数,探测函数检查传递给它的设备信息,并判断驱动是否真正合适这个设备.

(2)由于某些原因,设备被移除或驱动不再控制设备时,调用断开(disconnect)函数,做适当清理.

探测和断开回调函数都在USB集线器内核线程上下文中被调用,因此它们休眠是合法的.为了缩短 USB探测时间,大部分工作尽可能在设备打开时完成.这是因为 USB核心是在一个线程中处理 USB设备的添加和移除,因此任何慢设备驱动都可能使 USB设备探测时间变长。

9.1探测函数分析

在探测回调函数中, USB设备驱动应当初始化它可能用来管理 USB设备的所有本地结构并保存所有需要的设备信息到本地结构,因为在此时做这些通常更容易.为了和设备通讯,USB驱动通常要探测设备的端点地址和缓冲大小.

PS:Linux USB驱动相关细节知识补充

1.在usb_fill_bulk_urb,usb_fill_int_urb,usb_fill_control_urb都需要指定回调函数,当此URB请求完成时,usb core回调用此函数。

注意:urb回调函数是在中断上下文运行,因此它不应做任何内存分配,持有任何信号量,或任何可导致进程休眠的事情.如果从回调中提交 urb并需要分配新内存块,需使用 GFP_ATOMIC标志来告知 USB核心不要休眠.

2. urb封装函数:

(1)int usb_bulk_msg(struct usb_device*usb_dev,unsigned int pipe,void*data, int len, int*actual_length,int timeout)

功能:创建批量 urb并发送到指定的设备,接着在返回之前等待完成.

参数:

struct usb_device*usb_dev:目标 USB设备指针

unsigned int pipe:目标 USB设备的特定端点.必须使用特定的宏创建.

void*data:如果是 OUT端点,指向要发送到设备的数据的指针.如果是 IN端点,这是从设备读取的数据的缓冲区指针.

int len: data参数指向的缓冲的长度

int*actual_length:指向函数放置真实字节数的指针,根据端点方向,这些字节要么是被发送到设备的,要么是从设备中读取的.

int timeout:时钟嘀哒数,应等待的时间.如果为 0,函数永远等待操作完成.

返回值:成功返回0,actual_length参数包含被传送或从设备中读取的字节数.否则返回负的错误值.

(2)int usb_control_msg(struct usb_device*dev, unsigned int pipe, __u8 request,__u8 requesttype, __u16 value, __u16 index,void*data, __u16 size,int timeout)

功能:创建控制 urb并发送到指定的设备,接着在返回之前等待完成.

参数:

struct usb_device*usb_dev:目标 USB设备指针

unsigned int pipe:目标 USB设备的特定端点.必须使用特定的宏创建.

__u8 request:控制消息的 USB请求值.

__u8 requesttype:控制消息的 USB请求类型.

__u16 value:控制消息的 USB消息值.

__u16 index:控制消息的 USB消息索引值.

void*data:如果是 OUT端点,指向要发送到设备的数据的指针.如果是 IN端点,这是从设备读取的数据的缓冲区指针.

__u16 size: data参数指向的缓冲的长度

int timeout:时钟嘀哒数,应等待的时间.如果为 0,函数永远等待操作完成.

返回值:成功返回被传送到或从设备读取的字节数.否则返回负的错误值.

(3)int usb_interrupt_msg(struct usb_device*usb_dev, unsigned int pipe,void*data,int len, int*actual_length,int timeout)

功能:创建中断 urb并发送到指定的设备,接着在返回之前等待完成.其实就是usb_bulk_msg的包装,所有参数和usb_bulk_msg一样使用

阅读剩余
THE END