|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2024-6-18 17:34:47
|
显示全部楼层
抱着学习的心态,我在看parretto的开源代码,他在PL里只例化了一个riscv cpu呀,没有例化多个cpu
而且我看lib文件夹下的ram和rom数据,是初始化时在下面这个函数里使用的
他这个初始化过程是遍历lib下的一个rom数组,然循环赋值给dp->dev->mem
// DP Initialize rom
void prt_dp_rom_init (prt_dp_ds_struct *dp, uint32_t len, uint8_t *rom)
{
uint32_t dat;
// Start initialization
dp->dev->ctl = PRT_DP_CTL_MEM_STR;
for (int word = 0; word < (len/4)+1; word++)
{
for (int byte = 3; byte >= 0; byte--)
{
dat <<= 8;
dat |= rom[(word * 4) + byte];
}
dp->dev->mem = dat;
}
}
dp->dev->mem其实只是prt_dp_ds_struct结构体里的prt_dp_dev_struct结构体里的一个成员变量,上面这个循环的结果好像只是把rom的最后四个字节赋值给dp->dev->mem,感觉完成是无效操作
这里完全没理解是个什么操作原理,大神能帮忙再解下疑吗?
// Device structure
typedef struct {
uint32_t ctl; // Control
uint32_t sta; // Status
uint32_t mail_out; // Mail out (pm -> host)
uint32_t mail_in; // Mail in (host -> pm)
uint32_t aux; // AUX
uint32_t mem; // Memory update
} prt_dp_dev_struct;
// Data structure
typedef struct {
uint8_t id;
volatile prt_dp_dev_struct *dev; // Device
prt_dp_mail_ds_struct mail_in; // Mail in
prt_dp_mail_ds_struct mail_out; // Mail out
volatile prt_dp_debug_struct debug; // Debug
volatile uint32_t evt; // Event
prt_dp_cb_struct cb; // Callback
prt_dp_sta_struct sta; // Status
prt_dp_trn_struct trn; // Training
prt_dp_hpd_type hpd; // HPD
prt_dp_lnk_struct lnk; // Link
prt_dp_vid_struct vid[2]; // Video
prt_dp_edid_struct edid; // EDID
#ifdef PRT_SIM
prt_dp_aux_ds_struct aux; // AUX
#endif
} prt_dp_ds_struct;
|
|