深度探索笔记-第六章

书中提到:Linux驱动和普通的LinuxAPI没有本质的区别,linux将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,这样与驱动交换数据就像和设备文件交换数据一样。而我们使用的windows不同,Windows中我发现很难找到安装后的驱动的文件目录。

要将数据在硬件设备上实现输出就需要Linui 驱动可以响应应用程序传递过来的数据,这里需要使用回调函数,编写 Linux 驱动最重要的一步就是编写回调函数。

基本的Linux驱动开发的一般步骤如下:

1:建立Linux驱动骨架,linux系统对驱动的基本操作是初始化加载和释放退出,之前的章节就出现过,这两个函数分别用 modu te_init 和 moduie_exit 宏指定。因此包含这两 个函数及指定这两个函数的两个宏的 C程序文件也可看作是 Linux 驱动的骨架。

2: 注册和注销设备文件,分别使用misc_register和misc_deregi ster 函数创建和移除设备文件。

3:指定与驱动相关的信息。

4:指定回调函数,例如read,write都是,与设备文件相关的通过misc_register注册。

5:编写业务逻辑,也就是通过编写代码来实现功能。

6:编写 Makefile 文件。

7:编译 Linux 驱动程序;

8:安装和卸载 Linux 驱动,使用ins mod或modprobe命令装载,使用rmmod命令卸载。

统计单词数的例子是利用设备文件作为介质与应用程序进行交互,并没有访问硬件。

要注意驱动文件的创建方式:echo ‘’ > word _count.c。

在创建makefile文件时,obj-m 表示将 Linux 驱动作为模块(.ko 文件〉编译,obj-y则将 Linux 驱动编译进 Linux 内核。如果驱动依赖其他文件,其中依赖文件要使用 module-y 或 module-objs 指定,module 表示模块名。

编写骨架文件时出现了printk函数,它和printf类似,printf 函数运行在用户空间,printk 函数运行在内核空间。

之前多次提到过android也是基于linux内核的因此大多数linux驱动程序可以在其他 Linux 发行版上测试完再重新用交叉编译器编译成基于 ARM架构的目标文件,然后再安装到 Android 上即可正常运行。

要注意相关信息中的开源协议。

本书中为每个例子编写了一个Build.h脚本文件来编译和安装源代码,执行这个脚本文件就会要求用户选择将源代码编译到那个平台。使用echo ' hello lining’> /dev/wordcount写入数据和cat /dev/wo  rdcount来读取数据,对驱动进行测试。

使用 modprobe 命令也可以安装Linux 驱动,insmod和modprobe 的区别是 modprobe 命令可以检查驱动模块的依赖性,使用前需要先使用  depmod 命令检测 Linux驱动模块的依赖关系。

例子中在linux下测试驱动,为了使测试效果更接近其实环境, 一般需要编写专门用于测试的程序。此外可以利用 Android 模拟器测试 Linux 内核。Android 模拟器的 goldfish 内核默认不允许动态装载 Linux 驱动模块,因此需要在编译Linux 内核之前执行如下命令配置 Linux 内核。:

cd  -/kernel/goldfish

make  menucoNfig

         在eclipes中编写测试驱动程序的化更加直观和方便,实际练习时可以多使用eclipes。

 

posted @ 2016-07-08 16:00  焦岚  阅读(139)  评论(0编辑  收藏  举报