您的位置首页>企业动态>

Linux驱动程序框架介绍

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux驱动程序框架介绍问题。嵌入式linux中文站向广大嵌入式linux爱好者介绍了Linux

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解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()。

七.设备的轮询和中断处理:

对于不支持中断的设备,读写时需要轮询设备状态,是否继续数据传输。例如,打印机。如果设备支持中断,可以根据中断方式进行。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。