第一个android驱动程序

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 编译内核才可以。

你可能感兴趣的:(第一个android驱动程序)