IMX6移植Linux3.0.35内核时需要添加的矩阵按键的平台设备信息
发布日期:2021-07-01 00:05:04 浏览次数:2 分类:技术文章

本文共 5433 字,大约阅读时间需要 18 分钟。

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

本文记录在IMX6开发板上移植鼎芯Linux3.0.35内核时,需要配置的矩阵按键的信息。本设备使用的矩阵按键是一个5*5的矩阵按键。

本人其他开发板内核的移植与分析请点击链接查看: 与

1、IMX6移植3.0.35内核时需要配置的按键的信息

首先我们要知道我们的按键接的核心板的引脚都有哪些:

在这里插入图片描述

3.0.35内核中使用的矩阵按键驱动源码在”drivers/input/keyboard/matrix_keypad.c”中。

里面是一个平台驱动,我们只要写平台设备,描述硬件的资源与此驱动匹配即可。

驱动中有代码如下:

488 static struct platform_driver matrix_keypad_driver = {
489 .probe = matrix_keypad_probe,490 .remove = __devexit_p(matrix_keypad_remove),491 .driver = {
492 .name = "matrix-keypad",493 .owner = THIS_MODULE,494 #ifdef CONFIG_PM495 .pm = &matrix_keypad_pm_ops,496 #endif497 },498 };499 module_platform_driver(matrix_keypad_driver);

通过阅读平台驱动的probe函数,可得知我们写的平台设备应提供具本哪些硬件信息.

378 static int __devinit matrix_keypad_probe(struct platform_device *pdev)379 {
380 const struct matrix_keypad_platform_data *pdata; //平台设备提供的platform_data381 const struct matrix_keymap_data *keymap_data;382 struct matrix_keypad *keypad;383 struct input_dev *input_dev;384 unsigned short *keycodes;385 unsigned int row_shift;386 int err;388 pdata = pdev->dev.platform_data; ... .....394 keymap_data = pdata->keymap_data; ... .....433 matrix_keypad_build_keymap(keymap_data, row_shift,434 input_dev->keycode, input_dev->keybit); //从keymap_data里分解出行列键对应的键码 ... .....439 err = init_matrix_gpio(pdev, keypad); //注册行线的中断号 ... .....443 err = input_register_device(keypad->input_dev); //输入设备对象注册 ... .....456 return err;457 }

通过probe函数,可以确定我们写平台设备时只需通过platform_data成员提供平台驱动所需的信息,无需再提供resource.

再确定结构体matrix_keypad_platform_data的每个成员的作用即可,如不清楚具体用途,可以在驱动代码里通过查看对成员值的访问反推出用途.

在"include/linux/input/matrix_keypad.h"中有

#define KEY(row, col, val)  ((((row) & (MATRIX_MAX_ROWS - 1)) << 24) |\                 (((col) & (MATRIX_MAX_COLS - 1)) << 16) |\                 ((val) & 0xffff)).....#define KEY_ROW(k)      (((k) >> 24) & 0xff)#define KEY_COL(k)      (((k) >> 16) & 0xff)#define KEY_VAL(k)      ((k) & 0xffff)..........#define MATRIX_SCAN_CODE(row, col, row_shift)   (((row) << (row_shift)) + (col))............struct matrix_keymap_data {
const uint32_t *keymap; //装载按键对应的键码数组, 注意每个键码需要使用宏KEY来写。也就是一个32位数据里,行,列,键码各占用8, 8, 16位. unsigned int keymap_size; //键码数组的元素个数};............struct matrix_keypad_platform_data {
const struct matrix_keymap_data *keymap_data; //键码数据对象的首地址 const unsigned int *row_gpios; //行线用的IO口 const unsigned int *col_gpios; //列线用的IO口 unsigned int num_row_gpios; //多少个行线 unsigned int num_col_gpios; //多少个列线 unsigned int col_scan_delay_us; //扫描列线时间隔时间 unsigned int debounce_ms; //防抖动的间隔时间 unsigned int clustered_irq; //行线是否共用一个中断, 设0则每个行线的中断是独立的 unsigned int clustered_irq_flags; bool active_low; //键按下时,行线是否为低电平 bool wakeup; bool no_autorepeat; //按键按下时是否重复提交按键, 设1就是不重复,设0重复};

根据我们的原理图:

行线接: KEY_ROW0, KEY_ROW1, KEY_ROW2, KEY_ROW4,KEY_ROW5

列线接: KEY_ROW0, KEY_ROW1, KEY_ROW2, KEY_ROW4,KEY_ROW5

2、添加设备信息的具体步骤

Imx_keypad平台层函数的添加

  1. 在board-mx6q_sabresd.c中添加
//注意键值,可以根据自己项目的需求自己更改static int mx6_sabresd_keymap[] = {
KEY(0, 0, KEY_UP), KEY(0, 1, KEY_F9), KEY(0, 2, KEY_F3), KEY(0, 4, KEY_DOWN), KEY(0, 5, KEY_PRINT), KEY(1, 0, KEY_RIGHT), KEY(1, 1, KEY_F8), KEY(1, 2, KEY_F4), KEY(1, 4, KEY_HOME), KEY(1, 5, KEY_PAGEDOWN), KEY(2, 0, KEY_F12), KEY(2, 1, KEY_F7), KEY(2, 2, KEY_F5), KEY(2, 4, KEY_END), KEY(2, 5, KEY_PAGEUP), KEY(4, 0, KEY_F11), KEY(4, 1, KEY_F1), KEY(4, 2, KEY_F6), KEY(4, 4, KEY_NUMLOCK), KEY(4, 5, KEY_ESC), KEY(5, 0, KEY_F10), KEY(5, 1, KEY_F2), KEY(5, 2, KEY_LEFT), KEY(5, 4, KEY_SCROLLLOCK), KEY(5, 5, KEY_PAUSE), };static const struct matrix_keymap_data mx6_sabresd_map_data __initconst= {
.keymap = mx6_sabresd_keymap, .keymap_size = ARRAY_SIZE(mx6_sabresd_keymap),};
  1. 在mx6_sabresd_board_init函数中添加:
imx6q_add_imx_keypad(&mx6_sabresd_map_data);   //KEYBOARD

这个函数是在Platfprm-imx-keypad.c定义的,需要在Devices-imx6q.h中添加宏定义:

extern const struct imx_imx_keypad_data imx6q_imx_keypad_data ;  //lyy #define imx6q_add_imx_keypad(pdata)   \	imx_add_imx_keypad(&imx6q_imx_keypad_data,pdata);
  1. 在Platfprm-imx-keypad.c中添加:
//lyy#ifdef CONFIG_SOC_IMX6Qconst struct imx_imx_keypad_data imx6q_imx_keypad_data __initconst =	imx_imx_keypad_data_entry_single(MX6SL, SZ_16);#endif /* ifdef CONFIG_SOC_IMX6Q */
  1. 在Board-mx6_sabresd.h中添加并将所有复用引脚注释掉

有可能有其它设备复用了下面这些引脚,一定要先将他们注释掉

/* keyboaed lyy */	MX6Q_PAD_KEY_COL0__KPP_COL_0,   	MX6Q_PAD_KEY_ROW0__KPP_ROW_0,   	MX6Q_PAD_KEY_COL1__KPP_COL_1,   	MX6Q_PAD_KEY_ROW1__KPP_ROW_1,   	MX6Q_PAD_KEY_COL2__KPP_COL_2,   	MX6Q_PAD_KEY_ROW2__KPP_ROW_2,    MX6Q_PAD_KEY_COL4__KPP_COL_4,    MX6Q_PAD_KEY_ROW4__KPP_ROW_4,    MX6Q_PAD_CSI0_DAT4__KPP_COL_5,    MX6Q_PAD_CSI0_DAT5__KPP_ROW_5,
  1. 在arch\arm\mach-mx6\Clock.c中的lookups[]中加入:
static struct clk_lookup lookups[] = {
。。。。。。。。。。。。。。_REGISTER_CLOCK(NULL, "kpp", dummy_clk), //这是加入的};

3、测试

重新编译内核后,烧写到开发板,然后测试按键是否可以正常使用:

首先在板子启动后,在板子的终端输入;

$ cat /proc/bus/input/devices

查看当前的设备,找到我们的按键设备,假设为evet0。

则在终端中输入

$ hexdump /dev/input/event0

所有按键都按一遍,会发现终端中打印了按键的值(显示的内容好像是某一种编码,不知道怎么转换为按键的值)

4、总结

已经转行做互联网了,现在把实验室相关的事做一下,之前没补完的博客补一下,以后可能就不写嵌入式相关的内容了。当然,还会写关于Linux内核的相关知识。

做嵌入式,如果做的不深,如果不是去深度定制Linux内核,或者深度开发驱动,其实就没什么可做的了。希望看到这里的朋友,加油,不管在做什么,不要放弃,下一步就会成功!!!

学习探讨加:

qq:1126137994
微信:liu1126137994

转载地址:https://lyy-0217.blog.csdn.net/article/details/83317951 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IMX6移植Linux4.1.15内核时需要添加矩阵按键的设备树信息
下一篇:【Linux进程、线程、任务调度】四多核下负载均衡 中断负载均衡,RPS软中断负载均衡 cgroups与CPU资源分群分配 Linux为什么不是硬实时 preempt-rt对Linux实时性的改造

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月30日 22时12分11秒