首页 > 其他分享 >在qemu添加基于ast2600的设备

在qemu添加基于ast2600的设备

时间:2024-10-12 23:18:59浏览次数:12  
标签:set qemu ast2600 object property 添加 i2c aspeed class

公司的设备基于aspeed 的ast2600. 和ast2600-evt还是有不小差距, 需要为了多模拟一些数据, 需要添加新machine, 修改部分设备.

修改文件 hw/arm/aspeed.c

1. 添加新的machine pf12,  基于ast2600-evb, 提供一个class init函数

static const TypeInfo aspeed_machine_types[] = {
 ........

 }, {
        .name          = MACHINE_TYPE_NAME("ast2600-evb"),
        .parent        = TYPE_ASPEED_MACHINE,
        .class_init    = aspeed_machine_ast2600_evb_class_init,
    }, {
        .name          = MACHINE_TYPE_NAME("pf12"),
        .parent        = TYPE_ASPEED_MACHINE,
        .class_init    = aspeed_machine_pf12_class_init,
    },{

....

2. 创建刚才提供的函数 aspeed_machine_pf12_class_init 参考 aspeed_machine_ast2600_evb_class_init

static void aspeed_machine_pf12_class_init(ObjectClass *oc, void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);
    AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
    printf("init pf12 class\n");
    mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
    amc->soc_name  = "ast2600-a3";
    amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
    amc->hw_strap2 = AST2600_EVB_HW_STRAP2|0xC800; // 需要ABR功能
    amc->fmc_model = "mx66u51235f"; 
    amc->spi_model = "mx66u51235f";
    amc->num_cs    = 2;
    amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
                     ASPEED_MAC3_ON;
    amc->i2c_init  = pf12_i2c_init; // 这个就是自定义的device的部分
    mc->default_ram_size = 1 * GiB;
    mc->default_cpus = mc->min_cpus = mc->max_cpus =
        aspeed_soc_num_cpus(amc->soc_name);
    mc->reset = pf12_reset;  // 我需要reset部分gpio
};

3. 实现 pf12_i2c_init , 和evb上 i2c 设备不一样


static void pf12_i2c_init(AspeedMachineState *bmc)
{
    AspeedSoCState *soc = &bmc->soc;

    DeviceState *dev;

    // dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1),
    //                                      "emc1413", 0x4c));
    // object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
    // object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
    // object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);

    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1),
                     TYPE_TMP105, 0x4d);

    // 这些设备是FRU相关的(eeprom)
    uint8_t *eeprom_buf2 = g_malloc0(8 * 1024);
    uint8_t buf2[] = {
        // 08:bf:b8:c0:be:ac
        0x08, 0xbf, 0xb8, 0x0c, 0xbe, 0xac, 0x00, 0xfe,
        .......
    };
    memcpy(eeprom_buf2, buf2, sizeof(buf2));
    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 6), 0x56,
                          eeprom_buf2);

    uint8_t *eeprom_fru = g_malloc0(8 * 256);
    uint8_t fru[] = {
        // 08:bf:b8:c0:be:ac
        0x01, 0x00, 0x01, 0x05, 0x0f, 0x00, 0x00, 0xea, 0x01, 0x04, 0x17, 0xce, 0x31, 0x33, 0x53, 0x46,
      .............
    };
    memcpy(eeprom_fru, fru, sizeof(fru));
    smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54,
                          eeprom_fru);

   
    DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_DS1338, 0x10));
    // qdev_connect_gpio_out(dev, 14, qdev_get_gpio_in(DEVICE(dev), 0));

    // i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_ADS7846, 0x18);

    // LM75 is compatible with TMP105 driver //
    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 0x49);
    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 0x49);
    i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 0x4B);

}

4. Reset 函数


static void pf12_reset(MachineState *state, ShutdownCause reason)
{
    AspeedMachineState *bmc = ASPEED_MACHINE(state);
    AspeedGPIOState *gpio = &bmc->soc.gpio;
    printf("pf12_reset reason %d \n", reason);
    qemu_devices_reset(reason);

    /* Board ID: 7 (Class-1, 4 slots) */
    object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);

    /* Slot presence pins, inverse polarity. (False means present) */
    object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
    object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
   ...........
}

aspeed machine支持参数设置, 可以运行时调整flash设备 ( fmc-model ,spi-model)

代码在  aspeed_machine_class_props_init


