1.在Ubuntu下载编译linux内核
请参考 http://blog.csdn.net/nexttake/article/details/8181008
2.编写Linux驱动程序
2.1 word_count.c驱动代码编写
Makefile:obj-m := yzy_word_count.o
2.2 编译
make -C /lib/modules/2.6.38-8-generic/build/ M=/home/yzy/workspace_driver/my_word_count
编译得时候目前遇到一个问题,就是如果在/.bashrc中配置了编译android kernel内核得交叉编译得环境变量
export PATH=$PATH:<android source>/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
export ARCH=arm
会导致上面得编译命令执行失败。
3.在Ubuntu平台测试驱动
3.1通过shell 测试 ,前提是 sudo -s 切换到root权限
echo “I love you ” >/dev/我的驱动
3.2 通过linux gcc测试
代码如下,前提是ls /dev/我的驱动
chmod 777 /dev/我的驱动 将这个驱动得权限放开。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int testdev;
unsigned char buf[4];
/** 在终端 通过 sudo -s ; ./a.out "I love you " 来测试**/
/**在代码中如何获得root权限呢?**/
testdev = open("/dev/yzy_wordcount", O_RDWR);
if (testdev == -1)
{
printf("Cann't open file \n");
return 0;
}
if (argc > 1)
{
write(testdev, argv[1], strlen(argv[1]));
printf("string:%s\n", argv[1]);
}
read(testdev, buf, 4);
int n = 0;
// 将4个字节还原成int类型的值
n = ((int) buf[0]) << 24 | ((int) buf[1]) << 16 | ((int) buf[2]) << 8
| ((int) buf[3]);
printf("word byte display:%d,%d,%d,%d\n", buf[0], buf[1], buf[2], buf[3]);
printf("word count:%d\n", n);
close(testdev);
return 0;
}
输出:
word byte display:0,0,0,2
word count:2
4.在Android平台测试驱动
4.1 安装交叉编译环境(可选)
将android源码的prebuild/arm 目录下的交叉编译配置到环境变量中
export PATH=$PATH:~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
4.2 编译android kernel内核
编译android linux
内核 http://blog.csdn.net/flydream0/article/details/7070392
cd /home/spreadst/4.0/sprdroid4.0/kernel
make defconfig /make sp8810ea-vlx_defconfig /make help
make
make bzImage
4.3编译android驱动
4.3.1 将自己得驱动配置到android kernel内核,然后全编整个kernel
参考 http://blog.csdn.net/luoshengyang/article/details/6564592 ,
使用Kconfig这种方式是静态加载,不会生成 *.ko文件。
4.3.2 单独编译自己的驱动
切换到androidsource/kernel目录,执行
make -C /home/spreadst/4.0/sprdroid4.0/kernel ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- M=drivers/word_count_driver
4.5 adb push到android测试驱动
4.6 编译JNI代码操作驱动
4.7 编写android java代码测试驱动
5.求助
255|root@android:/system/app # insmod word_count.o
insmod: init_module 'word_count.o' failed (Exec format error)
可是我的代码的内核版本 和 android系统是一致的啊!
感谢李老师的解答,
打扰您了,
insmod: init_module 'word_count.o' failed (Exec format error)问题解决了,我当时编译android kernel内核的时候
使用make defconfig方式编译的bzImage,我们公司的手机是自己订制的内核,需要使用make 8810defconfig 编译内核才可以。