2024年4月26日发(作者:)

实验六 input子系统

【实验目的】

 了解input子系统概念,矩阵键盘和触摸屏原理。

利用input子系统实现的键盘驱动和触摸屏驱动,注意两者对比

【实验仪器】

1、装有Ubuntu操作系统的PC机一台;

2、XSBase270 ARM实验开发平台一套

【4×4矩阵键盘驱动代码分析】

1,定义keycode、设备和驱动相关结构体:

tatic unsigned char xsbase270kb_keycode[0x57] = {

[0] = KEY_1,

[1] = KEY_2,

[2] = KEY_3,

[6] = KEY_A,

[0x10] = KEY_4,

[0x11] = KEY_5,

[0x12] = KEY_6,

[0x16] = KEY_B,

[0x20] = KEY_7,

[0x21] = KEY_8,

[0x22] = KEY_9,

[0x26] = KEY_C,

[0x50] = KEY_KPASTERISK,

[0x51] = KEY_0,

[0x52] = KEY_E,

[0x56] = KEY_D,

};

static struct input_dev *xsbsae270_input_dev;

static struct platform_device *xsbase270kb_platform_device;

2,模块初始化函数:

static int __init xsbase270kb_init( void )

{

int i,err;

//初始化input_dev结构体

xsbsae270_input_dev = input_allocate_device();

xsbsae270_input_dev->name = DRIVER_NAME;

xsbsae270_input_dev->e = BUS_HOST;

xsbsae270_input_dev->open = xsbase270kb_open;

xsbsae270_input_dev->close = xsbase270kb_close;

xsbsae270_input_dev->evbit[0] = BIT(EV_KEY);//设置该输入设备使其响应EV_KEY事件

//设置keycode

xsbsae270_input_dev->keycode = xsbase270kb_keycode;

xsbsae270_input_dev->keycodesize = sizeof(unsigned char);

xsbsae270_input_dev->keycodemax = ARRAY_SIZE(xsbase270kb_keycode);

printk(KERN_EMERG"+xsbase270kb_initrn");

//设置该输入设备响应的键

for (i = 0; i < 0x57; i++)

if (xsbase270kb_keycode[i])

set_bit(xsbase270kb_keycode[i], xsbsae270_input_dev->keybit);

//申请中断

err = request_irq (IRQ_KEYPAD, kp_interrupt, IRQF_DISABLED, DRIVER_NAME , NULL);

if (err) {

printk (KERN_CRIT "Wow! Can't register IRQ[%d] for Keypadn", IRQ_KEYPAD);

return -1;

}

//设置IO口

pxa_gpio_mode( 99 | GPIO_ALT_FN_3_IN); /* MKIN5 */

pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN); /* MKIN0 */

pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN); /* MKIN1 */

pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN); /* MKIN2 */

pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT); /* MKOUT0 */

pxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT); /* MKOUT1 */