/* Report the IWLWIFI firmware image version Copyright 2015 TJ Licenced on the terms of the GNU General Public Licence version 3 compile using: gcc -o iwlwifi_fw_version iwlwifi_fw_version.c run using: ./iwlwifi_fw_version e.g: ./iwlwifi_fw_version /lib/firmware/iwlwifi-7260-10.ucode Type: TLV Version 23.15.10.0 /lib/firmware/iwlwifi-7260-10.ucode */ #include #include #include #include #include #include #define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24) #define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16) #define IWL_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8) #define IWL_UCODE_SERIAL(ver) ((ver) & 0x000000FF) int main (int argc, char **argv, char **env) { int result = 0; int fd = -1; unsigned int ver = 0; ssize_t qty = 0; off_t pos = 0; if (argc < 2 || (fd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "%s\n", "Please provide correct path/to/firmware"); return 1; } qty = read(fd, (void *)&ver, 4); if (ver == 0) { pos =lseek(fd, 0x48, SEEK_SET); qty = read(fd, (void *)&ver, 4); } printf("Version %d.%d.%d.%d Type %s %s\n", IWL_UCODE_MAJOR(ver), IWL_UCODE_MINOR(ver), IWL_UCODE_API(ver), IWL_UCODE_SERIAL(ver), pos > 4 ? "TLV" : "V1/V2", argv[1] ); close(fd); return result; }