[an error occurred while processing this directive]
|
Исходник программы - упаковщика: unsigned char buf[256000]; unsigned char res[256000]; unsigned char msk[256000]; // Возвращает число одинаковых символов после того, на который указывает указатель n ++; return n; void Pack(int treshold) for (int i = 0; i < blen;) int sl = SerLen(i); if ((buf[i] == 0) && (sl > treshold)) i += 1 + sl; mbit ++; // Контрольная распаковка if (buf[tptr++] != b) void Unpack(void) tptr = 0; for (int pd = 0, bd = 0, mbit = 0; pd < rlen;) if (msk[bd] & (1 << mbit)) UnpackedByte(0); mbit ++; void GenerateAssemblerOutput(char * fn) fprintf (outp, "; Упакованная прошивка Альтеры подготовлена из файла\n"); fprintf (outp, "packed_data:", fn); fprintf(outp, "$%02X", res[i]); if ((i < rlen-1) && (n < 7)) n ++; fprintf (outp, "zero_burst_bits:", fn); for (i = 0, n = 8; i < mlen+1; i ++) fprintf(outp, "$%02X", msk[i]); if ((i < mlen) && (n < 7)) n ++; fclose (outp); void GenerateCOutput(char * fn) fprintf (outp, "// Упакованная прошивка Альтеры подготовлена из файла\n"); fprintf (outp, "#define PDLENGTH %d\n", rlen); // fprintf (outp, "const unsigned int packed_data_length = PDLENGTH;\n"); fprintf (outp, "const unsigned char flash packed_data[PDLENGTH] =\n{"); for (int i = 0, n = 8; i < rlen; i ++) fprintf(outp, "0x%02X", res[i]); if (i < rlen-1) n ++; fprintf (outp, "const unsigned char flash zero_burst_bits[%d] =\n{", mlen+1); for (i = 0, n = 8; i < mlen+1; i ++) fprintf(outp, "0x%02X", msk[i]); if (i < mlen) n ++; fclose (outp); void main (int argc, char **argv) // Загружаю в буфер blen = 0; printf ("%d bytes loaded\n", blen); // Пакую printf ("Total altera data length %d bytes\n", rlen + mlen + 1); // Тестовая распаковка // Ассемблер или С // Передача байта через SPI // Заливка прошивки в Альтеру // Настройка контроллера SPI // Распаковка и загрузка if ((*zb_ptr) & curr_bit) spi(0); // Следующий бит // Для того, что бы прошивка заработала // Сброс схемы в Альтере
E-mail:
info@telesys.ru
////////////////////////////////////////////////////////////////////
#include
int blen = 0;
int rlen = 0;
int mlen = 0;
int mbit = 0;
int SerLen(int from)
{
for (int i = from+1, n = 0; i < blen; i ++)
{
if (buf[i] != buf[from])
{
break;
}
}
}
{
rlen = 0;
mlen = 0;
msk[mlen] = 0;
mbit = 0;
{
if (mbit > 7)
{
msk[++ mlen] = 0;
mbit = 0;
}
// Серия не длиннее байта
if (sl > 255)
{
sl = 255;
}
{
// Серия нулей
res[rlen++] = sl;
msk[mlen] |= 1 << mbit;
}
else
{
// Все остальное без сжатия
res[rlen++] = buf[i ++];
}
}
}
int tptr;
void UnpackedByte(unsigned char b)
{
{
printf("compare error in %d\n", tptr - 1);
}
}
{
unsigned char n;
{
if (mbit > 7)
{
bd ++;
mbit = 0;
}
{
n = res[pd++];
while(n --)
{
UnpackedByte(0);
}
}
else
{
UnpackedByte(res[pd++]);
}
}
}
{
// Сохраняю результат
FILE * outp = fopen ("altera.asm", "wt");
fprintf (outp, "; %s\n\n", fn);
for (int i = 0, n = 8; i < rlen; i ++)
{
if (n == 8)
{
fprintf(outp, "\n\t.db\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n\n");
{
if (n == 8)
{
fprintf(outp, "\n\t.db\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n");
}
{
// Сохраняю результат
FILE * outp = fopen ("altera_data.c", "wt");
fprintf (outp, "// %s\n\n", fn);
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n};\n");
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n};\n\n");
}
{
if (argc < 2)
{
printf("RBF file needed\n");
return;
}
printf ("Open file '%s'\n", argv[1]);
FILE * inp = fopen(argv[1], "rb");
if (!inp)
{
printf ("Open file error\n");
}
while (!feof(inp))
{
buf[blen++] = fgetc(inp);
}
fclose(inp);
Pack(1);
printf ("Check\n");
Unpack();
if (argc == 3)
{
if ((argv[2][0] == 'a') || (argv[2][0] == 'A'))
{
GenerateAssemblerOutput(argv[1]);
}
}
else
{
GenerateCOutput(argv[1]);
}
}
////////////////////////////////////////////////////////////////////
Исходник распаковщика в Меге
////////////////////////////////////////////////////////////////////
#ifndef NO_ALTERA
#include "altera_data.c"
#endif
#ifndef NO_ALTERA
static void spi(unsigned char byt)
{
SPDR = byt;
while(!SPSR.7);
}
#endif
void AlteraLoad(void)
{
#ifndef NO_ALTERA
unsigned char flash * pd_ptr;
unsigned char flash * zb_ptr;
unsigned char curr_bit, n;
#endif
// Разрешаю работу со внешней шиной
MCUCR = 0b11000000;
XMCRA = 0b00001110;
// Отключаю адрес от порта С
XMCRB = 0b00000111;
SPCR = 0x78;
SPSR = 0x00;
// Управляющие ноги
PORTB &= 0b11111000;
DDRB |= 0b00000111;
PORTE |= 0b10000000;
DDRE |= 0b01000000;
#ifndef NO_ALTERA
// Начало загрузки
nCONFIG = 0;
delay_ms(10);
nCONFIG = 1;
while (!nSTATUS);
pd_ptr = &packed_data[0];
zb_ptr = &zero_burst_bits[0];
curr_bit = 0b00000001;
while (!CONF_DONE)
{
// Если биты закончились - к след. байту
if (!curr_bit)
{
zb_ptr ++;
curr_bit = 0b00000001;
}
{ // Это последовательность нулевых байт
n = *(pd_ptr ++);
while(n--)
{
spi(0);
}
}
else
{ // Это просто байт
spi(*(pd_ptr ++));
}
curr_bit <<= 1;
}
spi(0);
spi(0);
spi(0);
spi(0);
spi(0);
#endif
ARESET = 0;
delay_ms(10);
ARESET = 1;
delay_ms(10);
}
///////////////////////////////////////////////////////////////////
Ответы