Попытались работать с аппаратным модулем шифрования из под RISC ядра. Работает в режиме простой замены, но с глюками. Иногда (через раз) не выставляются флаги READY или ERROR (стоит в нуле). При пошаговой отладке вроде работает лучше, но тоже не стабильно. В остальных режимах вообще работает непредсказуемо. При установке режимов гаммирования выходит по ошибке, как будто не хватает данных.
Экспериментировали с ожидпнием окончания транзакции. Вроде частично помогло, но походу нужно еще что-то.
Скорость в режиме простой замены до 8 МБ/сек.
Кто-нибудь работал с модулем? Подскажите, что не так.
Код:
Код:
//настройка генератора
void ClockConfigure(void)
{
RST_CLK->PER_CLOCK = 0xFFFFFFFF;
RST_CLK->PER_CLOCK |= 1<<4; //RST_CLK
//RST_CLK->DSP_CONTROL_STATUS = 0x1F;
RST_CLK->CPU_CLOCK = 0; //CPU_C1= HSI
RST_CLK->DSP_CLOCK = 0; //DSP_C1= HSI
//--------------------------------------------------------------
// Включаем HSE=8мГц
//--------------------------------------------------------------
//Включаем HSE
RST_CLK->HS_CONTROL = 1;
//ждем инициализации HSE
while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY)); // Ждем старта HSE
//переключаемся на HSE
RST_CLK->CPU_CLOCK = 2; //CPU_C1= HSE
RST_CLK->DSP_CLOCK = 2; //DSP_C1= HSE
RST_CLK->PER_CLOCK |= (1<<3);
EEPROM->CMD =(3<<3); // 3 такта ожидания
RST_CLK->PER_CLOCK &= ~(1<<3);
//--------------------------------------------------------------
// Настройка множителей для CPU и DSP PLL
// CPUPLL=(9+1)*8мГц=80мГц
// DSPPLL=(11+1)*8мГц=96мГц
//--------------------------------------------------------------
RST_CLK->PLL_CONTROL = (9 << RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Pos) |
(11 << RST_CLK_PLL_CONTROL_PLL_DSP_MUL_Pos) ;
//--------------------------------------------------------------
// Включаем CPU PLL
//--------------------------------------------------------------
//включаем PLL
RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_CPU_ON;
//ждем инициализации CPU PLL
while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_CPU_RDY));
//CPU тактируется от CPU PLL
RST_CLK->CPU_CLOCK = 0x106;
//--------------------------------------------------------------
// Включаем DSP PLL
//--------------------------------------------------------------
//включаем PLL
RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_DSP_ON;
//ждем инициализации DSP PLL
while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_DSP_RDY));
//DSP тактируется от DSP PLL
RST_CLK->DSP_CLOCK = 0x106;
RST_CLK->PER_CLOCK |= (1<<31); //CRYPT
RST_CLK->DSP_CONTROL_STATUS = (1<<1);
//RST_CLK->DSP_CONTROL_STATUS = 0x8012;
//включаем периферийные блоки DSP и память
// RST_CLK->DSP_CONTROL_STATUS &= ~(RST_CLK_DSP_CONTROL_STATUS_RST_DSP_MEM | RST_CLK_DSP_CONTROL_STATUS_RST_DSP_PER | RST_CLK_DSP_CONTROL_STATUS_RST_DSP_ALL);
// RST_CLK->DSP_CONTROL_STATUS |= RST_CLK_DSP_CONTROL_STATUS_HOLD;
//разрешаем тактирование
DSP_CLK->CLKMD = (1<<15) | (1<<14) | (1<<13) | (1<<3);
SysTickStart(80000); // 1 ms HCLK=8Meg
}
/*
uint16_t crpt_key[] = {
0x6D54, 0x3320, 0x6568, 0x326C,
0x7369, 0x2065, 0x7373, 0x626E,
0x6120, 0x7967, 0x6769, 0x7474,
0x6573, 0x6568, 0x2c20, 0x733d
};
*/
//S1
uint16_t crpt_sync[] = {
0x802a, 0xc3a7, 0xa8ff, 0x47e3
};
//КЗУ-1
uint16_t crpt_key[] = {
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff
};
uint16_t crpt_const[] = {
0x5f24, 0x8019, 0xcb3e, 0x6a7d,
0xef9c, 0xa318, 0xd472, 0x5b06,
0xce8d, 0xa937, 0x4251, 0xb0f6,
0x2b9e, 0x17f5, 0x6cd0, 0x834a,
0x95e3, 0xd086, 0xc7ba, 0x4f12,
0xb6f8, 0x5c91, 0xa73d, 0x42e0,
0x0cb9, 0x5763, 0xfe84, 0xd2a1,
0x256c, 0xd90b, 0xa7e3, 0x814f
};
/*
uint16_t crpt_const[] = {
0x29a4, 0xe08d, 0xc1b6, 0x35f7,
0xc4be, 0xafd6, 0x1832, 0x9570,
0xd165, 0x243a, 0x7cfe, 0xb906,
0x1ad7, 0xf980, 0xc64e, 0x352b,
0x17c6, 0x8df5, 0xe9a4, 0x2b30,
0x0ab4, 0xd127, 0x5863, 0xefc9,
0x14bd, 0x95f3, 0x7ea0, 0xc286,
0x0df1, 0x4a75, 0xe329, 0xc8b6,
};
*/
uint16_t _crpt_data[] = {
0x0, 0x0, 0x0, 0x0
};
//To1
uint16_t crpt_data[] = {
0xcccc, 0xcccc, 0x3333, 0x3333
};
/*
//To2
uint16_t crpt_data[] = {
0x3333, 0x3333, 0xcccc, 0xcccc
};
*/
// Простая замена
void simple_substitute(void)
{
uint32_t i, j;
uint32_t test, sr;
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->ITER = 0x60; // ITER_EN_CRPT; //on crypt module
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->CWR = 0x40; // CWR_RST | CWR_MODE_0; //reset простая замена
//ввод ключа
for(i=0; i< sizeof(crpt_key)/2; i++){
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->KR = crpt_key[i];
//SysTickDelay(1);
}
//ввод узлов замены
for(i=0; i< sizeof(crpt_const)/2; i++){
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->CR = crpt_const[i];
//SysTickDelay(1);
}
test = QuantitySysTick;
for(j=0; j< 1024*1024; j++)
{
//ввод данных
for(i=0; i< sizeof(crpt_data)/2; i++)
{
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->DATA = crpt_data[i];
// SysTickDelay(1);
}
// sr = DSP_CRPT->SR;
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
//запуск
DSP_CRPT->CWR = 0x8; //|= CWR_START;
// sr = DSP_CRPT->SR;
//ждем готовности
while(!(DSP_CRPT->SR & 0x3));
if(DSP_CRPT->SR & SR_ERROR_CRPT)
{
//ERROR
while(1);
}
for(i=0; i< sizeof(crpt_data)/2; i++)
_crpt_data[i] = DSP_CRPT->DATA;
}
test = QuantitySysTick - test;
}
//режим гаммирования с обратной связью
void crypt_gamma_fb(void)
{
uint32_t i, j;
uint32_t test, sr;
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->ITER = 0x60; // ITER_EN_CRPT; //on crypt module
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->CWR = 0x40; // CWR_RST | CWR_MODE_0; //reset простая замена
//ввод ключа
for(i=0; i< sizeof(crpt_key)/2; i++){
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->KR = crpt_key[i];
}
//ввод узлов замены
for(i=0; i< sizeof(crpt_const)/2; i++){
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->CR = crpt_const[i];
}
DSP_CRPT->CWR = CWR_MODE_2; //гаммирование с обратной связью
//ввод синхропосылки
for(i=0; i< sizeof(crpt_sync)/2; i++){
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->SYNR = crpt_sync[i];
}
test = QuantitySysTick;
for(j=0; j< 1024*1024; j++){
//ввод данных
for(i=0; i< sizeof(crpt_data)/2; i++) {
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
DSP_CRPT->DATA = crpt_data[i];
}
//ждем окончания транзакции
while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
//запуск
DSP_CRPT->CWR = 0x8; //|= CWR_START;
//ждем готовности
while(!(DSP_CRPT->SR & 0x3));
if(DSP_CRPT->SR & SR_ERROR_CRPT) { //ERROR
while(1);
}
for(i=0; i< sizeof(crpt_data)/2; i++)
_crpt_data[i] = DSP_CRPT->DATA;
}
test = QuantitySysTick - test;
}