35e6b46a3a8fddf434582135c6b03700988d84c2
12 #include <netinet/in.h>
16 uint32_t gram_read(struct gramCtx
*ctx
, void *addr
) {
17 uint8_t commands
[6] = { 0x02, 0x01 };
19 int received
, sent
, fd
;
21 fd
= *(int*)(ctx
->user_data
);
23 *(uint32_t*)(&commands
[2]) = htonl((uint32_t)addr
>> 2);
25 sent
= write(fd
, commands
, sizeof(commands
));
26 if (sent
!= sizeof(commands
)) {
27 fprintf(stderr
, "gram_read error (sent bytes length mismatch)\n");
29 received
= read(fd
, &reply
, sizeof(reply
));
30 if (received
!= sizeof(reply
)) {
31 fprintf(stderr
, "gram_read error (read bytes length mismatch: %d != %d)\n", received
, sizeof(reply
));
34 //printf("gram_read: 0x%08x: 0x%08x\n", addr, ntohl(reply));
39 int gram_write(struct gramCtx
*ctx
, void *addr
, uint32_t value
) {
40 uint8_t commands
[10] = { 0x01, 0x01 };
43 *(uint32_t*)(commands
+2) = htonl((uint32_t)addr
>> 2);
44 *(uint32_t*)(commands
+6) = htonl(value
);
46 //printf("gram_write: 0x%08x: 0x%08x\n", addr, value);
48 sent
= write(*(int*)(ctx
->user_data
), commands
, sizeof(commands
));
49 if (sent
!= sizeof(commands
)) {
50 fprintf(stderr
, "gram_write error (sent bytes length mismatch)\n");
57 int serial_setup(const char *devname
, int baudrate
) {
61 serialfd
= open("/dev/ttyUSB1", O_RDWR
|O_NOCTTY
);
63 fprintf(stderr
, "Error %i from open: %s\n", errno
, strerror(errno
));
66 memset(&tty
, 0, sizeof(tty
));
67 if (tcgetattr(serialfd
, &tty
) != 0) {
68 fprintf(stderr
, "Error %i from tcgetattr: %s\n", errno
, strerror(errno
));
71 /* Parameters from flterm */
72 tcgetattr(serialfd
, &tty
);
73 tty
.c_cflag
= B115200
;
76 tty
.c_iflag
= IGNPAR
| IGNBRK
;
77 tty
.c_cflag
|= CLOCAL
;
82 tcsetattr(serialfd
, TCSANOW
, &tty
);
83 tcflush(serialfd
, TCOFLUSH
);
84 tcflush(serialfd
, TCIFLUSH
);
86 cfsetispeed(&tty
, B115200
);
87 cfsetospeed(&tty
, B115200
);
91 tcflush(serialfd
, TCIFLUSH
);
92 if (tcsetattr(serialfd
, TCSANOW
, &tty
) != 0) {
93 fprintf(stderr
, "Error %i from tcsetattr: %s\n", errno
, strerror(errno
));
99 int main(int argc
, char *argv
[]) {
101 int serial_port
, baudrate
= 0;
102 uint32_t read_value
, expected_value
;
103 const size_t kPatternSize
= 512;
104 uint32_t pattern
[kPatternSize
];
105 const int kDumpWidth
= 8;
111 uint32_t ddr_base
= 0x10000000;
114 struct gramProfile profile
= {
116 0xb30, 0x806, 0x200, 0x0
123 struct gramProfile profile
= {
125 0xb20, 0x806, 0x200, 0x0
132 struct gramProfile profile
= {
134 0x320, 0x6, 0x200, 0x0
140 struct gramProfile profile2
;
143 fprintf(stderr
, "Usage: %s port baudrate\n", argv
[0]);
147 sscanf(argv
[2], "%d", &baudrate
);
149 fprintf(stderr
, "%d is not a valid baudrate\n", baudrate
);
152 printf("Port: %s, baudrate: %d\n", argv
[1], baudrate
);
154 serial_port
= serial_setup(argv
[1], baudrate
);
155 ctx
.user_data
= &serial_port
;
157 printf("gram init... ");
158 gram_init(&ctx
, &profile
, (void*)ddr_base
, (void*)0x00009000, (void*)0x00008000);
162 printf("Rdly\np0: ");
163 for (size_t i
= 0; i
< 8; i
++) {
164 profile2
.rdly_p0
= i
;
165 gram_load_calibration(&ctx
, &profile2
);
166 gram_reset_burstdet(&ctx
);
167 for (size_t j
= 0; j
< 128; j
++) {
168 tmp
= gram_read(&ctx
, ddr_base
+4*j
);
170 if (gram_read_burstdet(&ctx
, 0)) {
179 printf("Rdly\np1: ");
180 for (size_t i
= 0; i
< 8; i
++) {
181 profile2
.rdly_p1
= i
;
182 gram_load_calibration(&ctx
, &profile2
);
183 gram_reset_burstdet(&ctx
);
184 for (size_t j
= 0; j
< 128; j
++) {
185 tmp
= gram_read(&ctx
, ddr_base
+4*j
);
187 if (gram_read_burstdet(&ctx
, 1)) {
196 printf("Auto calibrating... ");
197 res
= gram_generate_calibration(&ctx
, &profile2
);
198 if (res
!= GRAM_ERR_NONE
) {
200 gram_load_calibration(&ctx
, &profile
);
202 gram_load_calibration(&ctx
, &profile2
);
206 printf("Auto calibration profile:\n");
207 printf("\tp0 rdly: %d\n", profile2
.rdly_p0
);
208 printf("\tp1 rdly: %d\n", profile2
.rdly_p1
);
210 gram_reset_burstdet(&ctx
);
214 for (i
= 0; i
< kPatternSize
; i
++) {
218 printf("memtest... \n");
220 printf("Writing data sequence...");
221 for (i
= 0; i
< kPatternSize
; i
++) {
222 gram_write(&ctx
, ddr_base
+4*i
, pattern
[i
]);
227 sscanf(argv
[3], "%d", &delay
);
228 printf("waiting for %d second(s)...", delay
);
234 printf("Dumping data sequence...\n");
235 for (i
= 0; i
< kPatternSize
; i
++) {
236 if ((i
% kDumpWidth
) == 0) {
237 printf("%08x | ", ddr_base
+4*i
);
240 expected_value
= pattern
[i
];
242 for (int j
= 3; j
>= 0; j
--) {
243 printf("%02x", ((uint8_t*)(&expected_value
))[j
]);
246 if ((i
% kDumpWidth
) == kDumpWidth
-1) {
254 printf("Reading data sequence...\n");
255 for (i
= 0; i
< kPatternSize
; i
++) {
256 if ((i
% kDumpWidth
) == 0) {
257 printf("%08x | ", ddr_base
+4*i
);
260 read_value
= gram_read(&ctx
, ddr_base
+4*i
);
261 expected_value
= pattern
[i
];
263 for (int j
= 3; j
>= 0; j
--) {
264 if (((uint8_t*)(&read_value
))[j
] != ((uint8_t*)(&expected_value
))[j
]) {
265 printf("\033[0;31m%02x\033[0m", ((uint8_t*)(&read_value
))[j
]);
268 printf("\033[0;32m%02x\033[0m", ((uint8_t*)(&read_value
))[j
]);
272 if ((i
% kDumpWidth
) == kDumpWidth
-1) {
279 printf("Burstdet %d-%d\n", gram_read_burstdet(&ctx
, 0), gram_read_burstdet(&ctx
, 1));
281 printf("Memtest miss score (lowest is better): %d/100\n", (miss
/4)*100/kPatternSize
);