Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:3
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
imx233 + matrix keypad
ivandevel
Добавлено 19.04.2012 08:26 Редактировалось 03.06.2012 21:47
0
Сообщение: 1
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Здравствуйте! Необходимо реализовать 25 пользовательских кнопок на imx233. на ум сразу приходит матричная клава. В качестве портов выбрал LCD_D00..LCD_D07, LCD_CD, LCD_RS. т.е. получатся 5х5. Вопросы... Как реализовать драйвер матричной клавы? Правильно ли я выбрал порты? (по RM вроде GPIO есть на этих портах)
P.S.
С линуксом только начинаю знакомство.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.04.2012 10:06 Сообщение: 2
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Вот тут Юра пример выкладывал для at91sam9g45
http://www.starterkit.ru/html/index.php?name=forum&op=view&id=12359&num=6#12719

для imx233 будет аналогично, нужно только названия gpio поменять
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 19.04.2012 10:23 Сообщение: 3
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
там написано: "в ядре включена поддержка GPIO driven matrix keypad" а у imx233 эта поддержка есть?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.04.2012 10:33 Сообщение: 4
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
да - будет работать на любой платформе где есть gpio.
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 19.04.2012 10:35 Редактировалось 19.04.2012 10:36 Сообщение: 5
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
а можно Вас попросить пример накидать, как этот драйвер будет для imx233 выглядеть?
и где этот "файл борды" искать?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.04.2012 11:12 Редактировалось 19.04.2012 11:15 Сообщение: 6
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
"файл борды" для imx233 - linux-2.6.31/arch/arm/mach-stmp378x/stmp378x_devb.c

драйвер в ядре нужно включить в конфигураторе, в этом файле задается конфигурация этого драйвера для конкретной платформы. Для примера можно смотреть конфигурацию програмного spi на gpio в stmp378x_devb.c
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 20.05.2012 16:09 Редактировалось 20.05.2012 23:33 Сообщение: 7
ivandevel
3.66

Пункты: 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
Добавлено 21.05.2012 09:46 Редактировалось 21.05.2012 09:51 Сообщение: 8
sasamy
4.71

Пункты: 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
Добавлено 02.06.2012 19:58 Редактировалось 02.06.2012 20:07 Сообщение: 9
ivandevel
3.66

Пункты: 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
Добавлено 03.06.2012 18:23 Сообщение: 10
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
В файле stmp378x_devb.c закоментируйте структуру
Код

struct pin_group lcd_pins = {
.pins = lcd_lms430_desc,
.nr_pins = ARRAY_SIZE(lcd_lms430_desc),
};

явно в каком-то модуле из lcd панелей регистрируются эти пины - на этапе компиляции еще увидите в каком модуле не определена эта структура, его и надо прибить.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux