ivandevel
Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Здравствуйте! Необходимо реализовать 25 пользовательских кнопок на imx233. на ум сразу приходит матричная клава. В качестве портов выбрал LCD_D00..LCD_D07, LCD_CD, LCD_RS. т.е. получатся 5х5. Вопросы... Как реализовать драйвер матричной клавы? Правильно ли я выбрал порты? (по RM вроде GPIO есть на этих портах)
P.S.
С линуксом только начинаю знакомство.
sasamy
Пункты: 83542
Регистрация: 14.08.2009
ivandevel
Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
там написано: "в ядре включена поддержка GPIO driven matrix keypad" а у imx233 эта поддержка есть?
sasamy
Пункты: 83542
Регистрация: 14.08.2009
да - будет работать на любой платформе где есть gpio.
ivandevel
Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
а можно Вас попросить пример накидать, как этот драйвер будет для imx233 выглядеть?
и где этот "файл борды" искать?
sasamy
Пункты: 83542
Регистрация: 14.08.2009
"файл борды" для imx233 - linux-2.6.31/arch/arm/mach-stmp378x/stmp378x_devb.c
драйвер в ядре нужно включить в конфигураторе, в этом файле задается конфигурация этого драйвера для конкретной платформы. Для примера можно смотреть конфигурацию програмного spi на gpio в stmp378x_devb.c
ivandevel
Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Написал конфиг для драйвера в "файле борды", включил Matrix Keypad в menuconfig.
Код
static const uint32_t imx233_keymap[] = {
KEY(0,0,KEY_0),
KEY(0,1,KEY_1),
KEY(0,2,KEY_2),
KEY(0,3,KEY_3),
KEY(0,4,KEY_4),
KEY(1,0,KEY_5),
KEY(1,1,KEY_6),
KEY(1,2,KEY_7),
KEY(1,3,KEY_8),
KEY(1,4,KEY_9),
KEY(2,0,KEY_A),
KEY(2,1,KEY_B),
KEY(2,2,KEY_C),
KEY(2,3,KEY_D),
KEY(2,4,KEY_E),
KEY(3,0,KEY_F),
KEY(3,1,KEY_G),
KEY(3,2,KEY_H),
KEY(3,3,KEY_I),
KEY(3,4,KEY_J),
KEY(4,0,KEY_K),
KEY(4,1,KEY_L),
KEY(4,2,KEY_M),
KEY(4,3,KEY_N),
KEY(4,4,KEY_O),
};
static struct matrix_keymap_data imx233_keymap_data = {
.keymap = imx233_keymap,
.keymap_size = ARRAY_SIZE(imx233_keymap),
};
static const int imx233_col_gpios[] = {
PINID_LCD_D00,
PINID_LCD_D01,
PINID_LCD_D02,
PINID_LCD_D03,
PINID_LCD_D04,};
static const int imx233_row_gpios[] = {
PINID_LCD_D05,
PINID_LCD_D06,
PINID_LCD_D07,
PINID_LCD_RS,
PINID_LCD_WR,};
static struct matrix_keypad_platform_data imx233_pdata = {
.keymap_data = &imx233_keymap_data,
.row_gpios = imx233_row_gpios,
.col_gpios = imx233_col_gpios,
.num_row_gpios = 5,
.num_col_gpios = 5,
.active_low = 1,
.col_scan_delay_us = 10,
.debounce_ms = 10,
.wakeup = 1,
};
static struct platform_device imx233_kbd_device = {
.name = "matrix-keypad",
.id = -1,
.dev = {
.platform_data=&imx233_pdata,
},
};
void stmp3xxx_matrixk_init(void)
{
gpio_request(PINID_LCD_D00,"matrix-keyboard");
gpio_request(PINID_LCD_D01,"matrix-keyboard");
gpio_request(PINID_LCD_D02,"matrix-keyboard");
gpio_request(PINID_LCD_D03,"matrix-keyboard");
gpio_request(PINID_LCD_D04,"matrix-keyboard");
gpio_request(PINID_LCD_D05,"matrix-keyboard");
gpio_request(PINID_LCD_D06,"matrix-keyboard");
gpio_request(PINID_LCD_D07,"matrix-keyboard");
gpio_request(PINID_LCD_RS,"matrix-keyboard");
gpio_request(PINID_LCD_WR,"matrix-keyboard");
gpio_direction_output(PINID_LCD_D00,1);
gpio_direction_output(PINID_LCD_D01,1);
gpio_direction_output(PINID_LCD_D02,1);
gpio_direction_output(PINID_LCD_D03,1);
gpio_direction_output(PINID_LCD_D04,1);
gpio_direction_input(PINID_LCD_D05);
gpio_direction_input(PINID_LCD_D06);
gpio_direction_input(PINID_LCD_D07);
gpio_direction_input(PINID_LCD_RS);
gpio_direction_input(PINID_LCD_WR);
platform_device_register(&imx233_kbd_device);
}
клава не работает, при запуске ядро пишет:
Код
matrix-keypad matrix-keypad: failed to request GPIO32 for COL0
matrix-keypad: probe of matrix-keypad failed with error -16
2) нужно ли выполнять gpio_request фунцию? при ините ног? (подсмотрел в драйвере LCD)
sasamy
Пункты: 83542
Регистрация: 14.08.2009
Цитата
2) нужно ли выполнять gpio_request фунцию? при ините ног? (подсмотрел в драйвере LCD)
Нет - это делается в драйвере matrix-keypad - из-за этого ошибка
Цитата
matrix-keypad matrix-keypad: failed to request GPIO32 for COL0
см linux-2.6.31/drivers/input/keyboard/matrix_keypad.c
Цитата
static int __devinit init_matrix_gpio(struct platform_device *pdev,
struct matrix_keypad *keypad)
...
/* initialized strobe lines as outputs, activated */
for (i = 0; i < pdata->num_col_gpios; i++) {
err = gpio_request (pdata->col_gpios[i], "matrix_kbd_col");
if (err) {
dev_err(&pdev->dev,
"failed to request GPIO%d for COL%d\n",
pdata->col_gpios[i], i);
goto err_free_cols;
}
gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
}
Еще посмотрите что отключен драйвер графического фреймбуфера и драйверы панелей - иначе они конфликтовать из-за пинов PINID_LCD_D00 итд будут.
ivandevel
Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Все равно клава не работает..
1) Драйвера дисплея вроде отключены
2) Убрал gpio_request из файла борды - посыпались непонятные сообщения при загрузке ядра:
Код
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:83 gpio_ensure_requested+0x5c/0x12c()
autorequest GPIO-52
Modules linked in:
Backtrace:
[<c0027b80>] (dump_backtrace+0x0/0x108) from [<c0028008>] (dump_stack+0x18/0x1c)
r6:c014d874 r5:c035c7d0 r4:00000053
[<c0027ff0>] (dump_stack+0x0/0x1c) from [<c0039b64>] (warn_slowpath_common+0x50/0x68)
[<c0039b14>] (warn_slowpath_common+0x0/0x68) from [<c0039bc8>] (warn_slowpath_fmt+0x30/0x38)
r7:00000034 r6:00000000 r5:c0399eec r4:c03c8530
[<c0039b98>] (warn_slowpath_fmt+0x0/0x38) from [<c014d874>] (gpio_ensure_requested+0x5c/0x12c)
r3:00000034 r2:c035c7e8
[<c014d818>] (gpio_ensure_requested+0x0/0x12c) from [<c014db20>] (gpio_direction_input+0x8c/0x14c)
r7:c0009828 r6:00000014 r5:c0399eec r4:60000013
[<c014da94>] (gpio_direction_input+0x0/0x14c) from [<c002e55c>] (stmp3xxx_matrixk_init+0x70/0x80)
r8:00000001 r7:c0009828 r6:c03bdd8c r5:00000000 r4:c001e224
[<c002e4ec>] (stmp3xxx_matrixk_init+0x0/0x80) from [<c000ba30>] (stmp378x_devb_init+0x1c/0xfc)
[<c000ba14>] (stmp378x_devb_init+0x0/0xfc) from [<c0009848>] (customize_machine+0x20/0x2c)
[<c0009828>] (customize_machine+0x0/0x2c) from [<c00232f0>] (do_one_initcall+0x60/0x1ac)
[<c0023290>] (do_one_initcall+0x0/0x1ac) from [<c0008778>] (kernel_init+0x98/0x110)
r8:00000000 r7:00000000 r6:00000000 r5:00000000 r4:c001e224
[<c00086e0>] (kernel_init+0x0/0x110) from [<c003ccd0>] (do_exit+0x0/0x698)
r4:00000000
---[ end trace 1b75b31a2719ed25 ]---
ядро по прежнему выдает:
Код
matrix-keypad matrix-keypad: failed to request GPIO32 for COL0
matrix-keypad: probe of matrix-keypad failed with error -16
Клава - просто матрица из клавиш (без подтяжек)
кусок конфига, который вроде отвечает за фреймбуфер:
Код
# Freescale STMP3xxx implementations
#
# CONFIG_ARCH_STMP37XX is not set
CONFIG_ARCH_STMP378X=y
# CONFIG_MACH_STMP37XX is not set
CONFIG_MACH_STMP378X=y
# CONFIG_FB_STMP37XX_LMS350 is not set
# CONFIG_FB_STMP37XX_LMS430 is not set
# CONFIG_FB_STMP37XX_WF43 is not set
CONFIG_FB_STMP378X_TVENC=y
# CONFIG_STMP3XXX_UNIQUE_ID is not set
CONFIG_STMP378X_RAM_FREQ_SCALING=y
# CONFIG_STMP378X_RAM_MDDR is not set
CONFIG_STMP378X_RAM_DDR=y
CONFIG_DMA_ZONE_SIZE=12
CONFIG_UTMI_MXC=y
Frame buffer hardware drivers
#
# CONFIG_FB_UVESA is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_STMP37XX is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_BROADSHEET is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
#
# Display device support
#
# CONFIG_DISPLAY_SUPPORT is not set
#
# Console display driver support
#
# CONFIG_VGA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
# CONFIG_FONT_8x16 is not set
# CONFIG_FONT_6x11 is not set
# CONFIG_FONT_7x14 is not set
# CONFIG_FONT_PEARL_8x8 is not set
# CONFIG_FONT_ACORN_8x8 is not set
# CONFIG_FONT_MINI_4x6 is not set
# CONFIG_FONT_SUN8x16 is not set
# CONFIG_FONT_SUN12x22 is not set
# CONFIG_FONT_10x18 is not set
# CONFIG_LOGO is not set
sasamy
Пункты: 83542
Регистрация: 14.08.2009
В файле stmp378x_devb.c закоментируйте структуру
Код
struct pin_group lcd_pins = {
.pins = lcd_lms430_desc,
.nr_pins = ARRAY_SIZE(lcd_lms430_desc),
};
явно в каком-то модуле из lcd панелей регистрируются эти пины - на этапе компиляции еще увидите в каком модуле не определена эта структура, его и надо прибить.