[packages/gpr400] - new

qboosh qboosh at pld-linux.org
Mon Sep 15 17:14:21 CEST 2014


commit 2f72558aefdc7e431504da42c41404b72dc44ef5
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Mon Sep 15 17:14:17 2014 +0200

    - new

 gpr400-update.patch | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gpr400.spec         | 173 ++++++++++++++++++++++++++++++++++++
 2 files changed, 424 insertions(+)
---
diff --git a/gpr400.spec b/gpr400.spec
new file mode 100644
index 0000000..5522525
--- /dev/null
+++ b/gpr400.spec
@@ -0,0 +1,173 @@
+# TODO: probably update patch is incomplete
+#
+# Conditional build:
+%bcond_without	dist_kernel	# allow non-distribution kernel
+%bcond_without	kernel		# don't build kernel modules
+%bcond_without	userspace	# don't build userspace programs
+%bcond_with	verbose		# verbose build (V=1)
+
+%if %{without kernel}
+%undefine	with_dist_kernel
+%endif
+
+%if 0%{?_pld_builder:1} && %{with kernel} && %{with userspace}
+%{error:kernel and userspace cannot be built at the same time on PLD builders}
+exit 1
+%endif
+
+%if "%{_alt_kernel}" != "%{nil}"
+%if 0%{?build_kernels:1}
+%{error:alt_kernel and build_kernels are mutually exclusive}
+exit 1
+%endif
+%undefine	with_userspace
+%global		_build_kernels		%{alt_kernel}
+%else
+%global		_build_kernels		%{?build_kernels:,%{?build_kernels}}
+%endif
+
+%if %{without userspace}
+# nothing to be placed to debuginfo package
+%define		_enable_debug_packages	0
+%endif
+
+%define		kbrs	%(echo %{_build_kernels} | tr , '\\n' | while read n ; do echo %%undefine alt_kernel ; [ -z "$n" ] || echo %%define alt_kernel $n ; echo "BuildRequires:kernel%%{_alt_kernel}-module-build >= 3:2.6.36" ; done)
+%define		kpkg	%(echo %{_build_kernels} | tr , '\\n' | while read n ; do echo %%undefine alt_kernel ; [ -z "$n" ] || echo %%define alt_kernel $n ; echo %%kernel_pkg ; done)
+%define		bkpkg	%(echo %{_build_kernels} | tr , '\\n' | while read n ; do echo %%undefine alt_kernel ; [ -z "$n" ] || echo %%define alt_kernel $n ; echo %%build_kernel_pkg ; done)
+%define		ikpkg	%(echo %{_build_kernels} | tr , '\\n' | while read n ; do echo %%undefine alt_kernel ; [ -z "$n" ] || echo %%define alt_kernel $n ; echo %%install_kernel_pkg ; done)
+
+Summary:	Linux drivers for Gemplus GPR400 / GemPC 400 PCMCIA smart card readers
+Summary(pl.UTF-8):	Linuksowe sterowniki do czytników kart procesorowych Gemplus GPR400 / GemPC 400 na PCMCIA
+%define	pname	gpr400
+Name:		%{pname}%{?_pld_builder:%{?with_kernel:-kernel}%{_alt_kernel}}
+Version:	0
+%define	snap	20130219
+%define	rel	0.%{snap}.0.1
+Release:	%{rel}%{?_pld_builder:%{?with_kernel:@%{_kernel_ver_str}}}
+License:	LGPL v2.1 (IFD driver), GPL v2 (Linux kernel driver)
+Group:		Libraries
+Source0:	https://github.com/jeansch/gpr400/archive/master/%{pname}-%{snap}.tar.gz
+# Source0-md5:	1ced7ca5616c257a0229b400ffcfc822
+Patch0:		%{name}-update.patch
+# from http://www.hydromel.net/driver/gpr400/
+Source1:	http://www.hydromel.net/driver/gpr400/iccdrv.ZIP
+# Source1-md5:	a46a0dd7b26c1c8354c7898bcd2ae7a1
+URL:		https://github.com/jeansch/gpr400/
+BuildRequires:	pcsc-lite-devel >= 1.2.0
+BuildRequires:	rpmbuild(macros) >= 1.678
+%{?with_dist_kernel:%{expand:%kbrs}}
+BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%description
+PC/SC driver for Gemplus GPR400 / GemPC 400 smart card readers
+
+%description -l pl.UTF-8
+Sterownik PC/SC do czytników kart procesorowych Gemplus GPR400 / GemPC
+400.
+
+%package -n pcsc-driver-gpr400
+Summary:	PC/SC driver for Gemplus GPR400 / GemPC 400 smart card readers
+Summary(pl.UTF-8):	Sterownik PC/SC do czytników kart procesorowych Gemplus GPR400 / GemPC 400
+Group:		Libraries
+Requires:	pcsc-lite
+
+%description -n pcsc-driver-gpr400
+PC/SC driver for Gemplus GPR400 / GemPC 400 smart card readers
+
+%description -n pcsc-driver-gpr400 -l pl.UTF-8
+Sterownik PC/SC do czytników kart procesorowych Gemplus GPR400 / GemPC
+400.
+
+%define	kernel_pkg()\
+%package -n kernel%{_alt_kernel}-pcmcia-gpr400\
+Summary:	Linux driver for Gemplus GPR400/GemPC 400 smart card readers\
+Summary(pl.UTF-8):	Sterownik dla Linuksa do czytników kart procesorowych GemPlus GPR400/GemPC 400\
+Release:	%{rel}@%{_kernel_ver_str}\
+Group:		Base/Kernel\
+Requires(post,postun):	/sbin/depmod\
+%if %{with dist_kernel}\
+%requires_releq_kernel\
+Requires(postun):	%releq_kernel\
+%endif\
+\
+%description -n kernel%{_alt_kernel}-pcmcia-gpr400\
+Linux driver for Gemplus GPR400/GemPC 400 smart card readers.\
+\
+This package contains Linux module.\
+\
+%description -n kernel%{_alt_kernel}-pcmcia-gpr400 -l pl.UTF-8\
+Sterownik dla Linuksa do czytników kart procesorowych GemPlus\
+GPR400/GemPC 400.\
+\
+Ten pakiet zawiera moduł jądra Linuksa.\
+\
+%if %{with kernel}\
+%files -n kernel%{_alt_kernel}-pcmcia-gpr400\
+%defattr(644,root,root,755)\
+/lib/modules/%{_kernel_ver}/kernel/drivers/pcmcia/gpr400_cs.ko*\
+%endif\
+\
+%post	-n kernel%{_alt_kernel}-pcmcia-gpr400\
+%depmod %{_kernel_ver}\
+\
+%postun	-n kernel%{_alt_kernel}-pcmcia-gpr400\
+%depmod %{_kernel_ver}\
+%{nil}
+
+%define build_kernel_pkg()\
+%build_kernel_modules -C gpr400_cs -m gpr400_cs KERNELRELEASE=%{_kernel_ver}\
+# install to local directory, this makes building for multiple kernels easy\
+%install_kernel_modules -D installed -m gpr400_cs/gpr400_cs -d kernel/drivers/pcmcia\
+%{nil}
+
+%define install_kernel_pkg()\
+%{nil}
+
+%{?with_kernel:%{expand:%kpkg}}
+
+%prep
+%setup -q -n %{pname}-master
+%patch0 -p1
+
+%build
+%if %{with userspace}
+CC="%{__cc}" \
+CFLAGS="%{rpmcflags}" \
+%{__make} -C ifd-gpr400 \
+	CC="%{__cc}" \
+	CFLAGS="%{rpmcflags} -Wall -fPIC" \
+	LD="%{__cc} %{rpmldflags}"
+%endif
+
+%{?with_kernel:%{expand:%bkpkg}}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT
+
+%if %{with userspace}
+install -D ifd-gpr400/libgpr400_ifd.so $RPM_BUILD_ROOT%{_libdir}/pcsc/drivers/libgpr400_ifd.so
+install -d $RPM_BUILD_ROOT/etc/reader.conf.d
+cat >$RPM_BUILD_ROOT/etc/reader.conf.d/gpr400.conf <<EOF
+FRIENDLYNAME	"Gemplus GPR400"
+DEVICEFILE	/dev/gpr400
+LIBPATH		%{_libdir}/pcsc/drivers/libgpr400_ifd.so
+CHANNELID	5
+EOF
+%endif
+
+%if %{with kernel}
+%{expand:%ikpkg}
+cp -a installed/* $RPM_BUILD_ROOT
+%endif
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%if %{with userspace}
+%files -n pcsc-driver-gpr400
+%defattr(644,root,root,755)
+%doc ifd-gpr400/README
+%attr(755,root,root) %{_libdir}/pcsc/drivers/libgpr400_ifd.so
+%config(noreplace) %verify(not md5 mtime size) /etc/reader.conf.d/gpr400.conf
+%endif
diff --git a/gpr400-update.patch b/gpr400-update.patch
new file mode 100644
index 0000000..abce5bd
--- /dev/null
+++ b/gpr400-update.patch
@@ -0,0 +1,251 @@
+--- gpr400-master/gpr400_cs/gpr400_cs.c.orig	2013-02-20 22:07:29.000000000 +0100
++++ gpr400-master/gpr400_cs/gpr400_cs.c	2014-09-14 20:56:40.492311274 +0200
+@@ -44,8 +44,6 @@
+ #include <asm/io.h>
+ #include <asm/system.h>
+ 
+-#include <pcmcia/cs_types.h>
+-#include <pcmcia/cs.h>
+ #include <pcmcia/cistpl.h>
+ #include <pcmcia/cisreg.h>
+ #include <pcmcia/ciscode.h>
+@@ -76,7 +74,6 @@ MODULE_LICENSE("GPL");
+ #define GPR_DEBUG(n, args...)
+ #endif
+ 
+-static dev_info_t dev_info = "gpr400_cs";
+ static char *version = "GPR400 Driver 0.9.9";
+ 
+ #define CM_MAX_DEV              4
+@@ -263,7 +260,7 @@ static int gpr400_close(struct inode *in
+   return 0;
+ } 
+ 
+-static int gpr400_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) {
++static long gpr400_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
+   struct pcmcia_device *link;
+   gpr400_priv *dev;
+   u_char ta;      /* reader answer tag    */
+@@ -293,7 +290,7 @@ static int gpr400_ioctl(struct inode *in
+   switch (cmd) {
+   case GPR400_RESET:		/* reset the card reader	*/
+     gpr400_reset(dev);
+-    pcmcia_request_configuration(link, &link->conf);
++    pcmcia_enable_device(link);
+     /* Send select command */
+     if ((ret = tlv_send(dev, GPR400_SLCT, 0x01, "\x02")) < 0)
+       return ret;
+@@ -438,7 +435,7 @@ static int gpr400_ioctl(struct inode *in
+ 
+ static struct file_operations gpr400_chr_fops = {
+  open:    gpr400_open,
+- ioctl:   gpr400_ioctl,
++ unlocked_ioctl:   gpr400_ioctl,
+  release: gpr400_close,
+  owner:   THIS_MODULE,
+ };
+@@ -477,7 +474,7 @@ static int gpr400_resume(struct pcmcia_d
+ {
+   GPR_DEBUG(0, "gpr400 Resuming...\n");
+   gpr400_reset((gpr400_priv *)&link->priv);
+-  /* pcmcia_request_configuration(link, &link->conf); */
++  /* pcmcia_enable_device(link); */
+   GPR_DEBUG(0, "gpr400 Device resumed.\n");
+   return 0;
+ }
+@@ -512,7 +509,7 @@ static void gpr400_release(struct pcmcia
+   struct gpr400_priv *dev;
+   dev = link->priv;
+   pcmcia_disable_device(link);
+-  free_irq(link->irq.AssignedIRQ, dev);
++  free_irq(link->irq, dev);
+ }
+ 
+ #define CS_CHECK(fn, ret)						\
+@@ -521,94 +518,24 @@ static void gpr400_release(struct pcmcia
+ #define CFG_CHECK(fn, ret)			\
+   if(ret != 0) goto next_entry
+ 
++static int gpr400_conf_check(struct pcmcia_device *link, void *priv)
++{
++  if (link->config_index == 0)
++    return -EINVAL;
++
++  return pcmcia_request_io (link);
++}
++
+ static int gpr400_config(struct pcmcia_device *link) {
+   gpr400_priv *dev = link->priv;
+-  tuple_t tuple;
+-  cisparse_t parse;
+-  int last_fn, last_ret;
+-  u_char buf[64];
+-  win_req_t req;
+-  memreq_t map;
++  const char *last_fn;
++  int last_ret;
+ 
+   GPR_DEBUG(0, "gpr400_config(0x%p)\n", link);
+ 
+-  /*
+-   * This reads the card's CONFIG tuple to find its configuration
+-   * registers.
+-   */
+-  tuple.DesiredTuple = CISTPL_CONFIG;
+-  tuple.Attributes = 0;
+-  tuple.TupleData = buf;
+-  tuple.TupleDataMax = sizeof(buf);
+-  tuple.TupleOffset = 0;
+-  CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
+-  CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
+-  CS_CHECK(ParseTuple, pcmcia_parse_tuple(&tuple, &parse));
+-  link->conf.ConfigBase = parse.config.base;
+-  link->conf.Present = parse.config.rmask[0];
+-	
+   /* Get and parse CFTABLE_ENTRY */
+-  tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+-  tuple.Attributes = 0;
+-  CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
+-  while (last_ret == CS_SUCCESS) {
+-    cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
+-
+-    CFG_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
+-    CFG_CHECK(ParseTuple, pcmcia_parse_tuple(&tuple, &parse));
+-
+-    if ( cfg->index == 0 || cfg->io.nwin == 0 ) goto next_entry;
+-
+-    link->conf.ConfigIndex = cfg->index;
+-
+-    /* Use power settings for Vcc and Vpp if present */
+-    /*  Note that the CIS values need to be rescaled */
+-    if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
+-      if (link->conf.Vpp != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
+-	goto next_entry;
+-    }
+-
+-    if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
+-      link->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
+-				
+-
+-    /* Do we need to allocate an interrupt? */
+-    if ( cfg->irq.IRQInfo1 )
+-      link->conf.Attributes |= CONF_ENABLE_IRQ;
+-
+-    /* IO window settings */
+-    link->io.NumPorts1 = link->io.NumPorts2 = 0;
+-    if ( cfg->io.nwin > 0 ) { 
+-      cistpl_io_t *io = &cfg->io;
+-      link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+-      if (!(io->flags & CISTPL_IO_8BIT))
+-	link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+-      if (!(io->flags & CISTPL_IO_16BIT))
+-	link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+-
+-      link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
+-      link->io.BasePort1 = io->win[0].base;
+-      link->io.NumPorts1 = io->win[0].len;
+-      if (io->nwin > 1) {
+-	link->io.Attributes2 = link->io.Attributes1;
+-	link->io.BasePort2 = io->win[1].base;
+-	link->io.NumPorts2 = io->win[1].len;
+-      }
+-
+-      GPR_DEBUG(1, "gpr400_cs: RequestIO: 0x%04x-0x%04x\n",
+-		io->win[0].base,
+-		(io->win[0].base + io->win[0].len) - 1);
+-
+-      /* This reserves IO space but doesn't actually enable */
+-      CFG_CHECK(RequestIO, pcmcia_request_io(link, &link->io));
+-    }
+-
+-    /* If we got this far, we're cool! */
+-    break;
+-		
+-  next_entry:
+-    CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
+-  }
++  link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ;
++  CS_CHECK("pcmcia_loop_config", pcmcia_loop_config(link, gpr400_conf_check, NULL));
+ 
+   /*
+    * Allocate an interrupt line.  Note that this does not assign a
+@@ -617,8 +544,8 @@ static int gpr400_config(struct pcmcia_d
+    */
+   GPR_DEBUG(0, "gpr400_cs: pcmcia_requestIRQ\n");
+    
+-  CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
+-  dev->irq = link->irq.AssignedIRQ;
++  CS_CHECK("RequestIRQ", pcmcia_request_irq(link, gpr400_interrupt));
++  dev->irq = link->irq;
+ 
+   /*
+    * This actually configures the PCMCIA socket -- setting up
+@@ -626,45 +553,21 @@ static int gpr400_config(struct pcmcia_d
+    * card and host interface into "Memory and IO" mode.
+    */
+   GPR_DEBUG(0, "gpr400_cs: RequestConfiguration\n");
+-  CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
++  CS_CHECK("RequestConfiguration", pcmcia_enable_device(link));
+ 
+   GPR_DEBUG(0, "gpr400_cs: RequestWindow\n");
+-  req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | WIN_ENABLE;
+-  req.Base = 0; req.Size = 0; req.AccessSpeed = 55;
+-  CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win));
+-  map.Page = 0; map.CardOffset = 0;
+-  CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &map));
+-
+-  dev->am_base = ioremap(req.Base, req.Size);
+-
+-  dev->io_base = link->io.BasePort1;
+-  dev->io_mem = req.Base;
+-
+-  request_irq(dev->irq, gpr400_interrupt, IRQF_SHARED, dev_info, dev);
+-
+-  /* Finally, report what we've done */
+-  GPR_DEBUG(0, "gpr400_config : index 0x%02x: Vcc %d.%d",
+-	    link->conf.ConfigIndex,
+-	    conf.Vcc/10, conf.Vcc%10);
+-  if (link->conf.Vpp)
+-    GPR_DEBUG(0, ", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
+-  if (link->io.NumPorts1)
+-    GPR_DEBUG(0, ", io 0x%04x-0x%04x", link->io.BasePort1,
+-	      link->io.BasePort1+link->io.NumPorts1-1);
+-  if (link->io.NumPorts2)
+-    GPR_DEBUG(0, " & 0x%04x-0x%04x", link->io.BasePort2,
+-	      link->io.BasePort2+link->io.NumPorts2-1);
+-  if (link->conf.Attributes & CONF_ENABLE_IRQ)
+-    GPR_DEBUG(0, ", irq %d\n", link->irq.AssignedIRQ);
+-  if (link->win)
+-    GPR_DEBUG(0, "gpr400_config : io_mem: %06lx-%06lx",
+-	      req.Base, req.Base + req.Size-1);
+-  GPR_DEBUG("\n");
++  link->resource[PCMCIA_IOMEM_0]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | WIN_ENABLE;
++  link->resource[PCMCIA_IOMEM_0]->start = 0;
++  link->resource[PCMCIA_IOMEM_0]->end = 0;
++  CS_CHECK("RequestWindow", pcmcia_request_window(link, link->resource[PCMCIA_IOMEM_0], 55));
++  CS_CHECK("MapMemPage", pcmcia_map_mem_page(link, link->resource[PCMCIA_IOMEM_0], 0));
++
++  dev->am_base = ioremap(link->resource[PCMCIA_IOMEM_0]->start, resource_size(link->resource[PCMCIA_IOMEM_0]));
+ 
+   return 0;
+ 
+  cs_failed:
+-  cs_error(link, last_fn, last_ret);
++  dev_printk(KERN_NOTICE, &link->dev, "gpr400: error %d in %s\n", last_ret, last_fn);
+   gpr400_release(link);
+ 
+   return 0;
+@@ -691,13 +594,6 @@ static int __devinit gpr400_probe(struct
+   dev->release_timer.function = (void (*)(unsigned long))&gpr400_release;
+   dev->release_timer.data = (unsigned long)link;
+ 
+-  /* Interrupt setup */
+-  link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
+-  link->irq.Instance = dev;
+-  /* Config request setup */
+-  link->conf.Attributes = CONF_ENABLE_IRQ;
+-  link->conf.IntType = INT_MEMORY_AND_IO;
+-
+   init_waitqueue_head(&dev->wq);
+ 
+   return gpr400_config(link);
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/gpr400.git/commitdiff/2f72558aefdc7e431504da42c41404b72dc44ef5



More information about the pld-cvs-commit mailing list