[linux-minidisc] [PATCH] Port libnetmd from the old libusb-0.1 to the current libusb-1.0.
---
libnetmd/common.c | 33 ++++++++++++-----------
libnetmd/common.h | 4 +-
libnetmd/libnetmd.c | 23 +++++++++-------
libnetmd/libnetmd.h | 2 +-
libnetmd/libnetmd.pro | 2 +-
libnetmd/netmd_dev.c | 70 +++++++++++++++++++++++-------------------------
libnetmd/netmd_dev.h | 4 +-
libnetmd/secure.c | 10 ++++---
8 files changed, 76 insertions(+), 72 deletions(-)
diff --git a/libnetmd/common.c b/libnetmd/common.c
index a244889..1f7b660 100644
--- a/libnetmd/common.c
+++ b/libnetmd/common.c
@@ -23,6 +23,7 @@
*/
#include <string.h>
+#include <unistd.h>
#include "common.h"
#include "const.h"
@@ -41,7 +42,7 @@
@param tries maximum attempts to poll the minidisc
@return if error <0, else number of bytes that md wants to send
*/
-static int netmd_poll(usb_dev_handle *dev, char *buf, int tries)
+static int netmd_poll(libusb_device_handle *dev, unsigned char *buf, int tries)
{
int i;
@@ -49,10 +50,10 @@ static int netmd_poll(usb_dev_handle *dev, char *buf, int tries)
/* send a poll message */
memset(buf, 0, 4);
- if (usb_control_msg(dev, USB_ENDPOINT_IN | USB_TYPE_VENDOR |
- USB_RECIP_INTERFACE, 0x01, 0, 0, buf, 4,
+ if (libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR |
+ LIBUSB_RECIPIENT_INTERFACE, 0x01, 0, 0, buf, 4,
NETMD_POLL_TIMEOUT) < 0) {
- netmd_log(NETMD_LOG_ERROR, "netmd_poll: usb_control_msg failed\n");
+ netmd_log(NETMD_LOG_ERROR, "netmd_poll: libusb_control_transfer failed\n");
return NETMDERR_USB;
}
@@ -80,11 +81,11 @@ int netmd_exch_message(netmd_dev_handle *devh, unsigned char *cmd,
int netmd_send_message(netmd_dev_handle *devh, unsigned char *cmd,
const size_t cmdlen)
{
- char pollbuf[4];
+ unsigned char pollbuf[4];
int len;
- usb_dev_handle *dev;
+ libusb_device_handle *dev;
- dev = (usb_dev_handle *)devh;
+ dev = (libusb_device_handle *)devh;
/* poll to see if we can send data */
len = netmd_poll(dev, pollbuf, 1);
@@ -96,10 +97,10 @@ int netmd_send_message(netmd_dev_handle *devh, unsigned char *cmd,
/* send data */
netmd_log(NETMD_LOG_DEBUG, "Command:\n");
netmd_log_hex(NETMD_LOG_DEBUG, cmd, cmdlen);
- if (usb_control_msg(dev, USB_ENDPOINT_OUT | USB_TYPE_VENDOR |
- USB_RECIP_INTERFACE, 0x80, 0, 0, (char*)cmd, (int)cmdlen,
+ if (libusb_control_transfer(dev, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR |
+ LIBUSB_RECIPIENT_INTERFACE, 0x80, 0, 0, cmd, (int)cmdlen,
NETMD_SEND_TIMEOUT) < 0) {
- netmd_log(NETMD_LOG_ERROR, "netmd_exch_message: usb_control_msg failed\n");
+ netmd_log(NETMD_LOG_ERROR, "netmd_exch_message: libusb_control_transfer failed\n");
return NETMDERR_USB;
}
@@ -109,10 +110,10 @@ int netmd_send_message(netmd_dev_handle *devh, unsigned char *cmd,
int netmd_recv_message(netmd_dev_handle *devh, unsigned char* rsp)
{
int len;
- char pollbuf[4];
- usb_dev_handle *dev;
+ unsigned char pollbuf[4];
+ libusb_device_handle *dev;
- dev = (usb_dev_handle *)devh;
+ dev = (libusb_device_handle *)devh;
/* poll for data that minidisc wants to send */
len = netmd_poll(dev, pollbuf, NETMD_RECV_TRIES);
@@ -122,10 +123,10 @@ int netmd_recv_message(netmd_dev_handle *devh, unsigned char* rsp)
}
/* receive data */
- if (usb_control_msg(dev, USB_ENDPOINT_IN | USB_TYPE_VENDOR |
- USB_RECIP_INTERFACE, pollbuf[1], 0, 0, (char*)rsp, len,
+ if (libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR |
+ LIBUSB_RECIPIENT_INTERFACE, pollbuf[1], 0, 0, rsp, len,
NETMD_RECV_TIMEOUT) < 0) {
- netmd_log(NETMD_LOG_ERROR, "netmd_exch_message: usb_control_msg failed\n");
+ netmd_log(NETMD_LOG_ERROR, "netmd_exch_message: libusb_control_transfer failed\n");
return NETMDERR_USB;
}
diff --git a/libnetmd/common.h b/libnetmd/common.h
index f3a51bf..8dcff6b 100644
--- a/libnetmd/common.h
+++ b/libnetmd/common.h
@@ -1,13 +1,13 @@
#ifndef LIBNETMD_COMMON_H
#define LIBNETMD_COMMON_H
-#include <usb.h>
+#include <libusb-1.0/libusb.h>
/**
Typedef that nearly all netmd_* functions use to identify the USB connection
with the minidisc player.
*/
-typedef usb_dev_handle* netmd_dev_handle;
+typedef libusb_device_handle *netmd_dev_handle;
/**
Function to exchange command/response buffer with minidisc player.
diff --git a/libnetmd/libnetmd.c b/libnetmd/libnetmd.c
index 432c5a3..0291cbe 100644
--- a/libnetmd/libnetmd.c
+++ b/libnetmd/libnetmd.c
@@ -22,6 +22,8 @@
*
*/
+#include <unistd.h>
+
#include "libnetmd.h"
#include "utils.h"
@@ -58,12 +60,12 @@ struct netmd_pair const* find_pair(int hex, struct netmd_pair const* array)
return &unknown_pair;
}
-static void waitforsync(usb_dev_handle* dev)
+static void waitforsync(libusb_device_handle* dev)
{
- char syncmsg[4];
+ unsigned char syncmsg[4];
fprintf(stderr,"Waiting for Sync: \n");
do {
- usb_control_msg(dev, 0xc1, 0x01, 0, 0, syncmsg, 0x04, 5000);
+ libusb_control_transfer(dev, 0xc1, 0x01, 0, 0, syncmsg, 0x04, 5000);
} while (memcmp(syncmsg,"\0\0\0\0",4)!=0);
}
@@ -881,6 +883,7 @@ int netmd_write_disc_header(netmd_dev_handle* devh, minidisc* md)
int netmd_write_track(netmd_dev_handle* devh, char* szFile)
{
int ret = 0;
+ int transferred = 0;
int fd = open(szFile, O_RDONLY); /* File descriptor to omg file */
unsigned char *data = malloc(4096); /* Buffer for reading the omg file */
unsigned char *p = NULL; /* Pointer to index into data */
@@ -925,9 +928,9 @@ int netmd_write_track(netmd_dev_handle* devh, char* szFile)
size_t data_size_i; /* the size of the data part, later it will be used to point out the last byte in file */
unsigned int size;
unsigned char* buf=NULL; /* A buffer for recieving file info */
- usb_dev_handle *dev;
+ libusb_device_handle *dev;
- dev = (usb_dev_handle *)devh;
+ dev = (libusb_device_handle *)devh;
if(fd < 0)
return fd;
@@ -1034,7 +1037,7 @@ int netmd_write_track(netmd_dev_handle* devh, char* szFile)
netmd_log(NETMD_LOG_DEBUG, "Sending %d bytes to md\n", bytes_to_send);
netmd_log_hex(NETMD_LOG_DEBUG, data, bytes_to_send);
- ret = usb_bulk_write(dev,0x02, (char*)data, (int)bytes_to_send, 5000);
+ ret = libusb_bulk_transfer(dev, 0x02, data, (int)bytes_to_send, &transferred, 5000);
} /* End while */
if (ret<0) {
@@ -1046,7 +1049,7 @@ int netmd_write_track(netmd_dev_handle* devh, char* szFile)
/******** End transfer wait for unit ready ********/
fprintf(stderr,"Waiting for Done:\n");
do {
- usb_control_msg(dev, 0xc1, 0x01, 0, 0, (char*)size_request, 0x04, 5000);
+ libusb_control_transfer(dev, 0xc1, 0x01, 0, 0, size_request, 0x04, 5000);
} while (memcmp(size_request,"\0\0\0\0",4)==0);
netmd_log(NETMD_LOG_DEBUG, "Recieving response: \n");
@@ -1057,7 +1060,7 @@ int netmd_write_track(netmd_dev_handle* devh, char* szFile)
return -1;
}
buf = malloc(size);
- usb_control_msg(dev, 0xc1, 0x81, 0, 0, (char*)buf, (int)size, 500);
+ libusb_control_transfer(dev, 0xc1, 0x81, 0, 0, buf, (int)size, 500);
netmd_log_hex(NETMD_LOG_DEBUG, buf, size);
free(buf);
@@ -1071,11 +1074,11 @@ int netmd_write_track(netmd_dev_handle* devh, char* szFile)
/********* End TOC Edit **********/
- ret = usb_control_msg(dev, 0x41, 0x80, 0, 0, (char*)fintoc, 0x19, 800);
+ ret = libusb_control_transfer(dev, 0x41, 0x80, 0, 0, fintoc, 0x19, 800);
fprintf(stderr,"Waiting for Done: \n");
do {
- usb_control_msg(dev, 0xc1, 0x01, 0, 0, (char*)size_request, 0x04, 5000);
+ libusb_control_transfer(dev, 0xc1, 0x01, 0, 0, size_request, 0x04, 5000);
} while (memcmp(size_request,"\0\0\0\0",4)==0);
return ret;
diff --git a/libnetmd/libnetmd.h b/libnetmd/libnetmd.h
index cc33d78..bbd001c 100644
--- a/libnetmd/libnetmd.h
+++ b/libnetmd/libnetmd.h
@@ -32,7 +32,7 @@
#include <errno.h>
#include <stdint.h>
-#include <usb.h>
+#include <libusb-1.0/libusb.h>
#include "const.h"
#include "error.h"
diff --git a/libnetmd/libnetmd.pro b/libnetmd/libnetmd.pro
index ca93ac9..5c4f6ec 100644
--- a/libnetmd/libnetmd.pro
+++ b/libnetmd/libnetmd.pro
@@ -7,4 +7,4 @@ DEFINES += G_DISABLE_DEPRECATED=1
PKGCONFIG +=
HEADERS += common.h const.h error.h libnetmd.h log.h netmd_dev.h playercontrol.h secure.h trackinformation.h utils.h
SOURCES += common.c error.c libnetmd.c log.c netmd_dev.c playercontrol.c secure.c trackinformation.c utils.c
-LIBS += -lusb -lgcrypt
+LIBS += -lusb-1.0 -lgcrypt
diff --git a/libnetmd/netmd_dev.c b/libnetmd/netmd_dev.c
index 0c0e8b0..9e186b9 100644
--- a/libnetmd/netmd_dev.c
+++ b/libnetmd/netmd_dev.c
@@ -21,11 +21,14 @@
#include <string.h>
#include <errno.h>
#include <assert.h>
+#include <stdlib.h>
#include "netmd_dev.h"
#include "log.h"
#include "const.h"
+static libusb_context *ctx = NULL;
+
/*! list of known vendor/prod id's for NetMD devices */
static struct netmd_devices const known_devices[] =
{
@@ -76,33 +79,28 @@ static struct netmd_devices const known_devices[] =
netmd_error netmd_init(netmd_device **device_list)
{
- struct usb_bus *bus;
- struct usb_device *dev;
int count = 0;
+ ssize_t usb_device_count;
+ ssize_t i = 0;
netmd_device *new_device;
+ libusb_device **list;
+ struct libusb_device_descriptor desc;
- usb_init();
-
- usb_find_busses();
- usb_find_devices();
+ libusb_init(&ctx);
*device_list = NULL;
- for(bus = usb_get_busses(); bus; bus = bus->next)
- {
- for(dev = bus->devices; dev; dev = dev->next)
- {
- for(count = 0; (known_devices[count].idVendor != 0); count++)
- {
- if(dev->descriptor.idVendor == known_devices[count].idVendor
- && dev->descriptor.idProduct == known_devices[count].idProduct)
- {
- new_device = malloc(sizeof(netmd_device));
- new_device->usb_dev = dev;
- new_device->link = *device_list;
- *device_list = new_device;
- }
- }
- }
+
+ usb_device_count = libusb_get_device_list(NULL, &list);
+
+ for (i = 0; i < usb_device_count; i++) {
+ libusb_get_device_descriptor(list[i], &desc);
+ if(desc.idVendor == known_devices[count].idVendor &&
+ desc.idProduct == known_devices[count].idProduct) {
+ new_device = malloc(sizeof(netmd_device));
+ new_device->usb_dev = list[i];
+ new_device->link = *device_list;
+ *device_list = new_device;
+ }
}
return NETMD_NO_ERROR;
@@ -112,10 +110,10 @@ netmd_error netmd_init(netmd_device **device_list)
netmd_error netmd_open(netmd_device *dev, netmd_dev_handle **dev_handle)
{
int result;
- usb_dev_handle *dh;
+ libusb_device_handle **dh = NULL;
- dh = usb_open(dev->usb_dev);
- result = usb_claim_interface(dh, 0);
+ libusb_open(dev->usb_dev, dh);
+ result = libusb_claim_interface(*dh, 0);
if (result == 0) {
*dev_handle = (netmd_dev_handle*)dh;
@@ -127,13 +125,13 @@ netmd_error netmd_open(netmd_device *dev, netmd_dev_handle **dev_handle)
}
}
-netmd_error netmd_get_devname(netmd_dev_handle* devh, char* buf, size_t buffsize)
+netmd_error netmd_get_devname(netmd_dev_handle* devh, unsigned char* buf, size_t buffsize)
{
int result;
- result = usb_get_string_simple((usb_dev_handle *)devh, 2, buf, buffsize);
+ result = libusb_get_string_descriptor_ascii((libusb_device_handle *)devh, 2, buf, buffsize);
if (result < 0) {
- netmd_log(NETMD_LOG_ERROR, "usb_get_string_simple failed, %s (%d)\n", strerror(errno), errno);
+ netmd_log(NETMD_LOG_ERROR, "libusb_get_string_descriptor_asci failed, %s (%d)\n", strerror(errno), errno);
buf[0] = 0;
return NETMD_USB_ERROR;
}
@@ -144,15 +142,13 @@ netmd_error netmd_get_devname(netmd_dev_handle* devh, char* buf, size_t buffsize
netmd_error netmd_close(netmd_dev_handle* devh)
{
int result;
- usb_dev_handle *dev;
-
- dev = (usb_dev_handle *)devh;
- result = usb_release_interface(dev, 0);
- if (result == 0) {
- result = usb_close(dev);
- }
+ libusb_device_handle *dev;
- if (result < 0) {
+ dev = (libusb_device_handle *)devh;
+ result = libusb_release_interface(dev, 0);
+ if (result == 0)
+ libusb_close(dev);
+ else{
return NETMD_USB_ERROR;
}
@@ -172,4 +168,6 @@ void netmd_clean(netmd_device **device_list)
}
*device_list = NULL;
+
+ libusb_exit(ctx);
}
diff --git a/libnetmd/netmd_dev.h b/libnetmd/netmd_dev.h
index fba35a3..ba6cea5 100644
--- a/libnetmd/netmd_dev.h
+++ b/libnetmd/netmd_dev.h
@@ -7,7 +7,7 @@
typedef struct netmd_device {
struct netmd_device *link;
char name[32];
- struct usb_device *usb_dev;
+ struct libusb_device *usb_dev;
} netmd_device;
/**
@@ -43,7 +43,7 @@ netmd_error netmd_open(netmd_device *dev, netmd_dev_handle **dev_handle);
@param buf Buffer to hold the name.
@param buffsize Available size in buf.
*/
-netmd_error netmd_get_devname(netmd_dev_handle* devh, char* buf, size_t buffsize);
+netmd_error netmd_get_devname(netmd_dev_handle* devh, unsigned char* buf, size_t buffsize);
/**
Closes the usb descriptors.
diff --git a/libnetmd/secure.c b/libnetmd/secure.c
index c58b1e8..f74e4cd 100644
--- a/libnetmd/secure.c
+++ b/libnetmd/secure.c
@@ -31,7 +31,7 @@
#include <string.h>
#include <stdio.h>
-#include <usb.h>
+#include <libusb-1.0/libusb.h>
#include <errno.h>
#include <gcrypt.h>
@@ -355,6 +355,7 @@ void netmd_transfer_song_packets(netmd_dev_handle *dev,
unsigned char *packet, *buf;
size_t packet_size;
int error;
+ int transferred = 0;
p = packets;
while (p != NULL) {
@@ -370,7 +371,7 @@ void netmd_transfer_song_packets(netmd_dev_handle *dev,
memcpy(buf + 16, p->data, p->length);
/* ... send it */
- error = usb_bulk_write((usb_dev_handle*)dev, 2, (char*)packet, (int)packet_size, 10000);
+ error = libusb_bulk_transfer((libusb_device_handle*)dev, 2, packet, (int)packet_size, &transferred, 10000);
netmd_log(NETMD_LOG_DEBUG, "%d %d\n", packet_size, error);
/* cleanup */
@@ -557,9 +558,10 @@ netmd_error netmd_secure_send_track(netmd_dev_handle *dev,
netmd_error netmd_secure_real_recv_track(netmd_dev_handle *dev, uint32_t length, FILE *file, size_t chunksize)
{
uint32_t done = 0;
- char *data;
+ unsigned char *data;
int32_t read;
netmd_error error = NETMD_NO_ERROR;
+ int transferred = 0;
data = malloc(chunksize);
while (done < length) {
@@ -567,7 +569,7 @@ netmd_error netmd_secure_real_recv_track(netmd_dev_handle *dev, uint32_t length,
chunksize = length - done;
}
- read = usb_bulk_read((usb_dev_handle*)dev, 0x81, data, (int)chunksize, 10000);
+ read = libusb_bulk_transfer((libusb_device_handle*)dev, 0x81, data, (int)chunksize, &transferred, 10000);
if (read >= 0) {
done += (uint32_t)read;
--
1.7.5.4