Moved testlibraw.c from src to tools directory.
Added sendiso and dumpiso programs in tools directory. Added man pages for sendiso and dumpiso in doc directory. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@66 53a565d1-3bb7-0310-b661-cf11e63c67ab
This commit is contained in:
parent
b6d807e7ac
commit
135babee19
|
@ -1,6 +1,6 @@
|
|||
# process this file with automake to create a Makefile.in
|
||||
|
||||
SUBDIRS = src doc debian
|
||||
SUBDIRS = src tools doc debian
|
||||
|
||||
aclocaldir = @datadir@/aclocal
|
||||
aclocal_DATA = libraw1394.m4
|
||||
|
|
2
NEWS
2
NEWS
|
@ -1,3 +1,5 @@
|
|||
- add sendiso and dumpiso tools with man files
|
||||
|
||||
Version 0.9:
|
||||
|
||||
- error reporting reworked to be more C library style; functions affected are
|
||||
|
|
|
@ -26,7 +26,10 @@ CFLAGS="$CFLAGS -Wall -Wunused"
|
|||
AC_OUTPUT([
|
||||
Makefile
|
||||
src/Makefile
|
||||
tools/Makefile
|
||||
doc/Makefile
|
||||
doc/testlibraw.1
|
||||
doc/sendiso.1
|
||||
doc/dumpiso.1
|
||||
debian/Makefile
|
||||
])
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
EXTRA_DIST = testlibraw.1.in libraw1394.sgml libraw1394 libraw1394.ps
|
||||
EXTRA_DIST = testlibraw.1.in sendiso.1.in dumpiso.1.in \
|
||||
libraw1394.sgml libraw1394 libraw1394.ps
|
||||
|
||||
# man files for testlibraw
|
||||
man_MANS = testlibraw.1
|
||||
man_MANS = testlibraw.1 sendiso.1 dumpiso.1
|
||||
|
||||
# libraw1394 docbook documentation
|
||||
|
||||
|
|
|
@ -18,7 +18,3 @@ libraw1394_la_SOURCES = \
|
|||
|
||||
# headers to be installed
|
||||
pkginclude_HEADERS = raw1394.h csr.h ieee1394.h
|
||||
|
||||
# testlibraw
|
||||
bin_PROGRAMS = testlibraw
|
||||
testlibraw_LDADD = libraw1394.la
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
# testlibraw
|
||||
bin_PROGRAMS = testlibraw sendiso dumpiso
|
||||
LDADD = ../src/libraw1394.la
|
|
@ -0,0 +1,236 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "../src/raw1394.h"
|
||||
|
||||
|
||||
u_int64_t listen_channels;
|
||||
unsigned long which_port;
|
||||
char *filename;
|
||||
int file;
|
||||
|
||||
int done;
|
||||
|
||||
void usage_exit(int exitcode)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: dumpiso [opts] [FILE]\n"
|
||||
"Dump IEEE 1394 isochronous channels to FILE or standard output.\n"
|
||||
"\n"
|
||||
"-c --channels CHANNELS Listen on these channels; CHANNELS is either a\n"
|
||||
" number X or a range X-Y.\n"
|
||||
"-p --port PORT Choose 1394 chip PORT. (default: 0)\n"
|
||||
"-h --help Show this help.\n"
|
||||
);
|
||||
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
void parse_args(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
char *tail;
|
||||
unsigned long chan1, chan2;
|
||||
|
||||
int c;
|
||||
int index;
|
||||
static struct option opts[] = {
|
||||
{ "channels", required_argument, NULL, 'c' },
|
||||
{ "port", required_argument, NULL, 'p' },
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
while (1) {
|
||||
c = getopt_long(argc, argv, "hc:p:", opts, &index);
|
||||
if (c == -1) break;
|
||||
|
||||
switch (c) {
|
||||
case 'c':
|
||||
chan1 = strtoul(optarg, &tail, 10);
|
||||
chan2 = chan1;
|
||||
|
||||
if (*tail) {
|
||||
if (tail[0] != '-' || !tail[1]) {
|
||||
fprintf(stderr,
|
||||
"invalid argument to channels: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
|
||||
tail++;
|
||||
chan2 = strtoul(tail, &tail, 10);
|
||||
if (*tail) {
|
||||
fprintf(stderr,
|
||||
"invalid argument to channels: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (chan2 < chan1) {
|
||||
unsigned long x = chan1;
|
||||
chan1 = chan2;
|
||||
chan2 = x;
|
||||
}
|
||||
|
||||
if (chan2 > 63) {
|
||||
fprintf(stderr,
|
||||
"invalid channel numbers: %s\n",
|
||||
optarg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = chan1; i <= chan2; i++)
|
||||
listen_channels |= 1ULL << i;
|
||||
|
||||
break;
|
||||
case 'p':
|
||||
which_port = strtoul(optarg, &tail, 10);
|
||||
if (*tail) {
|
||||
fprintf(stderr,
|
||||
"invalid argument to port: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
usage_exit(0);
|
||||
case '?':
|
||||
usage_exit(1);
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
|
||||
if (argc > 1) {
|
||||
fprintf(stderr, "Too many arguments.\n");
|
||||
usage_exit(1);
|
||||
}
|
||||
|
||||
if (argc) filename = *argv;
|
||||
|
||||
if (!listen_channels) listen_channels = ~0ULL;
|
||||
}
|
||||
|
||||
void write_header()
|
||||
{
|
||||
static char header[32] = "1394 isodump v1";
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
header[i+16] = (listen_channels >> (56 - 8*i)) & 0xff;
|
||||
|
||||
i = 0;
|
||||
while (i < 32) {
|
||||
int ret;
|
||||
ret = write(file, header + i, 32 - i);
|
||||
|
||||
if (ret < 0) {
|
||||
perror("header write");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
i += ret;
|
||||
}
|
||||
}
|
||||
|
||||
void open_dumpfile()
|
||||
{
|
||||
if (!filename || !filename[0] || (filename[0] == '-' && !filename[1])) {
|
||||
file = fileno(stdout);
|
||||
write_header();
|
||||
return;
|
||||
}
|
||||
|
||||
file = open(filename, O_CREAT | O_WRONLY, 0666);
|
||||
if (file < 0) {
|
||||
perror("dumpfile open");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ftruncate(file, 0);
|
||||
write_header();
|
||||
}
|
||||
|
||||
int iso_packet_handler(raw1394handle_t handle, int channel, size_t length,
|
||||
quadlet_t *data)
|
||||
{
|
||||
int ret;
|
||||
static unsigned int count;
|
||||
|
||||
count++;
|
||||
fprintf(stderr, "\r%u", count);
|
||||
fflush(stderr);
|
||||
|
||||
while (length) {
|
||||
ret = write(file, data, length);
|
||||
if (ret < 0) {
|
||||
perror("data write");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
length -= ret;
|
||||
data = (quadlet_t *)(((char *)data) + ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
raw1394handle_t handle;
|
||||
int i;
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
fprintf(stderr, "port: %ld\nchannels: %#016llx\nfile: %s\n", which_port,
|
||||
listen_channels, filename);
|
||||
|
||||
handle = raw1394_new_handle();
|
||||
if (!handle) {
|
||||
if (!errno)
|
||||
fprintf(stderr,
|
||||
"No working kernel driver found.\n");
|
||||
else
|
||||
perror("raw1394_get_handle");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
do {
|
||||
if (raw1394_get_port_info(handle, NULL, 0) <= which_port) {
|
||||
fprintf(stderr, "Port %ld does not exist.\n",
|
||||
which_port);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
raw1394_set_port(handle, which_port);
|
||||
} while (errno == ESTALE);
|
||||
|
||||
if (errno) {
|
||||
perror("raw1394_set_port");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
open_dumpfile();
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (!(listen_channels & 1ULL << i)) continue;
|
||||
|
||||
raw1394_set_iso_handler(handle, i, iso_packet_handler);
|
||||
raw1394_start_iso_rcv(handle, i);
|
||||
}
|
||||
|
||||
/* This should actually do something with the done variable, and set up
|
||||
signal handlers. */
|
||||
while (!done) raw1394_loop_iterate(handle);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,294 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "../src/raw1394.h"
|
||||
|
||||
|
||||
unsigned long which_port;
|
||||
char *filename;
|
||||
|
||||
unsigned long loopcount = 1;
|
||||
unsigned int speed;
|
||||
unsigned long packetcount;
|
||||
volatile unsigned int pend_req;
|
||||
|
||||
void usage_exit(int exitcode)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: sendiso [opts] FILE\n"
|
||||
"Send IEEE 1394 isochronous packets from dump file FILE.\n"
|
||||
"\n"
|
||||
"-l --loop COUNT Repeat sending data COUNT times.\n"
|
||||
"-i --infinite Repeat sending data infinitely.\n"
|
||||
"-s --speed SPEED Send data at SPEED (valid values are 100, 200, 400 or\n"
|
||||
" alternatively 1, 2, 4). (default: 100)\n"
|
||||
"\n"
|
||||
"-p --port PORT Choose 1394 chip PORT. (default: 0)\n"
|
||||
"-h --help Show this help.\n"
|
||||
);
|
||||
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
void parse_args(int argc, char **argv)
|
||||
{
|
||||
char *tail;
|
||||
|
||||
int c;
|
||||
int index;
|
||||
static struct option opts[] = {
|
||||
{ "file", required_argument, NULL, 'f' },
|
||||
{ "loop", required_argument, NULL, 'l' },
|
||||
{ "infinite", no_argument, NULL, 'i' },
|
||||
{ "speed", required_argument, NULL, 's' },
|
||||
{ "port", required_argument, NULL, 'p' },
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
while (1) {
|
||||
c = getopt_long(argc, argv, "f:l:is:p:h", opts, &index);
|
||||
if (c == -1) break;
|
||||
|
||||
switch (c) {
|
||||
case 'f':
|
||||
filename = optarg;
|
||||
break;
|
||||
case 'l':
|
||||
loopcount = strtoul(optarg, &tail, 10);
|
||||
if (*tail) {
|
||||
fprintf(stderr,
|
||||
"invalid argument to loop: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
loopcount = 0;
|
||||
break;
|
||||
case 's':
|
||||
speed = strtoul(optarg, &tail, 10);
|
||||
if (*tail) speed = -1;
|
||||
|
||||
switch (speed) {
|
||||
case 1:
|
||||
case 100:
|
||||
speed = 0;
|
||||
break;
|
||||
case 2:
|
||||
case 200:
|
||||
speed = 1;
|
||||
break;
|
||||
case 4:
|
||||
case 400:
|
||||
speed = 2;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr,
|
||||
"invalid argument to speed: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
which_port = strtoul(optarg, &tail, 10);
|
||||
if (*tail) {
|
||||
fprintf(stderr,
|
||||
"invalid argument to port: %s\n",
|
||||
optarg);
|
||||
usage_exit(1);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
usage_exit(0);
|
||||
case '?':
|
||||
usage_exit(1);
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
|
||||
if (argc > 1) {
|
||||
fprintf(stderr, "Too many arguments.\n");
|
||||
usage_exit(1);
|
||||
}
|
||||
|
||||
if (argc) filename = *argv;
|
||||
}
|
||||
|
||||
|
||||
int dec_int_callback(raw1394handle_t unused, int *counter, int unused_errcode)
|
||||
{
|
||||
(*counter)--;
|
||||
packetcount++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define BUF_SIZE 65536
|
||||
#define BUF_OVER BUF_SIZE
|
||||
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 = {
|
||||
(req_callback_t)dec_int_callback,
|
||||
&pend_req
|
||||
};
|
||||
|
||||
while (1) {
|
||||
while (pend_req > 30) raw1394_loop_iterate(handle);
|
||||
|
||||
count = read(file, buffer, BUF_SIZE);
|
||||
if (count < 0) {
|
||||
perror("read");
|
||||
exit(1);
|
||||
}
|
||||
if (count < 4) 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);
|
||||
|
||||
if (ret < 0) {
|
||||
perror("read");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ret == 0) return;
|
||||
|
||||
count += ret;
|
||||
}
|
||||
|
||||
raw1394_start_iso_write(handle, channel, tag, sy,
|
||||
speed, length,
|
||||
(quadlet_t *)(buffer + i),
|
||||
(unsigned long)&rh);
|
||||
i += length;
|
||||
pend_req++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void send_iso_file(raw1394handle_t handle)
|
||||
{
|
||||
int file;
|
||||
int count, ret;
|
||||
char buffer[32];
|
||||
|
||||
if (filename[0] == '-' && filename[1] == '\0') {
|
||||
file = fileno(stdin);
|
||||
} else {
|
||||
file = open(filename, O_RDONLY, 0);
|
||||
|
||||
if (file < 0) {
|
||||
perror("open");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
count = 32;
|
||||
while (count) {
|
||||
ret = read(file, buffer, count);
|
||||
|
||||
if (!ret) goto bad_format;
|
||||
|
||||
if (ret < 0) {
|
||||
perror("read");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
count -= ret;
|
||||
}
|
||||
|
||||
if (memcmp("1394 isodump v", buffer, 14)) goto bad_format;
|
||||
if (buffer[14] != '1') goto wrong_version;
|
||||
|
||||
while (1) {
|
||||
send_file_once(handle, file);
|
||||
|
||||
if (!loopcount) {
|
||||
if (lseek(file, 32, SEEK_SET) < 0) {
|
||||
perror("lseek");
|
||||
exit(1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (!(--loopcount)) break;
|
||||
|
||||
if (lseek(file, 32, SEEK_SET) < 0) {
|
||||
perror("lseek");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
bad_format:
|
||||
fprintf(stderr, "Input file format not recognized.\n");
|
||||
exit(1);
|
||||
|
||||
wrong_version:
|
||||
fprintf(stderr, "Format version of input file not supported.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
raw1394handle_t handle;
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
fprintf(stderr, "port: %ld\nloops: %ld\nfile: %s\n", which_port,
|
||||
loopcount, filename);
|
||||
|
||||
handle = raw1394_new_handle();
|
||||
if (!handle) {
|
||||
if (!errno)
|
||||
fprintf(stderr, "No working kernel driver found.\n");
|
||||
else
|
||||
perror("raw1394_get_handle");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
do {
|
||||
if (raw1394_get_port_info(handle, NULL, 0) <= which_port) {
|
||||
fprintf(stderr, "Port %ld does not exist.\n",
|
||||
which_port);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
raw1394_set_port(handle, which_port);
|
||||
} while (errno == ESTALE);
|
||||
|
||||
if (errno) {
|
||||
perror("raw1394_set_port");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (filename)
|
||||
send_iso_file(handle);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -13,8 +13,8 @@
|
|||
#include <string.h>
|
||||
#include <sys/poll.h>
|
||||
|
||||
#include "raw1394.h"
|
||||
#include "csr.h"
|
||||
#include "../src/raw1394.h"
|
||||
#include "../src/csr.h"
|
||||
|
||||
|
||||
#define TESTADDR (CSR_REGISTER_BASE + CSR_CYCLE_TIME)
|
Reference in New Issue