ue250_plx.c

来自「eCos操作系统源码」· C语言 代码 · 共 239 行

C
239
字号
//==========================================================================////      uE250_plx.c////      HAL support code for NMI uEngine uE250 PCI Local Bus (PLX)////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 2003 Gary Thomas <gary@mind.be>//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    David Mazur <david@mind.be>// Contributors: gthomas// Date:         2003-02-21// Purpose:      uPCI local bus (PLX/9080) support// Description:  ////####DESCRIPTIONEND####////========================================================================*/#include <pkgconf/hal.h>#include <pkgconf/system.h>#include CYGBLD_HAL_PLATFORM_H#include CYGHWR_MEMORY_LAYOUT_H#include <cyg/infra/cyg_type.h>         // base types#include <cyg/infra/cyg_trac.h>         // tracing macros#include <cyg/infra/cyg_ass.h>          // assertion macros#include <cyg/infra/diag.h>#include <cyg/hal/hal_io.h>             // IO macros#include <cyg/hal/hal_if.h>             // calling interface API#include <cyg/hal/hal_arch.h>           // Register state info#include <cyg/hal/hal_intr.h>           // Interrupt names#include <cyg/hal/hal_cache.h>#include <cyg/io/pci_hw.h>#include <cyg/io/pci.h>#ifdef CYGPKG_IO_PCIexternC void initialize_vga(void);#define _DEFINE_VARS#include <cyg/hal/plx.h>/** * Initial values for the configuration registers of the PLX 9080 */static struct plx_init {    cyg_uint32 address, value;} plx_init_values[] = {    { 0x0, 0xffe00000 },    { 0x4, 0x80000001 },    { 0x8, 0x0 },    { 0xc, 0x0 },    { 0x10,0xffe00000 },    { 0x14,0x80000000 },    { 0x18,0x40030141 },    { 0x1c,0x0 },    { 0x20,0x0 },    { 0x24,0x0 },    { 0x28,0x0 },    { 0x2c,0x0 },    { 0x78,0x0 },    { 0x7c,0x0 },    { 0xf0,0xffff8000 },    { 0xf4,0x40008001 },    { 0xf8,0x00000243 },    { 0x900, 0x68 },    { 0xFFFFFFFF,0},  // End marker};#ifdef CYGSEM_HAL_LOAD_VGA_FPGAstatic unsigned char uE250_plx_bitstream[] = {#include "uE250_plx_bitstream.h"   };externC void load_vga(cyg_uint8 *base, int len);#endif#if 0static void_show_pci_device(cyg_pci_device_id devid){    int i, bus, devfn;    cyg_pci_device dev_info;    bus = CYG_PCI_DEV_GET_BUS(devid);    devfn = CYG_PCI_DEV_GET_DEVFN(devid);    cyg_pci_get_device_info(devid, &dev_info);    diag_printf("\n");    diag_printf("Bus:        %d\n", CYG_PCI_DEV_GET_BUS(devid));    diag_printf("PCI Device: %d\n", CYG_PCI_DEV_GET_DEV(devid));    diag_printf("PCI Func  : %d\n", CYG_PCI_DEV_GET_FN(devfn));    diag_printf("Vendor Id : 0x%08X\n", dev_info.vendor);    diag_printf("Device Id : 0x%08X\n", dev_info.device);    diag_printf("Command:    %02x\n", dev_info.command);    for (i = 0; i < CYG_PCI_MAX_BAR; i++) {        diag_printf("  BAR[%d]    0x%08x /", i, dev_info.base_address[i]);        diag_printf(" probed size 0x%08x / CPU addr 0x%08x\n",                    dev_info.base_size[i], dev_info.base_map[i]);    }}#endifstatic /*__inline__*/ void write_fdc37c672_configreg(cyg_uint8 regno, cyg_uint8 data){    localbus_writeb(regno, FDC37C672_INDEX);    localbus_writeb(data, FDC37C672_DATA);}static /*__inline__*/ cyg_uint8 read_fdc37c672_configreg(cyg_uint8 regno){    localbus_writeb(regno, FDC37C672_INDEX);    return localbus_readb(FDC37C672_DATA) & 0xff;}/** *  Sets up the Base Address Registers of the PLX 9080 */void initialize_plx_bridge(void){    cyg_pci_device_id plx_dev = CYG_PCI_NULL_DEVID;    struct plx_init *init = plx_init_values;    int bus, devfn;    cyg_pci_device dev_info;//    diag_printf("Initializing PLX-9080 localbus controller\n");    if (cyg_pci_find_device((cyg_uint16)0x10B5, (cyg_uint16)0x9080, &plx_dev)) {        cyg_pci_get_device_info(plx_dev, &dev_info);        bus = CYG_PCI_DEV_GET_BUS(plx_dev);        devfn = CYG_PCI_DEV_GET_DEVFN(plx_dev);        // Run PLX/9080 initialization sequence        _plx_config_addr = dev_info.base_map[0] + LOCALBUS_CONFIG_OFFSET;        while (init->address != (cyg_uint32)0xFFFFFFFF) {            plx_config_writel(init->value, init->address);            init++;        }        // Turn device off so it can be re-configured        cyg_hal_plf_pci_cfg_write_byte(bus, devfn, CYG_PCI_CFG_COMMAND, 0);        // This lets the library probe the device so it can be setup.        cyg_pci_get_device_info(plx_dev, &dev_info);        // Now, assign new resources to the device        cyg_pci_configure_device(&dev_info);        // Re-enable device now that is's been configured        cyg_hal_plf_pci_cfg_write_byte(bus, devfn, CYG_PCI_CFG_COMMAND,                                        CYG_PCI_CFG_COMMAND_IO | CYG_PCI_CFG_COMMAND_MEMORY);        // See what was assigned - for later use        cyg_pci_get_device_info(plx_dev, &dev_info);        _plx_config_addr = dev_info.base_map[0] + LOCALBUS_CONFIG_OFFSET;        _plx_localbus_addr = dev_info.base_map[3];        // A little commercial plug :-)        localbus_writeb('M', ASCII_DISPLAY_BASE+8);        localbus_writeb('I', ASCII_DISPLAY_BASE+12);        localbus_writeb('N', ASCII_DISPLAY_BASE+16);        localbus_writeb('D', ASCII_DISPLAY_BASE+20);        // Configure SMSC FDC36c672 Super I/O controller        localbus_writeb(0x55,FDC37C672_CONFIG); // Enter FDC37C672 configuration mode        write_fdc37c672_configreg(7, 3);        // parallel port to IRQ 7, IO 0x378        write_fdc37c672_configreg(0x30, 1);        write_fdc37c672_configreg(0x70, 7);        write_fdc37c672_configreg(0x60, 0x3);        write_fdc37c672_configreg(0x61, 0x78);        write_fdc37c672_configreg(7, 4);        // first serial port to IRQ4, IO 0x3f8         write_fdc37c672_configreg(0x30, 1);        write_fdc37c672_configreg(0x70, 4);        write_fdc37c672_configreg(0x60, 0x3);        write_fdc37c672_configreg(0x61, 0xf8);        write_fdc37c672_configreg(7, 5);        // second serial port to IRQ5, IO 0x2f8        write_fdc37c672_configreg(0x30, 1);        write_fdc37c672_configreg(0x70, 3);        write_fdc37c672_configreg(0x60, 0x2);        write_fdc37c672_configreg(0x61, 0xf8);        write_fdc37c672_configreg(7, 7);        // PS/2 Keyboard/mouse to IRQ 1/5, IO 0x60         write_fdc37c672_configreg(0x30, 1);        write_fdc37c672_configreg(0x70, 1);        write_fdc37c672_configreg(0x72, 5);        localbus_writeb(0xAA,FDC37C672_CONFIG); // Leave FDC37C672 configuration mode #ifdef CYGSEM_HAL_LOAD_VGA_FPGA        load_vga(uE250_plx_bitstream, sizeof(uE250_plx_bitstream));#endif#ifdef CYGSEM_UE250_VGA_COMM        vga_comm_init(dev_info.base_map[2]);#endif    } else {        diag_printf("Can't find PLX controller!\n");    }}#endif // CYGPKG_IO_PCI

⌨️ 快捷键说明

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