将Linux驱动程序迁移到Android

时间:2011-11-02 14:52:28

标签: android makefile kernel device-driver

我正在将用于笔记本电脑的Linux编写的3G调制解调器移植到带有ARM处理器的嵌入式android(Gingerbread)设备上。我已经将设备驱动程序编译(C代码)作为模块(.ko文件)并安装。我在启动内核时看到了它并且运行良好。它按预期连接到USB端口。很高兴准备与他们交谈。

下一个必需的部分是用C ++编写的“连接管理器”。这是我遇到问题的地方。这不在内核空间中运行,但它不是具有用户界面的常规Android应用程序。这是在后台运行的“任务”,应该在启动时从“init.rc”文件启动。随源代码提供的makefile很适合设置依赖项,但就我想要定位的平台而言它是无用的。我正在使用Android源代码“arm-eabi- *”(运行Ubuntu机器)提供的工具链,我用它来编译Android和内核。我有很多编译错误,因为它使用Android中不存在的标准“libc”库。我用“bionic libc”取代了它,它是linux libc for light的轻量级子集版本。最重要的是,它查找“crt0.o”,它是启动代码,是linux环境(以及其他几个操作系统)中的静态链接程序。在Android中,它在运行时动态链接,因此使用的不是crt0.o。

网上有大量有关Android应用程序编程的信息,但对于那种低级别的东西却很少。如果有人有一个工作的makefile来构建那种在Android ARM下作为后台任务运行的C ++代码,我将非常感谢你看看它,或者是否有任何信息可以帮我找到一种方法。或者,如果有人做过这样的事情,可以给我一些关于如何实现这一目标的线索。

1 个答案:

答案 0 :(得分:1)

差不多一年之后,这里有一个makefile,它将编译一个简单的原生app:

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 / platforms / android-14 / arch-arm / usr /".

这应该动态链接到仿生libc,并应启用android驱动程序开发。

复制和粘贴上面的makefile时要小心。 Make非常具体关于制表符。