QEMU学习之路(9)— 在RISCV64 virt中添加DMA设备
QEMU学习之路(9)— 在RISCV64 virt中添加DMA设备
一、前言
QEMU版本:7.0.0
操作系统:Ubuntu 20.04.6 LTS
gcc版本:9.4.0
安装依赖
sudo apt install ninja-build wget
参考:Qemu Virt平台集成ARM PL080 DMA
二、QEMU安装
通过如下命令安装QEMU
1、获取安装包
wget https://download.qemu.org/qemu-7.0.0.tar.xz
2、解压
tar xvf qemu-7.0.0.tar.xz
3、配置
cd qemu-7.0.0
mkdir build && cd build
../configure --target-list="riscv64-softmmu" --prefix=`pwd`/opt
4、编译
make -j $(nproc)
5、安装
make install
6、查看版本
./opt/bin/qemu-system-riscv64 --version
三、修改文件
打开include/hw/riscv/virt.h
文件,添加DMA的枚举变量
打开hw/riscv/virt.c
文件,添加pl080头文件
添加DMA的配置地址
在hw/riscv/virt.c
文件中编写创建DMA设备的函数
static void create_dma(RISCVVirtState *s, DeviceState *irqchip)
{int i;DeviceState *dev;SysBusDevice *sysbus;const MemMapEntry *memmap = virt_memmap;MemoryRegion *sysmem = get_system_memory();dev = qdev_new(TYPE_PL080);sysbus = SYS_BUS_DEVICE(dev);object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem), &error_fatal);sysbus_realize_and_unref(sysbus, &error_fatal);sysbus_mmio_map(sysbus, 0, memmap[VIRT_DMA].base);for (i = 0; i < 3; ++i) {sysbus_connect_irq(sysbus, i, qdev_get_gpio_in(irqchip, DMA_IRQ));}
}
然后在virt_machine_init
函数中调用
修改hw/riscv/Kconfig
文件,将PL080添加到RISCV_VIRT设备中
然后重新配置、编译和安装
../configure --target-list="riscv64-softmmu" --prefix=`pwd`/opt
make -j $(nproc)
make install