基于Dragon Board 410c開發(fā)板的按鍵和軌跡球驅(qū)動實現(xiàn)代碼
在上一篇博客《基于Dragon Board 410c開發(fā)板的觸摸屏驅(qū)動編寫》中,我已經(jīng)描述了觸摸屏驅(qū)動編寫過程,以及其架構(gòu),這篇博客我會跟大家講述一下按鍵和軌跡球驅(qū)動。
一、按鍵和軌跡球驅(qū)動MSM具有按鍵和軌跡球的功能,對應(yīng)的驅(qū)動程序在文件arch/arm/mach-msm/board-mahimahi-keypad.c中,接下來開始介紹此文件的實現(xiàn)流程。
(1)文件board-mahimahi-keypad.c中的全局定義代碼如下所示:
staTIc struct gpio_event_info *mahimahi_input_info[] = { ?? ? &mahimahi_keypad_matrix_info.info, ? ? ?// 鍵盤矩陣 ?? ? &mahimahi_keypad_key_info.info, ? ? ? ? // 鍵盤信息 ?? ? &jogball_x_axis.info.info, ? ? ? ? ? ? ?// 軌跡球X方向信息 ?? ? &jogball_y_axis.info.info, ? ? ? ? ? ? ?// 軌跡球Y方向信息 ?}; ?staTIc struct gpio_event_platform_data mahimahi_input_data = { ?? ? .names = { ?? ? ? ? "mahimahi-keypad", ? ? ? ? ? ? ? ? ?// 按鍵設(shè)備 ?? ? ? ? "mahimahi-nav", ? ? ? ? ? ? ? ? ? ? // 軌跡球設(shè)備 ?? ? ? ? NULL, ?? ? }, ?? ? .info = mahimahi_input_info, ?? ? .info_count = ARRAY_SIZE(mahimahi_input_info), ?? ? .power = jogball_power, ?};
staTIc struct platform_device mahimahi_input_device = { ?? ? .name = GPIO_EVENT_DEV_NAME, ?? ? .id = 0, ?? ? .dev = { ?? ? ? ? .platform_data = &mahimahi_input_data, ?? ? }, ?};?
按鍵和軌跡球是通過GPIO系統(tǒng)來實現(xiàn)的,因此定義了gpio_event_info類型的數(shù)組。
“mahimahi-keypad”和“mahimahi-nav”分別是兩個設(shè)備的名稱。
gpio_event_info 指針各式的數(shù)組mahimahi_input_info中包含了mahimahi_keypad_matrix_info.info,mahimahi_keypad_key_ info.info,jogball_x_axis.info.info和jogball_y_axis.info.info。
按鍵驅(qū)動是一個利用GPIO矩陣的驅(qū)動,由gpio_event_matrix_info矩陣定義,定義還需要包含按鍵的GPIO矩陣和input設(shè)備的信息,內(nèi)容如下所示:
staTIc unsigned int mahimahi_col_gpios[] = { 33, 32, 31 };
static unsigned int mahimahi_row_gpios[] = { 42, 41, 40 };
#define KEYMAP_INDEX(col, row) ?((col)*ARRAY_SIZE(mahimahi_row_gpios) + (row)) ?#define KEYMAP_SIZE ? ? (ARRAY_SIZE(mahimahi_col_gpios) * \ ?? ? ? ? ? ? ? ? ?ARRAY_SIZE(mahimahi_row_gpios)) ?static const unsigned short mahimahi_keymap[KEYMAP_SIZE] = { ? ? ? ? // 按鍵映射關(guān)系 ?? ? [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* 115 */ ?? ? [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* 114 */ ?? ? [KEYMAP_INDEX(1, 1)] = MATRIX_KEY(1, BTN_MOUSE), ?}; ?static struct gpio_event_matrix_info mahimahi_keypad_matrix_info = { ?? ? .info.func = gpio_event_matrix_func, ? ??// 關(guān)鍵函數(shù)實現(xiàn) ?? ? .keymap = mahimahi_keymap, ?? ? .output_gpios = mahimahi_col_gpios, ?? ? .input_gpios = mahimahi_row_gpios, ?? ? .noutputs = ARRAY_SIZE(mahimahi_col_gpios), ?? ? .ninputs = ARRAY_SIZE(mahimahi_row_gpios), ?? ? .settle_time.tv.nsec = 40 * NSEC_PER_USEC, ?? ? .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, ?? ? .flags = (GPIOKPF_LEVEL_TRIGGERED_IRQ | ?? ? ? ? ? GPIOKPF_REMOVE_PHANTOM_KEYS | ?? ? ? ? ? GPIOKPF_PRINT_UNMAPPED_KEYS), ?}; ?static struct gpio_event_direct_entry mahimahi_keypad_key_map[] = { // Power按鍵 ?? ? { ?? ? ? ? .gpio ? = MAHIMAHI_GPIO_POWER_KEY, ?? ? ? ? .code ? = KEY_POWER, ?? ? }, ?}; ?static struct gpio_event_input_info mahimahi_keypad_key_info = { ?? ? .info.func = gpio_event_input_func, ? ? ??// 關(guān)鍵函數(shù)實現(xiàn) ?? ? .info.no_suspend = true, ?? ? .flags = 0, ?? ? .type = EV_KEY, ?? ? .keymap = mahimahi_keypad_key_map, ?? ? .keymap_size = ARRAY_SIZE(mahimahi_keypad_key_map) ?};?
keypad_key_matrix _info和keypad _info是gpio_event_matrix_info類型的結(jié)構(gòu)體,分別負(fù)責(zé)兩個和一個按鍵的處理,
實際上,MSM平臺基本上只有三個按鍵:Power,音量增加按鍵和音量減少按鍵。音量增加和音量減少的掃描碼分別是KEY_VOLUMEUP(=115)和KEY_VOLUMEDOWN(=114)。
提示:音量控制的兩個按鍵在全鍵盤的qwerty.kl有所定義,同時符合Linux的input設(shè)備和Android的按鍵標(biāo)準(zhǔn)。
軌跡球部分也是由GPIO實現(xiàn)的,由X方向和Y方向兩部分組成,內(nèi)容如下所示:
static uint32_t jogball_x_gpios[] = { ?? ? MAHIMAHI_GPIO_BALL_LEFT, MAHIMAHI_GPIO_BALL_RIGHT, ?}; ?static uint32_t jogball_y_gpios[] = { ?? ? MAHIMAHI_GPIO_BALL_UP, MAHIMAHI_GPIO_BALL_DOWN, ?}; ?static struct jog_axis_info jogball_x_axis = { ?// X軸的內(nèi)容 ?? ? .info = { ?? ? ? ? .info.func = gpio_event_axis_func, ?// 關(guān)鍵函數(shù)實現(xiàn) ?? ? ? ? .count = ARRAY_SIZE(jogball_x_gpios), ?? ? ? ? .dev = 1, ?? ? ? ? .type = EV_REL, ?? ? ? ? .code = REL_X, ?? ? ? ? .decoded_size = 1U << ARRAY_SIZE(jogball_x_gpios), ?? ? ? ? .map = jogball_axis_map, ?? ? ? ? .gpio = jogball_x_gpios, ?? ? ? ? .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION, ?? ? } ?}; ?static struct jog_axis_info jogball_y_axis = {?// Y軸的內(nèi)容 ?? ? .info = { ?? ? ? ? .info.func = gpio_event_axis_func, ?// 關(guān)鍵函數(shù)實現(xiàn) ?? ? ? ? .count = ARRAY_SIZE(jogball_y_gpios) ?? ? ? ? .dev = 1, ?? ? ? ? .type = EV_REL, ?? ? ? ? .code = REL_Y, ?? ? ? ? .decoded_size = 1U << ARRAY_SIZE(jogball_y_gpios), ?? ? ? ? .map = jogball_axis_map, ?? ? ? ? .gpio = jogball_y_gpios, ?? ? ? ? .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION, ?? ? } ?};?
在上述代碼中,這里的軌跡球是用jog_axis_info類型的結(jié)構(gòu)體進行定義的,這種設(shè)備的類型(type)是相對設(shè)備EV_REL。
注意:除了默認(rèn)的AVRCP.kl和qwerty.kl之外,在MSM8916平臺中新增了文件h2w_headset.kl文件。