int main()
{
int iRetVal = 0;
uint32 pu32TestData[32];
uint32 *pu32HeaderPtr;
uint32 u32HeaderSize;
uint32 u32TotalBytes;
uint8 u8Counter;
uint32 u32BytesInFifo;
uint32 u32h0;
uint32 u32h1;
uint32 u32h2;
uint32 u32h3;
uint32 u32h4;
memset(pu32TestData, 0x0, 256);
/*
* Start initializing the MDHA (the hardware module that calculates the
* hash
*/
/* Reset the MDHA */
MCF_MDHA_MDCMR = MCF_MDHA_MDCMR_SWR;
while ((MCF_MDHA_MDSR & MCF_MDHA_MDSR_RD) == 0)
{
/* Wait until the reset completed */
}
/* The first 4 calculations no DMA and no interrupts are used */
MCF_MDHA_MDCR = MCF_MDHA_MDCR_DMAL(1) | MCF_MDHA_MDCR_ENDIAN;
/* Initialise the SHA algorithm's starting registers */
MCF_MDHA_MDMR = MCF_MDHA_MDMR_INIT | MCF_MDHA_MDMR_PDATA;
u32HeaderSize = 68;
u32TotalBytes = 0;
pu32HeaderPtr = pu32TestData;
while (u32HeaderSize > 0)
{
/* Now fill the FIFO with the first 16 uint32's */
u8Counter = 0;
u32BytesInFifo = 0;
while ((u8Counter 16) && u32HeaderSize > 3)
{
MCF_MDHA_MDIN = *pu32HeaderPtr++;
u32HeaderSize -= 4;
u32BytesInFifo += 4;
u8Counter++;
}
if ((u8Counter 16) && (u32HeaderSize > 0))
{
MCF_MDHA_MDIN = *pu32HeaderPtr++;
u32BytesInFifo += (uint8)u32HeaderSize;
u32HeaderSize = 0;
}
/* Fifo Filled */
MCF_MDHA_MDDSR = u32BytesInFifo;
/* GO!!!!! */
MCF_MDHA_MDCMR = MCF_MDHA_MDCMR_GO;
/* Now keep polling until the hash is calculated */
while ((MCF_MDHA_MDSR & MCF_MDHA_MDSR_INT) != 1)
{
/*
* For the time being, do nothing
*/
}
if ((MCF_MDHA_MDSR & MCF_MDHA_MDSR_ERR) != 0)
{
printf("An error occurred generating the SHA-1 hash\n\r");
iRetVal = -1;
u32TotalBytes = 0;
}
else if ((MCF_MDHA_MDSR & MCF_MDHA_MDSR_DONE) != 0)
{
u32TotalBytes += u32BytesInFifo;
if (u32HeaderSize == 0)
{
u32h0 = MCF_MDHA_MDA0;
u32h1 = MCF_MDHA_MDB0;
u32h2 = MCF_MDHA_MDC0;
u32h3 = MCF_MDHA_MDD0;
u32h4 = MCF_MDHA_MDE0;
if ((u32h0 == 0x46fe3f0a) &&
(u32h1 == 0x75b18d40) &&
(u32h2 == 0x6d86aca0) &&
(u32h3 == 0xed37bb70) &&
(u32h4 == 0x6ed8246b))
{
printf("HASH OK\n\r");
}
else
{
printf("HASH INCORRECT\n\r");
}
}
else
{
MCF_MDHA_MDCMR = MCF_MDHA_MDCMR_CI;
}
}
}
return iRetVal;
}