1.input设备支持的event及解释
关键结构体input_event信息:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
#define EV_SYN
0x00
表示设备支持所有的事件
#define EV_KEY
0x01
键盘或者按键,表示一个键码
#define EV_REL
0x02
鼠标设备,表示一个相对的光标位置结果
#define EV_ABS
0x03
手写板产生的值,其是一个绝对整数值
#define EV_MSC
0x04
其他类型
#define EV_LED
0x11
LED灯设备
#define EV_SND
0x12
蜂鸣器,输入声音
#define EV_REP
0x14
允许重复按键类型
#define EV_PWR
0x16
电源管理事件
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
2.底层驱动
static int __devinit xxx_probe(struct platform_device *pdev)
{
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
struct input_dev *input;
int i, error;
input = input_allocate_device();//申请input_dev结构
if (!input)
return -ENOMEM;
platform_set_drvdata(pdev, input);//把input_dev结构放好(以后方便调用)
input->evbit[0] = BIT(EV_KEY);//目前event的类型不操作32,所以你会看到对于evbit数组的操作都是对evbit[0]中的位来进行操作.
input->name = pdev->name; //input 设备名
input->phys = "gpio-keys/input0";
input->dev.parent = &pdev->dev;
input->id.bustype = BUS_HOST;
input->id.vendor = 0x0001;
input->id.product = 0x0001;
input->id.version = 0x0100;
//vendor,product,version: 厂商号,产品号,版本号
error = input_register_device(input);//注册输入设备,并和对应的handler处理函数挂钩
if (error) {
printk(KERN_ERR "Unable to register gpio-keys input device\n");
goto fail;
}
return 0;
fail:
input_free_device(input); //如果注册失败的话就注销input设备,释放已分配的input结构体
return error;
}