Я перечислю свою проблему здесь.
У меня есть телефон Google Nexus one a.k.a. "страсть" со мной. В телефоне установлены инструменты Fastboot и adb. И загрузчик разблокирован.
Моя задача: я должен добавить модуль ядра Linux в ядро Android.
Что я сделал:
Я выполнил шаги http://source.android.com/source/initializing.html и загрузил ядро для android-2.3.6_r1 (страсть) и создал его. Я также могу запустить его на телефоне, и новое ядро Android отлично работает. Теперь я хочу изменить ядро и добавить свой собственный модуль ядра, а затем запустить его на телефоне, чтобы ядро на телефоне было моим модифицированным ядром.
Теперь у меня есть два подхода, чтобы сделать это.
1)
Перекрестите мой модуль ядра с ядром Android и нажмите его на устройстве с помощью команды adb. Файл Makefile, который я использую в ядре, выглядит следующим образом.
VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 6
EXTRAVERSION = -00054-g5f01537
obj-m += hello-1.o
KDIR=/home/apurva/android_dir
PWD := $(shell pwd)
all:
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux- x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) modules
clean:
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) clean
Теперь это не может генерировать новый привет-1.ko. Я не знаю, почему, я думаю, есть некоторые проблемы с значениями VERSION, PATCHLEVEL, SUBLEVEL и EXTRAVERSION. Необходимы ли они? Я также пробовал эти значения с android-2.3.6_r1, но все же он не работает. Я не уверен, что это за значение EXTRAVERSION?
Я даже попытался использовать hello-1.ko, сгенерированный компилятором в моем ubuntu. Я нажал этот привет-1.ko в эмулятор со следующей командой adb.
/root/bin/src/out/host/linux-x86/bin/adb shell mount
/root/bin/src/out/host/linux-x86/bin/adb push hello-1.ko /data
/root/bin/src/out/host/linux-x86/bin/adb insmod /data/hello-1.ko
Но этот hello-1.ko не может вставлять insmod, и я получаю следующую ошибку. insmod: Ошибка в init_module() Функция hello-1.ko не реализована
В то время как hello-1.c довольно прост:
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
2)
Вторым подходом к этому может быть размещение исходных файлов модуля ядра в каталоге ядра android. Может быть в системном каталоге или в другом месте и попросить make создать эти исходные файлы вместе с другим источником. Но я не уверен, где спросить процесс make сделать это. Я попытался сделать это в main.mk и создал файл Android.mk в исходном каталоге исходных файлов, но это не сработало. Может быть, это лучшее решение, но я не мог найти никакой помощи в этом.
После этого мои модули ядра должны иметь возможность управлять wnic (устройством беспроводной сети) телефона Android. Он должен иметь возможность включить wnic в спящий режим, а затем разбудить его после получения команды из моего модуля ядра. Если у вас есть указатели на то, как это сделать, это поможет. Я обнаружил, что на Android он контролируется через частный драйвер wpa_supplicant. Команды, например:
wpa_cli driver powermode 0 - auto
wpa_cli driver powermode 1 - active
может выполнять мою задачу, но я не уверен, так как я не пробовал. Я не достиг этой стадии.
Пожалуйста, ознакомьтесь с этим и дайте некоторую помощь/руководство.
Спасибо,
Апурва