]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - tools/tools/ath/arcode/arcode.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / tools / tools / ath / arcode / arcode.c
1 /*
2  * Copyright (c) 2011 Adrian Chadd, Xenion Pty Ltd.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  *
16  * $FreeBSD$
17  */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <unistd.h>
22 #include <fcntl.h>
23 #include <errno.h>
24
25 #include <sys/types.h>
26 #include <sys/alq.h>
27
28 #include "ah_decode.h"
29
30 #define MAX_MARKERS     9
31
32 const char *markers[] = {  
33         "AH_MARK_RESET",                  /* ar*Reset entry, bChannelChange */
34         "AH_MARK_RESET_LINE",             /* ar*_reset.c, line %d */
35         "AH_MARK_RESET_DONE",             /* ar*Reset exit, error code */
36         "AH_MARK_CHIPRESET",              /* ar*ChipReset, channel num */
37         "AH_MARK_PERCAL",                 /* ar*PerCalibration, channel num */
38         "AH_MARK_SETCHANNEL",             /* ar*SetChannel, channel num */
39         "AH_MARK_ANI_RESET",              /* ar*AniReset, opmode */
40         "AH_MARK_ANI_POLL",               /* ar*AniReset, listen time */
41         "AH_MARK_ANI_CONTROL",            /* ar*AniReset, cmd */
42 };
43
44 static void
45 op_read(struct athregrec *a)
46 {
47         printf("read\t%.8x = %.8x\n", a->reg, a->val);
48 }
49
50 static void
51 op_write(struct athregrec *a)
52 {
53         printf("write\t%.8x = %.8x\n", a->reg, a->val);
54 }
55
56 static void
57 op_device(struct athregrec *a)
58 {
59         printf("device\t0x%x/0x%x\n", a->reg, a->val);
60 }
61
62 static void
63 op_mark(struct athregrec *a)
64 {
65         const char *s = "UNKNOWN";
66         if (a->reg <= MAX_MARKERS)
67                 s = markers[a->reg];
68
69         printf("mark\t%s (%d): %d\n", s, a->reg, a->val);
70 }
71
72 int
73 main(int argc, const char *argv[])
74 {
75         const char *file = argv[1];
76         int fd;
77         struct athregrec a;
78         int r;
79
80         if (argc < 2) {
81                 printf("usage: %s <ahq log>\n", argv[0]);
82                 exit(127);
83         }
84
85         fd = open(file, O_RDONLY);
86         if (fd < 0) {
87                 perror("open"); 
88                 exit(127);
89         }
90
91         while (1) {
92                 r = read(fd, &a, sizeof(a));
93                 if (r != sizeof(a))
94                         break;
95                 switch (a.op) {
96                         case OP_READ:
97                                 op_read(&a);
98                                 break;
99                         case OP_WRITE:
100                                 op_write(&a);
101                                 break;
102                         case OP_DEVICE:
103                                 op_device(&a);
104                                 break;
105                         case OP_MARK:
106                                 op_mark(&a);
107                                 break;
108                         default:
109                                 printf("op: %d; reg: 0x%x; val: 0x%x\n",
110                                     a.op, a.reg, a.val);
111                 }
112         }
113         close(fd);
114 }