驱动开发步骤
1、实现模块的加载和卸载入口
module_init(chr_dev_init)
module_exit(chr_dev_exit)
2、在模块加载入口函数中:
a,申请主设备号----让内核能够区分和管理不同的字符设备
register_chrdev(dev_major, "chr_dev", &my_fops)
b,创建设备文件节点----为用户提供一个可以操作文件的接口
struct class *class_create(THIS_MODULE, "chr_cls");
struct device *device_create(devcls, NULL, MKDEV(dev_major, 0), NULL, "name_device")
c,硬件的初始化
1.地址的映射
将硬件寄存器地址映射到虚拟文件系统,通过ioremap
2.申请中断
3.实现硬件寄存器的初始化----配置GPIO功能
实现file_operations
const struct file_operation my_fops = {
.open = chr_drv_open,
.close = chr_drv_close,
.read = chr_drv_read;
};