CH368 PCIE板卡的 R/W 操作,BIOS设置U 盘启动引导执行
代码
//jiawei ++++++
clear_screen();
//int cnt = 0;
int bus368 = 0;
int dev368 = 0;
int fun368 = 0;
int line_for_print=0;
for(int bus=0; bus<256; ++bus){
for(int dev=0; dev<32; ++dev) {
for(int fun=0; fun<8;++fun) {
// read confiureation space, start with [Vendor ID]: 01H ~ 02H, 16bits
int vid = pci_config_read16(bus, dev, fun, 0x0);
if (vid == 0x1c00) {
bus368 = bus;
dev368 = dev;
fun368 = fun;
printf(line_for_print++, 0, "bus368: %x, dev368: %x, fun368: %x", bus, dev, fun);
printf(line_for_print++, 0, "vendor id: %x", vid);
// read confiureation space, [Device ID]: 02H ~ 03H, 16bits
int deviceid = pci_config_read16(bus, dev, fun, 0x02);
printf(line_for_print++, 0, "device id: %x", deviceid);
break;
}
}
}
}
uint32_t test_val = 0;
//Device ID : 2 bytes, 5834H
test_val = pci_config_read16(bus368, dev368, fun368, 0x02);
printf(line_for_print++, 0, "2(device id) : 0x%x ", test_val);
//Command reg : 16bits, default all zero: 0000 0000 0000 0000
test_val = pci_config_read16(bus368, dev368, fun368, 0x04);
printf(line_for_print++, 0, "4(command reg): 0x%x ", test_val);
uint32_t command_reg_val = test_val;
//Status reg: 16bits, default value: 0010H / 0018H
test_val = pci_config_read16(bus368, dev368, fun368, 0x06);
printf(line_for_print++, 0, "6(status reg): 0x%x ", test_val);
// Revision ID, 8bits, default: 10H
test_val = pci_config_read8(bus368, dev368, fun368, 0x08);
printf(line_for_print++, 0, "8(revision id): 0x%x ", test_val);
uint32_t baseaddr = pci_config_read32(bus368, dev368, fun368, 0x10);
baseaddr = baseaddr & ~0x03; // clear last 2 bits of BAR
printf(line_for_print++, 0, "baseaddr: 0x%x", baseaddr);
int sub_vid = pci_config_read16(bus368, dev368, fun368, 0x2C); //same as VID
printf(line_for_print++, 0, "2C: %x", sub_vid);
int sub_did = pci_config_read16(bus368, dev368, fun368, 0x2E); //same as DID
printf(line_for_print++, 0, "2E: %x", sub_did);
while (1) // LED Test, offset = 0xE8H, SCL: bit1 SCS: bit2
{
pci_config_write8(bus368, dev368, fun368, baseaddr + 0xE8, 0x40);
printf(line_for_print, 0, "Test LED ON -> reg = [0x%x]", 0x40);// 0100 0000
sleep(1);
pci_config_write8(bus368, dev368, fun368, baseaddr + 0xE8, 0xff);
printf(line_for_print, 0, "Test LED OFF -> reg = [0x%x]", 0xff);
sleep(1);
}
//jiawei ---
测试结果
![](https://img-blog.csdnimg.cn/direct/5acebf7b0a3a411991b3f3b6fc2c2dde.png)
问题
Issue @1
CH368官网手册中关于 Command register 命令寄存器介绍如下,复位默认值为全0
但是如上图1所示,实际读取的结果是 0x7(hex),也即 0111b,最低3 bits 全是1
当前的读取操作之前并没有任何CH368-EVT板卡的I/O 寄存器写操作,实际读取值与手册描述的默认值不匹配。
Issue @2
BAR baseaddr I/O基地址读取出来是0x3001, 最低位是1 (表示当前为I/O 空间地址?)
后续以此基地址执行I/O 寄存器 R/W 时,需要清除BAR低两位? 以0x3000 BAR基地址索引操作?
Issue @3
I操作 I/O 空间 register之前,需要检查并设置配置空间 Command 寄存器(偏移地址04H)的最低位写入1,才能按照 BAR 地址 + 偏移地址 操作I/O ?
这种说法是正确的吗?