第六章

接下来就要进入Android底层开发入门的阶段了,在学习Linux驱动之前先来介绍一下Linux驱动的工作方式,Linux系统将每个驱动都映射成一个文件。这些文件称为设备文件或驱动文件,都保存在/dev目录中。这种设计理念使得与Linux驱动进行交互就向与普通文件进行交互一样容易。大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据变成与驱动设备交换数据。

编写Linux驱动程序的步骤:

1.建立Linux驱动骨架(装载和卸载Linux驱动)

2.注册和注销设备文件

3.指定与驱动相关的信息

4.指定回调函数

5.编写业务逻辑

6.编写Makefile文件

7.编译Linux驱动程序

8.安装和卸载Linux驱动

接下来要进行一个实例:

基础代码:#mkdir -p  /root/drivers/ch06/word_count    建立目录存放Linux驱动程序

#cd /root/drivers/ch06/word_count

#echo '' > word_count.c  建立驱动源代码文件

#echo 'obj-m := word_count.o' > Makefile  编写一个Makefile文件 make命令会吧Linux驱动源代码目录中的word_count.c或 word_count.s文件编译成word_count.o文件

obj-m 表示将Linux驱动作为模块(.ko文件)编译,word_count.o会被连接进word_count.ko文件,然后使用insmod或modprode命令装载word_count.ko

obj-y  表示将Linux驱动编译进Linux内核,word_count.o会被连接进built-in.o 文件,最终会被连接进内核

Linux系统将内存分为了用户空间和内核空间,两者空间的程序不能直接访问,printk函数运行在内核空间,printf函数运行在用户空间,因此属于内核程序的Linux驱动是不能直接访问printf函数的#make -C /usr/src/linux-headers-3.0.0-15-generic  M=/root/driver/ch06/word_count    编译Linux驱动源代码

# insmod word_count.ko  装载驱动

# lsmod | grep word_count   查看word_count是否安装成功

# rmmod word_count   卸载Linux驱动

#dmesg | grep word_count | tail -n 2    查看有Linux驱动输出的日志信息

加入有关信息:#define DEVICE_NAME "wordcount"    //定义设备文件名

//描述与设备文件触发的事件对应的回调函数指针

//owner:设备事件回调幻术应用于哪些驱动模块,THIS_MODULE表示应用于当前驱动模块

static struct file_operations dev_fops={.owner = THIS_MODULE};

//描述设备文件的信息

//minor:次设备号 MISC_DYNAMIC_MINOR,:动态生成次设备号  name :  设备文件名称

//fops : file_operations 结构体变量指针

static struct miscdevice misc={.minor = MISC_DYNAMIC_MINOR, .name=DEVICE_NAME,.fops = &dev_fops};

//初始化Linux驱动

static  int word_count_init(void)

{ int ret;

   ret = misc_register(&misc);

  printk("word_count_init_success ");

 return ret;

}

装载与卸载驱动:检查word_count驱动工作是否完全正常

#dmesg | tail -n 1

#modinfo word_count.ko

检测Linux驱动模块的依赖关系

#depmod /root/drivers/ch06/word_count/word_count.ko

调用命令装载Linux驱动

#modprode word_count

值得注意的是insmod 和 modprode 命令都是加载驱动,后者可以检查驱动模块的依赖性

接下来是多种方法测试Linux驱动:

1.使用Ubuntu Linux测试Linux驱动程序

2.在安卓模拟器上使用原生C语言来测试

3.使用Android ADK测试Linux驱动程序

4.使用Java代码直接操作设备文件来测试

5.使用S3C6410测试

6.将驱动编译进Linux内核测试

原文地址:https://www.cnblogs.com/xianrenzhilu/p/5561573.html