字符设备驱动

graph LR
A[字符设备驱动框架]-->B1[驱动初始化]
	B1[驱动初始化]-->C1[分配设备号]
		C1[分配设备号]-->D1[静态分配设备号]
			D1[静态分配设备号]-->E(register_chrdev_region)
		C1[分配设备号]-->D2[动态分配设备号]
			D2[动态分配设备号]-->F(alloc_chrdev_region)
		C1[分配设备号]-->D3[操作设备号dev_t]
			D3[操作设备号dev_t]-->Z1(MAJOR提取主设备号)
			D3[操作设备号dev_t]-->Z2(MINOR提取主设备号)
			D3[操作设备号dev_t]-->Z3(MKDRV将主次设备号合成dev_t)
			D3[操作设备号dev_t]-->Z4(cat /proc/device/xxx查看设备号)
	B1[驱动初始化]-->C2[初始化cdev]
		C2[初始化cdev]-->G(cdev_init)
	B1[驱动初始化]-->C3[注册cdev]
		C3[注册cdev]-->H(cdev_add)
A[字符设备驱动框架]-->B2[构建file_operations]
	B2[构建file_operations]-->J1(open)
	B2[构建file_operations]-->J2(read)
		J2(read)-->K(copy_to_user)
	B2[构建file_operations]-->J3(write)
		J3(write)-->L(copy_from_user)
	B2[构建file_operations]-->J4(ioctl)
		J4(ioctl)-->M(copy_from_user/copy_to_user)
	B2[构建file_operations]-->J5(close)
A[字符设备驱动框架]-->B3[生成设备节点]
	B3[生成设备节点]-->N1[手动生成设备节点]
		N1[手动生成设备节点]-->O(mknod命令)
	B3[生成设备节点]-->N2[自动生成设备节点]
		N2[自动生成设备节点]-->M1(class_create:在/sys/class/目录下创建一个class)
		N2[自动生成设备节点]-->M2(device_create:在/dev/目录下创建一个device)
A[字符设备驱动框架]-->B4[驱动卸载]
	B4[驱动卸载]-->P1[释放设备号]
		P1[释放设备号]-->Q(unregister_chrdev_region)
	B4[驱动卸载]-->P2[卸载cdev]
		P2[卸载cdev]-->R(cdev_del)
	B4[驱动卸载]-->P3[卸载设备]
		P3[卸载设备]-->T(device_destory)

杂项设备驱动

graph LR
A[杂项设备驱动框架]-->B1[注册杂项设备]
	B1[注册杂项设备]-->C(misc_register)
A[杂项设备驱动框架]-->B2[构建杂项设备结构体]
	B2[构建杂项设备结构体]-->D(struct miscdevice:对次设备号/设备节点名称/file_operations初始化)
A[杂项设备驱动框架]-->B3[构建file_operations]
	B3[构建file_operations]-->J1(open)
	B3[构建file_operations]-->J2(read)
		J2(read)-->K(copy_to_user)
	B3[构建file_operations]-->J3(write)
		J3(write)-->L(copy_from_user)
	B3[构建file_operations]-->J4(ioctl)
		J4(ioctl)-->M(copy_from_user/copy_to_user)
	B3[构建file_operations]-->J5(close)
A[杂项设备驱动框架]-->B4[卸载杂项设备]
	B4[卸载杂项设备]-->E(misc_deregister)

应用层打开节点

graph LR
A[应用程序]-->B1[open]
	B1-->C[file_operations]
A[应用程序]-->B2[read]
	B2-->C[file_operations]
A[应用程序]-->B3[write]
	B3-->C[file_operations]
A[应用程序]-->B4[ioctl]
	B4-->C[file_operations]
A[应用程序]-->B5[close]
	B5-->C[file_operations]
C-->D1[内核注册的open]
C-->D2[内核注册的read]
C-->D3[内核注册的write]
C-->D4[内核注册的ioctl]
C-->D5[内核注册的close]
D1-->E[操作硬件]
D2-->E[操作硬件]
D3-->E[操作硬件]
D4-->E[操作硬件]
D5-->E[操作硬件]