1.quard_star.h 修改
在QuardStarState定义了一个plic设备,为一个数组,因为有8个CPU
定义了一些与riscv中plic相关的信息
2.quard_star.c 修改
新建quard_star_plic_create
函数,plic的创建和virt.c中保持一致,virt.c中创建plic的源码如下,调用了virt_create_plic
函数,使用的硬件为SIFIVE_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; 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); 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 ); } }
3. Kconfig修改 新增了ACLINT和PLIC设备
config QUARD_STAR bool select SERIAL select PFLASH_CFI01 select RISCV_ACLINT select RISCV_APLIC select SIFIVE_PLIC
4. 测试 在进行测试时可将quard_star_flash_create
先注释掉,一个个硬件依次测试。
运行脚本:
timer@DESKTOP-JI9EVEH:~/quard-star$ ./build.sh timer@DESKTOP-JI9EVEH:~/quard-star$ ./run.sh
如下中断控制器添加成功:
代码地址:yanglianoo/quard-star: 从零基于qemu创建riscv嵌入式开发板,并移植操作系统 (github.com)
有问题请与我联系:wechat:13699648817