Merge branch 'master' of github.com:optixx/quickdev16

This commit is contained in:
optixx 2009-09-17 20:06:29 +02:00
commit c30ca4ca54
17 changed files with 909 additions and 161 deletions

View File

@ -0,0 +1,64 @@
--- ucon64-2.0.0-src/src/backup/f2a.c 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/backup/f2a.c 2009-08-28 10:00:36.000000000 +0000
@@ -53,8 +53,10 @@
#include "console/gba.h"
#ifdef USE_USB
#include <stdarg.h>
+#if 0
#include <sys/wait.h>
#include <sys/utsname.h>
+#endif
#include "misc/usb.h"
#endif
#ifdef USE_PARALLEL
@@ -253,9 +255,9 @@
than that. - dbjh
*/
{
- va_list argptr;
int status;
-
+#if 0
+ va_list argptr;
argc++;
va_start (argptr, argc);
if (fork () == 0)
@@ -294,7 +296,7 @@
}
wait (&status);
va_end (argptr);
-
+#endif
return status;
}
@@ -343,6 +345,7 @@
static int
f2a_connect_usb (void)
{
+#if 0
int fp, result, firmware_loaded = 0;
unsigned char f2afirmware[F2A_FIRM_SIZE];
char f2afirmware_fname[FILENAME_MAX];
@@ -367,13 +370,11 @@
{
struct utsname info;
int version;
-
if (uname (&info) == -1)
{
fputs ("ERROR: Could not determine version of the running kernel\n", stderr);
return -1;
}
-
version = strtol (&info.release[0], NULL, 10) * 10 +
strtol (&info.release[2], NULL, 10);
// example contents of info.release: "2.4.18-14custom"
@@ -477,6 +478,7 @@
" %s\n", usb_strerror ());
return -1;
}
+#endif
return 0;
}

View File

