OpenCores
URL https://opencores.org/ocsvn/ao486/ao486/trunk

Subversion Repositories ao486

[/] [ao486/] [trunk/] [sim/] [iverilog/] [soc/] [uploader/] [uploader.cpp] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
#include <cstdio>
2
#include <cstdlib>
3
#include <cstring>
4
 
5
void crc32(unsigned char *ptr, unsigned int *crc_output) {
6
    static unsigned char crc[32];
7
 
8
    if(ptr != NULL && crc_output != NULL) return;
9
 
10
    if(ptr == NULL && crc_output == NULL) {
11
        for(int i=0; i<32; i++) crc[i] = 1;
12
        return;
13
    }
14
 
15
    if(ptr == NULL && crc_output != NULL) {
16
        *crc_output = 0;
17
        for(int i=0; i<32; i++) {
18
            (*crc_output) |= crc[i] << (31-i);
19
        }
20
        (*crc_output) = ~(*crc_output);
21
        return;
22
    }
23
 
24
    unsigned char in[8];
25
    for(int j=0; j<8; j++) in[j] = ((*ptr) >> j) & 1;
26
 
27
    unsigned char new_crc[32];
28
 
29
    new_crc[31] = in[2] ^ crc[23] ^ crc[29];
30
    new_crc[30] = in[0] ^ in[3] ^ crc[22] ^ crc[28] ^ crc[31];
31
    new_crc[29] = in[0] ^ in[1] ^ in[4] ^ crc[21] ^ crc[27] ^ crc[30] ^ crc[31];
32
    new_crc[28] = in[1] ^ in[2] ^ in[5] ^ crc[20] ^ crc[26] ^ crc[29] ^ crc[30];
33
    new_crc[27] = in[0] ^ in[2] ^ in[3] ^ in[6] ^ crc[19] ^ crc[25] ^ crc[28] ^ crc[29] ^ crc[31];
34
    new_crc[26] = in[1] ^ in[3] ^ in[4] ^ in[7] ^ crc[18] ^ crc[24] ^ crc[27] ^ crc[28] ^ crc[30];
35
    new_crc[25] = in[4] ^ in[5] ^ crc[17] ^ crc[26] ^ crc[27];
36
    new_crc[24] = in[0] ^ in[5] ^ in[6] ^ crc[16] ^ crc[25] ^ crc[26] ^ crc[31];
37
    new_crc[23] = in[1] ^ in[6] ^ in[7] ^ crc[15] ^ crc[24] ^ crc[25] ^ crc[30];
38
    new_crc[22] = in[7] ^ crc[14] ^ crc[24];
39
    new_crc[21] = in[2] ^ crc[13] ^ crc[29];
40
    new_crc[20] = in[3] ^ crc[12] ^ crc[28];
41
    new_crc[19] = in[0] ^ in[4] ^ crc[11] ^ crc[27] ^ crc[31];
42
    new_crc[18] = in[0] ^ in[1] ^ in[5] ^ crc[10] ^ crc[26] ^ crc[30] ^ crc[31];
43
    new_crc[17] = in[1] ^ in[2] ^ in[6] ^ crc[9] ^ crc[25] ^ crc[29] ^ crc[30];
44
    new_crc[16] = in[2] ^ in[3] ^ in[7] ^ crc[8] ^ crc[24] ^ crc[28] ^ crc[29];
45
    new_crc[15] = in[0] ^ in[2] ^ in[3] ^ in[4] ^ crc[7] ^ crc[27] ^ crc[28] ^ crc[29] ^ crc[31];
46
    new_crc[14] = in[0] ^ in[1] ^ in[3] ^ in[4] ^ in[5] ^ crc[6] ^ crc[26] ^ crc[27] ^ crc[28] ^ crc[30] ^ crc[31];
47
    new_crc[13] = in[0] ^ in[1] ^ in[2] ^ in[4] ^ in[5] ^ in[6] ^ crc[5] ^ crc[25] ^ crc[26] ^ crc[27] ^ crc[29] ^ crc[30] ^ crc[31];
48
    new_crc[12] = in[1] ^ in[2] ^ in[3] ^ in[5] ^ in[6] ^ in[7] ^ crc[4] ^ crc[24] ^ crc[25] ^ crc[26] ^ crc[28] ^ crc[29] ^ crc[30];
49
    new_crc[11] = in[3] ^ in[4] ^ in[6] ^ in[7] ^ crc[3] ^ crc[24] ^ crc[25] ^ crc[27] ^ crc[28];
50
    new_crc[10] = in[2] ^ in[4] ^ in[5] ^ in[7] ^ crc[2] ^ crc[24] ^ crc[26] ^ crc[27] ^ crc[29];
51
    new_crc[9] = in[2] ^ in[3] ^ in[5] ^ in[6] ^ crc[1] ^ crc[25] ^ crc[26] ^ crc[28] ^ crc[29];
52
    new_crc[8] = in[3] ^ in[4] ^ in[6] ^ in[7] ^ crc[0] ^ crc[24] ^ crc[25] ^ crc[27] ^ crc[28];
53
    new_crc[7] = in[0] ^ in[2] ^ in[4] ^ in[5] ^ in[7] ^ crc[24] ^ crc[26] ^ crc[27] ^ crc[29] ^ crc[31];
54
    new_crc[6] = in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[5] ^ in[6] ^ crc[25] ^ crc[26] ^ crc[28] ^ crc[29] ^ crc[30] ^ crc[31];
55
    new_crc[5] = in[0] ^ in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[6] ^ in[7] ^ crc[24] ^ crc[25] ^ crc[27] ^ crc[28] ^ crc[29] ^ crc[30] ^ crc[31];
56
    new_crc[4] = in[1] ^ in[3] ^ in[4] ^ in[5] ^ in[7] ^ crc[24] ^ crc[26] ^ crc[27] ^ crc[28] ^ crc[30];
57
    new_crc[3] = in[0] ^ in[4] ^ in[5] ^ in[6] ^ crc[25] ^ crc[26] ^ crc[27] ^ crc[31];
58
    new_crc[2] = in[0] ^ in[1] ^ in[5] ^ in[6] ^ in[7] ^ crc[24] ^ crc[25] ^ crc[26] ^ crc[30] ^ crc[31];
59
    new_crc[1] = in[0] ^ in[1] ^ in[6] ^ in[7] ^ crc[24] ^ crc[25] ^ crc[30] ^ crc[31];
60
    new_crc[0] = in[1] ^ in[7] ^ crc[24] ^ crc[30];
61
 
62
    memcpy(crc, new_crc, sizeof(crc));
63
}
64
 
