📄 io.cc
字号:
//// Copyright (c) 2004 by Istv醤 V醨adi//// This file is part of dxr3Player, a DVD player written specifically // for the DXR3 (aka Hollywood+) decoder card, but now handles other// hardware as well. These files contain a (mostly) user-space driver // for the Unichrome board found on Via's EPIA motherboards.//// The information for implementing this driver has been gathered// from the following sources://// - The DirectFB Unichrome driver// Copyright (c) 2003 Andreas Robinson, All rights reserved.//// - Andreas Robinson's MPEG-2 decoder for the Unichrome board.// Copyright (c) 2003 Andreas Robinson, All rights reserved.//// - Via's Unichrome Framebuffer driver// Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.// Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.// This program 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 of the License, or// (at your option) any later version.//// This program 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 this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//------------------------------------------------------------------------------#include "IO.h"#include "util/Log.h"#include <cstdio>#include <unistd.h>#include <fcntl.h>#include <sys/mman.h>extern "C" {#include <pci/pci.h>}//------------------------------------------------------------------------------using unichrome::IO;//------------------------------------------------------------------------------IO::IO() : framebuffer(0), mmio(0), revision(0), sequencer(PORT_SEQUENCER), control(PORT_CONTROL), graphics(PORT_GRAPHICS), status(PORT_STATUS), attribute(PORT_ATTRIBUTE), miscOutput(PORT_MISC_OUTPUT), miscOutput2(PORT_MISC_OUTPUT2), miscInput(PORT_MISC_INPUT), i2c(*this){ pci_access* pacc = pci_alloc(); pci_init(pacc); pci_scan_bus(pacc); for(pci_dev* dev = pacc->devices; dev!=0; dev=dev->next) { pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_SIZES); if (dev->vendor_id==VENDOR_ID && dev->device_id==DEVICE_ID) { // FIXME: POSIX::open int fd = open("/dev/mem", O_RDWR); if (fd<0) { perror("open(/dev/mem)"); abort(); } // FIXME: POSIX::mmap framebuffer = mmap(0, FRAMEBUFFER_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, dev->base_addr[BASEIDX_FRAMEBUFFER] & PCI_ADDR_MEM_MASK); if (framebuffer==MAP_FAILED) { perror("mmap(framebuffer)"); abort(); } mmioSize = dev->size[BASEIDX_MMIO]; mmio = mmap(0, mmioSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, dev->base_addr[BASEIDX_MMIO] & PCI_ADDR_MEM_MASK); if (mmio==MAP_FAILED) { perror("mmap(mmio)"); abort(); } close(fd); Log::debug("Unichrome framebbufer @%p, mmio @%p\n", framebuffer, mmio); } if (dev->bus==0 && dev->dev==0 && dev->func==0) { revision = pci_read_byte(dev, 0xf6); } } pci_cleanup(pacc); if (framebuffer==0 || mmio==0) { Log::debug("Cannot find Unichrome device!\n"); abort(); } else { Log::debug("Unichrome revision %u\n", revision); } if (ioperm(0x3c0, 32, 1)<0) { perror("ioperm"); abort(); }}//------------------------------------------------------------------------------IO::~IO(){ ioperm(0x3c0, 32, 0); munmap(mmio, mmioSize); munmap(framebuffer, FRAMEBUFFER_SIZE);}//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -