Linux下的设备通常分为三类,字符设备,块设备和 络设备。
设备驱动程序也分为对应的三类:字符设备驱动程序、块设备驱动程序和 络设备驱动程序。
常见的字符设备有鼠标、键盘、串口、控制台等。
常见的块设备有各种硬盘、flash磁盘、RAM磁盘等。
在Linux里一个 络设备也可以叫做一个 络接口,如eth0,应用程序是通过Socket而不是设备节点来访问 络设备,在系统里根本就不存在 络设备节点。 络接口没有像字符设备和块设备一样的设备 ,只有一个唯一的名字,如eth0、eth1等,而这个名字也不需要与设备文件节点对应
设备节点被创建在/dev下,是连接内核与用户层的枢纽,就是设备是接到对应哪种接口的哪个ID 上。 相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息
在Linux中,所有设备都以文件的形式存放在/dev目录下,都是通过文件的方式进行访问,设备节点是Linux内核对设备的抽象,一个设备节点就是一个文件。应用程序通过一组标准化的调用执行访问设备,这些调用独立于任何特定的驱动程序。而驱动程序负责将这些标准调用映射到实际硬件的特有操作。
设备节点,驱动,硬件设备是如何关联到一起的呢br> 这是通过设备 实现的,包括主设备 和次设备 。当我们创建一个设备节点时需要指定主设备 和次设备 。应用程序通过名称访问设备,而设备 指定了对应的驱动程序和对应的设备。主设备 标识设备对应的驱动程序,次设备 由内核使用,用于确定设备节点所指设备。
主设备 :驱动程序在初始化时,会注册它的驱动及对应主设备 到系统中,这样当应用程序访问设备节点时,系统就知道它所访问的驱动程序了。你可以通过/proc/devices文件来查看系统设备的主设备 。
次设备 :驱动程序遍历设备时,每发现一个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备 以区分不同的设备。这样当应用程序访问设备节点时驱动程序就可以根据次设备 知道它说访问的设备了。
设备节点(设备文件):Linux中设备节点是通过“mknod”命令来创建的。一个设备节点其实就是一个文件,Linux中称为设备文件。有一点必要说明的是,在Linux中,所有的设备访问都是通过文件的方式,一般的数据文件程序普通文件,设备节点称为设备文件。
设备驱动:设备驱动程序(device driver),简称驱动程序(driver),是一个允许高级(High level)计算机软件(computer software)与硬件(hardware)交互的程序,这种程序建立了一个硬件与硬件,或硬件与软件沟通的界面,经由主板上的总线(bus)或其它沟通子系统(subsystem)与硬件形成连接的机制,这样的机制使得硬件设备(device)上的数据交换成为可能。想象平时我们说的写驱动,例如点led灯的驱动,就是简单的io操作。
以上很重要
如何编写最简单的LED驱动程序
编写驱动程序的套路:
① 确定主设备 ,也可以让内核分配
② 定义自己的file_operations结构体
③ 实现对应的drv_open/drv_read/drv_write等函数,填入file_operations结构体
④ 把file_operations结构体告诉内核:register_chrdev
⑤ 谁来注册驱动程序啊有一个入口函数:安装驱动程序时,就会去调用这个入口函数
⑥ 有入口函数就应该有出口函数:卸载驱动程序时,出口函数调用unregister_chrdev
⑦ 其他完善:提供设备信息,自动创建设备节点:class_create, device_create
实现led_open函数,在里面初始化LED引脚。
实现led_write函数,在里面根据APP传来的值控制LED。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!