You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.8 KiB
Python
119 lines
4.8 KiB
Python
1 year ago
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
#############################################################
|
||
|
# Adapted in part from linux-source-3.2/drivers/mtd/ubi/ubi-media.h
|
||
|
# for use in Python.
|
||
|
# Oct. 2013 by Jason Pruitt
|
||
|
#
|
||
|
# Original copyright notice.
|
||
|
# --------------------------
|
||
|
#
|
||
|
# Copyright (c) International Business Machines Corp., 2006
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation; either version 2 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||
|
# the GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program; if not, write to the Free Software
|
||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
#
|
||
|
# Authors: Artem Bityutskiy (Битюцкий Артём)
|
||
|
# Thomas Gleixner
|
||
|
# Frank Haverkamp
|
||
|
# Oliver Lohmann
|
||
|
# Andreas Arnez
|
||
|
#
|
||
|
#############################################################
|
||
|
|
||
|
import struct
|
||
|
|
||
|
# Magic number
|
||
|
UBI_EC_HDR_MAGIC = b'\x55\x42\x49\x23'
|
||
|
|
||
|
# Initial CRC32 checksum value.
|
||
|
UBI_CRC32_INIT = 4294967295 #0xFFFFFFFF
|
||
|
|
||
|
# Max number of volumes allowed.
|
||
|
UBI_MAX_VOLUMES = 128
|
||
|
|
||
|
# Internal Volume ID start.
|
||
|
UBI_INTERNAL_VOL_START = 2147479551
|
||
|
|
||
|
# Error Count header.
|
||
|
EC_HDR_FORMAT = '>4sB3sQIII32sI'
|
||
|
EC_HDR_FIELDS = ['magic', # Magic string UBI#
|
||
|
'version', # UBI version meant to accept this image.
|
||
|
'padding', # Reserved for future, zeros.
|
||
|
'ec', # Erase counter
|
||
|
'vid_hdr_offset', # Where the VID header starts.
|
||
|
'data_offset', # Where user data starts.
|
||
|
'image_seq', # Image sequence number
|
||
|
'padding2', # Reserved for future, zeros.
|
||
|
'hdr_crc'] # EC header crc32 checksum.
|
||
|
|
||
|
|
||
|
UBI_EC_HDR_SZ = struct.calcsize(EC_HDR_FORMAT) # 64
|
||
|
|
||
|
# Volume ID header.
|
||
|
UBI_VID_HDR_MAGIC =b'\x55\x42\x49\x21' # UBI!
|
||
|
VID_HDR_FORMAT = '>4sBBBBII4sIIII4sQ12sI'
|
||
|
VID_HDR_FIELDS = ['magic', # Magic string UBI!
|
||
|
'version', # UBI version meant to accept this image.
|
||
|
'vol_type', # Volume type, Dynamic/Static
|
||
|
'copy_flag', # If this is a copied PEB b/c of wear leveling.
|
||
|
'compat', # Compatibility of this volume UBI_COMPAT_*
|
||
|
'vol_id', # ID of this volume.
|
||
|
'lnum', # LEB number.
|
||
|
'padding', # Reserved for future, zeros.
|
||
|
'data_size', # How many bytes of data this contains.
|
||
|
# Used for static types only.
|
||
|
'used_ebs', # Total num of used LEBs in this volume.
|
||
|
'data_pad', # How many bytes at end of LEB are not used.
|
||
|
'data_crc', # CRC32 checksum of data, static type only.
|
||
|
'padding2', # Reserved for future, zeros.
|
||
|
'sqnum', # Sequence number.
|
||
|
'padding3', # Reserved for future, zeros.
|
||
|
'hdr_crc'] # VID header CRC32 checksum.
|
||
|
|
||
|
|
||
|
UBI_VID_HDR_SZ = struct.calcsize(VID_HDR_FORMAT) # 64
|
||
|
|
||
|
# Volume table records.
|
||
|
VTBL_REC_FORMAT = '>IIIBBH128sB23sI'
|
||
|
VTBL_REC_FIELDS = ['reserved_pebs', # How many PEBs reserved for this volume.
|
||
|
'alignment', # Volume alignment.
|
||
|
'data_pad', # Number of unused bytes at end of PEB.
|
||
|
'vol_type', # Volume type, static/dynamic.
|
||
|
'upd_marker', # If vol update started but not finished.
|
||
|
'name_len', # Length of name.
|
||
|
'name', # Volume name.
|
||
|
'flags', # Volume flags
|
||
|
'padding', # Reserved for future, zeros.
|
||
|
'crc'] # Vol record CRC32 checksum.
|
||
|
|
||
|
|
||
|
UBI_VTBL_REC_SZ = struct.calcsize(VTBL_REC_FORMAT) # 172
|
||
|
|
||
|
# Volume Identifier Header
|
||
|
UBI_VID_DYNAMIC = 1 # Volume can be resized.
|
||
|
UBI_VID_STATIC = 2 # Volume can not be resized.
|
||
|
PRINT_VOL_TYPE_LIST = [0, 'dynamic', 'static']
|
||
|
|
||
|
# Volume table record
|
||
|
UBI_VTBL_AUTORESIZE_FLG = 1
|
||
|
|
||
|
UBI_COMPAT_DELETE = 1 # Delete this internal volume before anything written.
|
||
|
UBI_COMPAT_RO = 2 # Attach this device in read-only mode.
|
||
|
UBI_COMPAT_PRESERVE = 4 # Preserve this internal volume - touch nothing.
|
||
|
UBI_COMPAT_REJECT = 5 # Reject this UBI image
|
||
|
PRINT_COMPAT_LIST = [0, 'Delete', 'Read Only', 0, 'Preserve', 'Reject']
|
||
|
|
||
|
# File chunk size for reads.
|
||
|
FILE_CHUNK_SZ = 5 * 1024 * 1024
|