I think you misunderstand the difference between iMX6 IVT offset 0x400 and uboot building offset 0x400.
Firstly.iMX6 only can support booting device with specified offset (device type dependant, e.g eMMC is 0x400).
Secondly,FSL uboot building generated an extra 0x400 dummy padding bytes before IVT offset.
Unfortunately,MFG tool and fastboot only support flashing pure content (with out padding bytes). So we have to
cut off padding bytes from generated u-boot.bin.
For fastboot what I often used to debugging,I add a patch to support u-boot.bin with padding bytes or not). You can
touch it as a refer. This patch will check this is padding uboot or not and flash to proper offset of booting device.
//only apply for SD/MMC boot device
static void patch_on_bootloader(char* source,char* dest,char *length){
unsigned char* source_buf=simple_strtoul(source, NULL, 16);
unsigned int dest_start = simple_strtoul(dest, NULL, 16);
int no_padding=0;
//dest normally pointer to dest device partition start sector
if(source_buf){
//check if there is padding of source image
if((source_buf[0]==0xD1)&&((source_buf[3]==0x40)||
(source_buf[3]==0x41)))
no_padding=1;
}
//we should change dest for padding or not
if(dest_start){
//should step on padding bytes
if(!no_padding){
sprintf(source,"0x%x",source_buf+0x400);
}
}else{
if(no_padding){
//jump over dest in 0x200
dest_start+=0x400/MMC_SATA_BLOCK_SIZE;//
sprintf(dest,"0x%x",dest_start);
}
}
//ignore length since it's calculated freely
}