Trying to replicate a CRC made with ielftool in srec_cat

907 views Asked by At

So I'm trying to figure out a way to calculate a CRC with srec_cat before putting the code on a microcontroller. Right now, my post-build script uses the ielftool from IAR to do the calculation and insert it into the correct spot in the hex file.

I'm wondering how I can produce the same CRC with srec_cat, using the same hex file of course.

Here is the ielftool command that produces the CRC32 that I want to replicate:

--checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060000-0x081fffff

  • APP_SYS_ApplactionCrc is the symbol where the checksum will be stored with a 4 byte offset added
  • crc32is the algorithm
  • 1 specifies one’s complement
  • m reverses the input bytes and the final checksum
  • i initializes the checksum value with the start value
  • 0xffffffff is the start value
  • And finally, 0x08060000-0x081fffff is the memory range for which the checksum will be calculated

I've tried a lot of things, but this, I think, is the closest I've gotten to the same command so far with srec_cat:

-crop 0x08060000 0x081ffffc -Bit_Reverse -crc32_b_e 0x081ffffc -CCITT -Bit_Reverse

  • -crop 0x08060000 0x081ffffc In a way specifies the memory range for which the CRC will be calculated
  • -Bit_Reverse should do the same thing as m in the ielftool when put in the right spot
  • -crc32_b_e is the algorithm. (I'm not sure yet if I need big endian _b_e or little endian _l_e)
  • 0x081ffffc is the location in memory to place the CRC
  • -CCITT The initial seed (start value in ielftool) is all one bits (it's the default, but I figured I'd throw it in there)

Does anyone have ideas of how I can replicate the ielftool's CRC? Or am I just trying in vain?

I'm new to CRCs and don't know much more than the basics. Does it even matter anyway if I have exactly the same algorithm? Won't the CRC still work when I put the code on a board?

Note: I'm currently using ielftool 10.8.3.1326 and srec_cat 1.63

1

There are 1 answers

0
Scott Madeux On BEST ANSWER

After many days of trying to figure out how to get the CRCs from each tool to match (and to make sure I was giving both tools the same data), I finally found a solution.

Based on Mark Adler's comment above I was trying to figure out how to get the CRC of a small amount of data such as an unsigned int. I finally had a lightbulb moment this morning and I realized that I simply needed to put a uint32_t with the value 123456789 in the code for the project I was already work on. Then I would place the variable at a specific location in memory using:

#pragma location=0x08060188
__root const uint32_t CRC_Data_Test = 123456789; //IAR specific pragma and keyword

This way I knew the variable location and length so could then tell the ielftool and srec_cat to only calculate the CRC over the area of that variable in memory.

I then took the elf file from the compiled project and created an intel hex file, so I could more easily look and make sure the correct variable data was at the correct address.

Next I sent the elf file through ielftool with this command:

ielftool proj.elf --checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060188-0x0806018b proj.elf

And I sent the hex file through srec_cat with this command:

srec_cat proj.hex -intel -crop 0x08060188 0x0806018c -crc32_b_e 0x081ffffc -o proj_srec.hex -intel

After converting the elf with the CRC to a hex file and comparing two hex files I saw that the CRCs were very similar. The only difference was the endianness. Changing -crc32_b_e to -crc32_l_e got both tools to give me 9E 6C DF 18 as the CRC.

I then changed the memory address ranges for the CRC calculation to what they originally were (see the question) and I once again got the same CRC with both ielftool and srec_cat.