миграция драйвера Linux на Android - PullRequest
2 голосов
/ 02 ноября 2011

Я портирую 3G-модем, написанный для Linux для ноутбуков, на встроенное устройство Android (Gingerbread) с процессором ARM. Я уже получил драйвер устройства, скомпилированный (код C) в виде модуля (файл .ko) и установлен. Я вижу это, когда я загружаю ядро, и оно работает хорошо. Он подключается к USB-порту, как задумано. Он счастлив, что готов к разговору.

Следующая необходимая часть - это «менеджер соединений», написанный на C ++. Вот где у меня проблема. Это не работает в пространстве ядра, но это не обычное приложение для Android с пользовательским интерфейсом. Это «задача», работающая в фоновом режиме, которая должна запускаться из файла «init.rc» во время загрузки. Makefile, предоставляемый с исходным кодом, хорош для установки зависимостей, но бесполезен для платформы, на которую я хочу ориентироваться. Я использую набор инструментов, поставляемый с исходным кодом Android «arm-eabi- *» (работает на компьютере с Ubuntu), который я использовал для компиляции Android и ядра. Я получил много ошибок компиляции, потому что он использует стандартные библиотеки "libc", которых нет в Android. Я заменил его на «bionic libc», который является облегченной версией Linux для Linux. Кроме того, он ищет «crt0.o», который является кодом запуска статически связанной программы в среде linux (и нескольких других ОС). В Android он динамически связан во время выполнения, поэтому использует что-то еще, кроме crt0.o.

В Интернете имеется масса информации о программировании приложений для Android, но очень мало о подобных вещах низкого уровня. Если у кого-то есть рабочий make-файл для создания такого кода C ++, который будет запускаться в качестве фоновой задачи под Android ARM, я был бы очень признателен, чтобы взглянуть на него или есть какая-либо информация, которая может помочь мне найти способ сделать это. Или, если кто-то сделал что-то подобное, мог бы подсказать, как этого добиться.

1 Ответ

1 голос
/ 06 сентября 2012

Почти год спустя, но вот make-файл, который скомпилирует простое нативное приложение:

NDK_USR_PATH := $(NDK_USR)

C_FILES := $(wildcard *.c) $(wildcard *.cpp)
O_FILES := $(patsubst %.cpp,%.o,$(C_FILES))
O_FILES := $(patsubst %.c,%.o,$(C_FILES))

out: $(O_FILES)
        @arm-eabi-gcc -o $@ $< -Bdynamic -Wl,--gc-section -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,--dynamic-linker=/system/bin/linker -Wl,-rpath-link=$(NDK_USR_PATH)/lib -nostdlib $(NDK_USR_PATH)/lib/crtend_android.o $(NDK_USR_PATH)/lib/crtbegin_dynamic.o -L$(NDK_USR_PATH)/lib -lc

%.o: %.c 
        @arm-eabi-gcc -o $@ $< -c -I$(NDK_USR_PATH)/include -fno-short-enums

clean:
        @rm -f *.o
        @rm -f out

Он компилирует любые файлы .c из той же директории в приложение с именем "out". Требуется, чтобы переменная окружения NDK_USR указывала на каталог ndk "ndk / android-ndk-r7 / platform / android-14 / arch-arm / usr /".

Это должно динамически связываться с bionic libc и должно включать разработку драйвера для Android.

Будьте осторожны при копировании и вставке вышеупомянутого make-файла. Make очень специфичен для символов табуляции.

...