读Linux那些事儿之我是HUB笔记(五)

简介:

28bus_mA:记录的是能够从总线上获得的电流,毫无疑问就是咱们前面算出来的 hub 上的那个 mA_per_port.

    level,级别,表征 usb 设备树的级连关系.Root Hub 当然其 level 就是 0,其下面一层就是level 1,再下面一层就是 level 2,依此类推.

29device_qualifier描述符

在高速和全速下有不同设备配置信息的高速设备必须具有一个 device_qualifier描述符 ,它描述了一个高速设备在进行速度切换时所需改变的信息.比如,一个设备当前工作于全速状态,那么 device qualifier 中就保存着信息记录这个设备工作在高速状态的信息,反之如果一个设备当前工作于高速状态,那么device qualifier中就包含着这个设备工作于全速状态的信息.

 

30、设备号:

dev_t记录下了设备的主设备号和次设备号.,dev_t 包含两部分,主设备号部分和次设备号部分. 12 位表征主设备号, 20位表示次设备号.

31hub驱动的使命:

device_add(),Linux 2.6设备模型中最基础的函数之一,这个函数非常了不起.要深入追踪这个函数,足以写一篇专题文章了.这个函数来自 drivers/base/core.c ,是设备模型那边提供的函数,从作用上来说,这个函数这么一执行,系统里就真正有了咱们这个设备,/sysfs 下面也能看到了,而且将会去遍历注册到 usb 总线上的所有的驱动程序,如果找到合适的,就去调用该驱动的probe函数;

对于U盘来说,最终将调用storage_probe()函数,对于hub来说,最终将调用hub_probe()函数,传递给它们的参数,正是我们此前获得的struct usb_interface指针和一个 struct usb_device_id 指针.后者我们在 usb-storage 里面已经非常熟悉了,它正是我们在usb总线上寻找驱动程序的依据,换句话说,每个驱动程序都会usb-storage那样,把自己支持的设备定义在一张表里,表中的每一项就是一个 struct usb_device_id,然后当我们获得了一个具体设备,我们就把该设备的实际的信息与这张表去比较,如果找到匹配的了,就认为该驱动支持该设备,从而最终会调用该驱动的probe()函数.而从此,这个设备就被传递到了设备驱动.hub驱动也完成了它最重要的一项工作.

 

32、电源管理

主流的技术有两种,APM  ACPI

APMAdvanced Power Management,高级电源管理,

ACPIAdvanced Configuration and Power Interface,高级配置和电源接口

电源管理的含义是什么:省电

众所周知,电源管理最重要的两个概念就是 suspend  resume,即挂起和恢复总的来说,suspend这个过程就是,上级下命令通知driver,driver保存状态,然后执行命令. notify before save state;save state before power down. resume 这个过程则是,power on and restore state.

STR  STD,这是两种Suspend 的状态.STRSuspend to RAM,挂起到内存,STD 就是Suspend to Disk,挂起到磁盘.STR 就是把系统进入 STR 前的工作状态数据都存放在内存中去. STR 状态下,电源仍然继续为内存和主板芯片组供电,以确保数据不丢失,而其它设备均处于关闭状态,系统的耗电量极低.一旦我们按下 Power 按钮,系统就被唤醒,马上从内存中读取数据并恢复到 STR 之前的工作状态,STR 的优点是休眠快唤醒也快,因为数据本来就在内存中. STD 则是把数据保存在磁盘中,很显然,保存在磁盘中要比保存在内存中慢.

ACPI 的状态一共有五种,分别是 S1,S2,S3,S4,S5,实际上 S4 就是 STD, STR 就是 S3,只不过 S1,S2,S3 差别不大,不过, Linux ,S1 被叫做 Standby, S3 被叫做 STR. S5就是 Shutdown. Linux 中说挂起,主要说的就是 S1,S3 S4.

到这里,hub驱动基本上看完了,其实hub做的事情很简单就是为设备做一系列的初始化工作,最后调用设备通过的proble函数。



本文转自 曾永刚 51CTO博客,原文链接:http://blog.51cto.com/zyg0227/557475


相关文章
|
1月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
112 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
3月前
|
Linux
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记10-进程NICE案例分析2
|
3月前
|
Linux
Linux源码阅读笔记09-进程NICE案例分析1
Linux源码阅读笔记09-进程NICE案例分析1
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
85 2
linux笔记 diff及patch的制作与使用
|
3月前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
68 9
|
3月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
3月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
3月前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障
|
3月前
|
Linux 开发者
Linux源码阅读笔记18-插入模型及删除模块操作
Linux源码阅读笔记18-插入模型及删除模块操作