Skip to main content

Open Source library for easy development with i.MX platform

Project description

Build Status Coverage Status PyPI Status Python Version

This repository collects a useful tools and python module targeted for i.MX Applications Processors.

What is implemented:

  • DCD (Device Configuration Data) API

  • Boot Image v2 (i.MX6 and i.MX7) API

  • Boot Image v3 (i.MX8QM-A0 and i.MX8QXP-A0) API

  • SDP (Serial Download Protocol) API - only USB interface

  • HAB-Log parser (only i.MX6 and i.MX7 yet)

  • SRK Table API

Embedded tools:

  • imxim - a tool for manipulation with *.imx boot image

  • imxsd - a tool to download and execute code on i.MX SoCs through the Serial Download Protocol (SDP)

    This project is still in developing phase. Please, test it and report founded issues.

Dependencies

  • Python - Python 3.x interpreter

  • Click - Python package for creating beautiful command line interface.

  • pyYAML - YAML parser and emitter for the Python programming language.

  • bincopy - Python package for parsing S-Record, Intel HEX and TI-TXT files.

  • easy_enum - User friendly implementation of documented Enum type for Python language.

  • cryptography - Provides cryptographic recipes and primitives to Python developers

  • PyUSB - Python package to access USB devices in Linux OS.

  • PyWinUSB - Python package that simplifies USB-HID communications on Windows OS.

Installation

$ pip install imx

To install the latest version from master branch execute in shell following commands:

$ pip install -r https://raw.githubusercontent.com/molejar/pyIMX/master/requirements.txt
$ pip install -U https://github.com/molejar/pyIMX/archive/master.zip

In case of development, install pyIMX from sources:

$ git clone https://github.com/molejar/pyIMX.git
$ cd pyIMX
$ pip install -r requirements.txt
$ pip install -U -e .

You may run into a permissions issues running these commands. Here are a few options how to fix it:

  1. Run with sudo to install pyIMX and dependencies globally

  2. Specify the --user option to install locally into your home directory (export “~/.local/bin” into PATH variable if haven’t).

  3. Run the command in a virtualenv local to a specific project working set.

Usage

In following example is demonstrated the simplicity of usage i.MX boot image API covered by imx.img module:

from imx import img

# --------------------------------------------------------------------------------
# Create new U-Boot i.MX6/7 image
# --------------------------------------------------------------------------------

# Create DCD segment instance
dcd = img.SegDCD()

# Create Write Data command and append values with addresses
cmd = img.CmdWriteData(4, img.EnumWriteOps.WRITE_VALUE)
cmd.append(0x30340004, 0x4F400005)
cmd.append(0x30391000, 0x00000002)
cmd.append(0x307A0000, 0x01040001)

# Append commands into DCD segment
dcd.append(cmd)
dcd.append(img.CmdCheckData(4, img.EnumCheckOps.ANY_CLEAR, 0x307900C4, 0x00000001))

# Open U-Boot raw image
with open('u-boot.img', 'rb') as f:
    app = f.read()

# Create IMX U-Boot image with DCD segment
image = img.BootImg2(0x877FF000, app, dcd)

# Print image info
print(image)

# Save IMX U-Boot image
with open('u-boot.imx', 'wb') as f:
    f.write(image.export())

# --------------------------------------------------------------------------------
# Extract DCD from existing U-Boot i.MX6/7 image
# --------------------------------------------------------------------------------

# Open U-Boot IMX image
with open('u-boot.imx', 'rb') as f:
    data = f.read()

# Parse U-Boot IMX image
image = img.BootImg2.parse(data)

# Extract DCD from U-Boot IMX image
dcd = image.dcd

# Print extracted DCD info
print(dcd)

# Save extracted DCD content as raw image
with open('dcd.img', 'wb') as f:
    f.write(dcd.export())

# Save extracted DCD content as readable text file
with open('dcd.txt', 'w') as f:
    f.write(dcd.store())

Second example demonstrate usage of i.MX serial downloader protocol API covered by imx.sdp module:

    from imx import sdp

    # scan for connected USB devs
    devs = sdp.scan_usb()

    if devs:
        # Print list of connected devices
        for i, dev in enumerate(devs):
            print("{}) {}".format(i, dev.usbd.info()))

        # Connect to first i.MX device
        flasher = devs[0]
        flasher.open()

        # Read data from i.MX Device (i.MX7D OCRAM)
        data = flasher.read(0x910000, 100, 8)

        # Write boot image data into i.MX Device (i.MX7D OCRAM)
        flasher.write_file(0x910000, data)

        # Other commands
        # ...

        # Disconnect IMX Device
        flasher.close()

For running ``imx.sdp`` module without root privileges in Linux OS
copy attached udev rules
`90-imx-sdp.rules <https://github.com/molejar/pyIMX/blob/master/udev/90-imx-sdp.rules>`__
into ``/etc/udev/rules.d`` directory and reload it with command:
``sudo udevadm control --reload-rules``.

TODO

  • Add serial interface support for imx.sdp module

  • Add image security features (sign and encryption)

  • Add eFuses read, write and validation functionality

  • Add HAB-log parser for i.MX-RT and i.MX8 devices

  • Add support for QSPI Flash image

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page