📄 dxr3.cc
字号:
//// Copyright (c) 2002 by Istv醤 V醨adi//// This file is part of dxr3Player, a DVD player written specifically // for the DXR3 (aka Hollywood+) decoder card.// 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 "DXR3.h"#include "util/Config.h"#include <linux/em8300.h>//------------------------------------------------------------------------------using namespace dxr3;//------------------------------------------------------------------------------DXR3::DXR3(unsigned deviceNumber) : deviceNumber(deviceNumber), video(this), overlay(this), audio(this){ dev.open(deviceNumber, O_RDWR); const Config& config = Config::get(); if (config.uploadMicrocode) { uploadMicrocode(config.microcodeFileName); } initializeSubdevices();}//------------------------------------------------------------------------------void DXR3::uploadMicrocode(void* data, size_t size){ em8300_microcode_t microcode; microcode.ucode = data; microcode.ucode_size = size; dev.ioctl(EM8300_IOCTL_INIT, µcode, "Failed to upload microcode");}//------------------------------------------------------------------------------void DXR3::uploadMicrocode(const char* fileName){ int fd = POSIX::open(fileName, O_RDONLY, "Cannot open device %s", fileName); size_t size = static_cast<size_t>(POSIX::lseek(fd, 0, SEEK_END)); POSIX::lseek(fd, 0, SEEK_SET); char* data = new char[size]; POSIX::read(fd, data, size); close(fd); uploadMicrocode(data, size); delete[] data;}//------------------------------------------------------------------------------void DXR3::initializeSubdevices(){ overlay.initialize(); video.initialize(deviceNumber); audio.initialize(deviceNumber);}//------------------------------------------------------------------------------inline void DXR3::waitCommand(int reg, int value){ em8300_register_t regs; regs.microcode_register = 1; do { regs.reg = reg; dev.ioctl(EM8300_IOCTL_READREG, ®s, "Error waiting for the command register"); } while(regs.val != value);}//------------------------------------------------------------------------------void DXR3::executeCommand(int commandRegister, int command, int statusRegister, int expectedStatus){ waitCommand(commandRegister, 0xffff); em8300_register_t regs; regs.reg = commandRegister; regs.val = command; dev.ioctl(EM8300_IOCTL_WRITEREG, ®s, "Error writing command %04x into register %04x", command, commandRegister); waitCommand(statusRegister, expectedStatus);}//------------------------------------------------------------------------------//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -