1.quard_star.h 修改

image-20230616181444462

2.quard_star.c 修改

  • quard_star_memmap修改

image-20230616181828094

  • RTC
static void quard_star_rtc_create(MachineState *machine)
{
QuardStarState *s = RISCV_VIRT_MACHINE(machine);
sysbus_create_simple("goldfish_rtc", quard_star_memmap[QUARD_STAR_RTC].base,
qdev_get_gpio_in(DEVICE(s->plic[0]), QUARD_STAR_RTC_IRQ));
}
  • 3路UART
/* 创建3个 uart */
static void quard_star_serial_create(MachineState *machine)
{
MemoryRegion *system_memory = get_system_memory();
QuardStarState *s = RISCV_VIRT_MACHINE(machine);

serial_mm_init(system_memory, quard_star_memmap[QUARD_STAR_UART0].base,
0, qdev_get_gpio_in(DEVICE(s->plic[0]), QUARD_STAR_UART0_IRQ), 399193,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
serial_mm_init(system_memory, quard_star_memmap[QUARD_STAR_UART1].base,
0, qdev_get_gpio_in(DEVICE(s->plic[0]), QUARD_STAR_UART1_IRQ), 399193,
serial_hd(1), DEVICE_LITTLE_ENDIAN);
serial_mm_init(system_memory, quard_star_memmap[QUARD_STAR_UART2].base,
0, qdev_get_gpio_in(DEVICE(s->plic[0]), QUARD_STAR_UART2_IRQ), 399193,
serial_hd(2), DEVICE_LITTLE_ENDIAN);
}
  • machine_init

image-20230616181618845

3. Kconfig修改

选中了RTC

config QUARD_STAR
bool
select SERIAL
select PFLASH_CFI01
select RISCV_ACLINT
select RISCV_APLIC
select SIFIVE_PLIC
select GOLDFISH_RTC //RTC

4. 测试

在进行测试时,我们需要在qemumonitor中使用info qtree来查看设备树信息,但是由于qemu无法滚屏,所以不能查看完整的设备树,这里修改了一下run.sh,将monitor映射到了控制台。run.sh修改如下:

SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)

$SHELL_FOLDER/output/qemu/bin/qemu-system-riscv64 \
-M quard-star \
-m 1G \
-smp 8 \
-bios none \
-monitor stdio \ #映射monitor

执行脚本测试:

timer@DESKTOP-JI9EVEH:~/quard-star$ ./build.sh
timer@DESKTOP-JI9EVEH:~/quard-star$ ./run.sh

可以看到monitor中输出的内容被映射到控制台中了,且RTCUART都挂载成功了。

image-20230616182310228

代码地址:yanglianoo/quard-star: 从零基于qemu创建riscv嵌入式开发板,并移植操作系统 (github.com)

有问题请与我联系:wechat:13699648817