从内核的angular度来看,请参阅/ usr / src / linux / Documentation / firmware_class / README :
内核(驱动程序):调用request_firmware(&fw_entry,$ FIRMWARE,设备)
用户空间:
- / sys / class / firmware / xxx / {loading,data}出现。
- 在$ FIRMWARE中使用固件标识符调用hotplug
和通常的热插拔环境。
- hotplug:echo 1> / sys / class / firmware / xxx / loading
内核:丢弃任何以前的部分负载。
用户空间:
- hotplug:cat appropriate_firmware_image> \
/ SYS /class/固件/ XXX /数据
内核:以PAGE_SIZE增量生长一个缓冲区来保存图像
进来。
用户空间:
- hotplug:echo 0> / sys / class / firmware / xxx / loading
内核:request_firmware()返回并且驱动程序具有固件
image in fw_entry - > {data,size}。 如果出了点问题
request_firmware()返回非零值,fw_entry被设置为
空值。
内核(驱动程序):驱动程序代码调用release_firmware(fw_entry)释放
固件映像和任何相关资源。
内核实际上并没有加载任何固件。 它只是简单地通知用户空间,“我想要一个名为xxx的固件”,并等待用户空间将固件映像传回给内核。
现在,在Ubuntu 8.04上,
$ grep固件/etc/udev/rules.d/80-program.rules
#根据需要加载固件
SUBSYSTEM ==“firmware”,ACTION ==“add”,RUN + =“firmware_helper”
所以如你udev , udev被configuration为在内核要求firmware_helper时运行firmware_helper。
$ apt-get source udev
正在读取软件包列表...完成
build立依赖关系树
阅读状态信息...完成
需要获得312kB的源文件。
获取:1 http://us.archive.ubuntu.com hardy-security / main udev 117-8ubuntu0.2(dsc)[716B]
获取:2 http://us.archive.ubuntu.com hardy-security / main udev 117-8ubuntu0.2(tar)[245kB]
获取:3 http://us.archive.ubuntu.com hardy-security / main udev 117-8ubuntu0.2(差异)[65.7kB]
在1秒内获得312kB(223kB / s)
gpg:签名使用DSA密钥ID 17063E6D星期二14四月2009 05:31:34 PM EDT
gpg:无法检查签名:找不到公钥
dpkg-source:提取udev-117中的udev
dpkg-source:解压udev_117.orig.tar.gz
dpkg-source:应用./udev_117-8ubuntu0.2.diff.gz
$ cd udev-117 /
$ cat debian / patches / 80-extras-firmware.patch
如果你阅读了源代码,你会发现Ubuntu写了一个firmware_helper ,它是硬编码的,首先查找/lib/modules/$(uname -r)/$FIRMWARE ,然后是/lib/modules/$FIRMWARE ,其他地点。 把它翻译成sh ,大概是这样的:
echo -n 1 > /sys/$DEVPATH/loading cat /lib/firmware/$(uname -r)/$FIRMWARE > /sys/$DEVPATH/data \ || cat /lib/firmware/$FIRMWARE > /sys/$DEVPATH/data if [ $? = 0 ]; then echo -n 1 > /sys/$DEVPATH/loading echo -n -1 > /sys/$DEVPATH/loading fi
这正是内核所期望的格式。
长话短说:Ubuntu的udev软件包具有自定义function,首先查看/lib/firmware/$(uname -r) 。 这个政策正在用户空间中处理。