2010-07-31 15:53:30 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2010 Stefan Lankes, Chair for Operating Systems,
|
|
|
|
* RWTH Aachen University
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*
|
|
|
|
* This file is part of MetalSVM.
|
|
|
|
*/
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/**
|
|
|
|
* @author Stefan Lankes
|
|
|
|
* @file arch/x86/include/asm/io.h
|
|
|
|
* @brief Functions related to processor IO
|
|
|
|
*
|
|
|
|
* This file contains inline functions for processor IO operations.
|
|
|
|
*/
|
|
|
|
|
2010-07-31 15:53:30 +00:00
|
|
|
#ifndef __ARCH_IO_H__
|
|
|
|
#define __ARCH_IO_H__
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2011-07-18 09:06:09 +02:00
|
|
|
#ifndef CMOS_PORT_ADDRESS
|
|
|
|
#define CMOS_PORT_ADDRESS 0x70
|
|
|
|
#endif
|
|
|
|
#ifndef CMOS_PORT_DATA
|
|
|
|
#define CMOS_PORT_DATA 0x71
|
|
|
|
#endif
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Read a byte from an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to read from
|
|
|
|
* @return The value which reads out from this port
|
|
|
|
*/
|
2010-07-31 15:53:30 +00:00
|
|
|
inline static unsigned char inportb(unsigned short _port) {
|
|
|
|
unsigned char rv;
|
2010-08-05 07:11:38 +00:00
|
|
|
asm volatile("inb %1, %0":"=a"(rv):"dN"(_port));
|
|
|
|
return rv;
|
2010-07-31 15:53:30 +00:00
|
|
|
}
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Read a word (2 byte) from an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to read from
|
|
|
|
* @return The value which reads out from this port
|
|
|
|
*/
|
2010-08-05 07:11:38 +00:00
|
|
|
inline static unsigned short inportw(unsigned short _port) {
|
|
|
|
unsigned short rv;
|
|
|
|
asm volatile("inw %1, %0":"=a"(rv):"dN"(_port));
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Read a double word (4 byte) from an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to read from
|
|
|
|
* @return The value which reads out from this port
|
|
|
|
*/
|
2010-08-05 07:11:38 +00:00
|
|
|
inline static unsigned int inportl(unsigned short _port) {
|
|
|
|
unsigned int rv;
|
|
|
|
asm volatile("inl %1, %0":"=a"(rv):"dN"(_port));
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Write a byte to an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to write to
|
|
|
|
* @param _data the 1 byte value you want to write
|
|
|
|
*/
|
2010-07-31 15:53:30 +00:00
|
|
|
inline static void outportb(unsigned short _port, unsigned char _data) {
|
2010-08-05 07:11:38 +00:00
|
|
|
asm volatile("outb %1, %0"::"dN"(_port), "a"(_data));
|
|
|
|
}
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Write a word (2 bytes) to an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to write to
|
|
|
|
* @param _data the 2 byte value you want to write
|
|
|
|
*/
|
2010-08-05 07:11:38 +00:00
|
|
|
inline static void outportw(unsigned short _port, unsigned short _data) {
|
|
|
|
asm volatile("outw %1, %0"::"dN"(_port), "a"(_data));
|
|
|
|
}
|
|
|
|
|
2011-04-04 11:27:49 +02:00
|
|
|
/** @brief Write a double word (4 bytes) to an IO port
|
|
|
|
*
|
|
|
|
* @param _port The port you want to write to
|
|
|
|
* @param _data the 4 byte value you want to write
|
|
|
|
*/
|
2010-08-05 07:11:38 +00:00
|
|
|
inline static void outportl(unsigned short _port, unsigned int _data)
|
|
|
|
{
|
|
|
|
asm volatile("outl %1, %0"::"dN"(_port), "a"(_data));
|
2010-07-31 15:53:30 +00:00
|
|
|
}
|
|
|
|
|
2011-07-18 09:06:09 +02:00
|
|
|
/**
|
|
|
|
* read a byte from CMOS
|
|
|
|
* @param offset CMOS offset
|
|
|
|
* @return value you want to read
|
|
|
|
*/
|
|
|
|
inline static uint8_t cmos_read(uint8_t offset)
|
|
|
|
{
|
|
|
|
outportb(CMOS_PORT_ADDRESS, offset);
|
|
|
|
return inportb(CMOS_PORT_DATA);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* write a byte in CMOS
|
|
|
|
* @param offset CMOS offset
|
|
|
|
* @param val the value you want wto write
|
|
|
|
*/
|
|
|
|
inline static void cmos_write(uint8_t offset, uint8_t val)
|
|
|
|
{
|
|
|
|
outportb(CMOS_PORT_ADDRESS, offset);
|
|
|
|
outportb(CMOS_PORT_DATA, val);
|
|
|
|
}
|
|
|
|
|
2010-07-31 15:53:30 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|