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 0xb30, 0x806, 0x200, 0x0
132 struct gramProfile profile
= {
134 0xb20, 0x806, 0x200, 0x0
141 struct gramProfile profile
= {
143 0x320, 0x6, 0x200, 0x0
149 struct gramProfile profile2
;
152 fprintf(stderr
, "Usage: %s port baudrate\n", argv
[0]);
156 sscanf(argv
[2], "%d", &baudrate
);
158 fprintf(stderr
, "%d is not a valid baudrate\n", baudrate
);
161 printf("Port: %s, baudrate: %d\n", argv
[1], baudrate
);
163 serial_port
= serial_setup(argv
[1], baudrate
);
164 ctx
.user_data
= &serial_port
;
166 printf("gram init... ");
167 gram_init(&ctx
, &profile
, (void*)ddr_base
, (void*)0x00009000, (void*)0x00008000);
171 printf("Rdly\np0: ");
172 for (size_t i
= 0; i
< 8; i
++) {
173 profile2
.rdly_p0
= i
;
174 gram_load_calibration(&ctx
, &profile2
);
175 gram_reset_burstdet(&ctx
);
176 for (size_t j
= 0; j
< 128; j
++) {
177 tmp
= gram_read(&ctx
, ddr_base
+4*j
);
179 if (gram_read_burstdet(&ctx
, 0)) {
188 printf("Rdly\np1: ");
189 for (size_t i
= 0; i
< 8; i
++) {
190 profile2
.rdly_p1
= i
;
191 gram_load_calibration(&ctx
, &profile2
);
192 gram_reset_burstdet(&ctx
);
193 for (size_t j
= 0; j
< 128; j
++) {
194 tmp
= gram_read(&ctx
, ddr_base
+4*j
);
196 if (gram_read_burstdet(&ctx
, 1)) {
205 printf("Auto calibrating... ");
206 res
= gram_generate_calibration(&ctx
, &profile2
);
207 if (res
!= GRAM_ERR_NONE
) {
209 gram_load_calibration(&ctx
, &profile
);
211 gram_load_calibration(&ctx
, &profile2
);
215 printf("Auto calibration profile:\n");
216 printf("\tp0 rdly: %d\n", profile2
.rdly_p0
);
217 printf("\tp1 rdly: %d\n", profile2
.rdly_p1
);
219 gram_reset_burstdet(&ctx
);
223 for (i
= 0; i
< kPatternSize
; i
++) {
227 printf("memtest... \n");
229 printf("Writing data sequence...");
230 for (i
= 0; i
< kPatternSize
; i
++) {
231 gram_write(&ctx
, ddr_base
+4*i
, pattern
[i
]);
236 sscanf(argv
[3], "%d", &delay
);
237 printf("waiting for %d second(s)...", delay
);
243 printf("Dumping data sequence...\n");
244 for (i
= 0; i
< kPatternSize
; i
++) {
245 if ((i
% kDumpWidth
) == 0) {
246 printf("%08x | ", ddr_base
+4*i
);
249 expected_value
= pattern
[i
];
251 for (int j
= 3; j
>= 0; j
--) {
252 printf("%02x", ((uint8_t*)(&expected_value
))[j
]);
255 if ((i
% kDumpWidth
) == kDumpWidth
-1) {
263 printf("Reading data sequence...\n");
264 for (i
= 0; i
< kPatternSize
; i
++) {
265 if ((i
% kDumpWidth
) == 0) {
266 printf("%08x | ", ddr_base
+4*i
);
269 read_value
= gram_read(&ctx
, ddr_base
+4*i
);
270 expected_value
= pattern
[i
];
272 for (int j
= 3; j
>= 0; j
--) {
273 if (((uint8_t*)(&read_value
))[j
] != ((uint8_t*)(&expected_value
))[j
]) {
274 printf("\033[0;31m%02x\033[0m", ((uint8_t*)(&read_value
))[j
]);
277 printf("\033[0;32m%02x\033[0m", ((uint8_t*)(&read_value
))[j
]);
281 if ((i
% kDumpWidth
) == kDumpWidth
-1) {
288 printf("Burstdet %d-%d\n", gram_read_burstdet(&ctx
, 0), gram_read_burstdet(&ctx
, 1));
290 printf("Memtest miss score (lowest is better): %d/100\n", (miss
/4)*100/kPatternSize
);