初识linux设备驱动开发

设备驱动的理解:

驱使硬件设备行动,驱动在底层硬件和应用软件之间起着一个承上启下的作用。应用软件只需要调用系统的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_int
moudule_exit(hello_exit);//卸载(rmmod)模块的时候调用hello_exit

内核运行的时候不能依赖于c库,所以得用自己的打印函数printk。当驱动加载到内核中的时候,可以访问内核的公用符号(包括函数和变量),所以驱动可以使用printk函数。
Makefile可以随便找本书抄下,但是我觉得其实不是很懂这个Makefile如何写的,所以还是需要进一步的研究。
这样编译完成之后,可以得到一个ko文件,insmod或者rmmod都是可以的。

LED驱动

无操作系统下的LED驱动:
LED灯是由GPIO口来控制,GPIO一般由两组寄存器控制,一组控制寄存器,一组数据寄存器。控制寄存器控制GPIO的方向:输入输出,数据寄存器控制或者显示GPIO口的电平高低。
在编写这种驱动的时候,只需要将LED开启关闭的函数接口交给应用程序,这样就可以由应用程序去调用来实现自己的功能。
有操作系统下的LED驱动
Linux内核为字符设备定义了大量的数据结构和函数,在编写驱动的时候需要用这些东西来实现驱动与内核的接口。这就是为啥在有操作系统的情况下驱动会变得复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值