Am Dienstag, 15. April 2008 schrieb Takashi Iwai:
At Mon, 14 Apr 2008 21:29:54 +0200, Karsten Wiese wrote:
Hi,
there are 2 fixes since v0.3 here:
- compiles & works for x86 32bit again.
- hardware configuration is done via ioctl() instead of write(). Fixing a bug that led to jackd not starting again after a stop.
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 6676a17..3c55dea 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c (snip) +static void snd_usbmidi_us122l_output(struct snd_usb_midi_out_endpoint *ep) (snip)
- while (count < 9)
((char *)ep->urb->transfer_buffer)[count++] = 0xFD;
Use memset().
will do.
diff --git a/sound/usb/usx2y/Makefile b/sound/usb/usx2y/Makefile index 9ac22bc..7489330 100644 --- a/sound/usb/usx2y/Makefile +++ b/sound/usb/usx2y/Makefile @@ -1,3 +1,5 @@ snd-usb-usx2y-objs := usbusx2y.o usX2Yhwdep.o usx2yhwdeppcm.o +snd-usb-us122l-objs := us122l.o
obj-$(CONFIG_SND_USB_USX2Y) += snd-usb-usx2y.o +obj-$(CONFIG_SND_USB_US122L) += snd-usb-us122l.o
Missing dependency to snd-usb-audio? Maybe we need to split a helper module...
don't understand. please explain.
+static void pt_version(struct usb_device *dev) +{
- int ret;
- u8 *buf = kmalloc(200, GFP_KERNEL);
- if (!buf)
return;
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
'V',
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0, 0, buf, 200, 1000);
- if (ret < 0) {
P_DBG("%i", ret);
goto out;
- }
- P_VDBG("%u %u %u", buf[0], buf[1], buf[2]);
- buf[ret] = 0;
- P_VDBG(".%s.", buf + 3);
+out:
- kfree(buf);
+}
This function is only for debugging, no?
At least 1 of these is needed to make the thing work. Will check.
+static int pt_info(struct usb_device *dev) +{
- int ret;
- u8 *buf = kmalloc(200, GFP_KERNEL);
- if (!buf)
return -ENOMEM;
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
'I',
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0, 0, buf, 200, 1000);
- if (ret < 0) {
P_DBG("%i", ret);
goto out;
- }
- P_VDBG("0x%X", buf[0]);
- ret = buf[0];
+out:
- kfree(buf);
- return ret;
+}
Ditto.
+static void pt_info_set(struct usb_device *dev, u8 v) +{
- int ret;
- ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
'I',
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
v, 0, NULL, 0, 1000);
- P_VDBG("%i", ret);
+}
Ditto.
--- /dev/null +++ b/sound/usb/usx2y/usb_stream.h (snip)
+#define INTERFACE_VERSION 1 +#define KERNEL_64 0x80000000
Should be more unique name as this seems imported by user-space apps...
Ok.
+#define USB_STREAM_INTERFACE_VERSION \
- ((BITS_PER_LONG == 64 ? KERNEL_64 : 0) | INTERFACE_VERSION)
+#define SNDRV_USB_STREAM_IOCTL_SET_PARAMS \
- _IOW('H', 0x90, struct usb_stream_config)
+#if !__KERNEL__
Usually #ifndef __KERNEL__
will change.
+struct usb_iso_packet_descriptor {
- unsigned int offset;
- unsigned int length; /* expected length */
- unsigned int actual_length;
- int status;
+};
Why this is needed for !__KERNEL__ ? I see only struct usb_stream_config is required.
see the plugin. Userspace directly reads urbs.
+#endif
+#define USB_STREAM_NURBS 4 +struct usb_stream_config {
- unsigned version;
- unsigned sample_rate;
- unsigned period_frames;
- unsigned frame_size;
+};
The codes below here should be hidden to user-space. If it's exported, then prepare more explicit struct. For example, pointers may have different sizes on user-space.
Needed in user-space. Currently only 64Bit userspace works on 64Bit kernel. Also 32bit user-space on 32bit kernel. 32bit user-space on 64bit kernel returns an error to the caller, please see the plugin. IMO 32bit user-space working on 64bit kernel can wait for "INTERFACE_VERSION 2"
+#define P_WARN(fmt, ...) \
- printk(KERN_WARNING"%s %s:%i "fmt"\n", \
MODNAME, __func__, __LINE__, ## __VA_ARGS__);
+#define P_DBG(fmt, ...) \
- printk(KERN_DEBUG"%s %s:%i "fmt"\n", \
MODNAME, __func__, __LINE__, ## __VA_ARGS__);
+#define P_VDBG(fmt, ...)
Try to avoid own-printk macros as much as possible...
will fix.
thanks, Karsten