usb-storage: Add support for Rio Karma
Subsystems (2)
PATCH 1/1 usb-storage: Add support for Rio Karma
Add support for the Rio Karma portable digital audio player to usb-storage.
---
This is the first in a pair of patches to add the Rio Karma as a mass storage device. This patch exposes the player as a block device when connected to USB, and the next patch, "Read Rio Karma boot sector," also properly exposes the partitions. This is useful as-is to users for purposes of back-up/restore or blanking the disk on the unit, e.g. with dd.
A filesystem driver for the Optimized MPEG File System, used by both Rio Karma and ReplayTV, is in an embryonic stage at http://bobcopeland.com/karma/.
drivers/usb/storage/rio_karma.c | 104 +++++++++++++++++++++++++++++++++++++++ drivers/usb/storage/rio_karma.h | 9 +++ 2 files changed, 113 insertions(+), 0 deletions(-) create mode 100644 drivers/usb/storage/rio_karma.c create mode 100644 drivers/usb/storage/rio_karma.h
applies-to: 3c36672829527bef6951ca2f1eae7da4285fee31 ece6a8eb17d1b6464349ab2b025fdb8bc76e00da
drivers/usb/storage/rio_karma.c new file +104 -0
@@ -0,0 +1,104 @@ +/* USB driver for DNNA Rio Karma +* +* (C) 2005 Bob Copeland ([email protected]) +* +* The Karma is a mass storage device, although it requires some +* initialization code to get in that mode. +* +* 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, 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. +* +*/ + +#include <linux/delay.h> +#include <linux/string.h> +#include <linux/jiffies.h> +#include "rio_karma.h" +#include "usb.h" +#include "transport.h" +#include "debug.h" + +#define RIO_MSC 0x08 +#define RIOP_INIT "RIOP\x00\x01\x08\x00" +#define CMD_LEN 40 +#define RECV_LEN 0x200 + +/* Initialize the Karma and get it into mass storage mode. +* +* The initialization begins by sending 40 bytes starting +* RIOP\x00\x01\x08\x00, which the device will ack with a 512-byte +* packet with the high four bits set and everything else null. +* +* Next, we send RIOP\x80\x00\x08\x00. Each time, a 512 byte response +* must be read, but we must loop until byte 5 in the response is 0x08, +* indicating success. +*/ +int rio_karma_init (struct us_data *us) +{ +int result, partial; +char *recv; +static char init_cmd[] =RIOP_INIT ; +unsigned long timeout; + +// us->iobuf is big enough to hold cmd but not receive +if (!(recv =kmalloc (RECV_LEN ,GFP_KERNEL | __GFP_DMA))) + goto die_nomem; + +US_DEBUGP ("Initializing Karma...\n" ); + +memcpy (us->iobuf, init_cmd,sizeof (init_cmd)); +memset (&us->iobuf[sizeof (init_cmd)],0 ,CMD_LEN -sizeof (init_cmd)); + + result =usb_stor_bulk_transfer_buf (us, us->send_bulk_pipe, + us->iobuf,CMD_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + result =usb_stor_bulk_transfer_buf (us, us->recv_bulk_pipe, + recv,RECV_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + us->iobuf[4 ] =0x80 ; + us->iobuf[5 ] =0 ; + timeout = jiffies +msecs_to_jiffies (3000 ); +for (;;) { +US_DEBUGP ("Sending init command\n" ); + result =usb_stor_bulk_transfer_buf (us, us->send_bulk_pipe, + us->iobuf,CMD_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + result =usb_stor_bulk_transfer_buf (us, us->recv_bulk_pipe, + recv,RECV_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + +if (recv[5 ] ==RIO_MSC ) +break ; +if (time_after (jiffies, timeout)) + goto die; +msleep (10 ); + } +US_DEBUGP ("Karma initialized.\n" ); +kfree (recv); +return 0 ; + +die: +kfree (recv); +die_nomem: +US_DEBUGP ("Could not initialize karma.\n" ); +return USB_STOR_TRANSPORT_FAILED ; +} +
drivers/usb/storage/rio_karma.h new file +9 -0
@@ -0,0 +1,9 @@ +#ifndef _RIO_KARMA_H +#define _RIO_KARMA_H + +#include <linux/config.h> +#include "usb.h" + +int rio_karma_init (struct us_data *); + +#endif
---
0.99.9i
Signature · 1 line
Bob Copeland %% www.bobcopeland.com
I'm guessing you're missing some significant portions of patch here... this code isn't compiled/linked, you don't add to the unusual_devs table, all you have here is an initializer function, etc etc.
The material on your web page supports this conclusion.
Matt
Quoted 152 lines · Bob Copeland
Add support for the Rio Karma portable digital audio player to usb-storage.
Signed-off-by Bob Copeland <[email protected]>---
This is the first in a pair of patches to add the Rio Karma as a mass storage device. This patch exposes the player as a block device when connected to USB, and the next patch, "Read Rio Karma boot sector," also properly exposes the partitions. This is useful as-is to users for purposes of back-up/restore or blanking the disk on the unit, e.g. with dd.
A filesystem driver for the Optimized MPEG File System, used by both Rio Karma and ReplayTV, is in an embryonic stage at http://bobcopeland.com/karma/.
drivers/usb/storage/rio_karma.c | 104 +++++++++++++++++++++++++++++++++++++++ drivers/usb/storage/rio_karma.h | 9 +++ 2 files changed, 113 insertions(+), 0 deletions(-) create mode 100644 drivers/usb/storage/rio_karma.c create mode 100644 drivers/usb/storage/rio_karma.happlies-to:
3c36672829527bef6951ca2f1eae7da4285fee31ece6a8eb17d1b6464349ab2b025fdb8bc76e00dadrivers/usb/storage/rio_karma.c new file +104
-0@@ -0,0 +1,104 @@ +/* USB driver for DNNA Rio Karma +* +* (C) 2005 Bob Copeland ([email protected]) +* +* The Karma is a mass storage device, although it requires some +* initialization code to get in that mode. +* +* 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, 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. +* +*/ + +#include <linux/delay.h> +#include <linux/string.h> +#include <linux/jiffies.h> +#include "rio_karma.h" +#include "usb.h" +#include "transport.h" +#include "debug.h" + +#define RIO_MSC 0x08 +#define RIOP_INIT "RIOP\x00\x01\x08\x00" +#define CMD_LEN 40 +#define RECV_LEN 0x200 + +/* Initialize the Karma and get it into mass storage mode. +* +* The initialization begins by sending 40 bytes starting +* RIOP\x00\x01\x08\x00, which the device will ack with a 512-byte +* packet with the high four bits set and everything else null. +* +* Next, we send RIOP\x80\x00\x08\x00. Each time, a 512 byte response +* must be read, but we must loop until byte 5 in the response is 0x08, +* indicating success. +*/ +int rio_karma_init (struct us_data *us) +{ +int result, partial; +char *recv; +static char init_cmd[] =RIOP_INIT ; +unsigned long timeout; + +// us->iobuf is big enough to hold cmd but not receive +if (!(recv =kmalloc (RECV_LEN ,GFP_KERNEL | __GFP_DMA))) + goto die_nomem; + +US_DEBUGP ("Initializing Karma...\n" ); + +memcpy (us->iobuf, init_cmd,sizeof (init_cmd)); +memset (&us->iobuf[sizeof (init_cmd)],0 ,CMD_LEN -sizeof (init_cmd)); + + result =usb_stor_bulk_transfer_buf (us, us->send_bulk_pipe, + us->iobuf,CMD_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + result =usb_stor_bulk_transfer_buf (us, us->recv_bulk_pipe, + recv,RECV_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + us->iobuf[4 ] =0x80 ; + us->iobuf[5 ] =0 ; + timeout = jiffies +msecs_to_jiffies (3000 ); +for (;;) { +US_DEBUGP ("Sending init command\n" ); + result =usb_stor_bulk_transfer_buf (us, us->send_bulk_pipe, + us->iobuf,CMD_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + + result =usb_stor_bulk_transfer_buf (us, us->recv_bulk_pipe, + recv,RECV_LEN , &partial); +if (result !=USB_STOR_XFER_GOOD ) + goto die; + +if (recv[5 ] ==RIO_MSC ) +break ; +if (time_after (jiffies, timeout)) + goto die; +msleep (10 ); + } +US_DEBUGP ("Karma initialized.\n" ); +kfree (recv); +return 0 ; + +die: +kfree (recv); +die_nomem: +US_DEBUGP ("Could not initialize karma.\n" ); +return USB_STOR_TRANSPORT_FAILED ; +} +drivers/usb/storage/rio_karma.h new file +9
-1@@ -0,0 +1,9 @@ +#ifndef _RIO_KARMA_H +#define _RIO_KARMA_H + +#include <linux/config.h> +#include "usb.h" + +int rio_karma_init (struct us_data *); + +#endif ---0.99.9i
Signature · 1 line
Bob Copeland %% www.bobcopeland.com
Signature · 8 lines
Matthew Dharm Home: [email protected] Maintainer, Linux USB Mass Storage Driver G: Money isn't everything, A.J. AJ: Who convinced you of that? G: The Chief, at my last salary review. -- Mike and Greg User Friendly, 11/3/1998
Quoted 5 lines · Matthew Dharm
I'm guessing you're missing some significant portions of patch here... this code isn't compiled/linked, you don't add to the
unusual_devstable, all you have here is an initializer function, etc etc.The material on your web page supports this conclusion.
Oh, sorry, I fumbled the git commands to generate that one. Here's the full patch:
Subject: [PATCH] usb-storage: Add support for Rio Karma
Add support for the Rio Karma portable digital audio player to usb-storage.
---
Kconfig | 7 +++ Makefile | 1 rio_karma.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rio_karma.h | 9 ++++ unusual_devs.h | 7 +++ usb.c | 3 + 6 files changed, 131 insertions(+)
drivers/usb/storage/Kconfig +7 -0
@@ -124,3 +124,10 @@ config USB_STORAGE_ONETOUCH hard drive's as an input device. An action can be associated with this input in any keybinding software. (e.g. gnome's keyboard short- cuts) + +config USB_STORAGE_KARMA + bool "Rio Karma MP3 player (EXPERIMENTAL)" + depends on USB_STORAGE && EXPERIMENTAL + help + Say Y here to include additional code to support the Rio Karma + digital music player as a mass storage device.
drivers/usb/storage/Makefile +1 -0
@@ -19,6 +19,7 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_ISD usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB) += datafab.o usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o +usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) += rio_karma.o usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ initializers.o $(usb-storage-obj-y)
drivers/usb/storage/rio_karma.c new file +104 -0
104 lines not on this page · raw message
drivers/usb/storage/rio_karma.h new file +9 -0
@@ -0,0 +1,9 @@ +#ifndef _RIO_KARMA_H +#define _RIO_KARMA_H + +#include <linux/config.h> +#include "usb.h" + +int rio_karma_init (struct us_data *); + +#endif
drivers/usb/storage/unusual_devs.h +7 -0
@@ -145,6 +145,13 @@ UNUSUAL_DEV( 0x0451, 0x5416, 0x0100, 0x US_SC_DEVICE, US_PR_BULK, NULL, US_FL_NEED_OVERRIDE ), +#ifdef CONFIG_USB_STORAGE_KARMA +UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101, + "Rio", + "Rio Karma", + US_SC_SCSI, US_PR_BULK, rio_karma_init, US_FL_FIX_INQUIRY), +#endif + /* Patch submitted by Philipp Friedrich <[email protected]> */ UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100, "Kyocera",
drivers/usb/storage/usb.c +3 -0
@@ -94,6 +94,9 @@#ifdef CONFIG_USB_STORAGE_ONETOUCH #include "onetouch.h" #endif +#ifdef CONFIG_USB_STORAGE_KARMA +#include "rio_karma.h" +#endif /* Some informational data */ MODULE_AUTHOR ("Matthew Dharm <[email protected]>" );
Alan Stern
maintainerdrivers/usb/storage/unusual_devs.h UNUSUAL_DEV( 0x0451, 0x5416, 0x0100, 0x · line 152
Quoted 11 lines · Bob Copeland
drivers/usb/storage/unusual_devs.h +5
-0@@ -145,6 +145,13 @@ UNUSUAL_DEV( 0x0451, 0x5416, 0x0100, 0x US_SC_DEVICE, US_PR_BULK, NULL, US_FL_NEED_OVERRIDE ), +#ifdef CONFIG_USB_STORAGE_KARMA +UNUSUAL_DEV (0x045a ,0x5210 ,0x0101 ,0x0101 , +"Rio" , +"Rio Karma" , + US_SC_SCSI, US_PR_BULK, rio_karma_init, US_FL_FIX_INQUIRY),
Are you sure you need US_SC_SCSI and US_PR_BULK? Wouldn't US_SC_DEVICE and US_PR_DEVICE be sufficient?
And do you really need US_FL_FIX_INQUIRY? Hardly any devices do (maybe none).
Alan Stern
Quoted 2 lines · Alan Stern
And do you really need
US_FL_FIX_INQUIRY? Hardly any devices do (maybe none).
This one does:
/* aeb */
UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
"Feiya",
"5-in-1 Card Reader",
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY ),Andries
Quoted 7 lines · Andries Brouwer
Quoted 2 lines · Alan Stern
And do you really need
US_FL_FIX_INQUIRY? Hardly any devices do (maybe none).
Quoted 8 lines
This one does:
/* aeb */
UNUSUAL_DEV(0x090c,0x1132,0x0000,0xffff,"Feiya", "5-in-1 Card Reader", US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY ),
Can you be more specific? Matthew added some code (specifically a delay) which should have taken care of most if not all of these a few kernel versions ago (.12-ish?)...
Are you saying this device still doesn't work for you using the above entry in a recent kernel?
Signature · 7 lines
Phil Dibowitz [email protected] Freeware and Technical Pages Insanity Palace of Metallica http://www.phildev.net/ http://www.ipom.com/ "Be who you are and say what you feel, because those who mind don't matter and those who matter don't mind." - Dr. Suess
Quoted 9 lines · Phil Dibowitz
Quoted 5 lines
UNUSUAL_DEV(
0x090c,0x1132,0x0000,0xffff,"Feiya", "5-in-1 Card Reader", US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY ),Can you be more specific? Matthew added some code (specifically a delay) which should have taken care of most if not all of these a few kernel versions ago (.12-ish?)...
I don't understand how adding a delay can influence the fact that it returns the wrong capacity.
Alan Stern
maintainerdrivers/usb/storage/rio_karma.c line 55
Quoted 3 lines · Bob Copeland
Add support for the Rio Karma portable digital audio player to usb-storage.
drivers/usb/storage/rio_karma.c new file +1
-0+if (!(recv =kmalloc (RECV_LEN ,GFP_KERNEL | __GFP_DMA)))
You don't want to use __GFP_DMA here.
Alan Stern