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 */


发布评论