uint32_t reverse_32( uint32_t data ) { asm("rbit r0,r0"); return data; } ; uint32_t crc32_ether( char *buf, int len, int clear ) { uint32_t *p = (uint32_t*) buf; uint32_t crc, crc_reg; if ( clear ) CRC_ResetDR( ); while ( len >= 4 ) { crc_reg = CRC_CalcCRC( reverse_32( *p++ ) ); len -= 4; } crc = reverse_32( crc_reg ); if ( len ) { CRC_CalcCRC( crc_reg ); switch ( len ) { case 1: crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFF ) ^ crc ) >> 24 ); crc = ( crc >> 8 ) ^ reverse_32( crc_reg ); break; case 2: crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFF ) ^ crc ) >> 16 ); crc = ( crc >> 16 ) ^ reverse_32( crc_reg ); break; case 3: crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFFFF ) ^ crc ) >> 8 ); crc = ( crc >> 24 ) ^ reverse_32( crc_reg ); break; } } return ~crc; }