- add '-f' option to force root node.

- fix byte order in read_write_quad()
- show hostnames in the list
- fix typo in manpage

MFC after: 1 week
This commit is contained in:
Hidetoshi Shimokawa 2008-03-05 01:30:48 +00:00
parent b455d946f5
commit 302176c71f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176810
2 changed files with 23 additions and 8 deletions

View file

@ -39,6 +39,7 @@
.Op Fl o Ar node .Op Fl o Ar node
.Op Fl s Ar node .Op Fl s Ar node
.Op Fl l Ar file .Op Fl l Ar file
.Op Fl f Ar node
.Op Fl g Ar gap_count .Op Fl g Ar gap_count
.Op Fl b Ar pri_req .Op Fl b Ar pri_req
.Op Fl M Ar mode .Op Fl M Ar mode
@ -77,6 +78,10 @@ Write to the
register on the node. register on the node.
.It Fl l Ar file .It Fl l Ar file
Load hex dump file of the configuration ROM and parse it. Load hex dump file of the configuration ROM and parse it.
.It Fl f Ar node
Force specified
.Ar node
to be the root node on the next bus reset.
.It Fl g Ar gap_count .It Fl g Ar gap_count
Broadcast Broadcast
.Ar gap_count .Ar gap_count
@ -98,7 +103,7 @@ an error complaining about "format 0x20", try to force the "mpeg" mode.
.It Fl R Ar filename .It Fl R Ar filename
Receive DV or MPEG TS stream and dump it to a file. Receive DV or MPEG TS stream and dump it to a file.
Use Ctrl-C to stop the receiving. Use Ctrl-C to stop the receiving.
Some DV cameras seem not to send the stream if a bus manager exits. Some DV cameras seem not to send the stream if a bus manager exists.
If you cannot get the stream, try the following commands: If you cannot get the stream, try the following commands:
.Bd -literal -offset indent .Bd -literal -offset indent
sysctl hw.firewire.try_bmr=0 sysctl hw.firewire.try_bmr=0

View file

@ -64,10 +64,12 @@ static void
usage(void) usage(void)
{ {
fprintf(stderr, fprintf(stderr,
"fwcontrol [-u bus_num] [-rt] [-g gap_count] [-o node] " "fwcontrol [-u bus_num] [-rt] [-f node] [-g gap_count] "
"[-o node] "
"[-b pri_req] [-c node] [-d node] [-l file] " "[-b pri_req] [-c node] [-d node] [-l file] "
"[-R file] [-S file] [-m target]\n" "[-R file] [-S file] [-m target]\n"
"\t-u: specify bus number\n" "\t-u: specify bus number\n"
"\t-f: broadcast force_root by phy_config packet\n"
"\t-g: broadcast gap_count by phy_config packet\n" "\t-g: broadcast gap_count by phy_config packet\n"
"\t-o: send link-on packet to the node\n" "\t-o: send link-on packet to the node\n"
"\t-s: write RESET_START register on the node\n" "\t-s: write RESET_START register on the node\n"
@ -153,20 +155,23 @@ list_dev(int fd)
struct fw_devlstreq *data; struct fw_devlstreq *data;
struct fw_devinfo *devinfo; struct fw_devinfo *devinfo;
struct eui64 eui; struct eui64 eui;
char addr[EUI64_SIZ]; char addr[EUI64_SIZ], hostname[40];
int i; int i;
data = get_dev(fd); data = get_dev(fd);
printf("%d devices (info_len=%d)\n", data->n, data->info_len); printf("%d devices (info_len=%d)\n", data->n, data->info_len);
printf("node EUI64 status\n"); printf("node EUI64 status hostname\n");
for (i = 0; i < data->info_len; i++) { for (i = 0; i < data->info_len; i++) {
devinfo = &data->dev[i]; devinfo = &data->dev[i];
fweui2eui64(&devinfo->eui, &eui); fweui2eui64(&devinfo->eui, &eui);
eui64_ntoa(&eui, addr, sizeof(addr)); eui64_ntoa(&eui, addr, sizeof(addr));
printf("%4d %s %6d\n", if (eui64_ntohost(hostname, sizeof(hostname), &eui))
hostname[0] = 0;
printf("%4d %s %6d %s\n",
(devinfo->status || i == 0) ? devinfo->dst : -1, (devinfo->status || i == 0) ? devinfo->dst : -1,
addr, addr,
devinfo->status devinfo->status,
hostname
); );
} }
free((void *)data); free((void *)data);
@ -198,7 +203,7 @@ read_write_quad(int fd, struct fw_eui64 eui, u_int32_t addr_lo, int readmode, u_
qld = (u_int32_t *)&asyreq->pkt; qld = (u_int32_t *)&asyreq->pkt;
if (!readmode) if (!readmode)
asyreq->pkt.mode.wreqq.data = data; asyreq->pkt.mode.wreqq.data = htonl(data);
if (ioctl(fd, FW_ASYREQ, asyreq) < 0) { if (ioctl(fd, FW_ASYREQ, asyreq) < 0) {
err(1, "ioctl"); err(1, "ioctl");
@ -676,7 +681,7 @@ main(int argc, char **argv)
list_dev(fd); list_dev(fd);
} }
while ((ch = getopt(argc, argv, "M:g:m:o:s:b:prtc:d:l:u:R:S:")) != -1) while ((ch = getopt(argc, argv, "M:f:g:m:o:s:b:prtc:d:l:u:R:S:")) != -1)
switch(ch) { switch(ch) {
case 'b': case 'b':
tmp = strtol(optarg, NULL, 0); tmp = strtol(optarg, NULL, 0);
@ -697,6 +702,11 @@ main(int argc, char **argv)
get_crom(fd, tmp, crom_buf, len); get_crom(fd, tmp, crom_buf, len);
dump_crom(crom_buf); dump_crom(crom_buf);
break; break;
case 'f':
tmp = strtol(optarg, NULL, 0);
open_dev(&fd, devbase);
send_phy_config(fd, tmp, -1);
break;
case 'g': case 'g':
tmp = strtol(optarg, NULL, 0); tmp = strtol(optarg, NULL, 0);
open_dev(&fd, devbase); open_dev(&fd, devbase);