/* ***************************************************************************** * Copyright (c) 2013 Benjamin Krill * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * ****************************************************************************/ #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; }