65
int main(int argc, char *argv[]) {
66
    if(argc != 3) {
67
        printf("Invalid argument. Call %s with <filename> <start offset in decimal>.\n", argv[0]);
68
        return -1;
69
    }
70
 
71
    stdout = freopen(NULL, "wb", stdout);
72
 
73
    if(stdout == NULL) {
74
        printf("Error: can not reopen stdout.\n");
75
        return -1;
76
    }
77
 
78
    FILE *fp = fopen(argv[1], "rb");
79
    if(fp == NULL) {
80
        perror("fopen() failed");
81
        return -1;
82
    }
83
 
84
    int int_ret = fseek(fp, 0, SEEK_END);
85
    if(int_ret != 0) {
86
        perror("fseek() failed");
87
        fclose(fp);
88
        return -1;
89
    }
90
 
91
    int size = ftell(fp);
92
    if(size < 0) {
93
        perror("ftell() failed");
94
        fclose(fp);
95
        return -1;
96
    }
97
 
98
    rewind(fp);
99
 
100
    unsigned char *buf = new unsigned char[size];
101
    if(buf == NULL) {
102
        printf("new[] failed.\n");
103
        fclose(fp);
104
        return -1;
105
    }
106
 
107
    int_ret = fread(buf, size, 1, fp);
108
    if(int_ret != 1) {
109
        perror("fread() failed.\n");
110
        fclose(fp);
111
        delete buf;
112
        return -1;
113
    }
114
 
115
    unsigned char cmd = 0x00;
116
    unsigned int  offset = atoi(argv[2]);
117
    unsigned int  crc = 0;
118
 
119
    crc32(NULL, NULL);
120
    for(int i=0; i<size; i++) crc32(buf + i, NULL);
121
    crc32(NULL, &crc);
122
 
123
    int_ret = fwrite(&cmd, sizeof(cmd), 1, stdout);
124
    if(int_ret != 1) {
125
        perror("fwrite() failed");
126
        fclose(fp);
127
        delete buf;
128
        return -1;
129
    }
130
 
131
    int_ret = fwrite(&offset, sizeof(offset), 1, stdout);
132
    if(int_ret != 1) {
133
        perror("fwrite() failed");
134
        fclose(fp);
135
        delete buf;
136
        return -1;
137
    }
138
 
139
    int_ret = fwrite(&size, sizeof(size), 1, stdout);
140
    if(int_ret != 1) {
141
        perror("fwrite() failed");
142
        fclose(fp);
143
        delete buf;
144
        return -1;
145
    }
146
 
147
    int_ret = fwrite(buf, size, 1, stdout);
148
    if(int_ret != 1) {
149
        perror("fwrite() failed");
150
        fclose(fp);
151
        delete buf;
152
        return -1;
153
    }
154
 
155
    int_ret = fwrite(&crc, sizeof(crc), 1, stdout);
156
    if(int_ret != 1) {
157
        perror("fwrite() failed");
158
        fclose(fp);
159
        delete buf;
160
        return -1;
161
    }
162
 
163
    fclose(fp);
164
    delete buf;
165
 
166
    return 0;
167
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.