Здесь я перечисляю свою проблему.
У меня с собой телефон Google Nexus, он же "страсть". В телефоне установлены инструменты 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
Теперь невозможно создать новый hello-1.ko. Я не знаю почему, я предполагаю, что есть некоторая проблема со значениями VERSION, PATCHLEVEL, SUBLEVEL и EXTRAVERSION. Это необходимо? Я также пробовал это значение из android-2.3.6_r1, но оно все равно не работает. Я не уверен, что это за значение EXTRAVERSION?
Я даже пробовал использовать hello-1.ko, сгенерированный компилятором в моем ubuntu. Я нажал на это hello-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 /* Needed by all modules */
#include /* 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 собрать эти исходные файлы вместе с другим источником. Но я не уверен, где это сделать. Я попытался сделать это в main.mk и создал файл Android.mk в исходном каталоге моих исходных файлов, но это не сработало. Может быть, это лучшее решение, но я не смог найти в этом никакой помощи.
После этого мои модули ядра должны иметь возможность управлять wnic (устройством беспроводного сетевого интерфейса) телефона Android. Он должен иметь возможность перевести wnic в спящий режим, а затем разбудить его после получения команды от моего модуля ядра. Если у вас есть подсказки, как это сделать, это вам поможет. Я обнаружил, что на Android он управляется частным драйвером wpa_supplicant. Команды, например:
wpa_cli driver powermode 0 - auto
wpa_cli driver powermode 1 - active
, могут выполнить мою задачу, но я не уверен, так как не пробовал. Я еще не дошел до этой стадии.
Пожалуйста, изучите это и предоставьте некоторую помощь / руководство.
Спасибо,
Apurva