]> git.zerfleddert.de Git - usb-driver/commitdiff
full support for parallel ports on ISE 12
authorMichael Gernoth <michael@gernoth.net>
Mon, 24 May 2010 12:33:38 +0000 (14:33 +0200)
committerMichael Gernoth <michael@gernoth.net>
Mon, 24 May 2010 12:33:38 +0000 (14:33 +0200)
index.html
usb-driver.c

index b4600d8452fba949c176b786900aceead10e6d6f..35610d6f9c61154c5d3f86980ac20bf86ad8d0b2 100644 (file)
@@ -59,8 +59,7 @@
                        <kbd>sed -i -e 's/TEMPNODE/tempnode/' -e 's/SYSFS/ATTRS/g' -e 's/BUS/SUBSYSTEMS/' /etc/udev/rules.d/xusbdfwu.rules</kbd><BR>
                        You may have to reboot for this change to take effect.</P></LI>
 
-                       <LI><P><I>2010-05-22</I>: Support for ISE 12 is now available in the driver, the presence of "windrvr6"
-                       is recognized again. Support for parallel/ftdi-cables is currently limited to existing parallel ports only. So you can't use an ftdi-emulated cable on a non-existing parallel port. Using it on a physically present port still works.</P></LI>
+                       <LI><P><I>2010-05-22</I>: Support for ISE 12 is now available in the driver.</P></LI>
                </UL>
                </P>
                <H2>Supported Cables</H2>
index 252e3279c07b5adab1ba68da5cde70990ceb73d8..69ee972c46169a186d3043f9df41742125949c76 100644 (file)
@@ -41,6 +41,7 @@
 #include <bits/wordsize.h>
 #include <sys/ipc.h>
 #include <sys/sem.h>
+#include <sys/mman.h>
 #include <syscall.h>
 #include <linux/personality.h>
 #include "usb-driver.h"
@@ -676,29 +677,59 @@ long int _Z14isModuleLoadedPci(char *module_name, int i) {
 /* XilCommNS::CPortResources::Instance() */
 void* _ZN9XilCommNS14CPortResources8InstanceEv() {
        static void* (*func) (void) = NULL;
+       static char *NetString = NULL;
+       static char *NetString2 = NULL;
+       char *filename = NULL;
        void *ret;
 
        if (!func)
                func = (void* (*) (void)) dlsym(RTLD_NEXT, "_ZN9XilCommNS14CPortResources8InstanceEv");
 
-       DPRINTF("-> XilCommNS::CPortResources::Instance()\n");
+       if (!NetString)
+               NetString = (char*)dlsym(RTLD_NEXT, "_ZTSN9XilCommNS9NetStringE");
 
-       ret = func();
+       if (!NetString2)
+               NetString2 = (char*)dlsym(RTLD_NEXT, "_ZTIN9XilCommNS9NetStringE");
+       
+       if (NetString && (!strcmp((char*)(NetString+0xb0), "/proc/sys/dev/parport/%s/base-addr")))
+               filename = (char*)(NetString+0xb0);
 
-#ifdef DEBUG
-       hexdump(ret, 0x29, "<-");
-       #if 0
-       {
-               void *portinfo;
-               portinfo = ((unsigned char**)ret+0x00);
-               hexdump(portinfo, 256, "PI");
-               hexdump(portinfo+0x50, 4, "BS");
-               hexdump(portinfo+0x54, 4, "BE");
-               hexdump(portinfo+0x58, 4, "ES");
-               hexdump(portinfo+0x5c, 4, "EE");
+       if (NetString2 && (!strcmp((char*)(NetString2+0xa4), "/proc/sys/dev/parport/%s/base-addr")))
+               filename = (char*)(NetString2+0xa4);
+
+       if (filename) {
+               long pagesize;
+               size_t protectlen;
+               void *start;
+               int len = strlen(filename) + 1;
+               int ret;
+
+               pagesize = sysconf(_SC_PAGE_SIZE);
+               DPRINTF("You have %lu bytes sized pages!\n", pagesize);
+
+               start = (void*)((long)filename & (~(pagesize-1)));
+
+               protectlen = pagesize;
+               if ((long)(filename + len) > (long)(start + protectlen))
+                       protectlen += pagesize;
+
+               DPRINTF("Unprotecting %zd bytes starting at %p\n", protectlen, start);
+               ret = mprotect(start, protectlen, PROT_READ|PROT_WRITE);
+               if (ret == -1)
+                       perror("mprotect");
+
+               DPRINTF("Replacing %s with /dev/zero\n", filename);
+               strcpy(filename, "/dev/zero");
+
+               DPRINTF("Reprotecting %zd bytes starting at %p\n", protectlen, start);
+               ret = mprotect(start, protectlen, PROT_READ|PROT_EXEC);
+               if (ret == -1)
+                       perror("mprotect");
        }
-       #endif
-#endif
+
+       DPRINTF("-> XilCommNS::CPortResources::Instance()\n");
+
+       ret = func();
 
        DPRINTF("<- XilCommNS::CPortResources::Instance()\n");
 
Impressum, Datenschutz