接下来就要进入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内核测试