--- a/Makefile.am +++ b/Makefile.am @@ -72,6 +72,8 @@ drv_generic_i2c.c \ drv_generic_i2c.h \ drv_generic_keypad.c \ drv_generic_keypad.h \ +drv_generic_spidev.c \ +drv_generic_spidev.h \ drv_ASTUSB.c \ drv_BeckmannEgle.c \ drv_BWCT.c \ --- /dev/null +++ b/drv_generic_spidev.c @@ -0,0 +1,89 @@ +/* $Id$ + * $URL$ + * + * generic driver helper for displays connected via SPI bus + * + * Copyright (C) 2012 Gabor Juhos + * + * This file is part of LCD4Linux. + * + * LCD4Linux 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, or (at your option) + * any later version. + * + * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "qprintf.h" +#include "cfg.h" +#include "drv_generic_spidev.h" + +static char *generic_spidev_section = ""; +static char *generic_spidev_driver = ""; +static int generic_spidev_fd; + +int drv_generic_spidev_open(const char *section, const char *driver) +{ + char *spidev; + + udelay_init(); + + generic_spidev_section = (char *) section; + generic_spidev_driver = (char *) driver; + + spidev = cfg_get(generic_spidev_section, "Port", NULL); + + info("%s: initializing SPI device %s", generic_spidev_driver, spidev); + generic_spidev_fd = open(spidev, O_WRONLY); + if (generic_spidev_fd < 0) { + error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev); + goto exit_error; + } + + return 0; + + exit_error: + free(spidev); + return -1; +} + +int drv_generic_spidev_close(void) +{ + close(generic_spidev_fd); + return 0; +} + +int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr) +{ + int ret; + + ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr); + if (ret < count) { + error("%s: can't send SPI message! (%s)\n", + generic_spidev_driver, strerror(errno)); + return -1; + } + + return 0; +} --- /dev/null +++ b/drv_generic_spidev.h @@ -0,0 +1,54 @@ +/* $Id$ + * $URL$ + * + * generic driver helper for displays connected via SPI bus + * + * Copyright (C) 2012 Gabor Juhos + * Copyright (C) 2012 The LCD4Linux Team + * + * This file is part of LCD4Linux. + * + * LCD4Linux 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, or (at your option) + * any later version. + * + * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* + * + * exported fuctions: + * + * int drv_generic_spidev_open (const char *section, const char *driver) + * reads 'Port' entry from config and opens + * the SPI device + * returns 0 if ok, -1 on failure + * + * int drv_generic_spidev_close (void) + * closes SPI device + * returns 0 if ok, -1 on failure + * + * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr) + * transfer data to/from the SPI device + * + */ + +#ifndef _DRV_GENERIC_SPIDEV_H_ +#define _DRV_GENERIC_SPIDEV_H_ + +#include + +int drv_generic_spidev_open(const char *section, const char *driver); +int drv_generic_spidev_close(void); +int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr); + +#endif /* _DRV_GENERIC_SPIDEV_H_ */ --- a/drivers.m4 +++ b/drivers.m4 @@ -301,6 +301,7 @@ PARPORT="no" SERIAL="no" I2C="no" KEYPAD="no" +SPIDEV="no" # generic libraries LIBUSB="no" @@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then DRVLIBS="$DRVLIBS -ljpeg" fi +# generic spidev driver +if test "$SPIDEV" = "yes"; then + DRIVERS="$DRIVERS drv_generic_spidev.o" + AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver]) +fi + # libusb if test "$LIBUSB" = "yes"; then DRVLIBS="$DRVLIBS -lusb" --- a/configure.ac +++ b/configure.ac @@ -115,6 +115,9 @@ AC_ARG_WITH(outb, AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"]) +# check for spidev +AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"]) + # drivers sinclude(drivers.m4)