分类: LINUX
2013-09-23 21:42:44
(1) 修改arch/arm/mach-davinci下的da850.c文件
修改如下:
图2
此处的修改是将GPIO的相关引脚在寄存器中设置为GPIO的接口类型。
每个GPIO引脚所对应的寄存器和其在寄存器中的位置详见TI文档OMAP-L138 Applications Processor System Reference Guide
图3
图4
在图3和图4中,将LCD和VPIF中相应的引脚注释掉,因为此处的定义,与我们测试时候的采用GPIO是相同的寄存器,测试的时候,发现如果不注释掉这些地方,在串口终端中,当按键按下的时候没有数字打印出来。
图5
图6
图5和图6是LCD和VPIF接口的相关引脚,如果不注释掉的话,就会在内核编译的时候出错。
(2) 修改arch/arm/mach-davinci/include/mach/下的mux.h文件,修改如下
图7
在这里添加测试的引脚定义;
图8
图9
图8和图9的修改也是将此处的与GPIO引脚冲突的配置注释掉;
(3) 修改arch/arm/mach-davinci下的board-da850-evm.c文件
在函数da850_evm_init()函数的上方添加如下的代码段:
//===================added by wp 2012.9.22===========================
static struct gpio_keys_button da850_evm_gpio_buttons[] = {
[0] = {
.type = EV_KEY, // EV_KEY=0x01
.active_low = 0,
.wakeup = 0,
.debounce_interval = DA850_KEYS_DEBOUNCE_MS,
.code = KEY_ENTER, //KEY_ENTER=28
.desc = "button1",
.gpio = GPIO_TO_PIN(7,1), // GPIO_TO_PIN(7,1)= 7*16+1=113
},
[1] = {
.type = EV_KEY,
.active_low = 0,
.wakeup = 0,
.debounce_interval = DA850_KEYS_DEBOUNCE_MS,
.code = KEY_DOWN, // KEY_DOWN = 108
.desc = "button2",
.gpio = GPIO_TO_PIN(7,3), // GPIO_TO_PIN(7,3)=7*16+3=115
},
[2] = {
.type = EV_KEY,
.active_low = 0,
.wakeup = 0,
.debounce_interval = DA850_KEYS_DEBOUNCE_MS,
.code = KEY_RIGHT, // KEY_RIGHT =106
.desc = "button3",
.gpio = GPIO_TO_PIN(7,7), // GPIO_TO_PIN(7,7) = 7*16+7=119
},
};
static struct gpio_keys_platform_data da850_evm_gpio_buttons_pdata = {
.buttons = da850_evm_gpio_buttons,
.nbuttons = ARRAY_SIZE(da850_evm_gpio_buttons),
//.poll_interval = DA850_GPIO_KEYS_POLL_MS,
};
static struct platform_device da850_evm_gpio_buttons_device = {
.name = "gpio-keys",
.id = 1,
.dev = {
.platform_data = &da850_evm_gpio_buttons_pdata
},
};
//===============================end======================================
在da850_evm_init()最后添加如下的代码段:
/*used by GPIO buttons ,added by wp 2013.9.22*/
ret = platform_device_register(&da850_evm_gpio_buttons_device);
if (ret)
pr_warning("da850_evm_init: GPIO buttons init "
" failed: %d\n", ret);
该处的作用是注册设备。
(4)编译内核
在编译内核的时候注意选择如下的选项
Device Drivers ——————>
Input device support --->
[*] Keyboards --->
<*> GPIO Buttons
这样可以保证我们的驱动程序gpio_keys.c编译到内核。
(5)内核的下载过程略去;
(6)在内核的启动过程中我们可以看到如下启动信息;
图10
图10 表明该驱动成功的编译进内核,在内核中注册成功。
(7)测试代码
测试代码如何编译和拷贝到文件系统中见测试代码文件夹中的README
现在将测试结果贴出:
图11
在上面图11中的结果是,在每次按下一个键,就会打印四行的信息。第一个参数type 即EV_KEY (或者EV_SW)类型在include/linux/input.h中有定义为0x01,code的值即为我们在board-da850-evm.c 中定义的KEY_ENTER、KEY_DOWN 、KEY_RIGHT的值,value就是按键的取值。
从上面的测试结果看,GPIO测试成功。