-
Notifications
You must be signed in to change notification settings - Fork 67
/
qrmem.c
102 lines (83 loc) · 2.56 KB
/
qrmem.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "include.h"
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//* Чтение участка памяти модема в файл qmem.bin
//
// qread <адрес> <длина>
// Чтение идет блоками по 512 байт. Все чила - в hex
//
void main(int argc, char* argv[]) {
unsigned char iobuf[2048];
unsigned char filename[300]="qmem.bin";
unsigned int i;
unsigned int adr=0,len=0x200,endadr,blklen=512,helloflag=0,opt;
FILE* out;
#ifndef WIN32
char devname[20]="/dev/ttyUSB0";
#else
char devname[20]="";
#endif
while ((opt = getopt(argc, argv, "p:a:l:o:hi")) != -1) {
switch (opt) {
case 'h':
printf("\n Утилита предназначена для чтения адресного пространства модема\n\n\
Допустимы следующие ключи:\n\n\
-i - запускает процедуру HELLO для инициализации загрузчика\n\
-p <tty> - указывает имя устройства последовательного порта для общения с загрузчиком\n\
-o <file> - имя выходного файла (по умолчанию qmem.bin)\n\n\
-a <adr> - начальный адрес\n\
-l <num> - размер читаемого участка\n");
return;
case 'p':
strcpy(devname,optarg);
break;
case 'o':
strcpy(filename,optarg);
break;
case 'a':
sscanf(optarg,"%x",&adr);
break;
case 'l':
sscanf(optarg,"%x",&len);
break;
case 'i':
helloflag=1;
break;
case '?':
case ':':
return;
}
}
#ifdef WIN32
if (*devname == '\0')
{
printf("\n - Последовательный порт не задан\n");
return;
}
#endif
if (len == 0) {
printf("\n Неправильная длина");
return;
}
if (!open_port(devname)) {
#ifndef WIN32
printf("\n - Последовательный порт %s не открывается\n", devname);
#else
printf("\n - Последовательный порт COM%s не открывается\n", devname);
#endif
return;
}
out=fopen(filename,"wb");
if (helloflag) hello(2);
endadr=adr+len;
printf("\n Чтение области %08x - %08x\n",adr,endadr-1);
for(i=adr;i<endadr;i+=512) {
printf("\r %08x",i);
if ((i+512) > endadr) {
blklen=endadr-adr;
}
memread(iobuf,i,blklen);
fwrite(iobuf,1,blklen,out);
}
printf("\n");
fclose(out);
}