aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorddennedy <ddennedy@53a565d1-3bb7-0310-b661-cf11e63c67ab>2004-11-18 05:24:13 +0000
committerddennedy <ddennedy@53a565d1-3bb7-0310-b661-cf11e63c67ab>2004-11-18 05:24:13 +0000
commiteb9b08bd5ca698bc3dba386f11dbc043b2ca6390 (patch)
tree1ce95c6a63b612e2270b653dad36513e7103989f
parentd5902a87154841ea71398a013f50569be2f4d3aa (diff)
downloadlibraw1394-eb9b08bd5ca698bc3dba386f11dbc043b2ca6390.tar.gz
port iso examples to rawiso API
git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@147 53a565d1-3bb7-0310-b661-cf11e63c67ab
-rw-r--r--NEWS1
-rw-r--r--src/raw1394.h2
-rw-r--r--tools/dumpiso.c67
-rw-r--r--tools/sendiso.c104
4 files changed, 109 insertions, 65 deletions
diff --git a/NEWS b/NEWS
index 34aa442..309d58d 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ Version 1.1.0:
- deprecate old isochronous API.
- move API comment documentation to header and reformat header comments as
kernel-doc (use linux/scripts/kernel-doc to extract and format them).
+- updated tools/dumpiso and tools/sendiso to new isochronous API.
Version 0.10:
diff --git a/src/raw1394.h b/src/raw1394.h
index c3cdd22..59fca94 100644
--- a/src/raw1394.h
+++ b/src/raw1394.h
@@ -146,7 +146,7 @@ int raw1394_iso_xmit_init(raw1394handle_t handle,
* @max_packet_size: largest packet you need to handle, in bytes (not including
* the isochronous header)
* @channel: isochronous channel to receive
- * @speed: speed at which to receive
+ * @mode: bufferfill or packet per buffer mode
* @irq_interval: maximum latency of wake-ups, in packets
* (-1 if you don't care)
*
diff --git a/tools/dumpiso.c b/tools/dumpiso.c
index 2fcef78..a73e2d3 100644
--- a/tools/dumpiso.c
+++ b/tools/dumpiso.c
@@ -1,3 +1,13 @@
+/*
+ * libraw1394 - library for raw access to the 1394 bus with the Linux subsystem.
+ *
+ * Copyright (C) 1999,2000 Andreas Bombe
+ *
+ * This library is licensed under the GNU Lesser General Public License (LGPL),
+ * version 2.1 or later. See the file COPYING.LIB in the distribution for
+ * details.
+ */
+
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@@ -7,13 +17,14 @@
#include "../src/raw1394.h"
+#define BUFFER 1000
+#define PACKET_MAX 4096
u_int64_t listen_channels;
unsigned long which_port;
char *filename;
int file;
-
-int done;
+enum raw1394_iso_dma_recv_mode mode = RAW1394_DMA_DEFAULT;
void usage_exit(int exitcode)
{
@@ -70,6 +81,8 @@ void parse_args(int argc, char **argv)
optarg);
usage_exit(1);
}
+ } else {
+ mode = RAW1394_DMA_PACKET_PER_BUFFER;
}
if (chan2 < chan1) {
@@ -160,28 +173,38 @@ void open_dumpfile()
write_header();
}
-int iso_packet_handler(raw1394handle_t handle, int channel, size_t length,
- quadlet_t *data)
+static enum raw1394_iso_disposition
+iso_handler(raw1394handle_t handle, unsigned char *data,
+ unsigned int length, unsigned char channel,
+ unsigned char tag, unsigned char sy, unsigned int cycle,
+ unsigned int dropped)
{
int ret;
- static unsigned int count;
+ static unsigned int counter = 0;
+
+ if (++counter % 1000 == 0)
+ fprintf(stderr, "\r%uK packets", counter/1000);
- count++;
- fprintf(stderr, "\r%u", count);
- fflush(stderr);
+ /* write header */
+ write(file, &length, sizeof(length));
+ write(file, &channel, sizeof(channel));
+ write(file, &tag, sizeof(tag));
+ write(file, &sy, sizeof(sy));
+ sy = 0;
+ write(file, &sy, sizeof(sy));
while (length) {
ret = write(file, data, length);
if (ret < 0) {
perror("data write");
- exit(1);
+ return RAW1394_ISO_ERROR;
}
length -= ret;
- data = (quadlet_t *)(((char *)data) + ret);
+ data += ret;
}
- return 0;
+ return RAW1394_ISO_OK;
}
int main(int argc, char **argv)
@@ -221,16 +244,24 @@ int main(int argc, char **argv)
open_dumpfile();
- for (i = 0; i < 64; i++) {
- if (!(listen_channels & 1ULL << i)) continue;
+ if (mode == RAW1394_DMA_DEFAULT) {
+ raw1394_iso_multichannel_recv_init(handle, iso_handler,
+ BUFFER, 2048, -1); /* >2048 makes rawiso stall! */
+ raw1394_iso_recv_set_channel_mask(handle, listen_channels);
- raw1394_set_iso_handler(handle, i, iso_packet_handler);
- raw1394_start_iso_rcv(handle, i);
+ } else for (i = 0; i < 64; i++) {
+ if (!(listen_channels & 1ULL << i))
+ continue;
+ raw1394_iso_recv_init(handle, iso_handler, BUFFER, PACKET_MAX,
+ i, mode, -1);
}
+ raw1394_iso_recv_start(handle, -1, -1, 0);
+
+ while (raw1394_loop_iterate(handle) == 0);
- /* This should actually do something with the done variable, and set up
- signal handlers. */
- while (!done) raw1394_loop_iterate(handle);
+ fprintf(stderr, "\n");
+ raw1394_iso_shutdown(handle);
+ raw1394_destroy_handle(handle);
return 0;
}
diff --git a/tools/sendiso.c b/tools/sendiso.c
index 8e20cec..37de920 100644
--- a/tools/sendiso.c
+++ b/tools/sendiso.c
@@ -18,6 +18,8 @@
#include "../src/raw1394.h"
+#define BUFFER 1000
+#define PACKET_MAX 4096
unsigned long which_port;
char *filename;
@@ -86,15 +88,15 @@ void parse_args(int argc, char **argv)
switch (speed) {
case 1:
case 100:
- speed = 0;
+ speed = RAW1394_ISO_SPEED_100;
break;
case 2:
case 200:
- speed = 1;
+ speed = RAW1394_ISO_SPEED_200;
break;
case 4:
case 400:
- speed = 2;
+ speed = RAW1394_ISO_SPEED_400;
break;
default:
fprintf(stderr,
@@ -134,66 +136,72 @@ void parse_args(int argc, char **argv)
if (argc) filename = *argv;
}
-
-static int dec_int_callback(raw1394handle_t unused, void *counter, raw1394_errcode_t unused_errcode)
-{
- (*(int *)counter)--;
- return 0;
-}
-static int pend_req;
-
-#define BUF_SIZE 65536
-#define BUF_OVER BUF_SIZE
+#define BUF_SIZE 4096
+#define BUF_HEAD 8
void send_file_once(raw1394handle_t handle, int file)
{
int count, i, ret;
unsigned channel, tag, sy;
size_t length;
- static char buffer[BUF_SIZE + BUF_OVER];
-
- static struct raw1394_reqhandle rh = {
- dec_int_callback,
- &pend_req
- };
+ static char buffer[BUF_SIZE + BUF_HEAD];
+ static unsigned int counter = 0;
+ static int inited = 0;
while (1) {
- while (pend_req > 30) raw1394_loop_iterate(handle);
-
- count = read(file, buffer, BUF_SIZE);
+ count = read(file, buffer, BUF_HEAD);
if (count < 0) {
perror("read");
exit(1);
}
- if (count < 4) return;
+ if (count < BUF_HEAD)
+ return;
i = 0;
- while (i < count) {
- length = (buffer[i] << 8) | buffer[i + 1];
- channel = buffer[i + 2] & 0x3f;
- tag = buffer[i + 2] >> 6;
- sy = buffer[i + 3] & 0xf;
-
- i += 4;
- while (i + length > count) {
- ret = read(file, buffer + BUF_SIZE,
- i + length - BUF_SIZE);
+ length = ((unsigned int *)buffer)[i];
+ channel = buffer[i + 4];
+ tag = buffer[i + 5];
+ sy = buffer[i + 6];
+
+ i += BUF_HEAD;
+ while (count < length + BUF_HEAD) {
+ ret = read(file, buffer + count,
+ length - count + BUF_HEAD);
- if (ret < 0) {
- perror("read");
- exit(1);
- }
+ if (ret < 0) {
+ perror("read");
+ exit(1);
- if (ret == 0) return;
+ }
+ if (ret == 0)
+ return;
- count += ret;
+ count += ret;
+ }
+
+ if (inited == 0) {
+ /*
+ fprintf(stderr, "transmitting first packet with length "
+ "%d on channel %d with tag %d and sy %d\n",
+ length, channel, tag, sy);
+ */
+ ret = raw1394_iso_xmit_init(handle, NULL, BUFFER,
+ PACKET_MAX, channel, speed, -1);
+ if (ret < 0) {
+ perror("raw1394_iso_xmit_init");
+ exit(1);
}
-
- raw1394_start_iso_write(handle, channel, tag, sy,
- speed, length,
- (quadlet_t *)(buffer + i),
- (unsigned long)&rh);
- i += length;
- pend_req++;
+ raw1394_iso_xmit_start(handle, -1, -1);
+ inited = 1;
+ }
+
+ if (++counter % 1000 == 0)
+ fprintf(stderr, "\r%uK packets", counter/1000);
+
+ ret = raw1394_iso_xmit_write(handle, &buffer[i],
+ length, tag, sy);
+ if (ret < 0) {
+ perror("\nraw1394_iso_xmit_write");
+ exit(1);
}
}
}
@@ -299,5 +307,9 @@ int main(int argc, char **argv)
if (filename)
send_iso_file(handle);
+ fprintf(stderr, "\n");
+ raw1394_iso_shutdown(handle);
+ raw1394_destroy_handle(handle);
+
return 0;
}