/** @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 do_CMD_APCI1032_Read1DigitalInput(struct pci_dev * pdev, unsigned int cmd, unsigned long arg)
{
	int ret;
	unsigned int tmpUser = 0;
	uint8_t channel;
	uint8_t inputValue;

	/* Gets the channel parameter from the user */
	if (copy_from_user(&tmpUser, (unsigned int __user *)arg, sizeof(tmpUser)))
		return -EFAULT;
	channel = (uint8_t)tmpUser;

	ret = APCI1032_Read1DigitalInput(pdev, channel, &inputValue);
	if (ret != 0)
		return ret;

	tmpUser = inputValue;
	if (copy_to_user((unsigned int __user *)arg, &tmpUser, sizeof(tmpUser)))
		return -EFAULT;

	return 0;
}

//------------------------------------------------------------------------------
int do_CMD_APCI1032_Read8DigitalInput(struct pci_dev * pdev, unsigned int cmd, unsigned long arg)
{
	int ret;
	uint8_t port;
	uint8_t inputValue;

	/* Gets the channel parameter from the user */
	if (copy_from_user(&port, (uint8_t __user *)arg, sizeof(port)))
		return -EFAULT;

	ret = APCI1032_Read8DigitalInputs(pdev, port, &inputValue);
	if (ret != 0)
		return ret;

	if (copy_to_user((uint8_t __user *)arg, &inputValue, sizeof(inputValue)))
		return -EFAULT;

	return 0;
}

//------------------------------------------------------------------------------
int do_CMD_APCI1032_Read16DigitalInput(struct pci_dev * pdev, unsigned int cmd, unsigned long arg)
{
	int ret;
	uint8_t port;
	uint16_t inputValue;

	/* Gets the channel parameter from the user */
	if (copy_from_user(&inputValue, (uint16_t __user *)arg, sizeof(inputValue)))
		return -EFAULT;
	port = (uint8_t)inputValue;

	ret = APCI1032_Read16DigitalInputs(pdev, port, &inputValue);
	if (ret != 0)
		return ret;

	if (copy_to_user((uint16_t __user *)arg, &inputValue, sizeof(inputValue)))
		return -EFAULT;

	return 0;
}

//------------------------------------------------------------------------------
int do_CMD_APCI1032_Read32DigitalInput(struct pci_dev * pdev, unsigned int cmd, unsigned long arg)
{
	int ret;
	uint32_t inputValue;

	ret = APCI1032_Read32DigitalInputs(pdev, &inputValue);
	if (ret != 0)
		return ret;

	if (copy_to_user((uint32_t __user *)arg, &inputValue, sizeof(inputValue)))
		return -EFAULT;

	return 0;
}
