下载
中文
注册

开发示例

本章节指导开发者修改默认外部设备配置。

操作步骤

  1. 将om-sdk.tar.gz中的配置模板“software/ibma/lib/Linux/config/device_config.json”拷贝到{project_dir}/src/app/add_extend_device”目录下。
  2. 按照实际需求,修改device_config.json配置文件。
    {
      "primary_partitions": [
        1,
        2,
        3,
        4,
        5
      ],
      "usb_hub_id": "0bda:5411",
      "extend_info": {
        "u-disk": [
          {
            "platform": "a5080000.hiusbc1",
            "location": "usb2",
            "name": "u-disk2"
          }, 
          {
            "platform": "a5100000.hiusbc2",
            "location": "usb1",
            "name": "u-disk1"
          },
          {
            "platform": "a5180000.hiusbc3",
            "location": "usb0",
            "name": "u-disk0"
          }
        ],
        "eMMC": [
          {
            "platform": "82000000.sdhci0",
            "location": "eMMC1",
            "name": "eMMC"
          },
          {
            "platform": "82010000.sdhci1",
            "location": "SDIO1",
            "name": "SD-card"
          }
        ],
        "DISK": [
          {
            "platform": "a6000000.sata",
            "device": "0:0:0:0",
            "location": "PCIE-0",
            "name": "disk m.2"
          },
          {
            "platform": "a6000000.sata",
            "device": "1:0:0:0",
            "location": "PCIE-1",
            "name": "disk0"
          },
          {
            "platform": "a6000000.sata",
            "device": "2:0:0:0",
            "location": "PCIE-2",
            "name": "disk1"
          }
        ],
        "ethnet": [
          {
            "platform": "a7100000.xge0",
            "location": "PORT1",
            "name": "eth0"
          },
          {
            "platform": "a7200000.xge1",
            "location": "PORT2",
            "name": "eth1"
          }
        ]
      }
    }
  3. 使用配置文件检查脚本validate_device_config.py对修改后的配置文件进行检查,验证配置文件的是否正确。
    cd src/app/add_extend_device
    python3 vaidate_device_config.py

    validate_device_config.py脚本内容参考如下:

    import json
    import re
    from pathlib import Path
    CFG_FILE = Path(__file__).parent.joinpath("device_config.json")
    MAX_SIZE_BYTES = 1 * 1024 * 1024
    MAX_PARTITION_NUM = 16
    DEV_CLS = "eMMC", "u-disk", "ethnet", "DISK"
    NAME_PATTERN = r"^[a-zA-Z0-9\-\_\s\.]{2,64}$"
    
    
    def validate():
        assert CFG_FILE.stat().st_size < MAX_SIZE_BYTES, f"size of config should less than {MAX_SIZE_BYTES} bytes."
        cfg = json.loads(CFG_FILE.read_text())
        assert isinstance(cfg, dict), "config must be json format."
        validate_primary_partitions(cfg)
        validate_extend_info(cfg)
    
    
    def validate_primary_partitions(cfg: dict):
        parts = cfg.get("primary_partitions")
        assert isinstance(parts, list), "primary_partitions must be a list."
        assert 1 <= len(parts) <= MAX_PARTITION_NUM, f"number of partitions should be in range [1, {MAX_PARTITION_NUM}]."
        for part in parts:
            assert isinstance(part, int), f"partition number {part} is not of int type."
    
    
    def validate_extend_info(cfg: dict):
        extend_info = cfg.get("extend_info")
        assert isinstance(extend_info, dict), "extend_info must be a dict."
        locations = set()
        for cls, devices in extend_info.items():
            assert cls in DEV_CLS, f"class of {cls} not supported."
            assert isinstance(devices, list), f"the value of {cls} must be a list."
            for index, device in enumerate(devices):
                assert isinstance(device, dict), f"{cls}.{index} is not a dict."
    
                platform = device.get("platform")
                assert isinstance(platform, str) and platform, f"{cls}.{index}.{platform} is not a valid string."
    
                location = device.get("location")
                assert isinstance(location, str) and location, f"{cls}.{index}.{location} is not a valid string."
                assert location not in locations, f"location of {location}  is duplicated."
                locations.add(location)
    
                name = device.get("name")
                find_iter = re.fullmatch(NAME_PATTERN, name)
                assert all((
                    isinstance(name, str),
                    2 <= len(name) <= 64,
                    find_iter and find_iter.group(0) == name
                )), rf"{cls}.{index}.{name} is invalid, just support 'A-Za-z0-9\-\_\.' and length in range [2, 64]"
    
    
    if __name__ == '__main__':
        validate()
        print("validate device config success.")
  4. {project_dir}/build/build.sh”中,实现拷贝配置文件的代码。
    cp -rf "${TOP_DIR}"/src/app/add_extend_device/device_config.json "${OMSDK_TAR_PATH}"/software/ibma/lib/Linux/config/device_config.json