Annotation of embedtools/src/athctl.c, revision 1.1.2.3
1.1.2.2 misho 1: /*************************************************************************
2: * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
3: * by Michael Pounov <misho@aitbg.com>
4: *
5: * $Author: misho $
1.1.2.3 ! misho 6: * $Id: athctl.c,v 1.1.2.2 2010/10/23 01:50:49 misho Exp $
1.1.2.2 misho 7: *
8: *************************************************************************/
1.1.2.1 misho 9: #include "global.h"
1.1.2.2 misho 10: #include "athctl.h"
1.1.2.1 misho 11:
12:
1.1.2.2 misho 13: int Verbose;
14: extern char compiled[], compiledby[], compilehost[];
15:
16:
17: static void
18: Usage()
19: {
20: printf( "athCtl is tool for Atheros WiFi cards managment \n"
21: "=== %s === %s@%s ===\n\n"
1.1.2.3 ! misho 22: " Syntax: athctl [options] [0xMemory_Address]\n"
! 23: " athctl [-v] -t [-i <iface_no>]\n"
! 24: " athctl [-v] -c <timeout> [-i <iface_no>]\n"
! 25: " athctl [-v] -d <distance> [-i <iface_no>]\n"
! 26: " athctl [-v] -r <0xoffset> <0xMemory_Address>\n"
! 27: " athctl [-v] -w <0xoffset> <0xMemory_Address>\n"
! 28: " athctl [-v] -s <file> <0xMemory_Address>\n"
! 29: " athctl [-v] -w <file> <0xMemory_Address>\n"
! 30: "\n"
1.1.2.2 misho 31: "\t-v\t\tVerbose ...\n"
32: "\t-t\t\tGet current Atheros maximum range in meters\n"
33: "\t-i <iface_no>\tApply to this Atheros interface number (like ath0 == 0)\n"
34: "\t-d <distance>\tMode distance, meters to target\n"
35: "\t-c <timeout>\tMode distance, mS timeouts correction\n"
1.1.2.3 ! misho 36: "\t-s <file>\tDump EEPROM to file\n"
! 37: "\t-u <file>\tUpdate EEPROM from file\n"
! 38: "\t-r <offset>\tRead EEPROM word from PCI mapped memory address\n"
! 39: "\t-w <offset>\tWrite EEPROM word to PCI mapped memory address\n"
1.1.2.2 misho 40: "\n", compiled, compiledby, compilehost);
41: }
42:
43: static int
44: calcDistance(int ifid, int dist, int cor)
45: {
46: int slottime[2], timeout[2];
47: size_t len;
48: char szStr[STRSIZ];
49:
50: slottime[0] = 9 + (dist / 300) + (dist % 300 ? 1 : 0);
51: timeout[0] = slottime[0] * 2 + 3 + cor;
52: VERB(3) printf("Info:: slottime=%d timeout=%d\n", slottime[0], timeout[0]);
53:
54: memset(szStr, 0, STRSIZ);
55: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
56: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
57: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
58: return -1;
59: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
60: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
61: return -1;
62: } else if (sysctlbyname(szStr, NULL, NULL, &slottime[0], sizeof slottime[0]) == -1) {
63: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, slottime[1],
64: errno, strerror(errno));
65: return -1;
66: } else
67: VERB(1) printf("Info:: set slottime(%d) from %d to %d ... OK!\n", len,
68: slottime[1], slottime[0]);
69:
70: memset(szStr, 0, STRSIZ);
71: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
72: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
73: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
74: return -1;
75: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
76: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
77: return -1;
78: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
79: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
80: errno, strerror(errno));
81: return -1;
82: } else
83: VERB(1) printf("Info:: set acktimeout(%d) from %d to %d ... OK!\n", len,
84: timeout[1], timeout[0]);
85:
86: memset(szStr, 0, STRSIZ);
87: snprintf(szStr, STRSIZ, SC_CTSTIMEOUT, ifid);
88: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
89: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
90: return -1;
91: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
92: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
93: return -1;
94: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
95: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
96: errno, strerror(errno));
97: return -1;
98: } else
99: VERB(1) printf("Info:: set ctstimeout(%d) from %d to %d ... OK!\n", len,
100: timeout[1], timeout[0]);
101:
102: return timeout[0];
103: }
104:
105:
106: static int
107: calcTimeout(int ifid, int cor)
108: {
109: int slottime[2], timeout[2];
110: size_t len;
111: char szStr[STRSIZ];
112:
113: memset(szStr, 0, STRSIZ);
114: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
115: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
116: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
117: return -1;
118: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
119: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
120: return -1;
121: } else
122: VERB(1) printf("Info:: get slottime(%d) %d ... OK!\n", len, slottime[1]);
123:
124: memset(szStr, 0, STRSIZ);
125: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
126: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
127: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
128: return -1;
129: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
130: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
131: return -1;
132: } else
133: VERB(1) printf("Info:: get acktimeout(%d) %d ... OK!\n", len, timeout[1]);
134:
135: slottime[0] = (timeout[1] - 3 - cor) / 2;
136: VERB(3) printf("Info:: calculated slottime=%d\n", slottime[0]);
137: timeout[0] = (slottime[0] - 10) * 300;
138: VERB(3) printf("Info:: calculated timeout=%d\n", timeout[0]);
139:
140: return timeout[0];
141: }
1.1.2.3 ! misho 142:
! 143:
! 144: static inline void *
! 145: devOpen(u_long baseaddr)
! 146: {
! 147: int fd;
! 148: void *basemem;
! 149:
! 150: fd = open("/dev/mem", O_RDWR);
! 151: if (fd == -1) {
! 152: printf("Error:: open device #%d - %s\n", errno, strerror(errno));
! 153: return NULL;
! 154: }
! 155: basemem = mmap(NULL, ATH_PCI_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, baseaddr);
! 156: if (basemem == MAP_FAILED) {
! 157: printf("Error:: map device #%d - %s\n", errno, strerror(errno));
! 158: close(fd);
! 159: return NULL;
! 160: } else
! 161: close(fd);
! 162:
! 163: return basemem;
! 164: }
! 165:
! 166: static inline void
! 167: devClose(void *basemem)
! 168: {
! 169: if (basemem)
! 170: munmap(basemem, ATH_PCI_MEM_SIZE);
! 171: }
! 172:
! 173: /*
! 174: static int
! 175: readEEPROM()
! 176: {
! 177: register u_long i;
! 178:
! 179: printf("Reading EEPROM ...\n");
! 180: for (i = 0; i < ATH_EEPROM_SIZE / 2; i++) {
! 181: }
! 182: }
! 183: */
! 184:
1.1.2.2 misho 185: // ----------------------------------------------------
186:
1.1.2.1 misho 187: int
188: main(int argc, char **argv)
189: {
1.1.2.3 ! misho 190: char ch, szName[MAXPATHLEN] = { 0 }, mode = 0;
1.1.2.2 misho 191: int ret = 0, dist = 0, cor = 0, ino = 0;
1.1.2.3 ! misho 192: u_long offset, baseaddr = (u_long) -1;
! 193: void *basemem = NULL;
1.1.2.2 misho 194:
1.1.2.3 ! misho 195: while ((ch = getopt(argc, argv, "hvtr:w:i:d:c:u:s:")) != -1)
1.1.2.2 misho 196: switch (ch) {
197: case 'v':
198: Verbose++;
199: break;
200: case 't':
201: mode |= 2;
202: break;
203: case 'i':
204: ino = strtol(optarg, NULL, 0);
205: if (ino < 0) {
206: printf("Error:: in interface number %d\n", ino);
207: return 1;
208: }
209: break;
210: case 'd':
211: mode |= 1;
212: dist = strtol(optarg, NULL, 0);
213: if (dist < 1) {
214: printf("Error:: in distance meters %d\n", dist);
215: return 1;
216: }
217: break;
218: case 'c':
219: mode |= 1;
220: cor = strtol(optarg, NULL, 0);
221: break;
1.1.2.3 ! misho 222: case 's':
! 223: mode = 0x10;
! 224: strlcpy(szName, optarg, MAXPATHLEN);
! 225: break;
! 226: case 'u':
! 227: mode = 0x20;
! 228: strlcpy(szName, optarg, MAXPATHLEN);
! 229: break;
! 230: case 'r':
! 231: mode = 4;
! 232: offset = strtoul(optarg, NULL, 0);
! 233: break;
! 234: case 'w':
! 235: mode = 8;
! 236: offset = strtoul(optarg, NULL, 0);
! 237: break;
1.1.2.2 misho 238: case 'h':
239: default:
240: Usage();
241: return 1;
242: }
243: argc -= optind;
244: argv += optind;
1.1.2.3 ! misho 245: if (argc && *argv)
! 246: baseaddr = strtoul(*argv, NULL, 0);
1.1.2.2 misho 247: if (!mode) {
248: printf("Error:: not selected mode for operation ...\n");
249: return 1;
250: }
1.1.2.3 ! misho 251: if (mode > 3 && baseaddr == (u_long) -1) {
! 252: printf("Error:: in this mode for operation, must give memory mapped address ...\n");
! 253: return 1;
! 254: }
1.1.2.2 misho 255:
256: if (mode & 1)
257: if ((ret = calcDistance(ino, dist, cor)) < 1)
258: return 2;
259: if (mode & 2) {
260: if ((ret = calcTimeout(ino, cor)) < 1)
261: return 2;
262: else {
263: VERB(1)
264: printf("Maximum approximate distance ~%d meters\n", ret);
265: else
266: printf("~%d\n", ret);
267: }
268: }
269:
1.1.2.3 ! misho 270: if (mode & 4) {
! 271: if (!(basemem = devOpen(baseaddr)))
! 272: return 2;
! 273: // if ((ret = readWord(basemem)) < 1)
! 274: // return 3;
! 275: devClose(basemem);
! 276: }
! 277:
1.1.2.1 misho 278: return 0;
279: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>