Browse Source

start of configuration infrastructure

master
michael 18 years ago
parent
commit
3e670223fd
  1. 8
      Makefile
  2. 75
      config.c
  3. 11
      config.h
  4. 50
      usb-driver.c

8
Makefile

@ -12,11 +12,11 @@ SOBJECTS=libusb-driver.so libusb-driver-DEBUG.so
all: $(SOBJECTS)
libusb-driver.so: usb-driver.c jtagkey.c usb-driver.h jtagkey.h Makefile
gcc $(CFLAGS) usb-driver.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver.so: usb-driver.c jtagkey.c config.c usb-driver.h jtagkey.h config.h Makefile
gcc $(CFLAGS) usb-driver.c config.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver-DEBUG.so: usb-driver.c jtagkey.c usb-driver.h jtagkey.h Makefile
gcc -DDEBUG $(CFLAGS) usb-driver.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver-DEBUG.so: usb-driver.c jtagkey.c config.c usb-driver.h jtagkey.h config.h Makefile
gcc -DDEBUG $(CFLAGS) usb-driver.c config.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
clean:
rm -f $(SOBJECTS)

75
config.c

@ -0,0 +1,75 @@
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
static struct parport_config pp_config[4];
static void read_config() {
int i;
static int config_read = 0;
if (config_read)
return;
config_read = 1;
for (i=0; i<sizeof(pp_config)/sizeof(struct parport_config); i++) {
pp_config[i].num = i;
pp_config[i].ppbase = i*0x10;
pp_config[i].real = 1;
}
#ifdef JTAGKEY
pp_config[3].real = 0;
pp_config[3].usb_vid = 0x0403;
pp_config[3].usb_pid = 0xcff8;
#endif
}
unsigned char config_is_real_pport(int num) {
int ret = 1;
int i;
read_config();
for (i=0; i<sizeof(pp_config)/sizeof(struct parport_config); i++) {
if (pp_config[i].num == num) {
ret = pp_config[i].real;
break;
}
}
return ret;
}
unsigned short config_usb_vid(int num) {
unsigned short ret = 0x00;
int i;
read_config();
for (i=0; i<sizeof(pp_config)/sizeof(struct parport_config); i++) {
if (pp_config[i].num == num) {
ret = pp_config[i].usb_vid;
break;
}
}
return ret;
}
unsigned short config_usb_pid(int num) {
unsigned short ret = 0x00;
int i;
read_config();
for (i=0; i<sizeof(pp_config)/sizeof(struct parport_config); i++) {
if (pp_config[i].num == num) {
ret = pp_config[i].usb_pid;
break;
}
}
return ret;
}

11
config.h

@ -0,0 +1,11 @@
struct parport_config {
int num;
unsigned long ppbase;
unsigned char real;
unsigned short usb_vid;
unsigned short usb_pid;
};
unsigned char config_is_real_pport(int num);
unsigned short config_usb_vid(int num);
unsigned short config_usb_pid(int num);

50
usb-driver.c

@ -42,6 +42,7 @@
#include <linux/parport.h>
#include <linux/ppdev.h>
#include "usb-driver.h"
#include "config.h"
#ifdef JTAGKEY
#include "jtagkey.h"
#endif
@ -349,7 +350,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
switch(request & ~(0xc0000000)) {
case VERSION:
version = (struct version_struct*)(wdheader->data);
strcpy(version->version, "libusb-driver.so $Revision: 1.65 $");
strcpy(version->version, "libusb-driver.so $Revision: 1.66 $");
version->versionul = 802;
DPRINTF("VERSION\n");
break;
@ -380,10 +381,11 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
ret = (*ioctl_func) (fd, request, wdioctl);
#else
/* FIXME: Ugly hack which maps amontec JtagKey to 4. parallel port */
#ifdef JTAGKEY
if ((unsigned long)cr->Card.Item[0].I.IO.dwAddr == 0x30) {
ret=jtagkey_init(0x0403, 0xcff8); /* I need a config file... */
if (!config_is_real_pport((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10)) {
int num = (unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10;
ret=jtagkey_init(config_usb_vid(num), config_usb_pid(num));
cr->hCard = 0xff;
ppbase = (unsigned long)cr->Card.Item[0].I.IO.dwAddr;
if (ret < 0)
@ -392,6 +394,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
break;
}
#endif
if (parportfd < 0) {
snprintf(ppdev, sizeof(ppdev), "/dev/parport%lu",
(unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
@ -708,7 +711,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
#else
#ifdef JTAGKEY
if (ppbase == 0x30) {
if (!config_is_real_pport(ppbase / 0x10)) {
ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, 1);
break;
}
@ -730,8 +733,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
#else
#ifdef JTAGKEY
/* FIXME: Config file and mor intelligent mapping! */
if (ppbase == 0x30) {
if (!config_is_real_pport(ppbase / 0x10)) {
ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, num);
break;
}
@ -981,12 +983,25 @@ FILE *fopen(const char *path, const char *mode) {
if (!func)
func = (FILE* (*) (const char*, const char*)) dlsym(RTLD_NEXT, "fopen");
#ifdef JTAGKEY
/* FIXME: Hack for parport mapping */
if (!strcmp(path, "/proc/sys/dev/parport/parport3/base-addr")) {
for (i = 0; i < 4; i++) {
snprintf(buf, sizeof(buf), "/proc/sys/dev/parport/parport%d/base-addr", i);
if (!strcmp(path, buf)) {
DPRINTF("open base-addr of parport%d\n", i);
if (config_is_real_pport(i)) {
ret = (*func) (path, mode);
} else {
ret = (*func) ("/dev/null", mode);
} else
#endif
}
if (ret) {
baseaddrfp = ret;
baseaddrnum = i;
}
return ret;
}
}
ret = (*func) (path, mode);
if (!strcmp(path, "/proc/modules")) {
@ -997,17 +1012,6 @@ FILE *fopen(const char *path, const char *mode) {
#endif
}
if (ret) {
for (i = 0; i < 4; i++) {
snprintf(buf, sizeof(buf), "/proc/sys/dev/parport/parport%d/base-addr", i);
if (!strcmp(path, buf)) {
DPRINTF("open base-addr of parport%d\n", i);
baseaddrfp = ret;
baseaddrnum = i;
}
}
}
return ret;
}

Loading…
Cancel
Save