diff options
author | Jakub Bogusz | 2014-09-15 15:14:17 (GMT) |
---|---|---|
committer | Jakub Bogusz | 2014-09-15 15:14:17 (GMT) |
commit | 2f72558aefdc7e431504da42c41404b72dc44ef5 (patch) | |
tree | 16889cc054939c9bfc7db412cc0e4072e1b7a73b | |
download | gpr400-2f72558aefdc7e431504da42c41404b72dc44ef5.zip gpr400-2f72558aefdc7e431504da42c41404b72dc44ef5.tar.gz |
- new
-rw-r--r-- | gpr400-update.patch | 251 | ||||
-rw-r--r-- | gpr400.spec | 173 |
2 files changed, 424 insertions, 0 deletions
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); 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 |