plf_misc.c
来自「eCos操作系统源码」· C语言 代码 · 共 447 行 · 第 1/2 页
C
447 行
HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, CYGARC_REG_PCI_CFG_ADDR_ENABLE | (bus << CYGARC_REG_PCI_CFG_ADDR_BUSNO_shift) | (devfn << CYGARC_REG_PCI_CFG_ADDR_FUNC_shift) | (offset & ~3)); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, CYGARC_REG_PCI_CFG_CMD_RCFG); _DELAY(); HAL_READ_UINT32(CYGARC_REG_PCI_CFG_DATA, config_dword); shift = (offset & 3) * 8; config_dword &= ~(0xffff << shift); config_dword |= (data << shift); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, CYGARC_REG_PCI_CFG_ADDR_ENABLE | (bus << CYGARC_REG_PCI_CFG_ADDR_BUSNO_shift) | (devfn << CYGARC_REG_PCI_CFG_ADDR_FUNC_shift) | (offset & ~3)); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_DATA, config_dword); _DELAY(); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, CYGARC_REG_PCI_CFG_CMD_WCFG); _DELAY();}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_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, CYGARC_REG_PCI_CFG_ADDR_ENABLE | (bus << CYGARC_REG_PCI_CFG_ADDR_BUSNO_shift) | (devfn << CYGARC_REG_PCI_CFG_ADDR_FUNC_shift) | (offset & ~3)); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, CYGARC_REG_PCI_CFG_CMD_RCFG); _DELAY(); HAL_READ_UINT32(CYGARC_REG_PCI_CFG_DATA, config_dword); shift = (offset & 3) * 8; config_dword &= ~(0xff << shift); config_dword |= (data << shift); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, CYGARC_REG_PCI_CFG_ADDR_ENABLE | (bus << CYGARC_REG_PCI_CFG_ADDR_BUSNO_shift) | (devfn << CYGARC_REG_PCI_CFG_ADDR_FUNC_shift) | (offset & ~3)); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_DATA, config_dword); _DELAY(); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, CYGARC_REG_PCI_CFG_CMD_WCFG); _DELAY();}//--------------------------------------------------------------------------// IO space accessor functions#if 0 // Don't need these after all. But keep them around just in case...static voidpci_io_delay(void){ int i = 100; cyg_uint32 flg; do { HAL_READ_UINT32(CYGARC_REG_PCI_CFG_FLG, flg); } while (i-- && (flg & CYGARC_REG_PCI_CFG_FLG_ACTIVE)); // FIXME: what happens on timeout? Do we need to fill in 0xfffffff // in read data, by any chance?} static voidpci_io_status(void){ // FIXME: check status...}voidcyg_hal_plf_pci_io_write_byte (cyg_uint32 addr, cyg_uint8 data){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; int shift = io_addr & 3; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_DATA, ((cyg_uint32)data << (8*shift))); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, (CYGARC_REG_PCI_CFG_CMD_BE0 << shift) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_WRITE | CYGARC_REG_PCI_CFG_CMD_WT); pci_io_delay();}voidcyg_hal_plf_pci_io_write_word (cyg_uint32 addr, cyg_uint16 data){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; int shift = io_addr & 2; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_DATA, ((cyg_uint32)data << (8*shift))); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, ((CYGARC_REG_PCI_CFG_CMD_BE1|CYGARC_REG_PCI_CFG_CMD_BE0) << shift) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_WRITE | CYGARC_REG_PCI_CFG_CMD_WT); pci_io_delay();}voidcyg_hal_plf_pci_io_write_dword (cyg_uint32 addr, cyg_uint32 data){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_DATA, data); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, (CYGARC_REG_PCI_CFG_CMD_BE3|CYGARC_REG_PCI_CFG_CMD_BE2 | CYGARC_REG_PCI_CFG_CMD_BE1|CYGARC_REG_PCI_CFG_CMD_BE0) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_WRITE | CYGARC_REG_PCI_CFG_CMD_WT); pci_io_delay();}cyg_uint8cyg_hal_plf_pci_io_read_byte (cyg_uint32 addr){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; cyg_uint32 data; int shift = io_addr & 3; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, (CYGARC_REG_PCI_CFG_CMD_BE0 << shift) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_READ | CYGARC_REG_PCI_CFG_CMD_RD); pci_io_delay(); HAL_READ_UINT32(CYGARC_REG_PCI_CFG_DATA, data); return (cyg_uint8)(0xff & (data >> (8*shift)));}cyg_uint16cyg_hal_plf_pci_io_read_word (cyg_uint32 addr){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; cyg_uint32 data; int shift = io_addr & 2; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, ((CYGARC_REG_PCI_CFG_CMD_BE1|CYGARC_REG_PCI_CFG_CMD_BE0) << shift) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_READ | CYGARC_REG_PCI_CFG_CMD_RD); pci_io_delay(); HAL_READ_UINT32(CYGARC_REG_PCI_CFG_DATA, data); return (cyg_uint16)(0xffff & (data >> (shift*8)));}cyg_uint32cyg_hal_plf_pci_io_read_dword (cyg_uint32 addr){ cyg_uint32 io_addr = addr - HAL_PCI_PHYSICAL_IO_BASE; cyg_uint32 data; HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_ADDR, io_addr & ~3); HAL_WRITE_UINT32(CYGARC_REG_PCI_CFG_CMD, (CYGARC_REG_PCI_CFG_CMD_BE3|CYGARC_REG_PCI_CFG_CMD_BE2 | CYGARC_REG_PCI_CFG_CMD_BE1|CYGARC_REG_PCI_CFG_CMD_BE0) | CYGARC_REG_PCI_CFG_CMD_CMDEN | CYGARC_REG_PCI_CFG_CMD_IO_READ | CYGARC_REG_PCI_CFG_CMD_RD); pci_io_delay(); HAL_READ_UINT32(CYGARC_REG_PCI_CFG_DATA, data); return data;}#endif//--------------------------------------------------------------------------// PCI interrupt decodingstatic cyg_uint32cyg_hal_plf_pci_arbiter(CYG_ADDRWORD vector, CYG_ADDRWORD data){ cyg_uint32 isr_ret, int_sts; HAL_READ_UINT32(CYGARC_REG_SD0001_INT_STS1, int_sts); if (int_sts & CYGARC_REG_SD0001_INT_INTA) { isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_PCIA);#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN if (isr_ret & CYG_ISR_HANDLED)#endif return isr_ret; } if (int_sts & CYGARC_REG_SD0001_INT_INTB) { isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_PCIB);#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN if (isr_ret & CYG_ISR_HANDLED)#endif return isr_ret; } if (int_sts & CYGARC_REG_SD0001_INT_INTC) { isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_PCIC);#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN if (isr_ret & CYG_ISR_HANDLED)#endif return isr_ret; } if (int_sts & CYGARC_REG_SD0001_INT_INTD) { isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_PCID);#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN if (isr_ret & CYG_ISR_HANDLED)#endif return isr_ret; } return 0;}#endif // CYGPKG_IO_PCI//--------------------------------------------------------------------------// eof plf_misc.c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?