diff options
author | Evan Lojewski <github@meklort.com> | 2019-02-09 16:40:57 -0700 |
---|---|---|
committer | Evan Lojewski <github@meklort.com> | 2019-02-09 16:40:57 -0700 |
commit | c9ff2c0b1ca53e3c4a199da7e4804499c88bdbae (patch) | |
tree | f1e75582aa82767bd32382af41e0a3a914a453a4 /libs | |
parent | c7abbe964d09a0c744da30bf26214781b9d814dc (diff) | |
download | bcm5719-ortega-c9ff2c0b1ca53e3c4a199da7e4804499c88bdbae.tar.gz bcm5719-ortega-c9ff2c0b1ca53e3c4a199da7e4804499c88bdbae.zip |
Import initial bcm flash tool.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libs/NVRam/CMakeLists.txt | 4 | ||||
-rw-r--r-- | libs/NVRam/crc.c | 65 | ||||
-rw-r--r-- | libs/NVRam/include/NVRam.h | 5 | ||||
-rw-r--r-- | libs/VPD/CMakeLists.txt | 56 | ||||
-rw-r--r-- | libs/VPD/include/vpd.h | 94 | ||||
-rw-r--r-- | libs/VPD/vpd.c | 184 |
7 files changed, 407 insertions, 2 deletions
diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt index e14af56..2352d41 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -45,5 +45,6 @@ add_subdirectory(NVRam) add_subdirectory(MII) +add_subdirectory(VPD) add_subdirectory(bcm5719) diff --git a/libs/NVRam/CMakeLists.txt b/libs/NVRam/CMakeLists.txt index b436fa1..43ad3e9 100644 --- a/libs/NVRam/CMakeLists.txt +++ b/libs/NVRam/CMakeLists.txt @@ -46,12 +46,12 @@ project(NVRam) # Host Simulation library -simulator_add_library(${PROJECT_NAME} STATIC nvm.c) +simulator_add_library(${PROJECT_NAME} STATIC nvm.c crc.c) target_link_libraries(${PROJECT_NAME} PRIVATE simulator) target_include_directories(${PROJECT_NAME} PUBLIC ../../include) target_include_directories(${PROJECT_NAME} PUBLIC include) # MIPS Library -mips_add_library(${PROJECT_NAME}-mips STATIC nvm.c) +mips_add_library(${PROJECT_NAME}-mips STATIC nvm.c crc.c) target_include_directories(${PROJECT_NAME}-mips PUBLIC ../../include) target_include_directories(${PROJECT_NAME}-mips PUBLIC include) diff --git a/libs/NVRam/crc.c b/libs/NVRam/crc.c new file mode 100644 index 0000000..ec4d66e --- /dev/null +++ b/libs/NVRam/crc.c @@ -0,0 +1,65 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file crc.c +/// +/// @project +/// +/// @brief CRC Support Routines +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2018, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the copyright holder nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +#include <NVRam.h> + +#define CRC32_POLYNOMIAL 0xEDB88320 + +uint32_t NVRam_crc ( + uint8_t *pcDatabuf, // Pointer to data buffer + uint32_t ulDatalen, // Length of data buffer in bytes + uint32_t crc) // Initial value +{ + uint8_t data; + uint32_t idx, bit; + for (idx = 0; idx < ulDatalen; idx++) + { + data = *pcDatabuf++; + for (bit = 0; bit < 8; bit++, data >>= 1) + { + crc = (crc >> 1) ^ (((crc ^ data) & 1) ? CRC32_POLYNOMIAL : 0); + } + } + return crc; +} diff --git a/libs/NVRam/include/NVRam.h b/libs/NVRam/include/NVRam.h index cb822df..5f2fcfb 100644 --- a/libs/NVRam/include/NVRam.h +++ b/libs/NVRam/include/NVRam.h @@ -60,4 +60,9 @@ void NVRam_write(uint32_t address, uint32_t* buffer, size_t words); void NVRam_enable(void); void NVRam_disable(void); +uint32_t NVRam_crc( + uint8_t *pcDatabuf, // Pointer to data buffer + uint32_t ulDatalen, // Length of data buffer in bytes + uint32_t crc); // Initial value + #endif /* NVRAM_H */ diff --git a/libs/VPD/CMakeLists.txt b/libs/VPD/CMakeLists.txt new file mode 100644 index 0000000..03a1fcc --- /dev/null +++ b/libs/VPD/CMakeLists.txt @@ -0,0 +1,56 @@ +################################################################################ +### +### @file libs/VPD/CMakeLists.txt +### +### @project +### +### @brief VPD CMake file +### +################################################################################ +### +################################################################################ +### +### @copyright Copyright (c) 2018, Evan Lojewski +### @cond +### +### All rights reserved. +### +### Redistribution and use in source and binary forms, with or without +### modification, are permitted provided that the following conditions are met: +### 1. Redistributions of source code must retain the above copyright notice, +### this list of conditions and the following disclaimer. +### 2. Redistributions in binary form must reproduce the above copyright notice, +### this list of conditions and the following disclaimer in the documentation +### and/or other materials provided with the distribution. +### 3. Neither the name of the copyright holder nor the +### names of its contributors may be used to endorse or promote products +### derived from this software without specific prior written permission. +### +################################################################################ +### +### THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +### AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +### ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +### INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +### CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +### ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +### POSSIBILITY OF SUCH DAMAGE. +### @endcond +################################################################################ + +project(VPD) + + +# Host Simulation library +simulator_add_library(${PROJECT_NAME} STATIC vpd.c) +target_include_directories(${PROJECT_NAME} PUBLIC ../../include) +target_include_directories(${PROJECT_NAME} PUBLIC include) + +# MIPS Library +mips_add_library(${PROJECT_NAME}-mips STATIC vpd.c) +target_include_directories(${PROJECT_NAME}-mips PUBLIC ../../include) +target_include_directories(${PROJECT_NAME}-mips PUBLIC include) diff --git a/libs/VPD/include/vpd.h b/libs/VPD/include/vpd.h new file mode 100644 index 0000000..3b266f7 --- /dev/null +++ b/libs/VPD/include/vpd.h @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file vpd.c +/// +/// @project +/// +/// @brief VPD Support Routines +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2018, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the copyright holder nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +#include <stdint.h> +#include <stdbool.h> +#include <stddef.h> + +#define VPD_DATA_TYPE_SMALL (0x00) +#define VPD_DATA_TYPE_LARGE (0x01) +#define VPD_TAG_IDENTIFIER (0x02) +#define VPD_TAG_END (0x0F) +#define VPD_TAG_VPD_R (0x10) +#define VPD_TAG_VPD_W (0x11) +typedef union { + struct { + uint8_t bytes:3; + uint8_t tag:4; + uint8_t type:1; + } small; + struct { + uint8_t tag:7; + uint8_t type:1; + } large; + uint8_t data; +} vpd_resource_typet_t; + +typedef struct { + uint16_t name; + uint8_t length; + uint8_t data; +} __attribute__((packed)) vpd_field_t; + +typedef union { + uint8_t bytes[0x100]; +} vpd_t; + + +#define VPD_PRODUCT_NAME "PN" +#define VPD_ENGINEERING_CHANGE "EC" +#define VPD_SERIAL_NUMBER "SN" +#define VPD_MANUFACTURING_ID "MN" +#define VPD_VENDOR_SPECIFIC_0 "V0" +#define VPD_CHECKSUM "RV" + +const char* vpd_get_field_name(uint16_t field); + + +uint8_t* vpd_get_identifier(uint8_t *buffer, size_t *len); +uint8_t* vpd_get_resource_by_name(uint8_t* buffer, size_t* len, uint16_t name); +uint8_t* vpd_get_resource_by_index(uint8_t* buffer, size_t* len, uint16_t* name, size_t index); +bool vpd_set_resource(uint8_t* buffer, size_t len, uint16_t resource, uint8_t* add_data, size_t add_len); +bool vpd_is_valid(uint8_t* buffer, size_t len); + diff --git a/libs/VPD/vpd.c b/libs/VPD/vpd.c new file mode 100644 index 0000000..04a4ad6 --- /dev/null +++ b/libs/VPD/vpd.c @@ -0,0 +1,184 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file vpd.c +/// +/// @project +/// +/// @brief VPD Support Routines +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2018, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the copyright holder nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +#include <vpd.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#include <stdio.h> + + +typedef struct { + const char* name; + const char* string; +} vpd_name_entry_t; + + +vpd_name_entry_t mNames[] = +{ + {.name = VPD_PRODUCT_NAME, .string = "Product Name"}, + {.name = VPD_ENGINEERING_CHANGE, .string = "Engineering Change"}, + {.name = VPD_SERIAL_NUMBER, .string = "Serial Number"}, + {.name = VPD_MANUFACTURING_ID, .string = "Manufacturer ID"}, + {.name = VPD_CHECKSUM, .string = "Checksum"}, +}; + +bool vpd_is_checksum(uint16_t field) +{ + if(0 == strncmp(VPD_CHECKSUM, (const char*)&field, 2)) + { + return true; + } + return false; +} +const char* vpd_get_field_name(uint16_t field) +{ + for(int i = 0; i < sizeof(mNames)/sizeof(mNames[0]); i++) + { + if(0 == strncmp(mNames[i].name, (const char*)&field, 2)) + { + return mNames[i].string; + } + } + + printf("Unknown %c%c\n", field, field >> 8); + return NULL; +} + +static uint8_t* get_next_tag(uint8_t* buffer, size_t *len) +{ + if(!len) return NULL; + + uint16_t tag_len = 0; + vpd_resource_typet_t b0 = {.data = buffer[0]}; + if(VPD_DATA_TYPE_LARGE == b0.large.type) + { + + tag_len = 3; + tag_len += buffer[1] | buffer[2] << 8; + } + else + { + tag_len = 1; + tag_len += b0.small.bytes; + } + + *len -= tag_len; + return &buffer[tag_len]; +} + +static uint8_t* get_tag_data(uint8_t* buffer, size_t *len) +{ + if(!len) return NULL; + + vpd_resource_typet_t b0 = {.data = buffer[0]}; + if(VPD_DATA_TYPE_LARGE == b0.large.type) + { + *len = buffer[1] | buffer[2] << 8; + return &buffer[3]; + } + else + { + *len = b0.small.bytes; + return &buffer[1]; + } +} + +uint8_t* vpd_get_resource_by_name(uint8_t *buffer, size_t *len, uint16_t type) +{ + return NULL; +} +uint8_t* vpd_get_resource_by_index(uint8_t *buffer, size_t *len, uint16_t *name, size_t index) +{ + index++; + size_t new_len = *len; + uint8_t *new_buf = get_next_tag(buffer, &new_len); + new_buf = get_tag_data(new_buf, &new_len); + + vpd_field_t* field; + do + { + field = (vpd_field_t*)new_buf; + + char* data = (char*)malloc(field->length + 1); + memcpy(data, &field->data, field->length); + data[field->length] = 0; + + new_buf += field->length; + new_buf += 3; + + index--; + if(index && vpd_is_checksum(field->name)) + { + // last entry found, but we requested more. + return NULL; + } + } while(index); + + *name = field->name; + *len = field->length; + return &field->data; +} +bool vpd_set_resource(uint8_t *buffer, size_t len, uint16_t resource, uint8_t *add_data, size_t add_len) +{ + return false; +} +bool vpd_is_valid(uint8_t* buffer, size_t len) +{ + if(!len) return false; + + if(!vpd_get_identifier(buffer, &len)) return false; + + // TODO: check checksum. + return true; +} + +uint8_t* vpd_get_identifier(uint8_t* buffer, size_t* len) +{ + if(!len) return NULL; + + + return get_tag_data(buffer, len); +} |