1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2021 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <stdint.h> 9*91f16700Schasinglulu #include <stdio.h> 10*91f16700Schasinglulu #include <stdlib.h> 11*91f16700Schasinglulu #include <string.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <getopt.h> 14*91f16700Schasinglulu #include <unistd.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #define NUM_MEM_BLOCK 1 17*91f16700Schasinglulu #define FOUR_BYTE_ALIGN 4 18*91f16700Schasinglulu #define EIGHT_BYTE_ALIGN 8 19*91f16700Schasinglulu #define SIZE_TWO_PBL_CMD 24 20*91f16700Schasinglulu 21*91f16700Schasinglulu #define SUCCESS 0 22*91f16700Schasinglulu #define FAILURE -1 23*91f16700Schasinglulu #define BYTE_SWAP_32(word) ((((word) & 0xff000000) >> 24)| \ 24*91f16700Schasinglulu (((word) & 0x00ff0000) >> 8) | \ 25*91f16700Schasinglulu (((word) & 0x0000ff00) << 8) | \ 26*91f16700Schasinglulu (((word) & 0x000000ff) << 24)) 27*91f16700Schasinglulu 28*91f16700Schasinglulu 29*91f16700Schasinglulu /* 30*91f16700Schasinglulu * Returns: 31*91f16700Schasinglulu * SUCCESS, on successful byte swapping. 32*91f16700Schasinglulu * FAILURE, on failure. 33*91f16700Schasinglulu */ 34*91f16700Schasinglulu int do_byteswap(FILE *fp) 35*91f16700Schasinglulu { 36*91f16700Schasinglulu int bytes = 0; 37*91f16700Schasinglulu uint32_t upper_byte; 38*91f16700Schasinglulu uint32_t lower_byte; 39*91f16700Schasinglulu uint32_t pad = 0U; 40*91f16700Schasinglulu /* Carries number of Padding bytes to be appended to 41*91f16700Schasinglulu * make file size 8 byte aligned. 42*91f16700Schasinglulu */ 43*91f16700Schasinglulu int append_bytes; 44*91f16700Schasinglulu int ret = FAILURE; 45*91f16700Schasinglulu 46*91f16700Schasinglulu fseek(fp, 0L, SEEK_END); 47*91f16700Schasinglulu bytes = ftell(fp); 48*91f16700Schasinglulu 49*91f16700Schasinglulu append_bytes = EIGHT_BYTE_ALIGN - (bytes % EIGHT_BYTE_ALIGN); 50*91f16700Schasinglulu if (append_bytes != 0) { 51*91f16700Schasinglulu if (fwrite(&pad, append_bytes, NUM_MEM_BLOCK, fp) 52*91f16700Schasinglulu != NUM_MEM_BLOCK) { 53*91f16700Schasinglulu printf("%s: Error in appending padding bytes.\n", 54*91f16700Schasinglulu __func__); 55*91f16700Schasinglulu goto byteswap_err; 56*91f16700Schasinglulu } 57*91f16700Schasinglulu bytes += append_bytes; 58*91f16700Schasinglulu } 59*91f16700Schasinglulu 60*91f16700Schasinglulu rewind(fp); 61*91f16700Schasinglulu while (bytes > 0) { 62*91f16700Schasinglulu if ((fread(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp) 63*91f16700Schasinglulu != NUM_MEM_BLOCK) && (feof(fp) == 0)) { 64*91f16700Schasinglulu printf("%s: Error reading upper bytes.\n", __func__); 65*91f16700Schasinglulu goto byteswap_err; 66*91f16700Schasinglulu } 67*91f16700Schasinglulu if ((fread(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp) 68*91f16700Schasinglulu != NUM_MEM_BLOCK) && (feof(fp) == 0)) { 69*91f16700Schasinglulu printf("%s: Error reading lower bytes.\n", __func__); 70*91f16700Schasinglulu goto byteswap_err; 71*91f16700Schasinglulu } 72*91f16700Schasinglulu fseek(fp, -8L, SEEK_CUR); 73*91f16700Schasinglulu upper_byte = BYTE_SWAP_32(upper_byte); 74*91f16700Schasinglulu lower_byte = BYTE_SWAP_32(lower_byte); 75*91f16700Schasinglulu if (fwrite(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp) 76*91f16700Schasinglulu != NUM_MEM_BLOCK) { 77*91f16700Schasinglulu printf("%s: Error writing lower bytes.\n", __func__); 78*91f16700Schasinglulu goto byteswap_err; 79*91f16700Schasinglulu } 80*91f16700Schasinglulu if (fwrite(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp) 81*91f16700Schasinglulu != NUM_MEM_BLOCK) { 82*91f16700Schasinglulu printf("%s: Error writing upper bytes.\n", __func__); 83*91f16700Schasinglulu goto byteswap_err; 84*91f16700Schasinglulu } 85*91f16700Schasinglulu bytes -= EIGHT_BYTE_ALIGN; 86*91f16700Schasinglulu } 87*91f16700Schasinglulu ret = SUCCESS; 88*91f16700Schasinglulu 89*91f16700Schasinglulu byteswap_err: 90*91f16700Schasinglulu return ret; 91*91f16700Schasinglulu } 92*91f16700Schasinglulu 93*91f16700Schasinglulu int main(int argc, char **argv) 94*91f16700Schasinglulu { 95*91f16700Schasinglulu FILE *fp = NULL; 96*91f16700Schasinglulu int ret = 0; 97*91f16700Schasinglulu 98*91f16700Schasinglulu if (argc > 2) { 99*91f16700Schasinglulu printf("Usage format is byteswap <filename>"); 100*91f16700Schasinglulu return -1; 101*91f16700Schasinglulu } 102*91f16700Schasinglulu 103*91f16700Schasinglulu fp = fopen(argv[1], "rb+"); 104*91f16700Schasinglulu if (fp == NULL) { 105*91f16700Schasinglulu printf("%s: Error opening the input file: %s\n", 106*91f16700Schasinglulu __func__, argv[1]); 107*91f16700Schasinglulu return -1; 108*91f16700Schasinglulu } 109*91f16700Schasinglulu 110*91f16700Schasinglulu ret = do_byteswap(fp); 111*91f16700Schasinglulu fclose(fp); 112*91f16700Schasinglulu return ret; 113*91f16700Schasinglulu } 114