@ -0,0 +1,813 @@
diff -Naur ucon64-2.0.0-src/src/backup/backup.h ucon64/src/backup/backup.h
--- ucon64-2.0.0-src/src/backup/backup.h 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/backup/backup.h 2009-08-28 10:00:36.000000000 +0000
@@ -59,4 +59,9 @@
#include "f2a.h"
#endif
+#ifdef USE_USB
+#include "quickdev16.h"
+#endif // USE_PARALLEL
+
+
#endif // BACKUP_H
diff -Naur ucon64-2.0.0-src/src/backup/quickdev16.c ucon64/src/backup/quickdev16.c
--- ucon64-2.0.0-src/src/backup/quickdev16.c 1970-01-01 00:00:00.000000000 +0000
+++ ucon64/src/backup/quickdev16.c 2009-09-01 13:01:12.000000000 +0000
@@ -0,0 +1,228 @@
+/*
+quickdev16.c - Quickdev16 support for uCON64
+
+Copyright (c) 2009 david@optixx.org
+
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include <usb.h>
+#include "misc/misc.h"
+#include "misc/itypes.h"
+#ifdef USE_ZLIB
+#include "misc/archive.h"
+#endif
+#include "misc/getopt2.h" // st_getopt2_t
+#include "misc/file.h"
+#include "misc/opendevice.h"
+
+
+#include "ucon64.h"
+#include "ucon64_misc.h"
+#include "ffe.h"
+#include "smc.h"
+#include "quickdev16.h"
+
+#include "console/snes.h"
+
+#define SNES_HEADER_LEN (sizeof (st_snes_header_t))
+
+const st_getopt2_t quickdev16_usage[] =
+ {
+ {
+ NULL, 0, 0, 0,
+ NULL, "Quickdev16"/* http://www.optixx.org */,
+ NULL
+ },
+#ifdef USE_USB
+ {
+ "xquickdev16", 0, 0, UCON64_XSNESRAM, // send only
+ NULL, "send ROM (in FFE format) to Quickdev16",
+ &ucon64_wf[WF_OBJ_NES_DEFAULT_STOP_NO_SPLIT]
+ },
+#endif
+ {NULL, 0, 0, 0, NULL, NULL, NULL}
+ };
+
+
+#ifdef USE_USB
+
+#define READ_BUFFER_SIZE 8192
+#define SEND_BUFFER_SIZE 128
+#define SNES_HIROM_SHIFT 16
+#define SNES_LOROM_SHIFT 15
+
+int
+quickdev16_write_rom (const char *filename)
+{
+ FILE *file;
+ int bytesread, bytessend, size;
+ time_t starttime;
+ usb_dev_handle *handle = NULL;
+ const unsigned char rawVid[2] = { USB_CFG_VENDOR_ID }, rawPid[2] = { USB_CFG_DEVICE_ID};
+ char vendor[] = { USB_CFG_VENDOR_NAME, 0 }, product[] = { USB_CFG_DEVICE_NAME, 0};
+ int cnt, vid, pid;
+ uint8_t *read_buffer;
+ uint32_t addr = 0;
+ uint16_t addr_lo = 0;
+ uint16_t addr_hi = 0;
+ uint16_t step = 0;
+ uint8_t bank = 0;
+ uint8_t bank_cnt = 0;
+ uint16_t bank_shift;
+ uint32_t bank_size;
+ uint32_t hirom = 0;
+ uint8_t byte = 0;
+ st_rominfo_t rominfo;
+
+
+ usb_init();
+ vid = rawVid[1] * 256 + rawVid[0];
+ pid = rawPid[1] * 256 + rawPid[0];
+ if (usbOpenDevice(&handle, vid, vendor, pid, product, NULL, NULL, NULL) != 0) {
+ fprintf(stderr,
+ "Could not find USB device \"%s\" with vid=0x%x pid=0x%x\n",
+ product, vid, pid);
+ exit(1);
+ }
+ printf("Open USB device \"%s\" with vid=0x%x pid=0x%x\n", product, vid,pid);
+
+ if ((file = fopen (filename, "rb")) == NULL)
+ {
+ fprintf (stderr, ucon64_msg[OPEN_READ_ERROR], filename);
+ exit (1);
+ }
+
+ if ((read_buffer = (unsigned char *) malloc (READ_BUFFER_SIZE)) == NULL)
+ {
+ fprintf (stderr, ucon64_msg[FILE_BUFFER_ERROR], READ_BUFFER_SIZE);
+ exit (1);
+ }
+
+ snes_init (&rominfo);
+ printf(rominfo.misc);
+ printf("\n");
+
+ if (UCON64_ISSET (ucon64.snes_hirom))
+ hirom = ucon64.snes_hirom ? 1 : 0;
+ else {
+ hirom = snes_get_snes_hirom ();
+ }
+
+
+
+ if (hirom) {
+ bank_shift = SNES_HIROM_SHIFT;
+ bank_size = 1 << SNES_HIROM_SHIFT;
+ } else {
+ bank_shift = SNES_LOROM_SHIFT;
+ bank_size = 1 << SNES_LOROM_SHIFT;
+ }
+
+
+
+ fseek (file, 0, SEEK_END);
+ size = ftell (file);
+ fseek (file, SMC_HEADER_LEN, SEEK_SET);
+ size -= SMC_HEADER_LEN;
+ bank_cnt = size / bank_size;
+
+ printf ("Send: %d Bytes (%.4f Mb) Hirom: %s, Banks: %i\n", size, (float) size / MBIT, hirom ? "Yes" : "No", bank_cnt);
+ bytessend = 0;
+ printf ("Press q to abort\n\n");
+ starttime = time (NULL);
+
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE |
+ USB_ENDPOINT_OUT, USB_MODE_AVR, 0, 0, NULL,
+ 0, 5000);
+
+ /* wait for the loader to depack */
+ usleep(500000);
+
+
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
+ USB_BULK_UPLOAD_INIT, bank_shift , bank_cnt, NULL, 0, 5000);
+
+
+ while ((bytesread = fread(read_buffer, READ_BUFFER_SIZE, 1, file)) > 0) {
+ for (step = 0; step < READ_BUFFER_SIZE; step += SEND_BUFFER_SIZE) {
+
+ addr_lo = addr & 0xffff;
+ addr_hi = (addr >> 16) & 0x00ff;
+
+ if (addr == 0){
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE |
+ USB_ENDPOINT_OUT, USB_BULK_UPLOAD_ADDR, addr_hi,
+ addr_lo, (char *) read_buffer + step,
+ SEND_BUFFER_SIZE, 5000);
+ } else {
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE |
+ USB_ENDPOINT_OUT, USB_BULK_UPLOAD_NEXT, addr_hi,
+ addr_lo, (char *) read_buffer + step,
+ SEND_BUFFER_SIZE, 5000);
+ }
+ if (cnt < 0) {
+ fprintf(stderr, "USB error: %s\n", usb_strerror());
+ usb_close(handle);
+ exit(-1);
+ }
+
+ bytessend += SEND_BUFFER_SIZE;
+ ucon64_gauge (starttime, bytessend, size);
+
+ addr += SEND_BUFFER_SIZE;
+ if ( addr % bank_size == 0) {
+ bank++;
+ }
+ }
+ }
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE |
+ USB_ENDPOINT_OUT, USB_BULK_UPLOAD_END, 0, 0, NULL,
+ 0, 5000);
+
+#if 0
+ bank = 0;
+ fseek(fp, 0, SEEK_SET);
+ while ((cnt = fread(read_buffer, READ_BUFFER_SIZE, 1, fp)) > 0) {
+ printf ("bank=0x%02x crc=0x%04x\n", bank++,
+ do_crc(read_buffer, READ_BUFFER_SIZE));
+ }
+ fclose(fp);
+#endif
+ cnt = usb_control_msg(handle,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE |
+ USB_ENDPOINT_OUT, USB_MODE_SNES, 0, 0, NULL,
+ 0, 5000);
+
+
+ free (read_buffer);
+ fclose (file);
+ return 0;
+}
+
+
+#endif // USE_USB
diff -Naur ucon64-2.0.0-src/src/backup/quickdev16.h ucon64/src/backup/quickdev16.h
--- ucon64-2.0.0-src/src/backup/quickdev16.h 1970-01-01 00:00:00.000000000 +0000
+++ ucon64/src/backup/quickdev16.h 2009-08-28 10:00:36.000000000 +0000
@@ -0,0 +1,81 @@
+/*
+quickdev16.h - Quickdev16 support for uCON64
+
+Copyright (c) 2009 david@optixx.org
+
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+#ifndef SNESRAM_H
+#define SNESRAM_H
+
+#define USB_UPLOAD_INIT 0
+#define USB_UPLOAD_ADDR 1
+
+#define USB_DOWNLOAD_INIT 2
+#define USB_DOWNLOAD_ADDR 3
+
+#define USB_CRC 4
+#define USB_CRC_ADDR 5
+
+#define USB_BULK_UPLOAD_INIT 6
+#define USB_BULK_UPLOAD_ADDR 7
+#define USB_BULK_UPLOAD_NEXT 8
+#define USB_BULK_UPLOAD_END 9
+#define USB_MODE_SNES 10
+#define USB_MODE_AVR 11
+#define USB_AVR_RESET 12
+
+/* -------------------------- Device Description --------------------------- */
+
+#define USB_CFG_VENDOR_ID 0xc0, 0x16
+/* USB vendor ID for the device, low byte first. If you have registered your
+ * own Vendor ID, define it here. Otherwise you use one of obdev's free shared
+ * VID/PID pairs. Be sure to read USBID-License.txt for rules!
+ */
+#define USB_CFG_DEVICE_ID 0xdd, 0x05
+/* This is the ID of the product, low byte first. It is interpreted in the
+ * scope of the vendor ID. If you have registered your own VID with usb.org
+ * or if you have licensed a PID from somebody else, define it here. Otherwise
+ * you use obdev's free shared VID/PID pair. Be sure to read the rules in
+ * USBID-License.txt!
+ */
+#define USB_CFG_DEVICE_VERSION 0x00, 0x01
+/* Version number of the device: Minor number first, then major number.
+ */
+#define USB_CFG_VENDOR_NAME 'o', 'p', 't', 'i', 'x', 'x', '.', 'o', 'r', 'g'
+#define USB_CFG_VENDOR_NAME_LEN 10
+/* These two values define the vendor name returned by the USB device. The name
+ * must be given as a list of characters under single quotes. The characters
+ * are interpreted as Unicode (UTF-16) entities.
+ * If you don't want a vendor name string, undefine these macros.
+ * ALWAYS define a vendor name containing your Internet domain name if you use
+ * obdev's free shared VID/PID pair. See the file USBID-License.txt for
+ * details.
+ */
+#define USB_CFG_DEVICE_NAME 'Q', 'U', 'I', 'C', 'K', 'D', 'E', 'V', '1', '6'
+#define USB_CFG_DEVICE_NAME_LEN 10
+/* Same as above for the device name. If you don't want a device name, undefine
+ * the macros. See the file USBID-License.txt before you assign a name if you
+ * use a shared VID/PID.
+ */
+
+extern const st_getopt2_t quickdev16_usage[];
+
+#ifdef USE_USB
+extern int quickdev16_write_rom (const char *filename);
+#endif
+
+#endif // SNESRAM_H
diff -Naur ucon64-2.0.0-src/src/console/snes.c ucon64/src/console/snes.c
--- ucon64-2.0.0-src/src/console/snes.c 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/console/snes.c 2009-08-28 10:00:36.000000000 +0000
@@ -3261,6 +3261,7 @@
snes_hirom = 0;
if (UCON64_ISSET (ucon64.snes_hirom)) // see snes_set_hirom()
snes_hirom = ucon64.snes_hirom;
+ //ucon64.snes_hirom = snes_hirom;
snes_hirom_ok = 1;
rominfo->interleaved = 0;
diff -Naur ucon64-2.0.0-src/src/Makefile.in ucon64/src/Makefile.in
--- ucon64-2.0.0-src/src/Makefile.in 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/Makefile.in 2009-08-28 10:00:36.000000000 +0000
@@ -7,8 +7,8 @@
@DEFINE_LIBCD64_MAKE@
CC=@CC@
-CFLAGS=-I. -Wall -W -O3 @DEFS@
-LDFLAGS=-s
+CFLAGS=-I. -Wall -W -O3 @DEFS@ -I/opt/local/include
+LDFLAGS=-s -L/opt/local/lib
TARGETS=
ifdef USE_DISCMAGE
@@ -96,7 +96,8 @@
OBJECTS=ucon64.o ucon64_dat.o ucon64_misc.o ucon64_opts.o \
misc/chksum.o misc/file.o misc/getopt.o misc/getopt2.o \
misc/misc.o misc/parallel.o misc/property.o misc/string.o \
- patch/aps.o patch/bsl.o patch/gg.o patch/ips.o patch/pal4u.o \
+ misc/opendevice.o \
+ patch/aps.o patch/bsl.o patch/gg.o patch/ips.o patch/pal4u.o \
patch/ppf.o patch/xps.o \
console/dc.o console/gb.o console/gba.o console/genesis.o \
console/jaguar.o console/lynx.o console/n64.o console/neogeo.o \
@@ -107,7 +108,7 @@
backup/fig.o backup/gbx.o backup/gd.o backup/interceptor.o \
backup/lynxit.o backup/mccl.o backup/mcd.o backup/md-pro.o \
backup/mgd.o backup/msg.o backup/pce-pro.o backup/pl.o \
- backup/psxpblib.o backup/sflash.o backup/smc.o backup/smd.o \
+ backup/psxpblib.o backup/sflash.o backup/quickdev16.o backup/smc.o backup/smd.o \
backup/smsgg-pro.o backup/ssc.o backup/swc.o backup/tototek.o \
backup/ufo.o backup/yoko.o backup/z64.o
ifdef USE_ZLIB
diff -Naur ucon64-2.0.0-src/src/misc/opendevice.c ucon64/src/misc/opendevice.c
--- ucon64-2.0.0-src/src/misc/opendevice.c 1970-01-01 00:00:00.000000000 +0000
+++ ucon64/src/misc/opendevice.c 2009-08-28 10:00:36.000000000 +0000
@@ -0,0 +1,286 @@
+/*
+ * Name: opendevice.c Project: V-USB host-side library Author: Christian
+ * Starkjohann Creation Date: 2008-04-10 Tabsize: 4 Copyright: (c) 2008 by
+ * OBJECTIVE DEVELOPMENT Software GmbH License: GNU GPL v2 (see License.txt),
+ * GNU GPL v3 or proprietary (CommercialLicense.txt) This Revision: $Id:
+ * opendevice.c 740 2009-04-13 18:23:31Z cs $
+ */
+
+/*
+ * General Description: The functions in this module can be used to find and
+ * open a device based on libusb or libusb-win32.
+ */
+
+
+#include <stdio.h>
+#include "opendevice.h"
+
+/*
+ * -------------------------------------------------------------------------
+ */
+
+#define MATCH_SUCCESS 1
+#define MATCH_FAILED 0
+#define MATCH_ABORT -1
+
+/*
+ * private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or
+ * MATCH_ABORT.
+ */
+static int _shellStyleMatch(char *text, char *p)
+{
+ int last,
+ matched,
+ reverse;
+
+ for (; *p; text++, p++) {
+ if (*text == 0 && *p != '*')
+ return MATCH_ABORT;
+ switch (*p) {
+ case '\\':
+ /*
+ * Literal match with following character.
+ */
+ p++;
+ /*
+ * FALLTHROUGH
+ */
+ default:
+ if (*text != *p)
+ return MATCH_FAILED;
+ continue;
+ case '?':
+ /*
+ * Match anything.
+ */
+ continue;
+ case '*':
+ while (*++p == '*')
+ /*
+ * Consecutive stars act just like one.
+ */
+ continue;
+ if (*p == 0)
+ /*
+ * Trailing star matches everything.
+ */
+ return MATCH_SUCCESS;
+ while (*text)
+ if ((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED)
+ return matched;
+ return MATCH_ABORT;
+ case '[':
+ reverse = p[1] == '^';
+ if (reverse) /* Inverted character class. */
+ p++;
+ matched = MATCH_FAILED;
+ if (p[1] == ']' || p[1] == '-')
+ if (*++p == *text)
+ matched = MATCH_SUCCESS;
+ for (last = *p; *++p && *p != ']'; last = *p)
+ if (*p == '-' && p[1] != ']' ? *text <= *++p
+ && *text >= last : *text == *p)
+ matched = MATCH_SUCCESS;
+ if (matched == reverse)
+ return MATCH_FAILED;
+ continue;
+ }
+ }
+ return *text == 0;
+}
+
+/*
+ * public interface for shell style matching: returns 0 if fails, 1 if matches
+ */
+static int shellStyleMatch(char *text, char *pattern)
+{
+ if (pattern == NULL) /* NULL pattern is synonymous to "*" */
+ return 1;
+ return _shellStyleMatch(text, pattern) == MATCH_SUCCESS;
+}
+
+/*
+ * -------------------------------------------------------------------------
+ */
+
+int usbGetStringAscii(usb_dev_handle * dev, int index, char *buf, int buflen)
+{
+ char buffer[256];
+ int rval,
+ i;
+
+ if ((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use
+ * libusb
+ * version
+ * if
+ * it
+ * works
+ */
+ return rval;
+ if ((rval =
+ usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
+ (USB_DT_STRING << 8) + index, 0x0409, buffer,
+ sizeof(buffer), 5000)) < 0)
+ return rval;
+ if (buffer[1] != USB_DT_STRING) {
+ *buf = 0;
+ return 0;
+ }
+ if ((unsigned char) buffer[0] < rval)
+ rval = (unsigned char) buffer[0];
+ rval /= 2;
+ /*
+ * lossy conversion to ISO Latin1:
+ */
+ for (i = 1; i < rval; i++) {
+ if (i > buflen) /* destination buffer overflow */
+ break;
+ buf[i - 1] = buffer[2 * i];
+ if (buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */
+ buf[i - 1] = '?';
+ }
+ buf[i - 1] = 0;
+ return i - 1;
+}
+
+/*
+ * -------------------------------------------------------------------------
+ */
+
+int usbOpenDevice(usb_dev_handle ** device, int vendorID,
+ char *vendorNamePattern, int productID,
+ char *productNamePattern, char *serialNamePattern,
+ FILE * printMatchingDevicesFp, FILE * warningsFp)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+ usb_dev_handle *handle = NULL;
+ int errorCode = USBOPEN_ERR_NOTFOUND;
+
+ usb_find_busses();
+ usb_find_devices();
+ for (bus = usb_get_busses(); bus; bus = bus->next) {
+ for (dev = bus->devices; dev; dev = dev->next) { /* iterate over
+ * all devices
+ * on all
+ * busses */
+ if ((vendorID == 0 || dev->descriptor.idVendor == vendorID)
+ && (productID == 0 || dev->descriptor.idProduct == productID)) {
+ char vendor[256],
+ product[256],
+ serial[256];
+ int len;
+ handle = usb_open(dev); /* we need to open the device in order
+ * to query strings */
+ if (!handle) {
+ errorCode = USBOPEN_ERR_ACCESS;
+ if (warningsFp != NULL)
+ fprintf(warningsFp,
+ "Warning: cannot open VID=0x%04x PID=0x%04x: %s\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct, usb_strerror());
+ continue;
+ }
+ /*
+ * now check whether the names match:
+ */
+ len = vendor[0] = 0;
+ if (dev->descriptor.iManufacturer > 0) {
+ len =
+ usbGetStringAscii(handle, dev->descriptor.iManufacturer,
+ vendor, sizeof(vendor));
+ }
+ if (len < 0) {
+ errorCode = USBOPEN_ERR_ACCESS;
+ if (warningsFp != NULL)
+ fprintf(warningsFp,
+ "Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct, usb_strerror());
+ } else {
+ errorCode = USBOPEN_ERR_NOTFOUND;
+ /*
+ * printf("seen device from vendor ->%s<-\n", vendor);
+ */
+ if (shellStyleMatch(vendor, vendorNamePattern)) {
+ len = product[0] = 0;
+ if (dev->descriptor.iProduct > 0) {
+ len =
+ usbGetStringAscii(handle,
+ dev->descriptor.iProduct,
+ product, sizeof(product));
+ }
+ if (len < 0) {
+ errorCode = USBOPEN_ERR_ACCESS;
+ if (warningsFp != NULL)
+ fprintf(warningsFp,
+ "Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct,
+ usb_strerror());
+ } else {
+ errorCode = USBOPEN_ERR_NOTFOUND;
+ /*
+ * printf("seen product ->%s<-\n", product);
+ */
+ if (shellStyleMatch(product, productNamePattern)) {
+ len = serial[0] = 0;
+ if (dev->descriptor.iSerialNumber > 0) {
+ len =
+ usbGetStringAscii(handle,
+ dev->descriptor.
+ iSerialNumber, serial,
+ sizeof(serial));
+ }
+ if (len < 0) {
+ errorCode = USBOPEN_ERR_ACCESS;
+ if (warningsFp != NULL)
+ fprintf(warningsFp,
+ "Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct,
+ usb_strerror());
+ }
+ if (shellStyleMatch(serial, serialNamePattern)) {
+ if (printMatchingDevicesFp != NULL) {
+ if (serial[0] == 0) {
+ fprintf(printMatchingDevicesFp,
+ "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\"\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct,
+ vendor, product);
+ } else {
+ fprintf(printMatchingDevicesFp,
+ "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\" serial=\"%s\"\n",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct,
+ vendor, product, serial);
+ }
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ usb_close(handle);
+ handle = NULL;
+ }
+ }
+ if (handle) /* we have found a deice */
+ break;
+ }
+ if (handle != NULL) {
+ errorCode = 0;
+ *device = handle;
+ }
+ if (printMatchingDevicesFp != NULL) /* never return an error for listing
+ * only */
+ errorCode = 0;
+ return errorCode;
+}
+
+/*
+ * -------------------------------------------------------------------------
+ */
diff -Naur ucon64-2.0.0-src/src/misc/opendevice.h ucon64/src/misc/opendevice.h
--- ucon64-2.0.0-src/src/misc/opendevice.h 1970-01-01 00:00:00.000000000 +0000
+++ ucon64/src/misc/opendevice.h 2009-08-28 10:00:36.000000000 +0000
@@ -0,0 +1,77 @@
+/* Name: opendevice.h
+ * Project: V-USB host-side library
+ * Author: Christian Starkjohann
+ * Creation Date: 2008-04-10
+ * Tabsize: 4
+ * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
+ * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
+ * This Revision: $Id: opendevice.h 740 2009-04-13 18:23:31Z cs $
+ */
+
+/*
+General Description:
+This module offers additional functionality for host side drivers based on
+libusb or libusb-win32. It includes a function to find and open a device
+based on numeric IDs and textual description. It also includes a function to
+obtain textual descriptions from a device.
+
+To use this functionality, simply copy opendevice.c and opendevice.h into your
+project and add them to your Makefile. You may modify and redistribute these
+files according to the GNU General Public License (GPL) version 2 or 3.
+*/
+
+#ifndef __OPENDEVICE_H_INCLUDED__
+#define __OPENDEVICE_H_INCLUDED__
+
+#include <usb.h> /* this is libusb, see http://libusb.sourceforge.net/ */
+#include <stdio.h>
+
+int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen);
+/* This function gets a string descriptor from the device. 'index' is the
+ * string descriptor index. The string is returned in ISO Latin 1 encoding in
+ * 'buf' and it is terminated with a 0-character. The buffer size must be
+ * passed in 'buflen' to prevent buffer overflows. A libusb device handle
+ * must be given in 'dev'.
+ * Returns: The length of the string (excluding the terminating 0) or
+ * a negative number in case of an error. If there was an error, use
+ * usb_strerror() to obtain the error message.
+ */
+
+int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp);
+/* This function iterates over all devices on all USB busses and searches for
+ * a device. Matching is done first by means of Vendor- and Product-ID (passed
+ * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard).
+ * When a device matches by its IDs, matching by names is performed. Name
+ * matching can be done on textual vendor name ('vendorNamePattern'), product
+ * name ('productNamePattern') and serial number ('serialNamePattern'). A
+ * device matches only if all non-null pattern match. If you don't care about
+ * a string, pass NULL for the pattern. Patterns are Unix shell style pattern:
+ * '*' stands for 0 or more characters, '?' for one single character, a list
+ * of characters in square brackets for a single character from the list
+ * (dashes are allowed to specify a range) and if the lis of characters begins
+ * with a caret ('^'), it matches one character which is NOT in the list.
+ * Other parameters to the function: If 'warningsFp' is not NULL, warning
+ * messages are printed to this file descriptor with fprintf(). If
+ * 'printMatchingDevicesFp' is not NULL, no device is opened but matching
+ * devices are printed to the given file descriptor with fprintf().
+ * If a device is opened, the resulting USB handle is stored in '*device'. A
+ * pointer to a "usb_dev_handle *" type variable must be passed here.
+ * Returns: 0 on success, an error code (see defines below) on failure.
+ */
+
+/* usbOpenDevice() error codes: */
+#define USBOPEN_SUCCESS 0 /* no error */
+#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */
+#define USBOPEN_ERR_IO 2 /* I/O error */
+#define USBOPEN_ERR_NOTFOUND 3 /* device not found */
+
+
+/* Obdev's free USB IDs, see USBID-License.txt for details */
+
+#define USB_VID_OBDEV_SHARED 5824 /* obdev's shared vendor ID */
+#define USB_PID_OBDEV_SHARED_CUSTOM 1500 /* shared PID for custom class devices */
+#define USB_PID_OBDEV_SHARED_HID 1503 /* shared PID for HIDs except mice & keyboards */
+#define USB_PID_OBDEV_SHARED_CDCACM 1505 /* shared PID for CDC Modem devices */
+#define USB_PID_OBDEV_SHARED_MIDI 1508 /* shared PID for MIDI class devices */
+
+#endif /* __OPENDEVICE_H_INCLUDED__ */
diff -Naur ucon64-2.0.0-src/src/ucon64.c ucon64/src/ucon64.c
--- ucon64-2.0.0-src/src/ucon64.c 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/ucon64.c 2009-08-28 10:00:36.000000000 +0000
@@ -171,6 +171,9 @@
sflash_usage,
// mgd_usage,
#endif
+#ifdef USE_USB
+ quickdev16_usage,
+#endif
lf,
neogeo_usage,
lf,
diff -Naur ucon64-2.0.0-src/src/ucon64_defines.h ucon64/src/ucon64_defines.h
--- ucon64-2.0.0-src/src/ucon64_defines.h 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/ucon64_defines.h 2009-08-28 10:00:36.000000000 +0000
@@ -326,6 +326,7 @@
UCON64_XSMCR,
UCON64_XSMD,
UCON64_XSMDS,
+ UCON64_XSNESRAM,
UCON64_XSWC,
UCON64_XSWC2,
UCON64_XSWC_IO,
diff -Naur ucon64-2.0.0-src/src/ucon64_opts.c ucon64/src/ucon64_opts.c
--- ucon64-2.0.0-src/src/ucon64_opts.c 2009-09-16 09:43:42.000000000 +0000
+++ ucon64/src/ucon64_opts.c 2009-08-28 10:00:36.000000000 +0000
@@ -310,6 +310,7 @@
case UCON64_XSMCR:
case UCON64_XSMD:
case UCON64_XSMDS:
+ case UCON64_XSNESRAM:
case UCON64_XSWC:
case UCON64_XSWC2:
case UCON64_XSWCR:
@@ -558,7 +559,7 @@
break;
case UCON64_Q:
- case UCON64_QQ: // for now -qq is equivalent to -q
+ case UCON64_QQ: //UCON64_XSMC for now -qq is equivalent to -q
ucon64.quiet = 1;
break;
@@ -2050,6 +2051,7 @@
smc_write_rts (ucon64.rom, ucon64.parport);
fputc ('\n', stdout);
break;
+
case UCON64_XSMD:
if (access (ucon64.rom, F_OK) != 0) // file does not exist -> dump cartridge
@@ -2077,6 +2079,15 @@
fputc ('\n', stdout);
break;
+ case UCON64_XSNESRAM:
+ if (!ucon64.rominfo->buheader_len)
+ fputs ("ERROR: This ROM has no header. Convert to an SMC compatible format with -ffe\n",
+ stderr);
+ else
+ quickdev16_write_rom (ucon64.rom);
+ fputc ('\n', stdout);
+ break;
+
case UCON64_XSWC:
enableRTS = 0; // falling through
case UCON64_XSWC2:

32
scripts/check_rle.py Normal file
View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
import binascii
import os
import sys
import time
import glob
import zlib
TARGET="/home/david/Dropbox/Tech/Quickdev16/roms/08"
count = 0
total_zip_len = 0
total_comp_len = 0
g = glob.glob(os.path.join(TARGET,"*"))
for name in g:
count +=1
data = open(name,'r').read()
data_len = len(data)
comp = binascii.rlecode_hqx(data)
comp_len = len(comp)
comp_pre = comp_len / ( data_len / 100 )
total_comp_len += comp_pre
zip_data = zlib.compress(data)
zip_len = len(zip_data)
zip_pre = zip_len / ( data_len / 100 )
total_zip_len += zip_pre
print "%30s %04i %04i %2.2f %04i %2.2f" % (os.path.basename(name)[:30],data_len / 1024 ,comp_len / 1024,comp_pre, zip_len / 1024, zip_pre )
print "%2.2f %2.2f" % ( total_zip_len / count , total_comp_len / count )

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +0,0 @@
This file will contain the digital signature of the files to be installed
on the system.
This file will be provided by Microsoft upon certification of your drivers.

View File

@ -1,136 +0,0 @@
[Version]
Signature = "$Chicago$"
provider = %manufacturer%
DriverVer = 07/07/2009,0.1.12.2
CatalogFile = quickdev16.cat
CatalogFile.NT = quickdev16.cat
CatalogFile.NTAMD64 = quickdev16_x64.cat
Class = LibUsbDevices
ClassGUID = {EB781AAF-9C70-4523-A5DF-642A87ECA567}
[ClassInstall]
AddReg=libusb_class_install_add_reg
[ClassInstall32]
AddReg=libusb_class_install_add_reg
[libusb_class_install_add_reg]
HKR,,,,"LibUSB-Win32 Devices"
HKR,,Icon,,"-20"
[Manufacturer]
%manufacturer%=Devices,NT,NTAMD64
;--------------------------------------------------------------------------
; Files
;--------------------------------------------------------------------------
[SourceDisksNames]
1 = "Libusb-Win32 Driver Installation Disk",,
[SourceDisksFiles]
libusb0.sys = 1,,
libusb0.dll = 1,,
libusb0_x64.sys = 1,,
libusb0_x64.dll = 1,,
[DestinationDirs]
libusb_files_sys = 10,system32\drivers
libusb_files_sys_x64 = 10,system32\drivers
libusb_files_dll = 10,system32
libusb_files_dll_wow64 = 10,syswow64
libusb_files_dll_x64 = 10,system32
[libusb_files_sys]
libusb0.sys
[libusb_files_sys_x64]
libusb0.sys,libusb0_x64.sys
[libusb_files_dll]
libusb0.dll
[libusb_files_dll_wow64]
libusb0.dll
[libusb_files_dll_x64]
libusb0.dll,libusb0_x64.dll
;--------------------------------------------------------------------------
; Device driver
;--------------------------------------------------------------------------
[LIBUSB_DEV]
CopyFiles = libusb_files_sys, libusb_files_dll
AddReg = libusb_add_reg
[LIBUSB_DEV.NT]
CopyFiles = libusb_files_sys, libusb_files_dll
[LIBUSB_DEV.NTAMD64]
CopyFiles = libusb_files_sys_x64, libusb_files_dll_wow64, libusb_files_dll_x64
[LIBUSB_DEV.HW]
DelReg = libusb_del_reg_hw
AddReg = libusb_add_reg_hw
[LIBUSB_DEV.NT.HW]
DelReg = libusb_del_reg_hw
AddReg = libusb_add_reg_hw
[LIBUSB_DEV.NTAMD64.HW]
DelReg = libusb_del_reg_hw
AddReg = libusb_add_reg_hw
[LIBUSB_DEV.NT.Services]
AddService = libusb0, 0x00000002, libusb_add_service
[LIBUSB_DEV.NTAMD64.Services]
AddService = libusb0, 0x00000002, libusb_add_service
[libusb_add_reg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,libusb0.sys
; Older versions of this .inf file installed filter drivers. They are not
; needed any more and must be removed
[libusb_del_reg_hw]
HKR,,LowerFilters
HKR,,UpperFilters
; Device properties
[libusb_add_reg_hw]
HKR,,SurpriseRemovalOK, 0x00010001, 1
;--------------------------------------------------------------------------
; Services
;--------------------------------------------------------------------------
[libusb_add_service]
DisplayName = "LibUsb-Win32 - Kernel Driver 07/07/2009, 0.1.12.2"
ServiceType = 1
StartType = 3
ErrorControl = 0
ServiceBinary = %12%\libusb0.sys
;--------------------------------------------------------------------------
; Devices
;--------------------------------------------------------------------------
[Devices]
"Quickdev16"=LIBUSB_DEV, USB\VID_16c0&PID_05dd
[Devices.NT]
"Quickdev16"=LIBUSB_DEV, USB\VID_16c0&PID_05dd
[Devices.NTAMD64]
"Quickdev16"=LIBUSB_DEV, USB\VID_16c0&PID_05dd
;--------------------------------------------------------------------------
; Strings
;--------------------------------------------------------------------------
[Strings]
manufacturer = "Optixx"

View File

@ -1,19 +0,0 @@
[properties]
title=quickdev16
author=
productcode=
packagecode=
upgradecode=
version=
comments=
supporturl=
eulafile=
language=en
bannerfile=
noquestions=false
[files]
file0path=C:\msys\1.0\home\david\ucon64\src\win32\quickdev16.inf
file1path=C:\msys\1.0\home\david\ucon64\src\win32\quickdev16.cat
file2path=C:\msys\1.0\home\david\ucon64\src\win32\quickdev16_x64.cat
file3path=C:\msys\1.0\home\david\ucon64\src\win32\ucon64.exe
file3shortcutname=Quickdev16

View File

@ -1,3 +0,0 @@
This file will contain the digital signature of the files to be installed
on the system.
This file will be provided by Microsoft upon certification of your drivers.

Binary file not shown.