more parts of the config infrastructure
authormichael <michael>
Mon, 30 Apr 2007 23:42:17 +0000 (23:42 +0000)
committermichael <michael>
Mon, 30 Apr 2007 23:42:17 +0000 (23:42 +0000)
config.c
config.h
parport.c
parport.h
usb-driver.c

index c41590f1818fb30dca2155c5bdc245d2cb5accec..ba6b9a65ddc7ce8b9d665b5e5e37fdba6c58baba 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1,5 +1,11 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
+#include "usb-driver.h"
+#include "parport.h"
+#ifdef JTAGKEY
+#include "jtagkey.h"
+#endif
 #include "config.h"
 
 static struct parport_config pp_config[4];
@@ -17,15 +23,37 @@ static void read_config() {
                pp_config[i].num = i;
                pp_config[i].ppbase = i*0x10;
                pp_config[i].real = 1;
+               pp_config[i].open = parport_open;
+               pp_config[i].close = parport_close;
+               pp_config[i].transfer = parport_transfer;
        }
 
 #ifdef JTAGKEY
        pp_config[3].real = 0;
        pp_config[3].usb_vid = 0x0403;
        pp_config[3].usb_pid = 0xcff8;
+       pp_config[3].open = jtagkey_open;
+       pp_config[3].close = jtagkey_close;
+       pp_config[3].transfer = jtagkey_transfer;
 #endif
 }
 
+struct parport_config *config_get(int num) {
+       struct parport_config *ret = NULL;
+       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]);
+                       break;
+               }
+       }
+
+       return ret;
+}
+
 unsigned char config_is_real_pport(int num) {
        int ret = 1;
        int i;
index f238e3b5c6f1e29857147a1c6cbb5e918e0498b6..e3e42ea10b95ff192b2476869ea3ba8194138807 100644 (file)
--- a/config.h
+++ b/config.h
@@ -4,9 +4,12 @@ struct parport_config {
        unsigned char real;
        unsigned short usb_vid;
        unsigned short usb_pid;
-       /* TODO: function pointer */
+       int (*open) (int num);
+       void (*close) (int handle);
+       int (*transfer) (WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num);
 };
 
+struct parport_config *config_get(int num);
 unsigned char config_is_real_pport(int num);
 unsigned short config_usb_vid(int num);
 unsigned short config_usb_pid(int num);
index 9cf35cd48d84dfbf19a3452a3ba8310cd6958f48..57ab08355593964f4b15ed5f869dd1a9ec9f8cc5 100644 (file)
--- a/parport.c
+++ b/parport.c
@@ -13,7 +13,7 @@
 
 static int parportfd = -1;
 
-int pp_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num) {
+int parport_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num) {
        int ret = 0;
        int i;
        unsigned long port;
index d4fbaa2b0ccaa0ada9ede4cc76e4b616bb4df0ff..ee4609844f84dc31cfea6d8ec665a9069669d061 100644 (file)
--- a/parport.h
+++ b/parport.h
@@ -1,3 +1,3 @@
-int pp_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num);
+int parport_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num);
 int parport_open(int num);
 void parport_close(int handle);
index f2f8477a5c430cde97ebb2423c5c1257f2684302..513fc3e41c5ec9c97123a44f17b65f6188ab86d3 100644 (file)
 #include <sys/ioctl.h>
 #include "usb-driver.h"
 #include "config.h"
-#include "parport.h"
-#ifdef JTAGKEY
-#include "jtagkey.h"
-#endif
 
 static int (*ioctl_func) (int, int, void *) = NULL;
 static int windrvrfd = -1;
 static unsigned long ppbase = 0;
 static unsigned long ecpbase = 0;
+static struct parport_config *pport = NULL;
 FILE *modulesfp = NULL;
 FILE *baseaddrfp = NULL;
 int baseaddrnum = 0;
@@ -248,7 +245,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.67 $");
+                       strcpy(version->version, "libusb-driver.so $Revision: 1.68 $");
                        version->versionul = 802;
                        DPRINTF("VERSION\n");
                        break;
@@ -278,12 +275,8 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
                                ret = (*ioctl_func) (fd, request, wdioctl);
 #else
 
-#ifdef JTAGKEY
-                               if (!config_is_real_pport((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10))
-                                       ret = jtagkey_open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
-                               else
-#endif
-                                       ret = parport_open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
+                               pport = config_get((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
+                               ret = pport->open((unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
 
                                ppbase = (unsigned long)cr->Card.Item[0].I.IO.dwAddr;
 
@@ -566,14 +559,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 #ifndef NO_WINDRVR
                                ret = (*ioctl_func) (fd, request, wdioctl);
 #else
-
-#ifdef JTAGKEY
-                               if (!config_is_real_pport(ppbase / 0x10)) {
-                                       ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, 1);
-                                       break;
-                               }
-#endif /* JTAGKEY */
-                               ret = pp_transfer(tr, fd, request, ppbase, ecpbase, 1);
+                               ret = pport->transfer(tr, fd, request, ppbase, ecpbase, 1);
 #endif
                        }
                        break;
@@ -587,13 +573,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 #ifndef NO_WINDRVR
                                ret = (*ioctl_func) (fd, request, wdioctl);
 #else
-
-#ifdef JTAGKEY
-                               if (!config_is_real_pport(ppbase / 0x10)) {
-                                       ret = jtagkey_transfer(tr, fd, request, ppbase, ecpbase, num);
-                               } else
-#endif /* JTAGKEY */
-                                       ret = pp_transfer(tr, fd, request, ppbase, ecpbase, num);
+                               ret = pport->transfer(tr, fd, request, ppbase, ecpbase, num);
 #endif
                        }
                        break;
@@ -653,12 +633,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 #ifndef NO_WINDRVR
                                ret = (*ioctl_func) (fd, request, wdioctl);
 #else
-#ifdef JTAGKEY
-                               if (cr->hCard == 0xff)
-                                       jtagkey_close(cr->hCard);
-                               else
-#endif
-                                       parport_close(cr->hCard);
+                               pport->close(cr->hCard);
 #endif
                        }
                        break;
Impressum, Datenschutz