rt_fota_crc.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-09-22 Warfalcon first version
  9. */
  10. #include <rtthread.h>
  11. static rt_uint32_t crc_tab[256];
  12. static rt_uint32_t bitrev(rt_uint32_t poly, rt_uint32_t width)
  13. {
  14. rt_uint32_t i;
  15. rt_uint32_t var = 0;
  16. for (i = 0; i < width; i++)
  17. {
  18. if (poly & 0x00000001)
  19. var |= 1 << (width - 1 - i);
  20. poly >>= 1;
  21. }
  22. return var;
  23. }
  24. static void crc32_init(rt_uint32_t poly)
  25. {
  26. rt_uint32_t i, j;
  27. rt_uint32_t c;
  28. poly = bitrev(poly, 32);
  29. for (i = 0; i < 256; i++)
  30. {
  31. c = i;
  32. for (j = 0; j < 8; j++)
  33. {
  34. if(c & 0x00000001)
  35. c = poly ^ (c >> 1);
  36. else
  37. c >>= 1;
  38. }
  39. crc_tab[i] = c;
  40. }
  41. }
  42. static rt_uint32_t crc32(rt_uint32_t crc_init, rt_uint8_t *buf, rt_uint32_t len)
  43. {
  44. rt_uint32_t i;
  45. rt_uint8_t index;
  46. for (i = 0; i < len; i++)
  47. {
  48. index = (rt_uint8_t)(crc_init ^ buf[i]);
  49. crc_init = (crc_init >> 8) ^ crc_tab[index];
  50. }
  51. return crc_init;
  52. }
  53. rt_uint32_t rt_fota_crc(rt_uint8_t *buf, rt_uint32_t len)
  54. {
  55. rt_uint32_t crc_init = 0xffffffff;
  56. crc_init = crc32(crc_init, buf, len) ^ 0xffffffff;
  57. return crc_init;
  58. }
  59. rt_uint32_t rt_fota_step_crc(rt_uint32_t crc, rt_uint8_t *buf, rt_uint32_t len)
  60. {
  61. return crc32(crc, buf, len);
  62. }
  63. int rt_fota_crc_init(void)
  64. {
  65. #define POLYNOMIAL 0x04c11db7
  66. crc32_init(POLYNOMIAL);
  67. return RT_EOK;
  68. }
  69. INIT_PREV_EXPORT(rt_fota_crc_init);