static void aspeed_machine_class_props_init(ObjectClass *oc)
{
    object_class_property_add_bool(oc, "execute-in-place",
                                   aspeed_get_mmio_exec,
                                   aspeed_set_mmio_exec);
    object_class_property_set_description(oc, "execute-in-place",
                           "boot directly from CE0 flash device");

    object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
                                  aspeed_set_bmc_console);
    object_class_property_set_description(oc, "bmc-console",
                           "Change the default UART to \"uartX\"");

    object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
                                   aspeed_set_fmc_model);
    object_class_property_set_description(oc, "fmc-model",
                                          "Change the FMC Flash model");
    object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
                                   aspeed_set_spi_model);
    object_class_property_set_description(oc, "spi-model",
                                          "Change the SPI Flash model");
}

标签:set,qemu,ast2600,object,property,添加,i2c,aspeed,class
From: https://blog.csdn.net/yanghuajia/article/details/142891070

相关文章

  • wpf 下拉框添加选项中删除数据
    需要根据实际需求在按钮的对应事件或者Command中添加逻辑<StyleTargetType="ComboBox"x:Key="DeleteComboBoxStyle"><SetterProperty="ItemContainerStyle"><Setter.Value><!--ComBoxItem--><......
  • Python 列表专题:添加元素
    目录1.Python列表概述1.1什么是列表?1.2列表的基本操作2.添加元素的方法2.1使用 append() 方法2.1.1添加不同类型的元素2.2使用 extend() 方法2.2.1使用字符串扩展列表2.3使用 insert() 方法2.4使用 + 操作符2.5使用 * 操作符3.使用案例3.1......
  • jupyter notebook里添加conda虚拟环境
    情况描述有时clone的项目中包含demo.ipynb文件,需要启动jupyter-notebook运行,此文记录将虚拟环境导入到jupyter中。1.下载并运行jupyter-notebook#在base环境当中安装jupyterpipinstalljupyter#base环境下运行jupyterjupyternotebook#jupyternotebook可选参数2.......
  • Android Studio添加依赖 新版 和 旧版 的添加方式(Gradle添加依赖)(Java)
    旧版的(在线添加)1找文件在项目的build.gradle文件中添加依赖(在下面的节点中添加库格式’组:名字:版本号‘)dependencies{implementation'com.example:library:1.0.0'}implementation‘组:名字:版本号’添加完成之后上方会出现如下图提示(点击现在同步)(Sy......
  • 大华NVR接入ONvif服务,添加数量达到上限
    大华NVR接入ONvif服务,通道比较多无法选择单通道问题:以下是使用谷歌浏览器的画面;以及客服反馈的解决方式 解决步骤: 1.建议更换浏览器尝试,普通的录像机或者摄像机建议使用IE内核的浏览器,比如360浏览器(可以使用兼容模式或者极速模式登录,地址栏后面的图标可以选择登录模式)。......
  • 如果我想在更新商品详情时添加图片,我应该如何修改请求数据?
    在更新商品详情时添加图片,通常需要使用multipart/form-data编码类型来构建请求体,因为这种类型支持文件的上传。以下是如何修改请求数据以包含图片的步骤:一、准备图片文件确保你有要上传的图片文件,并且知道其路径。图片文件将作为请求的一部分发送。二、修改请求头将Conten......
  • 给控件添加阴影效果SystemDropShadowChrome
    引入命名空间 xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2"给控件添加引用,这个性能比较好。例如给Combobox下拉框添加引用效果<--!其他代码--><Popupx:Name="PART_Popup"AllowsTransparency="true"Grid.Colum......
  • Stata教程:高级虚拟变量处理和标签添加
    Stata教程:高级虚拟变量处理和标签添加小菲stata,全网同名Hello,大家好,接粉丝提问,这期给大家分享虚拟变量处理和标签添加,在这个教程中,我们将使用Stata的"nlsw88"数据集(这是一个关于1988年美国女性劳动力的数据集)来演示如何创建更复杂的虚拟变量,添加详细的标签,并进行基本的统......
  • laravel11:添加全局中间件
    一,文档地址:https://docs.golaravel.com/docs/middleware注意选择11这个版本二,添加全局中间件时,需要添加到bootstrap/app.php文件中:1,useApp\Http\Middleware\EnsureTokenIsValid;->withMiddleware(function(Middleware$middleware){$middleware->append(Ensure......
  • Gitlab添加SSH密钥
    1、首先本地需要下载git,确保右键有gitbash选项2、在C盘用户文件夹下,找到.ssh目录(没有新建)3、在此目录下打开gitbash4、生成密钥ssh-keygen-trsa-b4096-C"[email protected]"ssh-keygen:这是生成SSH密钥对的命令。-trsa:这个选项指定了密钥类型。rsa是一种常用的加密......