full support for parallel ports on ISE 12
This commit is contained in:
parent
765c485a06
commit
a90dd20702
@ -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>
|
<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>
|
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"
|
<LI><P><I>2010-05-22</I>: Support for ISE 12 is now available in the driver.</P></LI>
|
||||||
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>
|
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
<H2>Supported Cables</H2>
|
<H2>Supported Cables</H2>
|
||||||
|
61
usb-driver.c
61
usb-driver.c
@ -41,6 +41,7 @@
|
|||||||
#include <bits/wordsize.h>
|
#include <bits/wordsize.h>
|
||||||
#include <sys/ipc.h>
|
#include <sys/ipc.h>
|
||||||
#include <sys/sem.h>
|
#include <sys/sem.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
#include <linux/personality.h>
|
#include <linux/personality.h>
|
||||||
#include "usb-driver.h"
|
#include "usb-driver.h"
|
||||||
@ -676,30 +677,60 @@ long int _Z14isModuleLoadedPci(char *module_name, int i) {
|
|||||||
/* XilCommNS::CPortResources::Instance() */
|
/* XilCommNS::CPortResources::Instance() */
|
||||||
void* _ZN9XilCommNS14CPortResources8InstanceEv() {
|
void* _ZN9XilCommNS14CPortResources8InstanceEv() {
|
||||||
static void* (*func) (void) = NULL;
|
static void* (*func) (void) = NULL;
|
||||||
|
static char *NetString = NULL;
|
||||||
|
static char *NetString2 = NULL;
|
||||||
|
char *filename = NULL;
|
||||||
void *ret;
|
void *ret;
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
func = (void* (*) (void)) dlsym(RTLD_NEXT, "_ZN9XilCommNS14CPortResources8InstanceEv");
|
func = (void* (*) (void)) dlsym(RTLD_NEXT, "_ZN9XilCommNS14CPortResources8InstanceEv");
|
||||||
|
|
||||||
|
if (!NetString)
|
||||||
|
NetString = (char*)dlsym(RTLD_NEXT, "_ZTSN9XilCommNS9NetStringE");
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
DPRINTF("-> XilCommNS::CPortResources::Instance()\n");
|
DPRINTF("-> XilCommNS::CPortResources::Instance()\n");
|
||||||
|
|
||||||
ret = func();
|
ret = func();
|
||||||
|
|
||||||
#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");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DPRINTF("<- XilCommNS::CPortResources::Instance()\n");
|
DPRINTF("<- XilCommNS::CPortResources::Instance()\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user