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.
- 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.
$ 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:
- Run with
sudo
to install pyIMX and dependencies globally - Specify the
--user
option to install locally into your home directory (export "~/.local/bin" into PATH variable if haven't). - Run the command in a virtualenv local to a specific project working set.
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 into/etc/udev/rules.d
directory and reload it with command:sudo udevadm control --reload-rules
.
- 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