大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux驱动程序框架介绍问题。
嵌入式linux中文站向广大嵌入式linux爱好者介绍了Linux驱动框架。
1.linux设备驱动程序和外部世界之间的接口可以分为三个部分:
1.驱动程序和操作系统内核之间的接口。它是通过file _ operations(include/Linux/fs . h)数据结构完成的。
2.驱动程序和系统引导之间的接口。这部分使用驱动程序来初始化设备。
3.驱动程序和设备之间的接口。这一部分描述了驱动程序如何与设备交互,这与特定的设备密切相关。
第二,按照功能划分,设备驱动的代码有以下几个部分:
1.司机的登记和注销。
2.设备的打开和释放。
3.设备的读写操作。
4.控制设备的运行。
5.设备的中断和轮询处理。
三.司机的登记和注销:
设备驱动程序可以在系统启动时初始化,也可以在需要时动态加载。字符由chr_dev_init()初始化,包括内存(devfs _ register _ CHRDEV(MEM _ Major,' MEM ',memory _ FOPS))、终端(tty_init()、打印机(lp_init())和鼠标(misc_init())
块初始化由blk_dev_init()完成,包括IDE硬盘(ide_init())、软盘(软盘_init())和光驱等块设备的初始化。
每个字符设备或块设备的初始化都通过devfs_register_chrdev()或devfs_register_blkdev()向内核注册。关闭字符设备或块设备时,还需要通过devfs_unregister_chrdev()或devfs_unregister_blkdev()从内核注销设备。
四.设备的打开和释放:
打开设备的方法是打开()。例如,打印机用lp_open()打开,而硬盘用hd_open()打开。在大多数设备驱动程序中,open会执行以下操作:
1.增加设备的使用次数。
2.检查与设备相关的错误,如设备未准备好或类似的硬件问题。
3.如果首次打开检查,初始化设备。
4.识别辅助设备号,必要时更新f_op指针。
5.如有必要,分配并设置要放在filp-private_data中的数据结构。
通过释放()释放设备,例如,通过lp_release()释放打印机,通过tty_release()释放终端设备。释放设备的一般步骤包括:
1.释放filp-private_data中由open分配的内存。
2.如果是最后一次释放,请关闭设备。
3.减少其他设置的使用次数。
动词(verb的缩写)设备的读写操作:
字符使用自己的read()和write()来读写数据。例如,虚拟终端由vcs_read()和vcs_write()读写。
块使用泛型_file_read()和泛型_file_write()来读写数据。这两个通用函数将读写请求添加到请求表中,内核可以通过ll_rw_block()优化请求的顺序。因为它在内存缓冲区而不是设备上运行,所以可以加快读写请求的速度。如果内存缓冲区中没有要读取的数据,或者要向设备写入写请求,则应执行数据传输。这是通过数据结构request_queue和request _ fn()(include/Linux/blk dev . h)完成的。
不及物动词控制设备的运行:
除了读写操作,有时还需要控制设备。这可以通过设备驱动程序中的ioctl()来完成。比如IDE硬盘可以由hd_ioctl()控制,光驱可以由cdrom_ioctl()控制。
与读写操作不同,ioctl()的用法与特定设备密切相关。以软驱的floppy_ioctl()为例(drivers/block/floppy.c):
staTIc int FD _ ioctl(struct inode * inode,
结构文件*filp,
无符号整数cmd,
无符号长参数);
其中,cmd的价值和意义与软驱有关,例如,FDEJECT表示弹出软盘。
除了ioctl(),设备驱动程序可能还有其他控制功能,例如llseek()。
七.设备的轮询和中断处理:
对于不支持中断的设备,读写时需要轮询设备状态,是否继续数据传输。例如,打印机。如果设备支持中断,可以根据中断方式进行。