日期:2014-05-16  浏览次数:20717 次

使用Android、S3C6410开发板和Ubuntu测试Linux驱动(1)
 开发可统计单词个数的Android驱动程序

     在上一节已经实现了一个简单的Linux驱动程序,该驱动的功能是统计给定字符串中的单词数。并且在最后已经将该Linux驱动的源代码成功编译成动态Linux驱动模块word_count.ko。下一步就是测试该模块。测试的方法很多,最常用的就是直接在UbuntuLinux中测试。当然,这对于本章实现的Linux驱动是没问题的,但是对于需要直接访问硬件的驱动在Ubuntu Linux上测试就不太方便。在这种情况下就需要在相应的硬件上进行测试。

     对于一个Linux驱动程序,一开始可以在UbuntuLinux上做前期开发和测试。对于访问硬件的部分也可以在Ubuntu Linux用软件进行模拟。当基本开发完成后,就需要在开发板或工程样机上使用真实的硬件进行测试。当然,最后还需要在最终销售的手机上进行测试。最终测试通过,Linux驱动才能算真正开发完成。在开发Linux驱动的过程中一个重要的步骤就是测试。本节将结合实际的开发流程介绍在不同平台上测试Linux驱动程序。这些测试平台包括UbuntuLinux、Android模拟器和S3C6410开发板。

一、使用Ubuntu Linux测试Linux驱动

本节将介绍如何在Ubuntu Linux下测试驱动程序。由于上一节编写的Linux驱动程序通过4个字节从设备文件(/dev/wordcount)返回单词数,所以不能使用cat命令测试驱动程序(cat命令不会将这4个字节还原成int类型的值显示)。但可以使用如下命令从日志中查看单词数。

# sh build.sh
# echo 'I love you.'  > /dev/wordcount
# dmesg

执行上面的命令后,如果输出如图6-13所示白框中的信息,说明驱动程序成功统计了单词数。

       虽然使用echo和dmesg命令可以测试Linux驱动程序,但这种方式并不是真正的测试。为了使测试效果更接近真实环境,一般需要编写专门用于测试的程序。本节将为word_count驱动编写一个专门的测试程序(test_word_count.c)。test_word_count.c通过直接操作/dev/wordcount设备文件与word_count驱动进行交互。测试程序的代码如下:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int testdev; 				//  打开设备文件(/dev/wordcount)的句柄
    unsigned char buf[4];          //  表示单词数的4个字节
    //  打开设备文件
    testdev = open("/dev/wordcount", O_RDWR);
    //  如果open函数返回-1,表示打开设备文件失败
    if (testdev == -1)
    {
        printf("Cann't open file \n");
        return 0;
    }
    //  如果test_word_count后面跟有命令行参数,程序会将第1个参数值当作待统计的字符串
    //  如果没有命令行参数,则只读取设备文件中的值
    if (argc > 1)
    {
        //  向设备文件写入待统计的字符串
        write(testdev, argv[1], strlen(argv[1]));
        //  输出待统计的字符串
        printf("string:%s\n", argv[1]);
    }
    //  读取设备文件中的单词数(4个字节)
    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]);
	    //  分别输出从设备文件获取的4个字节的值
    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;
}

      test_word_count程序可以跟1个命令行参数(多个命令行参数只会使用第1个命令行参数)。如果命令行参数值含有空格,需要使用单引号(')或双引号(")将参数值括起来。可以使用下面的一组命令测试word_count驱动程序。

# gcc test_word_count.c  -o test_word_count
# test_word_count
# test_word_count "I love you."
    执行上面的命令后,如果输出如图6-14所示的信息(假设word_count以前统计过一个含有4个单词的字符串),表示word_count驱动成功测试。

二、在Android模拟器上通过原生(Native)C程序测试Linux驱动

      虽说我们开发的是Linux驱动,但本书主要介绍的是Android版的Linux内核,因此,Linux驱动只在Ubuntu Linux上测试成功还不能保证在Android设备上一定能正常工作,所以必须在Android设备上进行测试。Android设备有很多种类,如安装了Android的开发板,运行Android系统的手机或平板电脑等。但离我们最近的并不是这些硬件设备,而是Android模拟器。Android模拟器可以模拟绝大多数真实的环境,所以可以利用Android模拟器测试Linux内核。

      在Android模拟器上测试Linux驱动首先应该想到的,也是最先应该做的就是将word_count.ko驱动模块安装在模拟器上。可能读者使用过adb shell命令。如果进入Android模拟器的命令提示符为“#”,说明通过命令行方式进入Android模拟器直接就是root权限(命令提示符为“$”,表示非root权限),因此从理论上可以使用insmod命令将word_count.ko驱动模块直接安装在Android模拟器中。现在我们来测试一下,看看是否可以将word_count.ko安装在Android模拟器上。现在执行build.sh脚本,并选择“Android模拟器”,脚本会自动将word_count.ko文件上传到Android模拟器的/data/local目录,并进行安装。如果读者选择的是S3C6410开发板,在安装word_count.ko时就会输出如下的错误信息,表示编译Linux驱动的Linux内核版本与当前Android模拟器的版本不相同,无法安装。所以在编译Linux驱动时,必须选择与当前运行的Linux内核版本相同的Linux内核进行编译,否则就无法安装Linux驱动。

insmod:init_module ‘/data/local/word_count.ko’ failed(Function not implemen