/********************************************* * (2013) Benjamin Krill *********************************************/ #include #include #include #include #include #include #include static void show_usage(char *name) { printf("USAGE: %s
[]\n" "\tw - write needs address, size, pattern\n" "\tr - read needs address, size\n" "\t\tsize in DW (4bytes)\n" , name); return; } int main(int argc, char **argv) { uint32_t *buf, pattern; int address, size, size_dw, i; clock_t start, end; int ret = -1; usb_dev_handle *hd; if (argc < 3 || (strncmp(argv[1], "w", 1) == 0 && argc < 5)) { show_usage(argv[0]); exit(1); } if ((hd = strm_init(0x04b4, 0x2342)) == NULL) { perror("cannot init usb2strm interface"); exit(1); } address = strtoull(argv[2], NULL, 0); size_dw = strtoull(argv[3], NULL, 0); size = size_dw*4; if (size_dw > 0xffffff) { perror("size cannot larger than 0xffffff DW"); goto out; } buf = (uint32_t*)malloc(size+8); if (buf == NULL) { perror("cannot allocate memory\n"); goto out; } if (strncmp(argv[1], "w", 1) == 0) { pattern = strtoull(argv[4], NULL, 0); for (i=0; i < size_dw; i++) { buf[i+2] = pattern; } buf[0] = STRM_TYPE_DDR2 << 28 | ((size_dw+1) & 0xffffff); buf[1] = STRM_DDR2_WRITE_HDR_INIT(address >> 2); printf("address=0x%x size=%d pattern=0x%06x - ", address, size, pattern); start = clock(); if ((ret = usb_bulk_write(hd, 2, (const char *)buf, size+8, 1000)) < 0) { fprintf(stderr, "\nFAILED: write bulk transfer (%d) [%s].\n\t%s\n", ret, __func__, usb_strerror()); } else { printf("wrote: %d bytes\n", ret); } end = clock(); printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); } else if (strncmp(argv[1], "r", 1) == 0) { buf[0] = STRM_TYPE_DDR2 << 28 | 2; buf[1] = STRM_DDR2_READ_HDR_INIT(address >> 2); buf[2] = ((size_dw) & 0xffffff); printf("address=0x%x size=%d - ", address, size); if ((ret = usb_bulk_write(hd, 2, (const char *)buf, 12, 1000)) < 0) { fprintf(stderr, "\nFAILED: write bulk transfer (%d) [%s].\n\t%s\n", ret, __func__, usb_strerror()); goto free; } else { printf("wrote: %d bytes\n", ret); } if ((ret = usb_bulk_read(hd, 6, (char *)buf, size+4, 6000000)) < 0) { fprintf(stderr, "\nFAILED: read bulk transfer (%d) [%s].\n\t%s\n", ret, __func__, usb_strerror()); goto free; } else { printf("read: %d bytes\n", ret); } for (i=0; i < size+4; i++) { if (!(i%0x10)) printf("\n"); printf("%02x ", ((uint8_t*)buf)[i]); } printf("\n"); } else { printf("Unknown argument.\n"); return -1; } free: free(buf); out: strm_fini(); return 0; }