字符设备驱动
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[操作硬件]