| // Copyright 2023 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| //! These are structures for creating the binary data for ZBI Items. |
| |
| use anyhow::{bail, Result}; |
| use zerocopy::{AsBytes, NoCell}; |
| |
| // LINT.IfChange |
| |
| /// This is the structure for the payload for ZBI_TYPE_PLATFORM_ID items. |
| #[derive(AsBytes, NoCell, Debug, PartialEq)] |
| #[repr(C, packed)] |
| pub(crate) struct ZbiPlatformId { |
| pub vid: u32, |
| pub pid: u32, |
| pub board_name: [u8; 32], |
| } |
| |
| /// This is the structure for the payload for ZBI_TYPE_DRV_BOARD_INFO items. |
| #[derive(AsBytes, NoCell, Debug, PartialEq)] |
| #[repr(C, packed)] |
| pub(crate) struct ZbiBoardInfo { |
| /// This is a value chosen by hardware/factory developers and is provided to |
| /// driver developers via board documentation. |
| pub revision: u32, |
| } |
| |
| // LINT.ThenChange(//sdk/fidl/zbi/board.fdl) |
| |
| impl ZbiPlatformId { |
| pub fn new(vid: u32, pid: u32, board_name: impl Into<String>) -> Result<Self> { |
| let board_name: String = board_name.into(); |
| if board_name.as_bytes().len() > 32 { |
| bail!("board_name is too long (max 32 bytes): {}", board_name.as_bytes().len()); |
| } |
| let mut platform_id = Self { vid, pid, board_name: [0u8; 32] }; |
| board_name.as_bytes().write_to_prefix(&mut platform_id.board_name); |
| Ok(platform_id) |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| |
| #[test] |
| fn test_creation() { |
| let platform_id = ZbiPlatformId::new(23, 42, "some board").unwrap(); |
| let platform_id_bytes = platform_id.as_bytes(); |
| |
| #[rustfmt::skip] |
| assert_eq!( |
| [ |
| // vid |
| 23u8, 0, 0, 0, |
| |
| //pid |
| 42, 0, 0, 0, |
| |
| //"some board" |
| b's', b'o', b'm', b'e', b' ', b'b', b'o', b'a', b'r', b'd', |
| |
| //padding |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| ], |
| platform_id_bytes |
| ); |
| } |
| |
| #[test] |
| fn test_fails_on_long_name() { |
| let result = ZbiPlatformId::new(0, 0, "this is far, far, too long of a name"); |
| assert!(result.is_err()); |
| } |
| } |