plf_io.h
来自「eCos操作系统源码」· C头文件 代码 · 共 649 行 · 第 1/3 页
H
649 行
nop; \ nop# define DEBUG_LED_IMM(val) \ li k0, HAL_DISPLAY_LEDBAR; \ li k1, val; \ sw k1, 0(k0)# define DEBUG_LED_REG(reg) \ li k0, HAL_DISPLAY_LEDBAR; \ sw reg, 0(k0)# define DEBUG_HEX_DISPLAY_IMM(val) \ li k0, HAL_DISPLAY_ASCIIWORD; \ li k1, val; \ sw k1, 0(k0)# define DEBUG_HEX_DISPLAY_REG(reg) \ li k0, HAL_DISPLAY_ASCIIWORD; \ sw reg, 0(k0)# define DEBUG_DELAY() \ li k0, 0x20000; \0: sub k0, k0, 1; \ bnez k0, 0b; \ nop#else# define DEBUG_ASCII_DISPLAY(register, character) \ *(register) = character# define DEBUG_LED_IMM(val) \ *HAL_DISPLAY_LEDBAR = val# define DEBUG_HEX_DISPLAY_IMM(val) \ *HAL_DISPLAY_ASCIIWORD = val# define DEBUG_DELAY() \ { \ volatile int i = 0x20000; \ while (--i) ; \ }# define DEBUG_DISPLAY(str) \ { \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS0, str[0]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS1, str[1]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS2, str[2]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS3, str[3]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS4, str[4]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS5, str[5]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS6, str[6]); \ DEBUG_ASCII_DISPLAY(HAL_DISPLAY_ASCIIPOS7, str[7]); \ }#define HAL_GALILEO_PUTREG(x,y) \ (*((volatile unsigned *)(CYGARC_UNCACHED_ADDRESS(HAL_MALTA_CONTROLLER_BASE) + (x))) = (y))#define HAL_GALILEO_GETREG(x) \ (*((volatile unsigned *)(CYGARC_UNCACHED_ADDRESS(HAL_MALTA_CONTROLLER_BASE) + (x))))extern cyg_uint32 cyg_hal_plf_pci_cfg_read_dword (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset);extern cyg_uint16 cyg_hal_plf_pci_cfg_read_word (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset);extern cyg_uint8 cyg_hal_plf_pci_cfg_read_byte (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset);extern void cyg_hal_plf_pci_cfg_write_dword (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset, cyg_uint32 val);extern void cyg_hal_plf_pci_cfg_write_word (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset, cyg_uint16 val);extern void cyg_hal_plf_pci_cfg_write_byte (cyg_uint32 bus, cyg_uint32 devfn, cyg_uint32 offset, cyg_uint8 val);// Initialize the PCI bus.externC void cyg_hal_plf_pci_init(void);#define HAL_PCI_INIT() cyg_hal_plf_pci_init()// leave gap at start of IO and mem for southbridge which is beyond standards// and not only ignores writes to the BAR, but also does not advertise use of// any IO/memory space. That is, southbridge is hardwired at 0x18000000// Map PCI device resources starting from these addresses in PCI space.#define HAL_PCI_ALLOC_BASE_MEMORY (HAL_MALTA_PCI_MEM0_BASE + 0x20000)#define HAL_PCI_ALLOC_BASE_IO 0x10000// This is where the PCI spaces are mapped in the CPU's address space.// #define HAL_PCI_PHYSICAL_MEMORY_BASE CYGARC_UNCACHED_ADDRESS(0)#define HAL_PCI_PHYSICAL_IO_BASE CYGARC_UNCACHED_ADDRESS(HAL_MALTA_PCI_IO_BASE)// Read a value from the PCI configuration space of the appropriate// size at an address composed from the bus, devfn and offset.#define HAL_PCI_CFG_READ_UINT8( __bus, __devfn, __offset, __val ) \ __val = cyg_hal_plf_pci_cfg_read_byte((__bus), (__devfn), (__offset)) #define HAL_PCI_CFG_READ_UINT16( __bus, __devfn, __offset, __val ) \ __val = cyg_hal_plf_pci_cfg_read_word((__bus), (__devfn), (__offset))#define HAL_PCI_CFG_READ_UINT32( __bus, __devfn, __offset, __val ) \ __val = cyg_hal_plf_pci_cfg_read_dword((__bus), (__devfn), (__offset))// Write a value to the PCI configuration space of the appropriate// size at an address composed from the bus, devfn and offset.#define HAL_PCI_CFG_WRITE_UINT8( __bus, __devfn, __offset, __val ) \ cyg_hal_plf_pci_cfg_write_byte((__bus), (__devfn), (__offset), (__val))#define HAL_PCI_CFG_WRITE_UINT16( __bus, __devfn, __offset, __val ) \ cyg_hal_plf_pci_cfg_write_word((__bus), (__devfn), (__offset), (__val))#define HAL_PCI_CFG_WRITE_UINT32( __bus, __devfn, __offset, __val ) \ cyg_hal_plf_pci_cfg_write_dword((__bus), (__devfn), (__offset), (__val))// Translate the PCI interrupt requested by the device (INTA#, INTB#,// INTC# or INTD#) to the associated CPU interrupt (i.e., HAL vector).#define HAL_PCI_TRANSLATE_INTERRUPT( __bus, __devfn, __vec, __valid) \ CYG_MACRO_START \ cyg_uint8 __req; \ HAL_PCI_CFG_READ_UINT8(__bus, __devfn, CYG_PCI_CFG_INT_PIN, __req); \ if (0 != __req) { \ /* Interrupt assignment as Galileo sees them. */ \ /* (From Malta User's Manual, 6.1 PCI Bus) */ \ CYG_ADDRWORD __translation[4] = { \ CYGNUM_HAL_INTERRUPT_PCI_AB, /* INTB# */ \ CYGNUM_HAL_INTERRUPT_PCI_CD, /* INTC# */ \ CYGNUM_HAL_INTERRUPT_PCI_CD, /* INTD# */ \ CYGNUM_HAL_INTERRUPT_PCI_AB}; /* INTA# */ \ \ /* The PCI lines from the different slots are wired like this */ \ /* on the PCI backplane: */ \ /* PCI_AB PCI_AB PCI_CD PCI_CD */ \ /* AMD PCnet INTA# */ \ /* I/O Slot 1 INTA# INTB# INTC# INTD# */ \ /* I/O Slot 2 INTD# INTA# INTB# INTC# */ \ /* I/O Slot 3 INTC# INTD# INTA# INTB# */ \ /* I/O Slot 4 INTB# INTC# INTD# INTA# */ \ /* */ \ /* Devsel signals are wired to, resulting in device IDs: */ \ /* AMD PCnet AD21 / dev 11 [(11+1)&3 = 0] */ \ /* I/O Slot 1 AD28 / dev 18 [(18+1)&3 = 3] */ \ /* I/O Slot 2 AD29 / dev 19 [(19+1)&3 = 0] */ \ /* I/O Slot 3 AD30 / dev 20 [(20+1)&3 = 1] */ \ /* I/O Slot 4 AD31 / dev 21 [(21+1)&3 = 2] */ \ \ /* For some reason the Ethernet device comes in on interrupt */ \ /* 11 rather than interrupt 16. */ \ if( (__bus)==0 && (__devfn)==0x58 ) \ __vec = CYGNUM_HAL_INTERRUPT_11; \ else __vec = __translation[((__req+CYG_PCI_DEV_GET_DEV(__devfn))&3)]; \ __valid = true; \ } else { \ /* Device will not generate interrupt requests. */ \ __valid = false; \ } \ CYG_MACRO_END// Galileo GT64120 on MIPS MALTA requires special processing.// First, it will hang when accessing device 31 on the local bus.// Second, we need to ignore the GT64120 so we can set it up// outside the generic PCI library.#define HAL_PCI_IGNORE_DEVICE(__bus, __dev, __fn) \ ((__bus) == 0 && ((__dev) == 0 || (__dev) == 31))// Bus address translation macros#define HAL_PCI_CPU_TO_BUS(__cpu_addr, __bus_addr) \ CYG_MACRO_START \ (__bus_addr) = CYGARC_PHYSICAL_ADDRESS((cyg_uint32)__cpu_addr); \ CYG_MACRO_END#define HAL_PCI_BUS_TO_CPU(__bus_addr, __cpu_addr) \ CYG_MACRO_START \ (__cpu_addr) = CYGARC_UNCACHED_ADDRESS(__bus_addr); \ CYG_MACRO_END// IDE interface macros//#define HAL_IDE_NUM_CONTROLLERS 2// Initialize the IDE controller(s).externC int cyg_hal_plf_ide_init(void);#define HAL_IDE_INIT() cyg_hal_plf_ide_init()#define HAL_IDE_READ_UINT8( __ctlr, __regno, __val ) \ __val = *HAL_REG8(((__ctlr) ? HAL_PIIX4_IDE_SEC_CMD : HAL_PIIX4_IDE_PRI_CMD) + (__regno))#define HAL_IDE_READ_UINT16( __ctlr, __regno, __val ) \ __val = *HAL_REG16(((__ctlr) ? HAL_PIIX4_IDE_SEC_CMD : HAL_PIIX4_IDE_PRI_CMD) + (__regno))#define HAL_IDE_READ_ALTSTATUS( __ctlr, __val ) \ __val = *HAL_REG16(((__ctlr) ? HAL_PIIX4_IDE_SEC_CTL : HAL_PIIX4_IDE_PRI_CTL) + 2)#define HAL_IDE_WRITE_UINT8( __ctlr, __regno, __val ) \ *HAL_REG8( ((__ctlr) ? HAL_PIIX4_IDE_SEC_CMD : HAL_PIIX4_IDE_PRI_CMD) + (__regno)) = (__val)#define HAL_IDE_WRITE_UINT16( __ctlr, __regno, __val ) \ *HAL_REG16( ((__ctlr) ? HAL_PIIX4_IDE_SEC_CMD : HAL_PIIX4_IDE_PRI_CMD) + (__regno)) = (__val)#define HAL_IDE_WRITE_CONTROL( __ctlr, __val ) \ *HAL_REG8( ((__ctlr) ? HAL_PIIX4_IDE_SEC_CTL : HAL_PIIX4_IDE_PRI_CTL) + 2) = (__val)#endif//-----------------------------------------------------------------------------// end of plf_io.h#endif // CYGONCE_PLF_IO_H
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?