/** @par LICENCE
* @verbatim
Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.

        ADDI-DATA GmbH
        Dieselstrasse 3
        D-77833 Ottersweier
        Tel: +19(0)7223/9493-0
        Fax: +49(0)7223/9493-92
        http://www.addi-data-com
        info@addi-data.com

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

You shoud also find the complete GPL in the COPYING file
accompanying this source code.

* @endverbatim
*/
#include "apci1032-private.h"
#include "apci1032-kapi.h"

EXPORT_NO_SYMBOLS;

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27)
#define __user
#endif

int APCI1032_Read1DigitalInput(struct pci_dev * pdev, uint8_t channel, uint8_t *inputValue)
{
	/* b_Channel must be between 1 and 32 included */
	if ((channel == 0) || (channel > 32))
		return -EINVAL;

	/* Reads the input value from the I/O Base Address */
	*inputValue = (uint8_t)((inl(GET_BAR1(pdev)) >> (channel - 1)) & 1);
	return 0;
}

//------------------------------------------------------------------------------
int APCI1032_Read8DigitalInputs(struct pci_dev * pdev, uint8_t port, uint8_t *inputValue)
{
	/* Port must be between 1 and 4 included */
	if ((port == 0) || (port > 4))
		return -EINVAL;

	/* Reads the input value from the I/O Base Address */
	*inputValue = (uint8_t)((inl(GET_BAR1(pdev)) >> ((port - 1) * 8)) & 0xFF);
	return 0;
}

//------------------------------------------------------------------------------
int APCI1032_Read16DigitalInputs(struct pci_dev * pdev, uint8_t port, uint16_t *inputValue)
{
	/* Port must be between 1 and 2 included */
	if ((port == 0) || (port > 2))
		return -EINVAL;

	/* Reads the input value from the I/O Base Address */
	*inputValue = (uint16_t)((inl(GET_BAR1(pdev)) >> ((port - 1) * 16)) & 0xFFFF);
	return 0;
}

//------------------------------------------------------------------------------
int APCI1032_Read32DigitalInputs(struct pci_dev * pdev, uint32_t *inputValue)
{
	/* Reads the input value from the I/O Base Address */
	*inputValue = inl(GET_BAR1(pdev));
	return 0;
}
