初识linux设备驱动开发

来源:互联网 发布:获取局域网mac地址命令 编辑:程序博客网 时间:2024/05/20 10:55

设备驱动的理解:

驱使硬件设备行动,驱动在底层硬件和应用软件之间起着一个承上启下的作用。应用软件只需要调用系统的API就可以让硬件做相应的工作,而不需要去管硬件是什么样子的。无操作系统的时候,驱动工程师可以根据硬件设备的特点去自定义API,应用工程师直接调用这些API即可;有操作系统的情况下,需要按照相应的架构来设计驱动(架构??需要研究!!)无操作系统:功能比较单一、控制并不复杂的系统,比如公交卡、电冰箱什么的有操作系统下驱动的作用:1. 驱动进行的硬件操作依然还是需要的2. 驱动加载进内核中,对应用软件而言需要提供操作系统的API来操作设备;对操作系统而言需要提供操作驱动的API。这样的话,可以发现其实调用操作系统的API其实是调用驱动的API,进而对底层硬件进行了操作3. 总的来说,当驱动都按照操作系统的要求来设计驱动的借口的时候,那么应用程序就可以调用统一的操作系统的API来访问各种设备,对于驱动而言很麻烦,但是对于应用程序而言很是便利

linux设备的分类和特点:

字符串设备:以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等块设备:按任意顺序访问,以块为单位进行操作,如硬盘、eMMC等如上节所说,虽然这两种设备的驱动设计有很大的出入,但是操作系统提供的API是一样的:open()、close()、read()、write()等等除网络设备之外,字符设备和块设备都被映射到Linux文件系统的文件和目录。对于块设备,Linux有两种访问方式。一种是类似dd命令对应的原始块设备,比如“dev/sdb1”等;另外一种方法是在块设备上建立FAT、EXT4等文件系统,然后以文件路径如“/home/hello.txt”的形式来访问。应用软件可以通过系统调用接口来编程也可以用c库函数来编程,出于代码的可移植性,后者值得推荐。其实后者也是调用操作系统的接口来实现的。

驱动界的Hello World

从hello world到Makefile

首先是hello world的代码#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){    printk(KERN_ALERT "hello, world\n");    return 0;}static void hello_exit(void){    printk(KERN_ALERT "GoodBye, cruel world!\n");}moudule_init(hello_init);//加载(insmod)模块的时候调用hello_intmoudule_exit(hello_exit);//卸载(rmmod)模块的时候调用hello_exit内核运行的时候不能依赖于c库,所以得用自己的打印函数printk。当驱动加载到内核中的时候,可以访问内核的公用符号(包括函数和变量),所以驱动可以使用printk函数。Makefile可以随便找本书抄下,但是我觉得其实不是很懂这个Makefile如何写的,所以还是需要进一步的研究。这样编译完成之后,可以得到一个ko文件,insmod或者rmmod都是可以的。

LED驱动

无操作系统下的LED驱动:

LED灯是由GPIO口来控制,GPIO一般由两组寄存器控制,一组控制寄存器,一组数据寄存器。控制寄存器控制GPIO的方向:输入输出,数据寄存器控制或者显示GPIO口的电平高低。在编写这种驱动的时候,只需要将LED开启关闭的函数接口交给应用程序,这样就可以由应用程序去调用来实现自己的功能。

有操作系统下的LED驱动

Linux内核为字符设备定义了大量的数据结构和函数,在编写驱动的时候需要用这些东西来实现驱动与内核的接口。这就是为啥在有操作系统的情况下驱动会变得复杂。
0 0
原创粉丝点击