上次作业总结
作业:实现一个字符设备驱动,实现ioctl接口,实现功能:注册和删除platform device/driver
状态:第一次接触驱动
思路:ioctl接口暂时没有思路,但若仅实现注册与删除,鉴于platform设备驱动本身具有的特殊性。platform驱动主要实现platform_device和platform_driver在platform上的注册与匹配。
需掌握的知识点:platform虚拟总线
device和driver和总线
需要用到的命令
know1:platform虚拟总线
Platform驱动实现platform_device和platform_driver在platform上的注册与匹配并相互绑定,然后作为一个普通的字符设备进行相应的应用。
Platform驱动的核心仍然是字符设备的核心结构:cdev,file_operations(包含的操作函数接口),dev_t(设备号),/dev(设备文件)等。
*提问:是一对一的关系吗?尝试写了一个新的driver,name相同但无法匹配上。
know2:总线、驱动、设备
先定义一个platform_device ,然后用platform_device_register在总线上进行注册;再定义一个platform_driver,用platform_drivier_register注册。Device与driver靠name字段匹配
*对应的是platform_device_unregister和platform_driver_unregister
内核要求每次出现一个设备就要向总线汇报(注册);每出现一个驱动就要向总线汇报(注册);内核启动时会扫描链接了哪些设备并为每一个设备建立一个struct device变量,并为每一个driver准备一个struct_driver结构变量,并加入相应链表后形成一条设备链表和一条驱动链表,这样就可以通过总线找到挂载在总线上的设备和驱动程序。
know3:常用命令
make命令等
Insmod/modprobe
Rmmod
Module_init(init_function);
Module_exit(exit_function)
__init/__initdata [仅用于模块初始化或清除阶段的函数和数据标记]
__exit/__exitdata
Current->pid [当前进程的进程id]
Current->comm [当前进程的进程名]
Obj-m: = test.o [由内核构造系统使用的makefile符号]
/sys/module [sysfs目录层次结构中包含当前已装载模块信息的目录]
#include <linux/module.h>
#include <linux/version.h> [两个基本必备的头文件]