初识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
- 初识linux设备驱动开发
- linux字符设备驱动初识
- 初识Linux设备驱动之字符设备
- Linux设备驱动开发
- Linux设备驱动开发
- Linux设备驱动开发
- Linux设备驱动开发
- Linux设备驱动开发
- linux驱动编写之十六(块驱动设备初识)
- Linux设备驱动开发详解
- Linux设备驱动开发概述
- Linux设备驱动开发示例
- LINUX设备驱动开发详解
- linux设备驱动开发详解
- Linux设备驱动开发概述
- linux设备驱动开发------牛人
- Linux设备驱动开发流程
- Linux设备驱动开发笔记
- Linux内核编程初体验 —— hello world
- Oracle高级查询
- 数组赋值
- HTML/CSS基础篇
- 山东大学电子设计与飞思卡尔协会培训1——51单片机
- 初识linux设备驱动开发
- 使用Jquery开源插件实现文件上传(带进度条)
- 四.Contiki之Protothread机制
- 洛谷 P1137 旅行计划
- 不要给真理, 要给解决方案!
- hdu 5980 Find Small A
- NO.4 鼠标的绘图操作
- JSTL标签库
- Coding和Git的环境搭建