#Device Firmware
设备固件是二进制blob,包含由硬件设备执行的代码。二进制blob在驱动程序的命名空间中可用于加载。
设备固件存储在CIPD中(Chrome Infrastructure Package Deployment)并在Google Storage中镜像备份。
## 在你开始之前
确保CIPD可用。 cipd必须在PATH中或`zircon/../buildtools/cipd`之一。
buildtools存储库可用
[这里](https://fuchsia.googlesource.com/buildtools/)。
##创建固件包
要创建固件包,请创建包含以下内容的目录
文件:
*一个或多个固件文件
*许可证文件
* [README.fuchsia](https://fuchsia.googlesource.com/fuchsia/+/master/docs/development/source_code/README.fuchsia.md)
README.fuchsia必须至少包含以下指令:
*`姓名`
*`版本`
*`上游Git`
*`许可证`
*`许可文件`
如果这是您第一次从主机系统上传到CIPD,
使用CIPD进行身份验证:
```
cipd auth-login
```
使用以下命令在CIPD中上载并标记包:
```
cipd create -in <package-directory> -install-mode copy \
-name <package-name> \
-tag git_repository:<source-git-repositry> \
-tag git_revision:<source-git-revision>
```
`package-name`的格式为`fuchsia/firmware/<name>`。
`<name>`应该是一个标识固件的字符串。它可能包含任何非空白字符。识别将要以名字方式使用固件的驱动程序是有帮助的。
完成此步骤后,程序包将上载到CIPD。检查
[CIPD browser here](https://chrome-infra-packages.appspot.com/#/?path=fuchsia/firmware)
对于'fuchsia/firmware`下的包。
##将固件包添加到构建中
在`prebuilt/zircon.ensure`中添加以下条目:
```
@Subdir firmware/<name>
<package-name> git_revision:<source-git-revision>
```
其中`<name>`,`<package-name>`和`<source-git-revision>`匹配传递给上面的`cipd create`的值。该软件包将被下载到`@Subdir`在`prebuilt`下指定的路径,即
`prebuilt/firmware/<name>`。
接下来,使用以下命令更新`prebuilt/zircon.versions`:
```
scripts/download-prebuilt --resolve
```
将此更改上传到Gerrit并将其发送到CQ。固件包将可以通过`scripts/download-prebuilt`以及工具链和QEMU下载。
##使用驱动程序中的固件包
将以下行添加到驱动程序的`rules.mk`中:
```
MODULE_FIRMWARE := <name>/<path-to-binary-blob>
```
这会将固件安装到bootfs下
`/boot/lib/firmware/$(basename $(MODULE_FIRMWARE))`.
`load_firmware()`API,在[`driver.h`](../../system/ulib/ddk/include/ddk/driver.h)加载VMO中路径指向的固件。