crcgen-new.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <inttypes.h>
  6. #include <string.h>
  7. #define lo8(x) (x & 0xFF)
  8. #define hi8(x) ((x >> 8) & 0xFF)
  9. #define xhi8(x) ((x >> 16) & 0xff)
  10. #define xxhi8(x) ((x >> 24) & 0xff)
  11. unsigned short crc_ccitt_update (uint16_t crc, uint8_t data)
  12. {
  13. data ^= lo8 (crc);
  14. data ^= data << 4;
  15. return ((((uint16_t)data << 8) | hi8 (crc)) ^ (uint8_t)(data >> 4) ^ ((uint16_t)data << 3));
  16. }
  17. int main(int argc, char *argv[]) {
  18. if (argc != 5) {
  19. printf("Usage: crcgen <filename> <length> <signature> <version>\r\n");
  20. return 1;
  21. }
  22. unsigned long length = strtol(argv[2],NULL,0);
  23. unsigned long devid = strtol(argv[3],NULL,0);
  24. unsigned long version = strtol(argv[4],NULL,0);
  25. if (length > length+8) {
  26. printf("Ha ha, very funny.\n");
  27. return 1;
  28. }
  29. uint8_t *data = malloc(length+8);
  30. if (!data) {
  31. perror("malloc");
  32. return 1;
  33. }
  34. memset(data, 0xff, length);
  35. FILE *f;
  36. f = fopen(argv[1], "rb+");
  37. if (f == 0) {
  38. printf("Unable to open file %s\r\n", argv[1]);
  39. return 1;
  40. }
  41. fread(data, 1, length, f);
  42. data[length-8] = lo8(devid);
  43. data[length-7] = hi8(devid);
  44. data[length-6] = xhi8(devid);
  45. data[length-5] = xxhi8(devid);
  46. data[length-4] = lo8(version);
  47. data[length-3] = hi8(version);
  48. unsigned long l;
  49. unsigned short crc = 0xFFFF;
  50. for (l=0; l < length-2; l++)
  51. crc = crc_ccitt_update(crc, data[l]);
  52. data[length-2] = lo8(crc);
  53. data[length-1] = hi8(crc);
  54. if (fseek(f, 0, SEEK_SET)) {
  55. perror("fseek");
  56. return 1;
  57. }
  58. if (fwrite(data, length, 1, f) != 1) {
  59. perror("fwrite");
  60. return 1;
  61. }
  62. fclose(f);
  63. return 0;
  64. }