4.2. 大端小端 (我们本该知道的)

4.2.1. 探测 CPC700

终于,我们到达了启动过程的 PCI 探测部分,却发现它无法工作。我们尝试使用以下方法与 CPC700 通信cpc700_read_local_pci_cfgb(),它是 PMPPC 的 LSP 提供的,并尝试读取 CPC 的配置寄存器。我们本应该得到0x1014,这是供应商 ID,但我们没有得到。我们意识到我们正在以小端模式通信,而 CPC 正在以大端模式监听。我们对函数做了一个小小的补丁,以便我们以大端模式与 CPC700 通信。然后我们可以正确读取供应商 ID,但其余部分仍然无法工作。我们不想修改代码,以便所有操作都以大端模式完成。

4.2.2. 使 CPC700 以小端模式通信

我们发现 CPC700 可以初始化为执行自动字节交换,这会在运行时执行小端到大端的转换。似乎我们的板子就是这样初始化的。我们在以下位置添加了一小段代码setup_arch(),它检查是否启用了字节交换,如果启用,则禁用它
while (cnt<2) {
	cpc700_read_local_pci_cfgb(0, );
	cpc700_read_local_pci_cfgb(1, );
	if (l == 0 && h == 0) {
		if (cnt == 0) {
			printk("CPC700 byte swaping enabled - trying to disable ... ");
			cpc700_write_pifcfg_be(0x18, 0); /* disable byte-swapping */
		} else {
			printk("FAILED !!\n");
			break;
		}
	} else {cd
		printk("byte swapping disabled.\n");
		break;
	}
	++cnt;
}
稍后进行一次简短的编译,PCI 探测工作了!我们喝了点啤酒并庆祝了一下 ;-)