设备驱动与初始化程序全解析
1. 设备驱动与硬件交互
设备驱动的主要任务是处理设备,通常是物理硬件,有时也包括虚拟接口,并以一致且有用的方式将它们呈现给用户空间。Linux 设备驱动大致可分为字符、块和网络三类,其中字符驱动接口最为灵活,也最为常见。
1.1 发现硬件配置
虚拟驱动仅能操作内存结构,缺乏与真实硬件的交互。而实际的设备驱动通常是为与硬件交互而编写的,这其中的一部分工作就是首先要能够发现硬件。需要注意的是,在不同的配置中,硬件可能位于不同的地址。
有些硬件会自行提供相关信息。例如,PCI 或 USB 等可发现总线上的设备具有查询模式,该模式会返回资源需求和唯一标识符。内核会将这些标识符以及可能的其他特性与设备驱动进行匹配,并将它们关联起来。
然而,嵌入式板上的大多数硬件模块并没有这样的标识符,这时就需要我们自己以设备树或平台数据(C 结构)的形式提供相关信息。
在 Linux 的标准驱动模型中,设备驱动会向相应的子系统(如 PCI、USB、开放固件(设备树)、平台设备等)进行注册。注册信息包括一个标识符和一个称为探测函数(probe function)的回调函数。当硬件的 ID 与驱动的 ID 匹配时,就会调用这个探测函数。对于 PCI 和 USB 设备,ID 基于设备的供应商和产品 ID;对于设备树和平台设备,ID 则是一个名称(文本字符串)。
1.2 设备树
设备树在硬件配置中起着重要作用。以 ARM Versatile 板为例,其以太网适配器在设备树文件 arch/arm/boot/dts/versatile-ab.dts 中
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



