79 lines
1.8 KiB
C++
79 lines
1.8 KiB
C++
/*
|
|
* \brief I/O back-end of the mindrvr driver
|
|
* \author Sebastian Sumpf <sebastian.sumpf@genode-labs.com>
|
|
* \date 2010-07-15
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2010-2013 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef _ATA_IO_H_
|
|
#define _ATA_IO_H_
|
|
|
|
#include <io_port_session/connection.h>
|
|
|
|
namespace Ata {
|
|
|
|
class Io_port : public Genode::Io_port_session
|
|
{
|
|
private:
|
|
|
|
Genode::Io_port_connection _io_cmd;
|
|
Genode::Io_port_connection _io_ctrl;
|
|
unsigned _base_cmd; /* command base */
|
|
unsigned _base_ctrl; /* control base */
|
|
|
|
unsigned short translate_address(unsigned short address)
|
|
{
|
|
return address < 8 ? _base_cmd + address : _base_ctrl + 6;
|
|
}
|
|
|
|
Genode::Io_port_connection * io(unsigned short address)
|
|
{
|
|
return (address < 8) ? &_io_cmd : &_io_ctrl;
|
|
}
|
|
|
|
public:
|
|
|
|
Io_port(unsigned base, unsigned base_ctrl)
|
|
: _io_cmd(base, 8), _io_ctrl(base_ctrl, 8),
|
|
_base_cmd(base), _base_ctrl(base_ctrl) {}
|
|
|
|
unsigned char inb(unsigned short address)
|
|
{
|
|
return io(address)->inb(translate_address(address));
|
|
}
|
|
|
|
unsigned short inw(unsigned short address)
|
|
{
|
|
return io(address)->inw(translate_address(address));
|
|
}
|
|
|
|
unsigned inl(unsigned short address)
|
|
{
|
|
return io(address)->inl(translate_address(address));
|
|
}
|
|
|
|
void outb(unsigned short address, unsigned char value)
|
|
{
|
|
io(address)->outb(translate_address(address), value);
|
|
}
|
|
|
|
void outw(unsigned short address, unsigned short value)
|
|
{
|
|
io(address)->outw(translate_address(address), value);
|
|
}
|
|
|
|
void outl(unsigned short address, unsigned value)
|
|
{
|
|
io(address)->outl(translate_address(address), value);
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif /* _ATA_IO_H_ */
|