summaryrefslogtreecommitdiff
path: root/chip/stm32/crc_hw.h
diff options
context:
space:
mode:
Diffstat (limited to 'chip/stm32/crc_hw.h')
-rw-r--r--chip/stm32/crc_hw.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/chip/stm32/crc_hw.h b/chip/stm32/crc_hw.h
new file mode 100644
index 0000000000..c1a97da842
--- /dev/null
+++ b/chip/stm32/crc_hw.h
@@ -0,0 +1,38 @@
+/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef _CRC_HW_H
+#define _CRC_HW_H
+/* CRC-32 hardware implementation with USB constants */
+
+#include "registers.h"
+
+static inline void crc32_init(void)
+{
+ /* switch on CRC controller */
+ STM32_RCC_AHBENR |= 1 << 6; /* switch on CRC controller */
+ /* reset CRC state */
+ STM32_CRC_CR = STM32_CRC_CR_RESET | STM32_CRC_CR_REV_OUT
+ | STM32_CRC_CR_REV_IN_WORD;
+ while (STM32_CRC_CR & 1)
+ ;
+}
+
+static inline void crc32_hash32(uint32_t val)
+{
+ STM32_CRC_DR = val;
+}
+
+static inline void crc32_hash16(uint16_t val)
+{
+ STM32_CRC_DR16 = val;
+}
+
+static inline uint32_t crc32_result(void)
+{
+ return STM32_CRC_DR ^ 0xFFFFFFFF;
+}
+
+#endif /* _CRC_HW_H */