plf_misc.c

来自「eCos操作系统源码」· C语言 代码 · 共 470 行 · 第 1/2 页

C
470
字号
				    CYG_PCI_CFG_COMMAND,				    CYG_PCI_CFG_COMMAND_IO |				    CYG_PCI_CFG_COMMAND_MEMORY |				    CYG_PCI_CFG_COMMAND_MASTER |				    CYG_PCI_CFG_COMMAND_PARITY |				    CYG_PCI_CFG_COMMAND_SERR);    // Setup latency timer field    cyg_hal_plf_pci_cfg_write_byte(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),				   CYG_PCI_CFG_LATENCY_TIMER, 6);    // Disable all BARs    bar_ena = 0x1ff;    // Check for active SCS10    start10 = HAL_GALILEO_GETREG(HAL_GALILEO_SCS10_LD_OFFSET) << 21;    end   = ((HAL_GALILEO_GETREG(HAL_GALILEO_SCS10_HD_OFFSET) & 0x7f) + 1) << 21;    if (end > start10) {	if ((size = __check_bar(start10, end - start10)) != 0) {	    // Enable BAR	    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_SCS10_SIZE_OFFSET, size);	    bar_ena &= ~HAL_GALILEO_BAR_ENA_SCS10;	}    }    // Check for active SCS32    start32 = HAL_GALILEO_GETREG(HAL_GALILEO_SCS32_LD_OFFSET) << 21;    end   = ((HAL_GALILEO_GETREG(HAL_GALILEO_SCS32_HD_OFFSET) & 0x7f) + 1) << 21;    if (end > start32) {	if ((size = __check_bar(start32, end - start32)) != 0) {	    // Enable BAR	    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_SCS32_SIZE_OFFSET, size);	    bar_ena &= ~HAL_GALILEO_BAR_ENA_SCS32;	}    }    bar_ena &= ~HAL_GALILEO_BAR_ENA_SCS10;    HAL_GALILEO_PUTREG(HAL_GALILEO_BAR_ENA_OFFSET, bar_ena);    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),				    CYG_PCI_CFG_BAR_0, 0xffffffff);    end = cyg_hal_plf_pci_cfg_read_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),					 CYG_PCI_CFG_BAR_0);	    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),				    CYG_PCI_CFG_BAR_0, start10);    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),				    CYG_PCI_CFG_BAR_1, 0xffffffff);    end = cyg_hal_plf_pci_cfg_read_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),					 CYG_PCI_CFG_BAR_1);    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(0,0),				    CYG_PCI_CFG_BAR_1, start32);    // enable ISA bridge on PIIX4    v = cyg_hal_plf_pci_cfg_read_dword(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_BRIDGE),                                       CYG_PCI_CFG_PIIX4_GENCFG);    v |= CYG_PCI_CFG_PIIX4_GENCFG_ISA;    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_BRIDGE),                                    CYG_PCI_CFG_PIIX4_GENCFG, v);            v = cyg_hal_plf_pci_cfg_read_byte(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_BRIDGE),                                      CYG_PCI_CFG_PIIX4_TOM);    v &= ~CYG_PCI_CFG_PIIX4_TOM_TOM_MASK;    v |= CYG_PCI_CFG_PIIX4_TOM_TOM_16M;    cyg_hal_plf_pci_cfg_write_byte(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_BRIDGE),                                   CYG_PCI_CFG_PIIX4_TOM, v);    cyg_pci_init();    // Configure PCI bus.    next_bus = 1;    cyg_pci_configure_bus(0, &next_bus);}// Check for configuration error.static int pci_config_errcheck(void){    cyg_uint32  irq;    // Check for master or target abort    irq = HAL_GALILEO_GETREG(HAL_GALILEO_IRQ_CAUSE_OFFSET);    if (irq & (HAL_GALILEO_IRQCAUSE_MASABT | HAL_GALILEO_IRQCAUSE_TARABT)) {	// Error. Clear bits.	HAL_GALILEO_PUTREG(HAL_GALILEO_IRQ_CAUSE_OFFSET,			   ~(HAL_GALILEO_IRQCAUSE_MASABT | HAL_GALILEO_IRQCAUSE_TARABT));        return 1;    }    return 0;}cyg_uint32 cyg_hal_plf_pci_cfg_read_dword (cyg_uint32 bus,					   cyg_uint32 devfn,					   cyg_uint32 offset){    cyg_uint32 config_data;    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |                       (bus << 16) | (devfn << 8) | offset);    config_data = HAL_GALILEO_GETREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET);    if (pci_config_errcheck())	return 0xffffffff;    return config_data;}cyg_uint16 cyg_hal_plf_pci_cfg_read_word (cyg_uint32 bus,					  cyg_uint32 devfn,					  cyg_uint32 offset){    cyg_uint32 config_dword;    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |		       (bus << 16) | (devfn << 8) | (offset & ~3));    config_dword = HAL_GALILEO_GETREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET);    if (pci_config_errcheck())	return 0xffff;    return (cyg_uint16)((config_dword >> ((offset & 3) * 8)) & 0xffff);}cyg_uint8 cyg_hal_plf_pci_cfg_read_byte (cyg_uint32 bus,					 cyg_uint32 devfn,					 cyg_uint32 offset){    cyg_uint32 config_dword;    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |		       (bus << 16) | (devfn << 8) | (offset & ~3));    config_dword = HAL_GALILEO_GETREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET);    if (pci_config_errcheck())	return 0xff;    return (cyg_uint8)((config_dword >> ((offset & 3) * 8)) & 0xff);}void cyg_hal_plf_pci_cfg_write_dword (cyg_uint32 bus,				      cyg_uint32 devfn,				      cyg_uint32 offset,				      cyg_uint32 data){    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |		       (bus << 16) | (devfn << 8) | offset);    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET, data);    (void)pci_config_errcheck();}void cyg_hal_plf_pci_cfg_write_word (cyg_uint32 bus,				     cyg_uint32 devfn,				     cyg_uint32 offset,				     cyg_uint16 data){    cyg_uint32 config_dword, shift;    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |		       (bus << 16) | (devfn << 8) | (offset & ~3));    config_dword = HAL_GALILEO_GETREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET);    if (pci_config_errcheck())	return;    shift = (offset & 3) * 8;    config_dword &= ~(0xffff << shift);    config_dword |= (data << shift);    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET, config_dword);    (void)pci_config_errcheck();}void cyg_hal_plf_pci_cfg_write_byte (cyg_uint32 bus,				     cyg_uint32 devfn,				     cyg_uint32 offset,				     cyg_uint8  data){    cyg_uint32 config_dword, shift;    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_ADDR_OFFSET,		       HAL_GALILEO_PCI0_CONFIG_ADDR_ENABLE |		       (bus << 16) | (devfn << 8) | (offset & ~3));    config_dword = HAL_GALILEO_GETREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET);    if (pci_config_errcheck())	return;    shift = (offset & 3) * 8;    config_dword &= ~(0xff << shift);    config_dword |= (data << shift);    HAL_GALILEO_PUTREG(HAL_GALILEO_PCI0_CONFIG_DATA_OFFSET, config_dword);    (void)pci_config_errcheck();}#endif  // defined(CYGPKG_IO_PCI)/*------------------------------------------------------------------------*//* IDE support                                                            */intcyg_hal_plf_ide_init(void){    cyg_uint32 v;    // enable IDE    v = cyg_hal_plf_pci_cfg_read_dword(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_IDE),                                       CYG_PCI_CFG_PIIX4_IDETIM);    v |= (CYG_PCI_CFG_PIIX4_IDETIM_IDE << 16) | CYG_PCI_CFG_PIIX4_IDETIM_IDE;    cyg_hal_plf_pci_cfg_write_dword(0, CYG_PCI_DEV_MAKE_DEVFN(_PIIX4_PCI_ID,_PIIX4_IDE),                                    CYG_PCI_CFG_PIIX4_IDETIM, v);    return HAL_IDE_NUM_CONTROLLERS;}/*------------------------------------------------------------------------*//* End of plf_misc.c                                                      */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?