虚拟键盘、虚拟鼠标驱动
模拟键盘鼠标

Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
参数wCode 表示待转换的码,参数wMapType 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType 设置为0,如果是虚拟扫描码转虚拟码,则wMapType 设置为1,如果是虚拟码转ASCII码,则wMapType 设置为2.相信有了这些,我们就可以构造键盘事件的lParam参数了。下面给出一个构造lParam参数的函数:
WM_KEYUP 表示一个普通键被释放
WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如下:
USB模拟鼠标与键盘使用说明

第一章使用说明1.1 功能简介本例程是用实验板来模拟鼠标或键盘,即将相关程序下载到单片机,并将学习板与电脑通过U口连接后,本学习板可以当作U口的鼠标或者键盘来用。
其中能够模拟实现的鼠标功能为:鼠标左移、右移、上移、下移,鼠标左键按下和右键按下。
能够模拟实现的键盘功能为:数字1和2的键入、SHIFT和ALT功能键的键入、大小写切换和小键盘数字键功能的键入。
本例程共用到学习板上的六个按键,位于矩阵键盘左上角的S6、S7、S10、S11、S14和S15。
1.2鼠标的信息说明将UsbMouse.hex文件下载到单片机中,且之后保证USB1口(位于学习板左上方)与电脑的U口处于连接状态(USB1口即为TX-1C开发板的U口)。
稍等片刻,便会先后在电脑屏幕的右下角出现下面两个提示(此提示只在第一次安装时出现):图1.1 系统发现新硬件提示图1.2安装成功提示右键单击“我的电脑”,选中“管理”项,点击并进入,在其左侧的项目栏里点击“设备管理器”,便会发现其中多了如下一个设备,也就是我们的TX-1C开发板所模拟的鼠标,如图1.3所示。
图1.3 设备描述显示双击“USB人体学输入设备”,会弹出如图1.4和图1.5的属性描述图1.4 属性描述---常规选项卡图1.5 属性描述---详细信息选项卡1.3 鼠标的使用说明在使用USB模拟鼠标与键盘功能之前,请确保将芯片PDIUSBD12左侧的两根插针用跳帽连接起来(这两根跳帽是用于芯片PDIUSBD12向单片机发出中断的连接线)!!!总共使用到的矩阵键盘中的六个按键的功能分别如表1.1所示据此,面上实验一下,体会自制鼠标的乐趣。
1.4 键盘的相关说明将文件夹“键盘实例”中的UsbKeyboard.hex文件下载到单片机中,并通过USB 线将TX-1C学习板与电脑U口连接后,同样会出现如图1.1.、图1.2类似的安装信息(也是在第一次安装时提示,以后都不再提示,除非更改程序中的相关设备描述信息,让电脑以为是一个以前从未连接过的设备连接了。
电脑键盘键位错乱的解决方法与技巧

电脑键盘键位错乱的解决方法与技巧在日常使用电脑的过程中,我们经常会遇到键盘键位错乱的问题,这不仅会影响我们的工作效率,还会带来一定的困扰。
那么,如何解决键盘键位错乱的问题呢?下面就来分享一些解决方法与技巧。
一、清洁键盘键盘是我们使用最频繁的电脑配件之一,长时间使用后,键盘上会积累许多灰尘和污垢,导致键位错乱。
因此,定期清洁键盘是解决问题的第一步。
可以使用专业的键盘清洁剂或者棉签蘸取适量的酒精进行清洁,记得先关机,避免液体进入键盘内部。
二、更换键帽如果键盘键位错乱问题仅出现在某几个键位上,可能是键帽损坏导致的。
键帽是键盘上的覆盖物,经常受到按压和摩擦,容易磨损或松动。
此时,我们可以尝试更换这些键帽。
一般来说,键帽可以轻松拆卸,可以在电脑配件店或者在线商城购买相应的键帽进行更换。
三、检查键盘设置有时候,键位错乱的问题可能是由于键盘设置错误导致的。
在Windows系统中,可以通过控制面板中的“区域和语言”选项进行键盘设置。
确保选择正确的键盘布局和输入语言,以避免键位错乱的问题。
此外,还可以尝试在设置中切换输入法,重新安装或更新键盘驱动程序。
四、使用虚拟键盘如果键盘键位错乱问题无法通过上述方法解决,我们可以尝试使用虚拟键盘。
虚拟键盘是一种通过鼠标点击来模拟键盘输入的工具,可以在操作系统中找到。
通过使用虚拟键盘,我们可以绕过键盘键位错乱的问题,继续进行工作或者操作。
虽然虚拟键盘可能不如实体键盘方便,但在紧急情况下,它是一个可行的替代方案。
五、更换键盘如果以上方法都无法解决键盘键位错乱的问题,那么可能是键盘硬件本身出现故障。
在这种情况下,我们需要考虑更换键盘。
可以选择购买一个新的键盘,确保选择质量可靠的品牌和型号。
另外,如果你使用的是笔记本电脑,也可以考虑外接键盘,这样可以方便地解决键位错乱的问题。
总结起来,电脑键盘键位错乱是一个常见的问题,但通过一些简单的方法和技巧,我们可以轻松解决。
定期清洁键盘、更换键帽、检查键盘设置、使用虚拟键盘以及更换键盘等方法都可以帮助我们解决键位错乱的问题。
驱动级python模拟键盘输入

驱动级python模拟键盘输入你可能感兴趣的资源PC键盘测试SCANCO DE值程序KEYTEST.EXE 可在WINDOW S下运行,在纯DOS下可测WIN 键。
都支持WIN扩展键和音量+-,支持KEY按下和松开,支持连发键,Fn功能键,显示SCANCO DE值,方便EC开发。
用于测试笔记本按键。
Python实现window s下模拟按键和鼠标点击的方法主要介绍了Python实现window s下模拟按键和鼠标点击的方法,涉及Python模拟实现鼠标及键盘事件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下python操作鼠标python操作鼠标正常安装会抱错可以用这个进行操控from py mouse import Py Mouse from py keyboard import Py Keyboard 安装命令进入文件夹python setup.py installpython驱动模拟按键.py驱动级别的模拟按键,需要先安装win io才可以运行。
可以制作任何脚本...python模拟鼠标点击脚本,python鼠标点击脚本-其它代码类资源...click_模拟键盘_python_源码使用python脚本来模拟鼠标键盘的行为,模拟按键,可实现按键精灵的功能。
python+rabird.win io实现驱动级模拟按键利用python+rabird.win io模块实现驱动级模拟按键,可以做任何游戏脚本,驱动级基本没办法被检测。
其中...python+rabird.win io模块实现驱动级模拟按键(可用于做游戏脚本)python+rabird.win io模块实现驱动级模拟按键(可用于做游戏脚本),驱动级基本没办法被检测。
注意电脑需要安装win io驱动才可以运行。
python+rabird.win io实现驱动级模拟按键利用python+rabird.win io模块实现驱动级模拟按键,可以做任何游戏脚本,驱动级基本没办法被检测。
鼠标失灵怎么办?win7利用键盘模拟鼠标操作的教程

⿏标失灵怎么办?win7利⽤键盘模拟⿏标操作的教程
有时候⿏标突然失灵了,但是还有重要的事情没有完成,需要⽤到⿏标,现在教⼤家如何在没有⿏标的时候设置键盘模拟⿏标1、⾸先按 Win 徽标键,打开桌⾯的开始菜单。
⽤⽅向键选择开始菜单右边的“控制⾯板”选项,点击打开“控制⾯板”。
2、在控制⾯板中⽤⽅向键选择 “轻松访问中⼼”按回车键打开选项
3、⽤⽅向键选择“使⿏标易于使⽤”选项按回车
4、要想设置⿏标键选项可按Alt+Y 打开,⽤Table键进⾏选项间的切换。
最后切换到确定按回车执⾏。
5、最后⽤⽅向键选择 “启⽤⿏标键”按Alt+M键选中复选框
6、按Alt+O进⾏确定,此时设置完毕后会看到桌⾯右下⾓出现了⿏标图案
7、设置成功后可以⽤数字键盘区控制⿏标了。
按下Ctrl+数字键可以加速移动⿏标哦。
注意事项:
1、使⽤⼩键盘模拟⿏标时,默认在NUM灯灭的情况下,⾃⾏设置的除外。
2、4对应左,8对应上,6对应右,2对应下,5对应⿏标右键,回车对应⿏标左键。
3、Ctrl加速,Shift减速。
通过蓝牙HID将安卓手机模拟成鼠标和键盘

通过蓝⽛HID将安卓⼿机模拟成⿏标和键盘⼀直以来就有⼀种想法,就是⾃⼰写⼀个APP将安卓⼿机模拟成⿏标/键盘,应急的时候可以⽤来代替⿏标/键盘。
之前也在国内外的⽹站上找了各种⽅案,但是这些⽅案不是很好,直到⾕歌发布的API28后终于有了很好的解决⽅案。
为了实现这个想法也⾛了不少弯路,也许⽅法不对吧,但看到最终完美运⾏的APP,⼼中还是很有成就感的。
经测试装了此APP的⼿机能与⼏乎所有安卓⼿机、WIN10笔记本电脑连接并操作,苹果设备需要IOS13及以上版本才能⽀持蓝⽛⿏标/键盘。
苹果系统下⿏标功能正常,键盘输⼊⽂字没问题,但是其它功能键(如:Win,Menu,PageUp/Down,上下左右键...)则没什么作⽤。
BluetoothHidDeviceandroid.bluetooth.BluetoothHidDevice是完成任务的核⼼类。
通过它将我们的应⽤注册成具有HID特征的蓝⽛设备,并传送HID设备的报告描述符。
如果我们的报告描述符没有问题,那么我们的设备就会成功模拟想要的HID设备。
码砖思路1. ⾸先将我们的应⽤注册为HID设备;BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, mProfileServiceListener,BluetoothProfile.HID_DEVICE);public static BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceDisconnected(int profile) { }@SuppressLint("NewApi") @Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {bluetoothProfile = proxy;if (profile == BluetoothProfile.HID_DEVICE) {HidDevice = (BluetoothHidDevice) proxy;HidConsts.HidDevice = HidDevice;BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(, HidConsts.DESCRIPTION, HidConsts.PROVIDER,BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor); HidDevice.registerApp(sdp, null, null, Executors.newCachedThreadPool(), mCallback);}}};public static final BluetoothHidDevice.Callback mCallback = new BluetoothHidDevice.Callback() {@Overridepublic void onAppStatusChanged(BluetoothDevice pluggedDevice, boolean registered) { }@Overridepublic void onConnectionStateChanged(BluetoothDevice device, int state) {if(state == BluetoothProfile.STATE_DISCONNECTED){HidUitls.IsConnected(false);if(connectionStateChangeListener != null){connectionStateChangeListener.onDisConnected();}}else if(state == BluetoothProfile.STATE_CONNECTED){HidUitls.IsConnected(true);if(connectionStateChangeListener != null){connectionStateChangeListener.onConnected();}}else if(state == BluetoothProfile.STATE_CONNECTING){if(connectionStateChangeListener != null){connectionStateChangeListener.onConnecting();}}}};2. 然后判断想要连接的蓝⽛设备有没有配对过(双⽅都要配对好),如果没有配对则需要建⽴配对;public static boolean Pair(String deviceAddress){if(BluetoothAdapter.checkBluetoothAddress(deviceAddress)){try {mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if(BtDevice == null){BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress);}if(BtDevice.getBondState() == BluetoothDevice.BOND_NONE){BtDevice.createBond();return false;}else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDED){return true;}else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDING){return false;}}catch (Exception ex){ ex.printStackTrace(); }}return false;}3. 配对完成后获取蓝⽛设备的MAC地址,⽤MAC地址连接⽬标设备;public static boolean Connect(String deviceAddress){if(TextUtils.isEmpty(deviceAddress)){return false;}mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if(BtDevice == null){BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress);}boolean ret = HidDevice.connect(BtDevice);return ret;}在⿏标键盘的基础上新增多媒体控制功能,媒体控制包含7个功能,分别是:上⼀⾸、下⼀⾸、⾳量+、⾳量-,停⽌播放、播放/暂停、静⾳。
一台电脑变多台——BeTwin 2.0.0.419 破解版+虚拟驱动+安装说明[转]
![一台电脑变多台——BeTwin 2.0.0.419 破解版+虚拟驱动+安装说明[转]](https://img.taocdn.com/s3/m/646ec27e27284b73f242504f.png)
如果你还在为和家人抢电脑而发愁?在你游戏的关键时刻家人突然过来要收菜、要聊天,怎么办?难道要再添置一台电脑?想不想让一台电脑变两台或者多台呢?现在只要再添加一台显示器、USB键盘、鼠标,就可以把一台电脑变成两台或最多5台电脑了。
什么软件这么厉害呢?下面Yongd给大家简单介绍下这款软件:Betwin是PC虚拟终端软件,可让一台PC带动多台性能相当的终端,多人可同时,独立地使用一台PC机。
BeTwin是一套基于WINDOWS的系统软件,BeTwin在一台运行2000/xp(包含win2000专业版/服务器版和winxp家庭版/服务器版最新有vista的版本)的PC内建立多个虚拟终端环境,用户只需加入显示器、显示卡、键盘、鼠标、音箱(可选)即可得到多个和主机性能相当的WINDOWS终端。
BeTwin 允许一台PC最多可添加四个终端用户。
BeTwin主机和终端用户可同时、独立地共享一台PC计算机的硬、软件(包括绝大多数单机、加密软件)及外设资源。
并可一人上网,多人同时独自冲浪。
BeTwin软件可为每个添加用户建立一个新的“虚拟计算机环境”。
“虚拟计算机”与单机的性能一样,事实上,他们共享单机的处理器、内存、硬盘和其他外设。
压缩包里提供了BeTwin破解版及详尽的安装、设置说明,菜鸟或小鸟都能照图安装,灰常简单。
软件亮点:对于已购置电脑的用户来说,最多只要再添加一台显示器、一块显卡、USB键盘、鼠标,可以把一台电脑变成两台电脑(最多5台)。
每台计算机可以独立操作,只需要一台主机!显卡方面:“AGP显卡+ PCI显卡” “双头VGA显卡” “VGA+DVI(接2台显示器需要装一个DVI转VGA转接头)” “双PCI-E” “集成显卡+AGP或PCI” 都可以做。
安装演示:一、连接好硬件1.将显示器接到显卡的第二个VGA端口,插好U好人键盘和U好人鼠标。
进入系统以后系统会检测到多个监视器、鼠标和键盘。
晃动U好人鼠标,确保光标能够移动。
如何解决电脑键盘按键失灵的问题

如何解决电脑键盘按键失灵的问题电脑键盘是我们日常工作和学习中必不可少的工具之一,然而有时候我们会遇到键盘按键失灵的问题。
这不仅会影响我们的工作效率,还会给我们带来许多困扰。
那么,我们该如何解决电脑键盘按键失灵的问题呢?本文将为您详细介绍几种常见的解决方法。
一、常规检查与清洁当键盘出现按键失灵的情况时,我们首先可以进行常规检查与清洁。
首先,检查键盘是否连接稳固,如果连接不良,可以重新插拔一下键盘接口。
其次,检查键盘线缆是否有损坏,如有需要更换。
然后,我们可以将键盘翻过来,轻轻拍打键盘背面,以清除可能存在的灰尘、污垢或碎屑。
最后,我们可以使用清洁剂或专业键盘清洁器对键盘进行彻底的清洁。
二、更新或更换键盘驱动程序在某些情况下,键盘按键失灵可能是由于驱动程序的问题所致。
我们可以尝试更新或重新安装键盘驱动程序来解决这个问题。
首先,我们可以在计算机的官方网站或设备制造商的官方网站上下载最新版本的键盘驱动程序,并按照指示进行安装。
如果问题仍然存在,我们可以尝试卸载旧的驱动程序,然后重新启动计算机并自动安装默认键盘驱动程序。
如果以上方法仍然无效,那么我们可能需要考虑更换键盘。
三、检查键盘设置有时候,键盘按键失灵可能是由于误操作或错误的键盘设置引起的。
我们可以打开计算机的控制面板或设置,进入键盘设置界面。
在这里,我们可以检查键盘的默认设置是否正确,例如按键灵敏度和布局等。
如果设置不正确,我们可以进行相应的修改。
四、使用虚拟键盘或外部键盘当键盘按键失灵无法解决时,我们可以考虑使用虚拟键盘或外部键盘作为临时解决方案。
虚拟键盘是一个屏幕上的软件键盘,可以通过鼠标点击来模拟键盘按键。
我们可以通过在计算机的操作系统中搜索虚拟键盘来找到并使用它。
另外,我们也可以连接外部键盘到电脑上,以取代失灵的内置键盘。
总结:当电脑键盘出现按键失灵的问题时,我们可以通过常规检查与清洁、更新或更换键盘驱动程序、检查键盘设置以及使用虚拟键盘或外部键盘等方法来解决。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
虚拟键盘、虚拟鼠标驱动找了这篇文,看对你有没有帮助,另外请联系我QQ634308587 一起研究一下。
一个鼠标驱动程序的分析(/driver/input/mouse/amimouse.c)一:Input设备驱动,(我称为虚拟输入设备)//drivers/input/input.c文件input设备是一种字符设备在模块初始化时创建设备类"input",注册Input字符设备,input的操作函数只有Open函数。
当打开特定设备时才将特定的设备操作函数static struct file_operations input_fops = {.owner = THIS_MODULE,.open = input_open_file,};函数调用如下:“/input/input . c”input_init()//这是虚拟输入设备的入口,既模块加载时调用{class_simple_create(THIS_MODULE,"input");//创建设备类input_proc_init()//创建proc下的文件节点retval = register_chrdev(INPUT_MAJOR, "input", &input_fop s);//注册字符设备驱动程序,在系统字符设备数组中添加一个字符设备,主设备号为INPUT—MAJOR,操作函数集为input_fops,在特殊文件打开时会根据文件的节点结构INODE中的主设备号在系统字符设备数组中搜索主设备号相同的字符设备驱动程序的操作函数集并将此操作函数集付给FILE结构的操作函数集指针f_ops并执行该函数集中的打开操作。
对于本input类设备即为input_fops中的input_open_filedevfs_mk_dir("input")//在设备目录"/dev"下创建devfs文件系统的"input"目录,以后的具体输入设备也将在这个目录下建立特殊设备文件,当打开该特殊文件时即对设备进行操作}当打开具体文件时既执行input_ipen_file此函数会寻到具体设备的文件操作函数集并付给file->f_op(这是一个文件的操作函数集,当系统打开一个文件时即产生一个file结构对该文件的操作都通过file 中的f_opes 如读取即调用FILE->f_op->read等二:输入驱动器,输入驱动器是指一类的输入设备(比如鼠标输入驱动器,键盘输入驱动器等等)这里说的是鼠标输入驱动器。
(我也称之为虚拟鼠标驱动器,因为他并不完成真正的硬件相关的鼠标驱动,真正的硬件IO驱动要在device中完成)他的描述结构是:struct input_handler {void *private;//私有数据void (*event)(struct input_handle *handle, unsigned int type , unsigned int code, int value);//响应输入事件的函数struct input_handle* (*connect)(struct input_handler *handl er, struct input_dev *dev, struct input_device_id *id);//连接设备的函数void (*disconnect)(struct input_handle *handle);//断开设备struct file_operations *fops;//文件操作函数集int minor;//次设备号char *name;//设备名.....};static struct mousedev *mousedev_table[MOUSEDEV_MINO RS];static struct input_handler mousedev_handler = {.event = mousedev_event,//鼠标事件回调函数.connect = mousedev_connect,//连接device.disconnect = mousedev_disconnect,.fops = &mousedev_fops,//文件操作函数集.minor = MOUSEDEV_MINOR_BASE,//次设备号基数.name = "mousedev",//设备名.id_table = mousedev_ids,//本驱动支持的设备ID};他的入口是:“/input/mousedev . c”static int __init mousedev_init(void){input_register_handler(&mousedev_handler);//在虚拟输入设备中注册鼠标输入驱动器memset(&mousedev_mix, 0, sizeof(struct mousedev));INIT_LIST_HEAD(&mousedev_mix.list);init_waitqueue_head(&mousedev_mix.wait);mousedev_table[MOUSEDEV_MIX] = &mousedev_mix;//给设备数组一个默认的鼠标devicemousedev_mix.exist = 1;mousedev_mix.minor = MOUSEDEV_MIX;devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR _BASE + MOUSEDEV_MIX),S_IFCHR|S_IRUGO|S_IWUSR, "input/mice");//建立input/mice 文件class_simple_device_add(input_class, MKDEV(INPUT_MAJOR , MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),NULL, "mice");//在input_class设备类中增加本设备驱动程序printk(KERN_INFO "mice: PS/2 mouse device common for al l mice\n");return 0;}虚拟鼠标设备驱动器就提供了各种操作的操作集函数,如read,write,ioctrl,等static struct file_operations mousedev_fops = {.owner = THIS_MODULE,.read = mousedev_read,.write = mousedev_write,.poll = mousedev_poll,.open = mousedev_open,.release = mousedev_release,.fasync = mousedev_fasync,};“/input/input . c”void input_register_handler(struct input_handler *handler) {struct input_dev *dev;//具体设备描述结构struct input_handle *handle;//设备句柄struct input_device_id *id;//设备IDif (!handler) return;INIT_LIST_HEAD(&handler->h_list);//初始化设备驱动器的链表if (handler->fops != NULL)input_table[handler->minor >> 5] = handler;//把驱动器按次设备号放到驱动器数组里,虚拟设备支持最多8个次设备list_add_tail(&handler->node, &input_handler_list);//加入驱动器链表list_for_each_entry(dev, &input_dev_list, node)if (!handler->blacklist || !input_match_device(handler->black list, dev))if ((id = input_match_device(handler->id_table, dev)))//用当前所有的输入设备于驱动器适配if ((handle = handler->connect(handler, dev, id)))//适配成功与驱动器连接input_link_handle(handle);//连接成功将设备句柄加到设备的句柄链表中}我们先假设注册驱动器时还没有一个输入设备在链表中,即注册时不需要进行驱动器适配。
在后面设备注册时再讲适配连接这样就完成了一个驱动器的注册三,具体设备。
这里完成的是真实与硬件交互的设备程序。
设备的描述结构是input_devstruct input_dev {void *private;//私有数据char *name;//......int (*open)(struct input_dev *dev);void (*close)(struct input_dev *dev);int (*accept)(struct input_dev *dev, struct file *file);int (*flush)(struct input_dev *dev, struct file *file);int (*event)(struct input_dev *dev, unsigned int type, unsign ed int code, int value);int (*upload_effect)(struct input_dev *dev, struct ff_effect *ef fect);int (*erase_effect)(struct input_dev *dev, int effect_id);//都是些回调函数了struct input_handle *grab;//设备句柄struct device *dev;//通用设备结构struct list_head h_list;//句柄链表input_link_handle函数将设备句柄加入到链表中。
dev响应中断时如果没有自己专用的event函数就遍历handle列表找到handle指向的input_handler的evnt函数调用struct list_head node;};struct input_handle {void *private;//私有数据int open;char *name;struct input_dev *dev;//设备struct input_handler *handler;//句柄拥有者驱动器struct list_head d_node;struct list_head h_node;};它的入口是:“/input/mouse/amimouse . c”static int __init amimouse_init(void){if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE)) return -ENODEV;amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);amimouse_dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | B IT(BTN_MIDDLE) | BIT(BTN_RIGHT);amimouse_dev.open = amimouse_open;amimouse_dev.close = amimouse_close;amimouse_ = amimouse_name;amimouse_dev.phys = amimouse_phys;amimouse_dev.id.bustype = BUS_AMIGA;amimouse_dev.id.vendor = 0x0001;amimouse_dev.id.product = 0x0002;amimouse_dev.id.version = 0x0100;input_register_device(&amimouse_dev);//注册设备printk(KERN_INFO "input: %s at joy0dat\n", amimouse_nam e);return 0;}“/input/input . c”void input_register_device(struct input_dev *dev){struct input_handle *handle;struct input_handler *handler;struct input_device_id *id;/** If delay and period are pre-set by the driver, then autorepeating* is handled by the driver itself and we don't do it in input.c.*/init_timer(&dev->timer);//初始化设备的定时器,对鼠标没什么用mousedev里没对他做什么,对键盘有用if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {dev->timer.data = (long) dev;dev->timer.function = input_repeat_key;dev->rep[REP_DELAY] = 250;dev->rep[REP_PERIOD] = 33;}INIT_LIST_HEAD(&dev->h_list);//初始化设备的句柄链表list_add_tail(&dev->node, &input_dev_list);list_for_each_entry(handler, &input_handler_list, node)//遍历驱动器列表if (!handler->blacklist || !input_match_device(handler->black list, dev))if ((id = input_match_device(handler->id_table, dev)))//找到与设备相配的驱动器,用id_table适配if ((handle = handler->connect(handler, dev, id)))//适配成功与驱动器连接// 这里是mouse驱动器mousedev的connect函数是mousedev_connectinput_link_handle(handle);//把Mousedev返回input_handle(注意不是input_handler)加到dev的handle连表中//这样dev响应中断时如果没有自己专用的event函数就遍历handle列表找到handle指向的input_handler的evnt函数调用#ifdef CONFIG_HOTPLUGinput_call_hotplug("add", dev);#endif#ifdef CONFIG_PROC_FSinput_devices_state++;wake_up(&input_devices_poll_wait);#endif}看看驱动器是怎么连接设备的,他申请一个mousedev结构用来保存鼠标设备信息。