android 按键

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

android物理按键关键词:android按键矩阵按键AD按键平台信息:内核:linux2.6/linux3.0系统:android/android4.0平台:S5PV310(samsungexynos4210)一、硬件部分:1、矩阵按键、IO按键、AD按键这个知识相对来说比较简单,不过上次真有一个网友不太清楚这个。所以这个基础部分我们在这里也说一下。(1)、矩阵按键记得上大学时学单片机时,这个矩阵按键还是个重点呢,上面的图还是AT89S52的片子,工作原理比较简单,通过行、列来确定是那个按键按下,比如说上图标号为1的键按下,IO(P1.7,P1.3)有电平变化,程序可以通过这里来判断是那一个键按下的,同理标号为2的按键按下IO(P1.4,P1.0)有电平变化。这样做程序上要从两个IO来判断是那个键按下,多了一个步骤,但是在硬件上有一个优势,就是如果按键比较多的时候比较节省IO口,比如说上面4x4=16,8个IO可以做16个按键,8x8=64,16个IO可以做64个按键。优点:可以用少的IO来做多个按键,判断按键比较准确;缺点:程序上相对IO按键来说多了一步。(2)、IO按键这个就比较简单了,用一个IO口的高低电平来判断按键是否按下。优点:程序、硬件电路都比较简单,判断按键比较准确;缺点:IO有限、按键多时不太合适。比如矩阵按键16个IO可以表示64个按键,IO的话只有16个。(3)、AD按键这个在之前在做电视的时候用的比较多一点。AD按键就是通过一个ADC接口,如下图所示,给一个VCC电压,比如说S1接地时AD接口得到的模拟电压值为ADC=0;当S2按下时,ADC=VCC/(R1+R2)*R2;这样就可以得到不同的ADC值,程序中在这里判断是那个按键按下。优点:程序、硬件电路都比较简单,一个IO可以做多个按键;缺点:AD按键有时候判断不准确,所以在程序中要多加检测AD值的次数。2、S5PV310的矩阵按键硬件原理图如下:硬件接口说明:vol+,vol-,back,home,menu为1*5的矩阵键盘,芯片接口信息如下:行XGNSS_GPIO_3/KP_COL3XGNSS_GPIO_4/KP_COL4XGNSS_GPIO_5/KP_COL5XGNSS_GPIO_6/KP_COL6XGNSS_GPIO_7/KP_COL7列XEINT17/KP_ROW1我们这里1*5=5也没有节省多少IO呀?情况是这样的,我们的原理图是从三星开发板上参考过来的,开发板上按键本来多一点,可是我们用不了那么多,人家那样做比较合理。可是我们“偷懒”,硬件上不用改,软件上也不用改,从这一点也可以看出我们国内做技术这个行业的有点……不太深入呀,整天老板在催,可是我们在细节上做不太好呀。三星在IO矩阵也有专用接口,所以就“奢侈”一次,用1*5的矩阵来实现5个按键。3、S5PV310的矩阵按键接口看一下芯片上的专用接口,如下图,全用的话有点多。关于专用接口的寄存器,这些寄存器我们后面要用得到的,按键的行、列信息会在这里面暂存的。以S5PV310为例,驱动代码:samsung-keypad.c软件部分:总体流程图如下,这个是在触摸屏基础上改过来的,感觉流程都是这个样子的。中断触发,中断处理。一、矩阵键行、列设定,和上报键值设定在android-kernel-samsung-dev/arch/arm/mach-exynos/mach-smdkv310.c中[cpp]viewplaincopy1.staticuint32_tsmdkv310_keymap[]__initdata={2./*KEY(row,col,keycode)*/3.KEY(0,3,KEY_1),KEY(0,4,KEY_2),KEY(0,5,KEY_3),4.KEY(0,6,KEY_4),KEY(0,7,KEY_5),5.KEY(1,3,KEY_A),KEY(1,4,KEY_C),KEY(1,5,KEY_E),6.KEY(1,6,KEY_B),KEY(1,7,KEY_D)//(1)、键值初始化;7.};8.9.staticstructmatrix_keymap_datasmdkv310_keymap_data__initdata={10..keymap=smdkv310_keymap,11..keymap_size=ARRAY_SIZE(smdkv310_keymap),12.};13.staticstructsamsung_keypad_platdatasmdkv310_keypad_data__initdata={14..keymap_data=&smdkv310_keymap_data,15..rows=2,//(2)、行、列设定,8行、2列,其实我们只用了5行、1列;16..cols=8,17.};18.staticvoid__initsmdkv310_machine_init(void)19.{20.samsung_keypad_set_platdata(&smdkv310_keypad_data);//(3)、平台设备初始化;21.}(1)、KEY(row,col,keycode)KEY这个宏在android-kernel-samsung-dev/include/linux/input/Matrix_keypad.h中实现:[cpp]viewplaincopy1.#defineMATRIX_MAX_ROWS322.#defineMATRIX_MAX_COLS323.#defineKEY(row,col,val)((((row)&(MATRIX_MAX_ROWS-1))24)|\4.(((col)&(MATRIX_MAX_COLS-1))16)|\5.((val)&0xffff))keycode的值在android-kernel-samsung-dev/include/linux/input.h中有定义,如下:[cpp]viewplaincopy1.#defineKEY_RESERVED02.#defineKEY_ESC13.#defineKEY_124.#defineKEY_235.#defineKEY_346.#defineKEY_457.#defineKEY_568.#defineKEY_679.#defineKEY_7810.#defineKEY_8911.#defineKEY_91012.#defineKEY_01113.#defineKEY_MINUS1214.#defineKEY_EQUAL1315.#defineKEY_BACKSPACE1416.#defineKEY_TAB1517.#defineKEY_Q1618.#defineKEY_W1719.#defineKEY_E1820.#defineKEY_R1921.#defineKEY_T2022.#defineKEY_Y2123.#defineKEY_U22(2)、行列设定;[cpp]viewplaincopy1..rows=2,2..cols=8,(3)、平台设备初始化;[cpp]viewplaincopy1.samsung_keypad_set_platdata(&smdkv310_keypad_data)。二、上面设定的keycode键值和上层相对应4.0.3_r1/device/samsung/smdkv310/samsung-keypad.kl中[cpp]viewplaincopy1.key2DPAD_UPWAKE_DROPPED2.key3DPAD_CENTERWAKE_DROPPED3.key4DPAD_DOWNWAKE_DROPPED4.key5DPAD_RIGHTWAKE_DROPPED5.key6DPAD_LEFTWAKE_DROPPED6.key18VOLUME_DOWNWAKE7.key30HOMEWAKE_DROPPED8.key32MENUWAKE_DROPPED9.key46VOLUME_UPWAKE10.key48BACKWAKE_DROPPED11.key10POWERWAKE总体对应图:以KEY_A为例,KEY_A30最终和上层的keypad.kl中的30HOME相对应三、矩阵键盘驱动程序分析android-kernel-samsung-dev/drivers/input/keyboard/samsung-keypad.c1、probe函数分析:[cpp]viewplaincopy1.staticint__devinitsamsung_keypad_probe(structplatform_device*pdev)2.{3.conststructsamsung_keypad_platdata*pdata;4.conststructmatrix_keymap_data*keymap_data;5.structsamsung_keypad*keypad;6.structresource*res;7.structinput_dev*input_dev;8.unsignedintrow_shift;9.unsignedintkeymap_size;10.interror;11.………………12.keymap_size=(pdata-rowsrow_shift)*sizeof(keypad-keycodes[0]);13.14.keypad=kzalloc(sizeof(*keypad)+keymap_size,GFP_KERNEL);15.input_dev=input_allocate_device();16.if(!keypad||!input_dev){17.error=-ENOMEM;18.gotoerr_free_mem;19.}20.21.res=platform_get_resource(pdev,IORESOURCE_MEM,0);22.if(!res){23.error=-ENODEV;24.gotoerr_free_mem;25.}26.27.keypad-base=ioremap(res-start,resource_size(res));28.if(!keypad-base){29.error=-EBUSY;30.gotoerr_free_mem;31.}32.…………33.//(1)、input参数初始化;34.keypad-input_dev=input_dev;35.keypad-row_shift=row_shift;36.keypad-rows=pdata-rows;37.keypad-cols=pdata-cols;38.init_waitqueue_head(&keypad-wait);39.40.input_dev-name=pdev-name;41.input_dev-id.bustype=BUS_HOST;42.input_dev-dev.parent=&pdev-dev;43.input_set_drvdata(input_dev,keypad);44.//(2)、打开、关闭函数;45.input_dev-open=samsung_keypad_open;46.input_dev-close=samsung_keypad_close;47.48.input_dev-evbit[0]=BIT_MASK(EV_KEY);49.if(!pdata-no_autorepeat)50.input_dev-evbit[0]|=BIT_MASK(EV_REP);51.52.input_set_capability(input_dev,EV_MSC,MSC_SCAN);53.54.input_dev-keycode=keypad-keycodes;55.input_dev-keycodesize=sizeof(keypad-keycodes[0]);56.input_dev-

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功