Problemi con la webcam RICOH r5u87???

martedì 11 maggio 2010 a 14:23
Girando qualche forum si può notare che molti utenti presentano alla comunità i propri problemi a far funzionare decentemente la propria webcam, precisamente il modello RICOH r5u87x (dove al posto dell'ultima x potrebbe esserci una lettera da a ad i) di cui sono dotati alcuni Vaio più altri portatili di differenti marche che però montano lo stesso modello. Ebbene, grazie alla pazienza e alla tenacia (doti spesso fondamentali se parliamo di GNU/Linux) di un nostro lettore e mio carissimo amico Gino alias prof87, eccoci venire a capo anche di questo annoso problema. Tramite una finestra di terminale, posizionatevi in una cartella in cui volete lavorare, magari nella home diamo un bel mkdir webcam e poi cd webcam. Quindi diamo i seguenti comandi:
sudo apt-get install libglib2.0-dev libusb-dev build-essential gcc automake mercurial
hg clone http://bitbucket.org/ahixon/r5u87x/
cd r5u87x
make
sudo make install
A questo punto per associare il
firmware dare come comando:
sudo r5u87x-loader --reload
Nel caso in cui sembra che la vostra
webcam sia già attiva potete provare a forzare il tutto con
sudo r5u87x-loader --force-clear
A questo punto ecco il suggerimento del Prof che vi incollo pari pari! (non ho questo modello di webcam quindi non ho potuto provare il tutto... mi affido a lui che risponderà nei commenti ad ogni vostro problema ;) )
Poi adesso bisognerà andare sul sito http://linuxtv.org/hg/v4l-dvb/ oppure http://linuxtv.org/hg/~pinchartl/uvcvideo/ e scaricare il tar.gz compilandolo.
Installare la libreria ncurses-dev, poi successivamente portarsi nel file e dare:
sudo make menuconfig
In pratica dando da terminale il comando sudo make menuconfig dovete navigare nel pannello di configurazione che appare seguendo questo percorso:
Multimedia support --->DVB/ATSC adapters --->FireDTV and FloppyDTV
quando avete selezionato la voce FireDTV and FloppyDTV la disattivate col tasto N quindi premete sempre Esc e prima di uscire dalla configurazione confermate salvando la modifica.
Successivamente dare
sudo make
sudo make install
sudo make unload
sudo modprobe uvcvideo
Ora nel caso la web cam si visualizza correttamente allora OK. In caso contario, ovvero la webcam continua a essere al contrario, bisogna incollare
dentro la directory precedentemente creata il seguente pezzo di codice nel file con percorso v4l-dvb-83712d149893/linux/drivers/media/video/uvc/uvc_video.c

static void uvc_video_decode_data(struct uvc_streaming *stream,
struct uvc_buffer *buf, const __u8 *data, int len)
{
struct uvc_video_queue *queue = &stream->queue;
unsigned int maxlen, nbytes, row_size, to_be_copied, shift_right;
void *mem;

if (len <= 0) return; /* Copy the video data to the buffer. */ maxlen = buf->buf.length - buf->buf.bytesused;
mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused;
nbytes = min((unsigned int)len, maxlen);
row_size = stream->cur_frame->wWidth *
stream->format->bpp / 8;
/* Each loop "nbytes" is decremented of the number of bytes just copied.
* So are there any other bytes to be copied?
*/
while (nbytes > 0) {
/* As the rows of modified frames have to be fulfilled from
* bottom-left to top-right, each cycle tries to complete a
* single row.
* In this cycle where is it needed to start to store bytes
* within the selected row? From the beginning or shifted
* right? Because other bytes could have been already stored in
* that row without completing it, so it could be needed a right
* shift.
*/
shift_right = buf->buf.bytesused % row_size;
/* In this cycle how many byte can we copy in the selected row?
*/
if (nbytes > row_size - shift_right)
to_be_copied = row_size - shift_right ;
else
to_be_copied = nbytes;
/* "queue->mem + buf->buf.m.offset" is the base-address where to
* start to store the current frame. This address refers to a
* preallocated area (just for a sigle frame) taking part in a
* circular buffer, where to store a fixed number of sequent
* frames.
*/
memcpy(queue->mem + buf->buf.m.offset
/* Go to the end of this frame. */
+ row_size * stream->cur_frame->wHeight
/* Go back for the number of bytes corrisponding to the
* already fully completed rows.
*/
- (buf->buf.bytesused - shift_right)
/* Go back at the starting point of the upper row. */
- row_size
/* Shift right on this row if it is needed. */
+ shift_right,
data,
to_be_copied );
/* Update "data", "byteused" and "nbytes" values. */
data += to_be_copied;
buf->buf.bytesused += to_be_copied ;
nbytes -= to_be_copied;
}
/* Complete the current frame if the buffer size was exceeded. */
if (len > maxlen) {
uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n");
buf->state = UVC_BUF_STATE_DONE;
}
}

Dopo ciò dare i soliti comandi di ricompilazione del file e quindi:
sudo make
sudo make install
sudo make unload
sudo modprobe uvcvideo

0 commenti

Posta un commento