-void crc_update(crc_t *crc, uint32_t data, int data_width)
-{
- for( int i=0; i < data_width; i++) {
- int oldstate = crc->state;
- crc->state = crc->state >> 1;
- if( (oldstate^data) & 1 ) {
- crc->state ^= crc->polynom;
- }
- data >>= 1;
+void crc_clear(crc_t *crc) {
+ crc->state = crc->initial_value & crc->mask;
+ if (crc->refin)
+ crc->state = reflect(crc->state, crc->order);
+}
+
+void crc_update(crc_t *crc, uint32_t indata, int data_width){
+
+ //reflected
+ if (crc->refin) indata = reflect(indata, data_width);
+
+ // Bring the next byte into the remainder.
+ crc->state ^= indata << (crc->order - data_width);
+
+ for( uint8_t bit = data_width; bit > 0; --bit) {
+ // Try to divide the current data bit.
+ if (crc->state & crc->topbit)
+ crc->state = (crc->state << 1) ^ crc->polynom;
+ else
+ crc->state = (crc->state << 1);