1. 概念

能够以字节流的形式访问而且只能顺序访问的设备叫做字符设备,针对字符设备编写的驱动叫做字符设备驱动

2. 字符设备驱动原理框图

用户层: app: open("/dev/input/mouse0", O_RDWR);
				read(), wirte(), close()
─────────────────────────────────────────────────────
内核层:    鼠标设备驱动
┌──────────────────────────┐  鼠标设备驱动注册后会得
│   mouse_open()           │  到一个设备号可以创建
│   mouse_read()           │  鼠标设备文件 /dev/...
│   mouse_write()          │  设备号:13,32
│   mouse_close()          │  设备号 = 13 << 20 | 32
└──────────────────────────┘
─────────────────────────────────────────────────────
硬件层:    鼠标设备

应用层控制硬件需要完成的事情:

  1. 驱动如何注册
  2. 设备文件如何创建
  3. 用户空间的系统调用如何回调到系统的操作方法
  4. 用户空间如何将指令传递到内核,内核如何将数据传递到用户空间
  5. 将硬件寄存器的物理内存映射为虚拟内存控制硬件

3. 字符设备驱动注册注销API

3.1 注册接口函数

#include <linux/fs.h> // 头文件
// 函数原型
int register_chrdev(unsigned int major, const char *name,
										const struct file_operations *fops);

功能:实现字符设备驱动的注册,这个函数申请了 256 个设备的资源,次设备号是 0 - 255。

参数:

返回值: