This commit is contained in:
Wolfgang Spraul 2012-06-15 08:26:36 +02:00
parent 67719691a8
commit 727fcb820a

270
bit2txt.c
View File

@ -168,14 +168,14 @@ typedef struct
const MAJOR majors[] =
{
/* 0 */ { "unknown", 4 },
/* 0 */ { "unknown", 4 }, // clock?
/* 1 */ { "unknown", 30 },
/* 2 */ { "unknown", 31 },
/* 3 */ { "unknown", 30 },
/* 4 */ { "unknown", 25 },
/* 4 */ { "unknown", 25 }, // bram?
/* 5 */ { "unknown", 31 },
/* 6 */ { "unknown", 30 },
/* 7 */ { "unknown", 24 },
/* 7 */ { "unknown", 24 }, // dsp?
/* 8 */ { "unknown", 31 },
/* 9 */ { "unknown", 31 },
/* 10 */ { "unknown", 31 },
@ -201,21 +201,28 @@ static const char* bitstr(uint32_t value, int digits)
return str;
}
void hexdump(const uint8_t* data, int len)
void hexdump(int indent, const uint8_t* data, int len)
{
int i, j;
char fmt_str[16] = "@%05x %02x";
char fmt_str[16] = "%s@%05x %02x";
char indent_str[16];
if (indent > 15)
indent = 15;
for (i = 0; i < indent; i++)
indent_str[i] = ' ';
indent_str[i] = 0;
i = 0;
if (len <= 0x100)
fmt_str[3] = '2';
fmt_str[5] = '2';
else if (len <= 0x10000)
fmt_str[3] = '4';
fmt_str[5] = '4';
else
fmt_str[3] = '6';
fmt_str[5] = '6';
while (i < len) {
printf(fmt_str, i, data[i]);
printf(fmt_str, indent_str, i, data[i]);
for (j = 1; (j < 8) && (i + j < len); j++) {
if (i + j >= len) break;
printf(" %02x", data[i+j]);
@ -225,6 +232,151 @@ void hexdump(const uint8_t* data, int len)
}
}
typedef struct ramb16_cfg
{
uint8_t byte[64];
} __attribute((packed)) ramb16_cfg_t;
static const int ramb_data_width_encoding[8] =
{
/* 000 */ 1,
/* 001 */ 2,
/* 010 */ 4,
/* 011 */ 9,
/* 100 */ 18,
/* 101 */ 36,
/* 110 */ -1, // unsupported
/* 111 */ 0
};
static const char* ramb16_cfg_str_min24[128] =
{
[257 - 256] "WRITE_MODE_A_NO_CHANGE",
[258 - 256] "WRITE_MODE_B_NO_CHANGE",
[259 - 256] "WRITE_MODE_A_READ_FIRST",
[260 - 256] "WRITE_MODE_B_READ_FIRST",
[264 - 256] "RSTTYPE_ASYNC",
[265 - 256] "RST_PRIORITY_A_CE",
[266 - 256] "RST_PRIORITY_B_CE",
[277 - 256] "DOA_REG",
[278 - 256] "DOB_REG",
[279 - 256] "RSTTYPE_ASYNC",
[286 - 256] "EN_RSTRAM_A",
[337 - 256] "EN_RSTRAM_B",
};
void print_ramb16_cfg(ramb16_cfg_t* cfg)
{
int i;
char forward_bits[128], reverse_bits[128];
printf("{\n");
// hexdump(1 /* indent */, &cfg->byte[0], 64 /* len */);
//
// Bits 0..255 come from minor 23, Bits 256..511 from minor 24.
// It looks like each set of 256 bits is divided into two halfs
// of 128 bits that are swept across the same memory locations
// in the chip. On the first sweep, some bits are turned on.
// On the second sweep, reverse from the end, most/all of the
// enabled bits stay on, some more are enabled, some disabled.
//
for (i = 0; i < 128; i++) {
forward_bits[i] = (cfg->byte[i/8] & (1<<(i%8))) != 0;
reverse_bits[i] = (cfg->byte[(255-i)/8]
& (1<<(7-(i%8)))) != 0;
}
//
// "fe" = forward enable (enable in forward sweep)
// "re" = reverse enable (enable in reverse sweep)
// "rd" = reverse disable (disable in reverse sweep)
//
for (i = 0; i < 128; i++) {
if (forward_bits[i])
printf(" fe%i ?\n", i);
}
for (i = 127; i >= 0; i--) {
if (reverse_bits[i] != forward_bits[i]) {
printf(" r%c%i ?\n",
reverse_bits[i] ? 'e' : 'd', i);
}
}
// minor 24
printf("\n");
for (i = 0; i < 128; i++) {
forward_bits[i] = (cfg->byte[32+i/8] & (1<<(i%8))) != 0;
reverse_bits[i] = (cfg->byte[32+(255-i)/8]
& (1<<(7-(i%8)))) != 0;
}
// data width
{
int encoding;
if (forward_bits[267-256] == reverse_bits[267-256]
&& forward_bits[269-256] == reverse_bits[269-256]
&& forward_bits[271-256] == reverse_bits[271-256]) {
encoding = 0;
if (forward_bits[267-256])
encoding |= 0x04;
if (forward_bits[269-256])
encoding |= 0x02;
if (forward_bits[271-256])
encoding |= 0x01;
if (encoding < sizeof(ramb_data_width_encoding) / sizeof(ramb_data_width_encoding[0])
&& ramb_data_width_encoding[encoding] != -1) {
printf(" data_width_a %i\n", ramb_data_width_encoding[encoding]);
forward_bits[267-256] = 0;
reverse_bits[267-256] = 0;
forward_bits[269-256] = 0;
reverse_bits[269-256] = 0;
forward_bits[271-256] = 0;
reverse_bits[271-256] = 0;
}
}
if (forward_bits[268-256] == reverse_bits[268-256]
&& forward_bits[256-256] == reverse_bits[256-256]
&& forward_bits[270-256] == reverse_bits[270-256]) {
encoding = 0;
if (forward_bits[268-256])
encoding |= 0x04;
if (forward_bits[256-256])
encoding |= 0x02;
if (forward_bits[270-256])
encoding |= 0x01;
if (encoding < sizeof(ramb_data_width_encoding) / sizeof(ramb_data_width_encoding[0])
&& ramb_data_width_encoding[encoding] != -1) {
printf(" data_width_b %i\n",
ramb_data_width_encoding[encoding]);
forward_bits[268-256] = 0;
reverse_bits[268-256] = 0;
forward_bits[256-256] = 0;
reverse_bits[256-256] = 0;
forward_bits[270-256] = 0;
reverse_bits[270-256] = 0;
}
}
}
for (i = 0; i < 128; i++) {
if (forward_bits[i])
printf(" fe%i %s\n", 256+i, ramb16_cfg_str_min24[i] ?
ramb16_cfg_str_min24[i] : "?");
}
for (i = 127; i >= 0; i--) {
if (reverse_bits[i] != forward_bits[i]) {
printf(" r%c%i %s\n",
reverse_bits[i] ? 'e' : 'd', 256+i,
ramb16_cfg_str_min24[i]
? ramb16_cfg_str_min24[i] : "?");
}
}
printf("}\n");
}
int main(int argc, char** argv)
{
uint8_t* bit_data = 0;
@ -234,7 +386,7 @@ int main(int argc, char** argv)
uint16_t packet_hdr_register, packet_hdr_wordcount;
int info = 0; // whether to print #I info messages (offsets and others)
char* bit_path = 0;
int i, j, k, l, num_frames, max_frames_to_scan;
int i, j, k, l, num_frames, max_frames_to_scan, offset_in_frame;
//
// parse command line
@ -380,6 +532,8 @@ int main(int argc, char** argv)
printf("sync_word\n");
while (bit_cur < bit_eof) {
// 8 is 2 padding frames between each row and 2 at the end
static const int content_start_frame = 4*505+8;
// packet header: ug380, Configuration Packets (p88)
if (info) printf("#I Packet header at off 0x%x.\n", bit_cur);
@ -801,6 +955,10 @@ int main(int argc, char** argv)
printf("#W T1 %s (%u words)",
xc6_regs[packet_hdr_register].name,
packet_hdr_wordcount);
if (packet_hdr_register == CRC) {
printf("\n"); // omit CRC for diff beauty
continue;
}
for (i = 0; (i < 8) && (i < packet_hdr_wordcount); i++)
printf(" 0x%x", __be16_to_cpu(*(uint16_t*)
&bit_data[u16_off+2+i*2]));
@ -835,20 +993,61 @@ int main(int argc, char** argv)
int first64_all_zero, first64_all_one;
int last64_all_zero, last64_all_one;
uint16_t middle_word;
int count;
int count, cur_row, cur_major, cur_minor;
if (i >= 2020) break;
if (i >= content_start_frame) break;
if (i%505 == 0)
if (i%(505+2) == 0)
printf("\n#D row %i\n", i/505);
cur_row = i/(505+2);
if (i%(505+2) == 505)
printf("\n#D padding\n");
cur_major = 0;
cur_minor = 0;
count = 0;
for (j = 0; j < sizeof(majors)/sizeof(majors[0]); j++) {
if (i%505 == count) {
printf("#D major %i (%i minors) %s\n", j, majors[j].minors, majors[j].name);
if (count == i%(505+2)) {
printf("\n#D major %i (%i minors) %s\n",
j, majors[j].minors, majors[j].name);
cur_major = j;
cur_minor = 0;
break;
}
if (count + majors[j].minors > i%(505+2)) {
cur_major = j;
cur_minor = i%(505+2) - count;
break;
}
count += majors[j].minors;
}
if (cur_major == 4 && cur_minor == 23
&& i+1 < num_frames
&& !(__be16_to_cpu(*(uint16_t*)&bit_data[bit_cur+i*130+64]))
&& !(__be16_to_cpu(*(uint16_t*)&bit_data[bit_cur+i*130+130+64]))
&& (cur_row > 0)) {
ramb16_cfg_t ramb16_cfg;
for (j = 0; j < 4; j++) {
offset_in_frame = (3-j)*32;
if (offset_in_frame >= 64)
offset_in_frame += 2;
for (k = 0; k < 32; k++) {
ramb16_cfg.byte[k] = bit_data[bit_cur+i*130+offset_in_frame+k];
ramb16_cfg.byte[k+32] = bit_data[bit_cur+i*130+130+offset_in_frame+k];
}
for (k = 0; k < 64; k++) {
if (ramb16_cfg.byte[k])
break;
}
if (k >= 64) continue; // empty
printf("RAMB16_X0Y%i config\n", ((cur_row-1)*4 + j)*2);
print_ramb16_cfg(&ramb16_cfg);
}
i++; // we processed two frames
continue;
}
middle_word = __be16_to_cpu(*(uint16_t*)
&bit_data[bit_cur+i*130+64]);
@ -882,7 +1081,7 @@ int main(int argc, char** argv)
printf("frame_64 all_1\n");
else {
printf("frame_64\n");
hexdump(&bit_data[bit_cur+i*130], 64);
hexdump(1, &bit_data[bit_cur+i*130], 64);
}
printf("frame_2 0x%04x\n", __be16_to_cpu(
@ -894,19 +1093,19 @@ int main(int argc, char** argv)
printf("frame_64 all_1\n");
else {
printf("frame_64\n");
hexdump(&bit_data[bit_cur+i*130+66], 64);
hexdump(1, &bit_data[bit_cur+i*130+66], 64);
}
continue;
}
max_frames_to_scan = num_frames - i - 1;
if (i + 1 + max_frames_to_scan >= ((i / 505)+1) * 505)
max_frames_to_scan = ((i/505)+1)*505 - i - 1;
if (i + 1 + max_frames_to_scan >= ((i / 507)+1)*507 - 2)
max_frames_to_scan = ((i/507)+1)*507 - i - 3;
count = 0;
for (j = 0; j < sizeof(majors)/sizeof(majors[0]); j++) {
if ((i/505)*505 + count > i
&& (i/505)*505 + count <= i+1+max_frames_to_scan) {
max_frames_to_scan = (i/505)*505 + count - i - 1;
if ((i/507)*507 + count > i
&& (i/507)*507 + count <= i+1+max_frames_to_scan) {
max_frames_to_scan = (i/507)*507 + count - i - 1;
break;
}
count += majors[j].minors;
@ -943,17 +1142,18 @@ int main(int argc, char** argv)
fprintf(stderr, "#E Internal error %i.\n", __LINE__);
goto fail;
}
for (i = 2020; i < num_frames; i++) {
for (i = content_start_frame; i < num_frames; i++) {
int all_zero, all_one;
static const int ram_starts[] =
{ 152, 170, 188, 206,
296, 314, 332, 350,
440, 458, 476, 494 };
{ 144, 162, 180, 198,
288, 306, 324, 342,
432, 450, 468, 486 };
if (i == 2020)
printf("\n#D 2020 - content start\n");
if (i == content_start_frame)
printf("\n#D %i - content start\n", i);
for (j = 0; j < sizeof(ram_starts) / sizeof(ram_starts[0]); j++) {
if (i == 2020 + ram_starts[j]
if (i == content_start_frame + ram_starts[j]
&& num_frames >= i+18)
break;
}
@ -1039,8 +1239,8 @@ int main(int argc, char** argv)
}
if (!all_zero && !all_one) {
printf("frame_130 %i off 0x%xh (%i)\n",
i-2020, bit_cur+i*130, bit_cur+i*130);
hexdump(&bit_data[bit_cur+i*130], 130);
i-content_start_frame, bit_cur+i*130, bit_cur+i*130);
hexdump(1, &bit_data[bit_cur+i*130], 130);
continue;
}
@ -1049,9 +1249,9 @@ int main(int argc, char** argv)
// readable.
max_frames_to_scan = num_frames - i - 1;
for (j = 0; j < sizeof(ram_starts) / sizeof(ram_starts[0]); j++) {
if ((2020 + ram_starts[j] > i)
&& (2020 + ram_starts[j] <= i+1+max_frames_to_scan)) {
max_frames_to_scan = 2020+ram_starts[j] - i - 1;
if ((content_start_frame + ram_starts[j] > i)
&& (content_start_frame + ram_starts[j] <= i+1+max_frames_to_scan)) {
max_frames_to_scan = content_start_frame+ram_starts[j] - i - 1;
// ram_starts is sorted in ascending order
break;
}
@ -1089,7 +1289,7 @@ int main(int argc, char** argv)
int dump_len = 2*u32 - num_frames*130;
printf("#D hexdump offset 0x%x, len 0x%x (%i)\n",
num_frames*130, dump_len, dump_len);
hexdump(&bit_data[bit_cur+num_frames*130], dump_len);
hexdump(1, &bit_data[bit_cur+num_frames*130], dump_len);
}
bit_cur += u32*2;