2014-12-02 5 views
2

В настоящее время я работаю над переносом Android 4.4 (Kitkat) на встроенную систему (на основе Freescale i.MX6). Чтобы начать разработку, я использовал несколько наборов для разработки (Wandboard, BD-Device BD-SL).Как просыпаться Android Embedded Board от Suspend с помощью GPIO

Работая над управлением питанием моей пользовательской платы, я не имел никаких проблем, чтобы отключить девиц. Тем не менее, я не мог найти, как разбудить их от сна (кроме силовой езды на велосипеде). Ожидаемым способом пробуждения системы было бы получить прерывание в GPIO (например, кнопка включения-выключения на телефоне на базе Android).

Я хотел знать, что было обычным способом разблокировать устройство Android от приостановки с прерыванием GPIO. Хотя вопрос может показаться тривиальным, мне не удалось собрать всю необходимую мне информацию из различных поисков на Google и специализированных форумах. Я нашел много информации, но ничего, что охватывало весь предмет. Возможно, потому, что мне не хватало необходимого фона, мне не удалось собрать все вместе без кода. Я догадался, что я не единственный в этой ситуации, поэтому этот пост.

Вот некоторые из информации, которую я нашел:

ответ

2

В конце концов, я копал слишком глубоко. Пример кода был прямо под моим носом. Все, что мне было нужно, было в коде BD-SL devkit для конкретного кода (можно найти в дереве исходных текстов BD-SL в mydroid/BD-SL-i.MX6/kernel_imx/arch/arm/mach-mx6/board-mx6_nitrogen6x.c)

Этот код относится только к ядру Freescale i.MX6, но разные части должны быть легко портирован/адаптирован к другим платформам Android Embedded.

GPIO определяет. Я просто пропускаю мультиплексор GPIO. Штифт должен быть мультиплексирован с функциональностью GPIO:

#define GP_ONOFF_KEY  IMX_GPIO_NR(2, 3) 

Определения ввода ключа

#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \ 
{        \ 
    .gpio  = gpio_num,    \ 
    .type  = EV_KEY,    \ 
    .code  = ev_code,    \ 
    .active_low = act_low,    \ 
    .desc  = "btn " descr,    \ 
    .wakeup  = wake,     \ 
} 

static struct gpio_keys_button buttons[] = { 
    GPIO_BUTTON(GP_ONOFF_KEY, KEY_POWER, 1, "key-power", 1), 
}; 

Определением соответствующих данных платформы и платформой устройства:

static struct gpio_keys_platform_data button_data = { 
    .buttons = buttons, 
    .nbuttons = ARRAY_SIZE(buttons), 
}; 

static struct platform_device button_device = { 
    .name  = "gpio-keys", 
    .id  = -1, 
    .num_resources = 0, 
    .dev  = { 
     .platform_data = &button_data, 
    } 
}; 

регистрирующих из платформенные устройства

static void __init add_device_buttons(void) 
{ 
    platform_device_register(&button_device); 
} 

/*! 
* Board specific initialization. 
*/ 
static void __init board_init(void) 
{ 
    //... 

    add_device_buttons(); 

    //... 
} 

И для полноты картины, структура данных инициализации, которая указывает на совет конкретной инициализации

/* 
* initialize data structure. 
*/ 
MACHINE_START(MX6_NITROGEN6X, "Boundary Devices Nitrogen6X/SABRE Lite Board") 
    /* Maintainer: Boundary Devices */ 
    .boot_params = MX6_PHYS_OFFSET + 0x100, 
    .fixup = fixup_mxc_board, 
    .map_io = mx6_map_io, 
    .init_irq = mx6_init_irq, 
    .init_machine = board_init, 
    .timer = &timer, 
    .reserve = reserve, 
MACHINE_END 
+0

Привет gfrigon. Мы пытаемся запустить Android на Q7A-551 с помощью MX 6DualLite. Когда Android находится в «приостановленном режиме», клавиатура usb может активировать Android с одним нажатием клавиши. Но если Android переходит в глубокий сон, «MEM mode», он не реагирует на нажатия клавиш на клавиатуре. Вы знаете, что с этим можно сделать? – MRodrigues

+1

@MRodrigues У меня нет проблем, связанных с MEM-режимом с помощью ключа GPIO. Поэтому у меня нет четкого ответа на ваш вопрос. Однако я попытаюсь дать несколько советов. Включена ли шина USB в режиме MEM?Если у вас есть доступ к коду драйвера клавиатуры, вы можете добавить отладочные отпечатки, чтобы увидеть, действительно ли код вызывается в режиме MEM. Вы также можете посмотреть файл своего файла/файла USB вашего конкретного компьютера, чтобы узнать, какие периферийные устройства отключены во время приостановки. – gfrigon

+0

Любопытный наш подход был своего рода тем, что вы только что сказали. Я заметил, что он останется включенным, но мне пришлось активировать пробуждение на правильном устройстве для порта USB, а также для внутреннего концентратора на плате и fsl-ehci.1. Одна из деталей, которые мне не хватало, также требовала настроить правильный порт USB на fsl-ehci.1, чтобы он автоматически включал управление мощностью. После этого он работал нормально. – MRodrigues

 Смежные вопросы

  • Нет связанных вопросов^_^