/hex2cyacd

Primary LanguageMakefile

Convert Intel format hex file to Cypress format bootloadable .cyacd file.

.cyacd file format:
    [4-byte SiliconID][1-byte SiliconRev][checksum type]
    The data records have the format:
    [1-byte ArrayID][2-byte RowNumber][2-byte DataLength][N-byte Data][1byte Checksum]
    The Checksum is computed by summing all bytes (excluding the checksum itself) and then taking the 2's complement.

eg:
    Line 518   : ":0200000490600A"
    Recordstart: ":"
    Byte Count : 0x02
    Address    : 0x0000
    Record Type: 0x04
    Data       : "9060" : 0x90 0x60
    Checksum   : 0x0A
    Checksum   
    Calculation: 0x0A = 0x100 ­ (0x02+0x00+0x00+0x04+0x90+0x60)

Fraction of Makefile showing the usage:

    hex:
    	arm-none-eabi-objcopy --gap-fill 0x00 -O ihex -v CY8CKIT-049-41XX_GPIO_Example.org.elf CY8CKIT-049-41XX_GPIO_Example.hex

    BOOTLOADER=./UART_Bootloader.elf
    TSIZE=$(shell arm-none-eabi-size $(BOOTLOADER) | grep $(notdir $(BOOTLOADER)) | awk '{ print $$1 }')
    cyacd:
    	-rm -f CY8CKIT-049-41XX_GPIO_Example_new.cyacd
    	perl ../../hex2cyacd/ihex2cyacd.pl $(TSIZE) 128 CY8CKIT-049-41XX_GPIO_Example.hex CY8CKIT-049-41XX_GPIO_Example_new.cyacd
    	diff CY8CKIT-049-41XX_GPIO_Example_new.cyacd CY8CKIT-049-41XX_GPIO_Example.org.cyacd
    	diff --strip-trailing-cr CY8CKIT-049-41XX_GPIO_Example_new.cyacd CY8CKIT-049-41XX_GPIO_Example.org.cyacd
    flash:
    	../../cybootload_linux/cybootload_linux CY8CKIT-049-41XX_GPIO_Example_new.cyacd

See also makefiles in cysample.linux.

Procedure:
New version now skips bytes corresponding to the bootloader, packs the reset into 128 bytes and ignores if all are zero. 

Intially this was how it all started: 
( later multiple lines were combined, and finally simpler byte packing. I guess this can 
further be simplified into few lines of perl code! : 
	pack all data, skip bootheader, unpack into 128 each, skip if 0s
)

use arm-none-eabi-size to determine text size

    arm-none-eabi-size --format=Berkeley Bootloadable\ Blinking\ LED.elf
    text    data     bss     dec     hex filename
    6464      24    1512    8000    1f40 Bootloadable Blinking LED.elf
Number of rows:
    arm-none-eabi-size --format=Berkeley UART_Bootloader.elf 
    text    data     bss     dec     hex filename
    4456      32    1672    6160    1810 UART_Bootloader.elf

Conversion:
    Bootloader size  = 4456/128 = 34 = 0x22. 
    So skip 34*2 line, ie lines 0-((34*2)-1) lines, since hex file has 64 byte size lines.
    Combine data from next odd and even lines to from combined data. So for every two lines in .hex file ( after the skip), there will be one line in .cyacd. See ihex2cyacd.pl for more details. 
    Row number is incremented for every odd-even line combination after the skip, whose data length is 0x40. 
    Repeat this for every line which has data length of 0x40, and combined data from odd and even lines are not "0". But keep row number incrementing for "0"s lines.
    
update:
	Now takes byte count from first line of hex file and uses that to find out number of lines to combine etc.
	test targets: 
		test1 CY8CKIT-049-41XX_GPIO_Example
		test2 CY8CKIT-049-41XX_PWM_Example
		test3 CY8CKIT-049-41XX_UART_Example
		test4 test/Bootloadable Blinking LED
		test5 test/test, elf from compile on linux ( ../cysample.linux )

update: tests renamed again, test_gpio, test_pwm, test_uart etc.

seems like cyelftool.exe modifies elf file generated by arm-none-eabi tools,
and once file is modified by cyelftool.exe, arm-none-eabi-objcopy generated
.hex files are ready for use by ihex2cyacd.pl. see diff.txt, diff.as files 
for the output from arm-none-eabi-objdump -D ouput before and after 
modification by cyelftool.exe.