170-add-generic-spidev-driver.patch 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. --- a/Makefile.am
  2. +++ b/Makefile.am
  3. @@ -71,6 +71,8 @@ drv_generic_i2c.c \
  4. drv_generic_i2c.h \
  5. drv_generic_keypad.c \
  6. drv_generic_keypad.h \
  7. +drv_generic_spidev.c \
  8. +drv_generic_spidev.h \
  9. drv_ASTUSB.c \
  10. drv_BeckmannEgle.c \
  11. drv_BWCT.c \
  12. --- /dev/null
  13. +++ b/drv_generic_spidev.c
  14. @@ -0,0 +1,89 @@
  15. +/* $Id$
  16. + * $URL$
  17. + *
  18. + * generic driver helper for displays connected via SPI bus
  19. + *
  20. + * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
  21. + *
  22. + * This file is part of LCD4Linux.
  23. + *
  24. + * LCD4Linux is free software; you can redistribute it and/or modify
  25. + * it under the terms of the GNU General Public License as published by
  26. + * the Free Software Foundation; either version 2, or (at your option)
  27. + * any later version.
  28. + *
  29. + * LCD4Linux is distributed in the hope that it will be useful,
  30. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  31. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  32. + * GNU General Public License for more details.
  33. + *
  34. + * You should have received a copy of the GNU General Public License
  35. + * along with this program; if not, write to the Free Software
  36. + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  37. + *
  38. + */
  39. +
  40. +#include "config.h"
  41. +
  42. +#include <stdlib.h>
  43. +#include <stdio.h>
  44. +#include <string.h>
  45. +#include <errno.h>
  46. +#include <unistd.h>
  47. +#include <fcntl.h>
  48. +#include <sys/types.h>
  49. +#include <sys/ioctl.h>
  50. +
  51. +#include "debug.h"
  52. +#include "qprintf.h"
  53. +#include "cfg.h"
  54. +#include "drv_generic_spidev.h"
  55. +
  56. +static char *generic_spidev_section = "";
  57. +static char *generic_spidev_driver = "";
  58. +static int generic_spidev_fd;
  59. +
  60. +int drv_generic_spidev_open(const char *section, const char *driver)
  61. +{
  62. + char *spidev;
  63. +
  64. + udelay_init();
  65. +
  66. + generic_spidev_section = (char *) section;
  67. + generic_spidev_driver = (char *) driver;
  68. +
  69. + spidev = cfg_get(generic_spidev_section, "Port", NULL);
  70. +
  71. + info("%s: initializing SPI device %s", generic_spidev_driver, spidev);
  72. + generic_spidev_fd = open(spidev, O_WRONLY);
  73. + if (generic_spidev_fd < 0) {
  74. + error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev);
  75. + goto exit_error;
  76. + }
  77. +
  78. + return 0;
  79. +
  80. + exit_error:
  81. + free(spidev);
  82. + return -1;
  83. +}
  84. +
  85. +int drv_generic_spidev_close(void)
  86. +{
  87. + close(generic_spidev_fd);
  88. + return 0;
  89. +}
  90. +
  91. +int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr)
  92. +{
  93. + int ret;
  94. +
  95. + ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr);
  96. + if (ret < count) {
  97. + error("%s: can't send SPI message! (%s)\n",
  98. + generic_spidev_driver, strerror(errno));
  99. + return -1;
  100. + }
  101. +
  102. + return 0;
  103. +}
  104. --- /dev/null
  105. +++ b/drv_generic_spidev.h
  106. @@ -0,0 +1,54 @@
  107. +/* $Id$
  108. + * $URL$
  109. + *
  110. + * generic driver helper for displays connected via SPI bus
  111. + *
  112. + * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
  113. + * Copyright (C) 2012 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
  114. + *
  115. + * This file is part of LCD4Linux.
  116. + *
  117. + * LCD4Linux is free software; you can redistribute it and/or modify
  118. + * it under the terms of the GNU General Public License as published by
  119. + * the Free Software Foundation; either version 2, or (at your option)
  120. + * any later version.
  121. + *
  122. + * LCD4Linux is distributed in the hope that it will be useful,
  123. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  124. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  125. + * GNU General Public License for more details.
  126. + *
  127. + * You should have received a copy of the GNU General Public License
  128. + * along with this program; if not, write to the Free Software
  129. + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  130. + *
  131. + */
  132. +
  133. +/*
  134. + *
  135. + * exported fuctions:
  136. + *
  137. + * int drv_generic_spidev_open (const char *section, const char *driver)
  138. + * reads 'Port' entry from config and opens
  139. + * the SPI device
  140. + * returns 0 if ok, -1 on failure
  141. + *
  142. + * int drv_generic_spidev_close (void)
  143. + * closes SPI device
  144. + * returns 0 if ok, -1 on failure
  145. + *
  146. + * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr)
  147. + * transfer data to/from the SPI device
  148. + *
  149. + */
  150. +
  151. +#ifndef _DRV_GENERIC_SPIDEV_H_
  152. +#define _DRV_GENERIC_SPIDEV_H_
  153. +
  154. +#include <linux/spi/spidev.h>
  155. +
  156. +int drv_generic_spidev_open(const char *section, const char *driver);
  157. +int drv_generic_spidev_close(void);
  158. +int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr);
  159. +
  160. +#endif /* _DRV_GENERIC_SPIDEV_H_ */
  161. --- a/drivers.m4
  162. +++ b/drivers.m4
  163. @@ -301,6 +301,7 @@ PARPORT="no"
  164. SERIAL="no"
  165. I2C="no"
  166. KEYPAD="no"
  167. +SPIDEV="no"
  168. # generic libraries
  169. LIBUSB="no"
  170. @@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then
  171. DRVLIBS="$DRVLIBS -ljpeg"
  172. fi
  173. +# generic spidev driver
  174. +if test "$SPIDEV" = "yes"; then
  175. + DRIVERS="$DRIVERS drv_generic_spidev.o"
  176. + AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver])
  177. +fi
  178. +
  179. # libusb
  180. if test "$LIBUSB" = "yes"; then
  181. DRVLIBS="$DRVLIBS -lusb"
  182. --- a/configure.ac
  183. +++ b/configure.ac
  184. @@ -115,6 +115,9 @@ AC_ARG_WITH(outb,
  185. AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"])
  186. +# check for spidev
  187. +AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"])
  188. +
  189. # drivers
  190. sinclude(drivers.m4)