1.quard_star.h 修改

image-20230616134654638

  • 在QuardStarState定义了一个plic设备,为一个数组,因为有8个CPU
  • 定义了一些与riscv中plic相关的信息

2.quard_star.c 修改

  • 修改内存映射数组,新增PLICCLINT

image-20230616134912981

  • 新建quard_star_plic_create函数,plic的创建和virt.c中保持一致,virt.c中创建plic的源码如下,调用了virt_create_plic函数,使用的硬件为SIFIVE_PLIC

image-20230616135305524

/* 创建plic */
static void quard_star_plic_create(MachineState *machine)
{
int socket_count = riscv_socket_count(machine);
QuardStarState *s = RISCV_VIRT_MACHINE(machine);
int i,hart_count,base_hartid;
for ( i = 0; i < socket_count; i++) {

hart_count = riscv_socket_hart_count(machine, i);
base_hartid = riscv_socket_first_hartid(machine, i);
char *plic_hart_config;
/* Per-socket PLIC hart topology configuration string */
plic_hart_config = riscv_plic_hart_config_string(machine->smp.cpus);

s->plic[i] = sifive_plic_create(
quard_star_memmap[QUARD_STAR_PLIC].base + i *quard_star_memmap[QUARD_STAR_PLIC].size ,
plic_hart_config, hart_count , base_hartid,
QUARD_STAR_PLIC_NUM_SOURCES,
QUARD_STAR_PLIC_NUM_PRIORITIES,
QUARD_STAR_PLIC_PRIORITY_BASE,
QUARD_STAR_PLIC_PENDING_BASE,
QUARD_STAR_PLIC_ENABLE_BASE,
QUARD_STAR_PLIC_ENABLE_STRIDE,
QUARD_STAR_PLIC_CONTEXT_BASE,
QUARD_STAR_PLIC_CONTEXT_STRIDE,
quard_star_memmap[QUARD_STAR_PLIC].size);
g_free(plic_hart_config);
}
}
  • 新增quard_star_aclint_create函数,相比于virt简化了许多,使用的硬件是SiFive CLINT
static void quard_star_aclint_create(MachineState *machine)
{
int i , hart_count,base_hartid;
int socket_count = riscv_socket_count(machine);
//每个CPU都需要创建 aclint
for ( i = 0; i < socket_count; i++) {

base_hartid = riscv_socket_first_hartid(machine, i);
hart_count = riscv_socket_hart_count(machine, i);

riscv_aclint_swi_create(
quard_star_memmap[QUARD_STAR_CLINT].base + i *quard_star_memmap[QUARD_STAR_CLINT].size,
base_hartid, hart_count, false);
riscv_aclint_mtimer_create(quard_star_memmap[QUARD_STAR_CLINT].base +
+ i *quard_star_memmap[QUARD_STAR_CLINT].size+ RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
}
}
  • machine_init函数修改,新增两个硬件

image-20230616135109899

3. Kconfig修改

新增了ACLINT和PLIC设备

config QUARD_STAR
bool
select SERIAL
select PFLASH_CFI01 //Pflash
select RISCV_ACLINT //ACLINT
select RISCV_APLIC //APLIC
select SIFIVE_PLIC //SIFIVE_PLIC

4. 测试

在进行测试时可将quard_star_flash_create先注释掉,一个个硬件依次测试。

image-20230616140512366

运行脚本:

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

如下中断控制器添加成功:

image-20230616140403678

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

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