Ник:
Пароль:

Контакты

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

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
iMX6 кнопка включения/выключения snvs_pwrkey
std_logic
Добавлено 20.01.2017 11:51
0
Сообщение: 1
std_logic
0

Пункты: 1133
Регистрация: 09.10.2012
Используется плата SK-IMX6S-OEM, buildroot-2016.02.
Не удаётся реализовать выключение через ОС Linux по прерыванию от ONOFF (Button).
Кнопка подключена к разъёму X5 (ONOFF).
Микросхема питания подключена к разъёму X7 (PMIC_ON_REQ).
Длительное нажатие на кнопку приводит к появлению 0 на X7. Вопрос в том, как отловить в системе короткое нажатие и безопасно завершить работу.

В ядре включены:
Device Drivers ---> [*] Power supply class support ---> [*] Board level reset or power off ---> всё доступные опции
Device Drivers ---> Input device support ---> Keyboards ---> IMX SNVS Power Key Driver

В dtsi файле (linux/arch/arm/boot/dts/imx6qdl-oem.dtsi) добавлено:
Код
&snvs_poweroff {
status = "okay";
};

&snvs_pwrkey {
status = "okay";
};


В dtsi файле (linux/arch/arm/boot/dts/imx6qdl.dtsi) изменено по аналогии с платами imx6sx и imx6ul:
Код
snvs: snvs@020cc000 {
compatible = "fsl,sec-v4.0-mon", "syscon", "simple-mfd";
reg = <0x020cc000 0x4000>;

snvs_rtc: snvs-rtc-lp {
compatible = "fsl,sec-v4.0-mon-rtc-lp";
regmap = <&snvs>;
offset = <0x34>;
interrupts = <0 19 IRQ_TYPE_LEVEL_HIGH>,
<0 20 IRQ_TYPE_LEVEL_HIGH>;
};

snvs_poweroff: snvs-poweroff {
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
mask = <0x60>;
status = "disabled";
};

snvs_pwrkey: snvs-powerkey {
compatible = "fsl,sec-v4.0-pwrkey";
regmap = <&snvs>;
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
linux,keycode = <KEY_POWER>;
wakeup;
};
};


В dmesg видно что драйвер svns_powerkey загрузился.
В Linux появилось устройство /dev/input/event0 с path snvs-powerkey.
При коротком нажатии кнопки незаметно какой-либо реакции от драйвера. Чтение cat из event0 ничего не возвращает. Непонятно как именно словить событие нажатия данной кнопки.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 20.01.2017 13:46 Сообщение: 2
sasamy
4.71

Пункты: 83552
Регистрация: 14.08.2009
Цитата

Вопрос в том, как отловить в системе короткое нажатие и безопасно завершить работу.


Мне кажется проще сделать на gpio

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=26430#26444
Спуститься к концу Подняться к началу
Персональная информация
command
Добавлено 26.01.2017 09:33 Редактировалось 26.01.2017 09:36 Сообщение: 3
command
5

Пункты: 143
Регистрация: 11.01.2017
Решили через патч drivers/input/keyboard/snvs_pwrkey.c

Код

static void imx_imx_snvs_check_for_events(unsigned long data)
{
struct pwrkey_drv_data *pdata = (struct pwrkey_drv_data *) data;
struct input_dev *input = pdata->input;
u32 state;

regmap_read(pdata->snvs, SNVS_HPSR_REG, &state);
// state = state & SNVS_HPSR_BTN ? 1 : 0;

// /* only report new event if status changed */
// if (state ^ pdata->keystate) {
// pdata->keystate = state;
// input_event(input, EV_KEY, pdata->keycode, state);
// input_sync(input);
// pm_relax(pdata->input->dev.parent);
// }

// /* repeat check if pressed long */
// if (state) {
// mod_timer(&pdata->check_timer,
// jiffies + msecs_to_jiffies(REPEAT_INTERVAL));
// }

/* interrupt only reports release of key so do not wait for state change */

state=1;
input_event(input, EV_KEY, pdata->keycode, state);
input_sync(input);
state=0;
input_event(input, EV_KEY, pdata->keycode, state);
input_sync(input);
}

демоном получаем нажатие из /dev/input/event и проблема решена.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux