input子系统分析:1. 概述及主要数据结构分析

一、概述

1. input子系统是什么?
    input子系统是linux用来管理不同类型、不同原理、不同的输入信息的众多输入设备的系统
    
    这边要注意,input子系统只支持字符流的输入设备,并不支持如lcm、camera等非字符流的设备
    
    input子系统支持的常见设备有:键盘、鼠标、触摸屏、游戏手柄、sensor、按键
    
linux中有很多个子系统:平台总线,input子系统,i2c子系统等。为了使代码复用,且简洁统一,均分成三层

input子系统分层:
    input handler层  
      
    input 核心层  
      
    input driver层  

2. input子系统有什么作用?

假设没有input子系统,输入设备要传递数据到应用层,驱动工程师必须实现以下操作步骤:
    1. register_chrdev_region()    // 申请设备号
    2. cdev_init()                // malloc一个字符设备cdev,初始化,并实现fops
    3. cdev_add();                // 注册一个cdev
    4. class_create();             // 创建类
    5. device_create();            // 创建设备节点
    6. request_irq();             // 硬件初始化,并注册中断(并非所有设备都需要中断)
    7. init_waitqueue_head(&mywq_head);    // 实现阻塞
    8. copy_to_user()            // 在中断处理函数中,将数据    
以上有一些步骤是通用的,input子系统将通用步骤提取出来,并统一实现

采用input子系统后,步骤大大化简,驱动工程师仅需要实现上面的第7步,其他步骤都由input子系统完成

二、input子系统中主要数据结构

struct input_event {
	struct timeval time; 	// 时间戳
	__u16 type; 			// 数据类型 如EV_ABS
	__u16 code;				// 具体数据 如ABS_MT_POSITION_X
	__s32 value;			// 值 如tp的横坐标
};

struct input_dev {
	const char *name; // sysfs中给用户看的信息
	const char *phys;
	const char *uniq;
	struct input_id id;
	//evbit实际是一个位表,描述输入设备能够产生什么类型数据
	unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; // EV_KEY,EV_ABS, EV_REL
	//表示能够产生哪种按键
	unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//KEY_POWER.. 能够表示768bit,直接用24个long来表示
							 // KEY_CNT == 768   BITS_TO_LONGS== nr/32 = 768/32==24
	//表示能够产生哪种相对坐标数据
	unsigned long relbit[BITS_TO_LONGS(REL_CNT)];// REL_X
	//表示能够产生哪种绝对坐标数据
	unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //ABS_X
	unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
	unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
	unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
	unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
	unsigned long swbit[BITS_TO_LONGS(SW_CNT)];

	struct device dev; // 继承device对象

	struct list_head	h_list;
	struct list_head	node; //表示节点
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值