Compare commits

25 Commits

Author SHA1 Message Date
Ben V. Brown
bf55d4bb8b fix release 2024-08-22 12:11:15 +10:00
Ben V. Brown
d695535fd4 TS101 rework for Miniware DFU (#44)
* Refactor output to allow turning hex duplication on/off

* Rough out being able to merge image files & firmware files

* Update output_hex.py

* Update TS101 to require merge

* Remove TS101 from CI

* .

* add py3-intelhex

* Update img2logo.py
2024-08-22 12:08:36 +10:00
Ben V. Brown
853b20eabc rename s60 to s60_s60p 2024-04-10 20:53:08 +10:00
Ivan Zorin
501ac131b8 Miniware firmware (#41)
* Add Miniware firmware for backup & documentation purposes [#1840]

* Add hex files [#1840]
2023-11-22 09:35:59 +11:00
Ivan Zorin
474fc5923b Make -m MODEL argument compatible with the main IronOS project build files & configs (+unify code style a bit) (#40)
* Add model name input argument compatibility with main IronOS project

* Fix var name according to PEP8 / code review
2023-10-27 04:44:33 +00:00
Ben V. Brown
b5e55ee1f1 Update README.md 2023-10-18 21:07:25 +11:00
Federico Di Lorenzo
5ec3a16c3f Add files via upload (#39)
* Add files via upload

* Update README.md
2023-08-21 09:11:45 +10:00
@MJerich MJerich
b313a84e10 new hack_the_planet image (#38)
* added hack_the_planet.png

* changed image url to match in the original repo
2023-08-06 23:03:35 +00:00
Ben V. Brown
3b02e3ea6f Expanding supported devices (#35) 2023-08-01 22:02:03 +10:00
Ben V. Brown
c10a130329 -j to zip 2022-08-21 15:42:15 +10:00
Ben V. Brown
6e9ed602a2 Update release.yml 2022-08-20 23:53:10 +10:00
Ben V. Brown
d39d58d79a Update release.yml 2022-08-20 23:52:26 +10:00
Ben V. Brown
248b2b5806 Test auto release 2022-08-20 23:51:06 +10:00
discip
9eed4b2dd4 removed some redundant entries (#28) 2022-08-20 23:24:59 +10:00
Ben V. Brown
1a5c7ac5f6 Update to generate nicer flipped logo file names (#29)
* Update img2logo.py

* Update img2logo.py
2022-08-20 23:03:45 +10:00
River B
92f4d50a73 add preview images and install instructions (#25)
* Add files via upload

* Create Install_Logo

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md
2022-08-20 11:21:25 +10:00
discip
c252b67c9a updated IronOS.gif (#27) 2022-08-10 11:08:02 +10:00
discip
2dd99ff5aa removed deprecated notes (#26) 2022-08-07 11:56:42 +10:00
Ben V. Brown
bd70b17cd6 Correct rotation for animations 2022-08-06 21:59:46 +10:00
Ben V. Brown
2942212437 Always make normal and flipped 2022-08-06 21:55:41 +10:00
Ben V. Brown
3c62bb7fe1 Remove _L files 2022-08-06 21:40:22 +10:00
Ben V. Brown
32e4db09ac Build flipped images in CI 2022-08-06 21:35:34 +10:00
Ben V. Brown
fbf0a8ac63 Add command line argument to rotate image 180 deg 2022-08-06 21:33:15 +10:00
Ben V. Brown
f4e5717e34 Print what file is being converted 2022-08-06 21:21:18 +10:00
River B
466022c12f Add files via upload (#19)
Adding extra logo's
2022-08-03 19:15:48 +10:00
28 changed files with 13633 additions and 72 deletions

View File

@@ -10,17 +10,18 @@ jobs:
strategy:
matrix:
include:
- args: "-m"
model: "miniware"
- args: "-p"
model: "pinecil"
- model: "miniware"
- model: "pinecilv1"
- model: "pinecilv2"
- model: "mhp30"
- model: "s60"
fail-fast: true
steps:
- name: Install dependencies (apk)
run: apk add --no-cache git python3 py3-pip zlib py3-pillow
run: apk add --no-cache git python3 py3-pip zlib py3-pillow py3-intelhex
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
submodules: true
@@ -28,13 +29,13 @@ jobs:
run: mkdir -p /tmp/${{ matrix.model }}
- name: build all files for the device
run: cd Bootup\ Logos && ./run.sh /tmp/${{ matrix.model }}/ ${{matrix.args}}
run: cd Bootup\ Logos && ./run.sh /tmp/${{ matrix.model }}/ -m ${{matrix.model}}
- name: build logo erase file
run: cd Bootup\ Logos && python3 img2logo.py -E erase_stored_image /tmp/${{ matrix.model }}/ ${{matrix.args}}
run: cd Bootup\ Logos && python3 img2logo.py -E erase_stored_image /tmp/${{ matrix.model }}/ -m ${{matrix.model}}
- name: Archive artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.model }}
path: |

63
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
---
name: "release"
on:
push:
branches:
- "main"
jobs:
release:
name: "Release"
runs-on: "ubuntu-22.04"
steps:
- name: Install dependencies (apk)
run: sudo apt update && sudo apt-get install -y git python3 python3-pillow python3-intelhex
- uses: actions/checkout@v3
with:
submodules: true
- name: prep
run: |
mkdir -p /tmp/pinecilv1 && \
mkdir -p /tmp/pinecilv2 && \
mkdir -p /tmp/miniware && \
mkdir -p /tmp/mhp30 && \
mkdir -p /tmp/s60
- name: build all files for the device
run: |
cd Bootup\ Logos && \
./run.sh /tmp/pinecilv1/ -m pinecilv1 && \
./run.sh /tmp/pinecilv2/ -m pinecilv2 && \
./run.sh /tmp/miniware/ -m miniware && \
./run.sh /tmp/mhp30/ -m mhp30 && \
./run.sh /tmp/s60/ -m s60
- name: build logo erase file
run: |
cd Bootup\ Logos && \
python3 img2logo.py -E erase_stored_image /tmp/pinecilv1/ -m pinecilv1 && \
python3 img2logo.py -E erase_stored_image /tmp/pinecilv2/ -m pinecilv2 && \
python3 img2logo.py -E erase_stored_image /tmp/miniware/ -m miniware && \
python3 img2logo.py -E erase_stored_image /tmp/mhp30/ -m mhp30 && \
python3 img2logo.py -E erase_stored_image /tmp/s60/ -m s60
- name: compress logo files
run: |
zip -rj pinecilv1.zip /tmp/pinecilv1/* && \
zip -rj miniware.zip /tmp/miniware/* && \
zip -rj pinecilv2.zip /tmp/pinecilv2/* && \
zip -rj mhp30.zip /tmp/mhp30/* && \
zip -rj s60_s60p.zip /tmp/s60/*
- uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest"
prerelease: false
title: "Release"
files: |
*.zip

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,3 +1,5 @@
# Boot up Logos
## Boot up logo's are logos or animations shown on boot of IronOS
These are programmed into the device just like the normal firmware.
@@ -33,25 +35,31 @@ This just overwrites individual bytes in the output buffer.
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/arcade_galaga.png)|arcade_galaga.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/arcade_pac_man.png)|arcade_pac_man.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/bender.png)|bender.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/doggie_bone.png)|doggie_bone.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/f1.png)|f1.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/halo_master_chief_helmet.png)|halo_master_chief_helmet.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/horror_vacui_IronOS.png)|horror_vacui_IronOS.png||
|![IronOS](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/IronOS.png)|IronOS.png|lefty-version available|
|![IronOS](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/IronOS.png)|IronOS.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/Logo1b.png)|Logo1b.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/lot_of_tin_is_too_few_tin_IT.png)|lot_of_tin_is_too_few_tin_IT.png|English: "A lot of tin is too few tin"|
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/majorTom.png)|majorTom.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/open_sw_hw_IronOS_logos.png)|open_sw_hw_IronOS_logos.png||
|![Pinecil](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/Pinecil.png)|Pinecil.png|lefty-version available|
|![Pinecil](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/Pinecil.png)|Pinecil.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/science.png)|science.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/skulls.png)|skulls.png||
|![TS100](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS100.png)|TS100.png|lefty-version available|
|![TS80](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS80.png)|TS80.png|lefty-version available|
|![TS80P](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS80P.png)|TS80P.png|lefty-version available|
|![TS100](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS100.png)|TS100.png||
|![TS80](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS80.png)|TS80.png||
|![TS80P](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/TS80P.png)|TS80P.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/wh_40k.png)|wh_40k.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/wwii_kilroy.png)|wwii_kilroy.png||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/hack_the_planet.png)|hack_the_planet.png||
**Animated logos**
|Logo \* |Filename |Note |
|:-------------:|:-------------:|:-----:|
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/CRT_horror_vacui.gif) |CRT_horror_vacui.gif||
|![IronOS](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/IronOS.gif)|IronOS.gif|lefty-version available|
|![IronOS](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/IronOS.gif)|IronOS.gif||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/terminal.gif)|terminal.gif||
|![Alt text](https://github.com/Ralim/IronOS-Meta/blob/main/Bootup%20Logos/Images/hack_the_planet.gif)|hack_the_planet.gif||
_* Click the individual logo to see its animation, if you missed it here._

View File

@@ -4,14 +4,19 @@ from __future__ import division
import argparse
import copy
import os, sys
from typing import Optional
from intelhex import IntelHex
from output_hex import HexOutput
from output_dfu import DFUOutput
try:
from PIL import Image, ImageOps
except ImportError as error:
raise ImportError("{}: {} requres Python Imaging Library (PIL). " "Install with `pip` (pip3 install pillow) or OS-specific package " "management tool.".format(error, sys.argv[0]))
raise ImportError(
"{}: {} requres Python Imaging Library (PIL). "
"Install with `pip` (pip3 install pillow) or OS-specific package "
"management tool.".format(error, sys.argv[0])
)
VERSION_STRING = "1.0"
@@ -22,31 +27,73 @@ LCD_PAGE_SIZE = 1024
DATA_PROGRAMMED_MARKER = 0xAA
FULL_FRAME_MARKER = 0xFF
EMPTY_FRAME_MARKER = 0xFE # If this marker is used to start a frame, the frame is a 0-length delta frame
EMPTY_FRAME_MARKER = (
0xFE # If this marker is used to start a frame, the frame is a 0-length delta frame
)
class MiniwareSettings:
IMAGE_ADDRESS = 0x0800F800
DFU_TARGET_NAME = b"IronOS-dfu"
DFU_PINECIL_ALT = 0
DFU_PINECIL_VENDOR = 0x1209
DFU_PINECIL_PRODUCT = 0xDB42
DFU_ALT = 0
DFU_VENDOR = 0x1209
DFU_PRODUCT = 0xDB42
MINIMUM_HEX_SIZE = 4096
class S60Settings:
IMAGE_ADDRESS = 0x08000000 + (62 * 1024)
DFU_TARGET_NAME = b"IronOS-dfu"
DFU_ALT = 0
DFU_VENDOR = 0x1209
DFU_PRODUCT = 0xDB42
MINIMUM_HEX_SIZE = 1024
class TS101Settings:
IMAGE_ADDRESS = 0x08000000 + (99 * 1024)
DFU_TARGET_NAME = b"IronOS-dfu"
DFU_ALT = 0
DFU_VENDOR = 0x1209
DFU_PRODUCT = 0xDB42
MINIMUM_HEX_SIZE = 1024
class MHP30Settings:
IMAGE_ADDRESS = 0x08000000 + (126 * 1024)
DFU_TARGET_NAME = b"IronOS-dfu"
DFU_ALT = 0
DFU_VENDOR = 0x1209
DFU_PRODUCT = 0xDB42
MINIMUM_HEX_SIZE = 4096
class PinecilSettings:
IMAGE_ADDRESS = 0x0801F800
DFU_TARGET_NAME = b"Pinecil"
DFU_PINECIL_ALT = 0
DFU_PINECIL_VENDOR = 0x28E9
DFU_PINECIL_PRODUCT = 0x0189
DFU_ALT = 0
DFU_VENDOR = 0x28E9
DFU_PRODUCT = 0x0189
MINIMUM_HEX_SIZE = 1024
def still_image_to_bytes(image: Image, negative: bool, dither: bool, threshold: int, preview_filename):
class Pinecilv2Settings:
IMAGE_ADDRESS = 1016 * 1024 # its 2 4k erase pages inset
DFU_TARGET_NAME = b"Pinecilv2"
DFU_ALT = 0
DFU_VENDOR = 0x28E9 # These are ignored by blisp so doesnt matter what we use
DFU_PRODUCT = 0x0189 # These are ignored by blisp so doesnt matter what we use
MINIMUM_HEX_SIZE = 1024
def still_image_to_bytes(
image: Image, negative: bool, dither: bool, threshold: int, preview_filename
):
# convert to luminance
# do even if already black/white because PIL can't invert 1-bit so
# can't just pass thru in case --negative flag
# also resizing works better in luminance than black/white
# also no information loss converting black/white to grayscale
# also no information loss converting black/white to greyscale
if image.mode != "L":
image = image.convert("L")
# Resize to lcd size using bicubic sampling
@@ -117,7 +164,9 @@ def get_screen_blob(previous_frame: bytearray, this_frame: bytearray):
return outputData
def animated_image_to_bytes(imageIn: Image, negative: bool, dither: bool, threshold: int):
def animated_image_to_bytes(
imageIn: Image, negative: bool, dither: bool, threshold: int, flip_frames
):
"""
Convert the gif into our best effort startup animation
We are delta-encoding on a byte by byte basis
@@ -136,6 +185,8 @@ def animated_image_to_bytes(imageIn: Image, negative: bool, dither: bool, thresh
for framenum in range(0, imageIn.n_frames):
imageIn.seek(framenum)
image = imageIn
if flip_frames:
image = image.rotate(180)
frameb = still_image_to_bytes(image, negative, dither, threshold, None)
frameData.append(frameb)
@@ -146,7 +197,9 @@ def animated_image_to_bytes(imageIn: Image, negative: bool, dither: bool, thresh
else:
delta = frameDuration_ms / frameTiming
if delta > 1.05 or delta < 0.95:
print(f"ERROR: You have a frame that is different to the first frame time. Mixed rates are not supported")
print(
f"ERROR: You have a frame that is different to the first frame time. Mixed rates are not supported"
)
sys.exit(-1)
print(f"Found {len(frameData)} frames, interval {frameTiming}ms")
frameTiming = frameTiming / 5
@@ -154,7 +207,9 @@ def animated_image_to_bytes(imageIn: Image, negative: bool, dither: bool, thresh
newTiming = max(frameTiming, 1)
newTiming = min(newTiming, 254)
print(f"Inter frame delay {frameTiming} is out of range, and is being adjusted to {newTiming*5}")
print(
f"Inter frame delay {frameTiming} is out of range, and is being adjusted to {newTiming*5}"
)
frameTiming = newTiming
# We have now mangled the image into our framebuffers
@@ -188,24 +243,26 @@ def animated_image_to_bytes(imageIn: Image, negative: bool, dither: bool, thresh
def img2hex(
input_filename,
device_model_name: str,
merge_hex_file: Optional[str],
preview_filename=None,
threshold=128,
dither=False,
negative=False,
isPinecil=False,
make_erase_image=False,
output_filename_base="out",
flip=False,
):
"""
Convert 'input_filename' image file into Intel hex format with data
formatted for display on LCD and file object.
Input image is converted from color or grayscale to black-and-white,
Input image is converted from color or greyscale to black-and-white,
and resized to fit LCD screen as necessary.
Optionally write resized/thresholded/black-and-white preview image
to file specified by name.
Optional `threshold' argument 8 bit value; grayscale pixels greater than
Optional `threshold' argument 8 bit value; greyscale pixels greater than
this become 1 (white) in output, less than become 0 (black).
Unless optional `dither', in which case PIL grayscale-to-black/white
Unless optional `dither', in which case PIL greyscale-to-black/white
dithering algorithm used.
Optional `negative' inverts black/white regardless of input image type
or other options.
@@ -219,32 +276,120 @@ def img2hex(
raise IOError('error reading image file "{}": {}'.format(input_filename, e))
if getattr(image, "is_animated", False):
data = animated_image_to_bytes(image, negative, dither, threshold)
data = animated_image_to_bytes(image, negative, dither, threshold, flip)
else:
if flip:
image = image.rotate(180)
# magic/required header
data = [DATA_PROGRAMMED_MARKER, 0x00] # Timing value of 0
image_bytes = still_image_to_bytes(image, negative, dither, threshold, preview_filename)
image_bytes = still_image_to_bytes(
image, negative, dither, threshold, preview_filename
)
data.extend(get_screen_blob([0] * LCD_NUM_BYTES, image_bytes))
# Pad up to the full page size
if len(data) < LCD_PAGE_SIZE:
pad = [0] * (LCD_PAGE_SIZE - len(data))
data.extend(pad)
deviceSettings = MiniwareSettings
if isPinecil:
# Set device settings depending on input `-m` argument
device_name = device_model_name.lower()
if (
device_name == "miniware"
or device_name == "ts100"
or device_name == "ts80"
or device_name == "ts80p"
):
deviceSettings = MiniwareSettings
elif device_name == "pinecilv1" or device_name == "pinecil":
deviceSettings = PinecilSettings
# Generate both possible outputs
output_name = output_filename_base + os.path.basename(input_filename)
DFUOutput.writeFile(
output_name + ".dfu",
data,
deviceSettings.IMAGE_ADDRESS,
deviceSettings.DFU_TARGET_NAME,
deviceSettings.DFU_PINECIL_ALT,
deviceSettings.DFU_PINECIL_PRODUCT,
deviceSettings.DFU_PINECIL_VENDOR,
elif device_name == "pinecilv2":
deviceSettings = Pinecilv2Settings
elif device_name == "ts101":
deviceSettings = TS101Settings
if merge_hex_file is None:
print(
"For the TS101 for compatibility with bugs in the Miniware Loader, you must merge the main firmware with the logo to flash it"
)
exit(1)
elif device_name == "s60":
deviceSettings = S60Settings
elif device_name == "mhp30":
deviceSettings = MHP30Settings
else:
print("Could not determine device type")
sys.exit(-1)
# Split name from extension so we can mangle in the _L suffix for flipped images
split_name = os.path.splitext(os.path.basename(input_filename))
if flip:
base = split_name[0]
ext = split_name[1]
base = base + "_L"
split_name = [base, ext]
output_name = output_filename_base + split_name[0] + split_name[1]
# If a file has been specified for merging, we want to splice our image data with it
if merge_hex_file is not None:
read_merge_write(merge_hex_file, data, deviceSettings, output_name)
else:
DFUOutput.writeFile(
output_name + ".dfu",
data,
deviceSettings.IMAGE_ADDRESS,
deviceSettings.DFU_TARGET_NAME,
deviceSettings.DFU_ALT,
deviceSettings.DFU_PRODUCT,
deviceSettings.DFU_VENDOR,
)
HexOutput.writeFile(
output_name + ".hex",
data,
deviceSettings.IMAGE_ADDRESS,
deviceSettings.MINIMUM_HEX_SIZE,
)
def read_merge_write(
merge_filename: str, image_data: list[int], deviceSettings, output_filename: str
):
"""
Reads in the merge filename as the base object, then inserts the image data.
Then pad-fills the empty space in the binary
"""
base_hex_file = IntelHex(merge_filename)
logo_hex_file = IntelHex()
logo_hex_file.frombytes(image_data, deviceSettings.IMAGE_ADDRESS)
# Merge in the image data, error if collision
base_hex_file.merge(logo_hex_file, overlap="error")
binary_base = base_hex_file.minaddr()
base_hex_file.padding = 0xFF
binary_blob = base_hex_file.tobinarray(start=binary_base)
print(
f"Post-merge output image starts at 0x{binary_base:x}, len {len(binary_blob)}"
)
HexOutput.writeFile(output_name + ".hex", data, deviceSettings.IMAGE_ADDRESS)
DFUOutput.writeFile(
output_filename + ".dfu",
binary_blob,
binary_base,
deviceSettings.DFU_TARGET_NAME,
deviceSettings.DFU_ALT,
deviceSettings.DFU_PRODUCT,
deviceSettings.DFU_VENDOR,
)
# Gap fill any missing segments
# This is required for the TS101 bootloader
segments = base_hex_file.segments()
for seg_pair in zip(segments, segments[1:]):
start = seg_pair[0][1]
end = seg_pair[1][0]
filler = [0xFE] * (end - start)
base_hex_file.frombytes(filler, start)
with open(output_filename + ".hex", "w") as output:
base_hex_file.write_hex_file(output, eolstyle="CRLF")
def parse_commandline():
@@ -269,11 +414,17 @@ def parse_commandline():
help="filename of image preview",
)
parser.add_argument(
"-M",
"--merge",
help="filename of another hex file to merge with, creating a combined firmware",
)
parser.add_argument(
"-n",
"--negative",
action="store_true",
help="photo negative: exchange black and white " "in output",
help="photo negative: exchange black and white in output",
)
parser.add_argument(
@@ -281,14 +432,16 @@ def parse_commandline():
"--threshold",
type=zero_to_255,
default=128,
help="0 to 255: gray (or color converted to gray) " "above this becomes white, below becomes black; " "ignored if using --dither",
help="0 to 255: grey (or color converted to grey) "
"above this becomes white, below becomes black; "
"ignored if using --dither",
)
parser.add_argument(
"-d",
"--dither",
action="store_true",
help="use dithering (speckling) to convert gray or " "color to black and white",
help="use dithering (speckling) to convert grey or " "color to black and white",
)
parser.add_argument(
@@ -298,8 +451,7 @@ def parse_commandline():
help="generate a logo erase file instead of a logo",
)
parser.add_argument("-p", "--pinecil", action="store_true", help="generate files for Pinecil")
parser.add_argument("-m", "--miniware", action="store_true", help="generate files for miniware")
parser.add_argument("-m", "--model", help="device model name")
parser.add_argument(
"-v",
"--version",
@@ -316,20 +468,36 @@ if __name__ == "__main__":
args = parse_commandline()
if args.preview and os.path.exists(args.preview) and not args.force:
sys.stderr.write('Won\'t overwrite existing file "{}" (use --force ' "option to override)\n".format(args.preview))
sys.stderr.write(
'Won\'t overwrite existing file "{}" (use --force '
"option to override)\n".format(args.preview)
)
sys.exit(1)
if args.miniware == False and args.pinecil == False:
sys.stderr.write("You must provide --miniware or --pinecil to select your model")
sys.exit(1)
print(f"Converting {args.input_filename} => {args.output_filename}")
img2hex(
merge_hex_file=args.merge,
input_filename=args.input_filename,
output_filename_base=args.output_filename,
device_model_name=args.model,
preview_filename=args.preview,
threshold=args.threshold,
dither=args.dither,
negative=args.negative,
make_erase_image=args.erase,
isPinecil=args.pinecil,
flip=False,
)
img2hex(
merge_hex_file=args.merge,
input_filename=args.input_filename,
output_filename_base=args.output_filename,
device_model_name=args.model,
preview_filename=args.preview,
threshold=args.threshold,
dither=args.dither,
negative=args.negative,
make_erase_image=args.erase,
flip=True,
)

View File

@@ -10,7 +10,6 @@ class HexOutput:
INTELHEX_END_OF_FILE_RECORD = 0x01
INTELHEX_EXTENDED_LINEAR_ADDRESS_RECORD = 0x04
INTELHEX_BYTES_PER_LINE = 16
INTELHEX_MINIMUM_SIZE = 4096
@classmethod
def split16(cls, word):
@@ -53,20 +52,19 @@ class HexOutput:
) # low 8 bits
@classmethod
def writeFile(cls, file_name: str, data: bytearray, data_address: int):
def writeFile(
cls,
file_name: str,
data: bytearray,
data_address: int,
minimum_hex_file_size: int,
):
"""write block of data in Intel hex format"""
with open(file_name, "w", newline="\r\n") as output:
def write(generator):
output.write("".join(generator))
if len(data) % cls.INTELHEX_BYTES_PER_LINE != 0:
raise ValueError(
"Program error: Size of LCD data is not evenly divisible by {}".format(
cls.INTELHEX_BYTES_PER_LINE
)
)
address_lo = data_address & 0xFFFF
address_hi = (data_address >> 16) & 0xFFFF
@@ -79,7 +77,7 @@ class HexOutput:
)
size_written = 0
while size_written < cls.INTELHEX_MINIMUM_SIZE:
while size_written < minimum_hex_file_size:
offset = address_lo
for line_start in range(0, len(data), cls.INTELHEX_BYTES_PER_LINE):
write(
@@ -90,8 +88,6 @@ class HexOutput:
)
)
size_written += cls.INTELHEX_BYTES_PER_LINE
if size_written >= cls.INTELHEX_MINIMUM_SIZE:
break
offset += cls.INTELHEX_BYTES_PER_LINE
write(cls.intel_hex_line(cls.INTELHEX_END_OF_FILE_RECORD, 0, ()))

View File

@@ -2,4 +2,4 @@
echo $1
echo $2
set -e
find Images/ -type f -exec python3 img2logo.py {} "$1" "$2" \;
find Images/ -type f -exec python3 img2logo.py {} "$1" "$2" "$3" \;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
# Miniware firmware directory
This directory contains original proprietary firmware developed by Miniware for the purpose of backup & for easy reference in the documentation.
**DISCLAIMER**: All copyrights & authorship of this firmware belong to Miniware.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
dda37ecf0c711781848b509c76e5c438 MHP30_2.11.hex
b835a6010fd0f876df1a5762e2317136 TS100_2.20.hex
06ac39c5ee21003e1a422bbb9e985de9 TS101_2.01.hex
abcdc8e9058931220c3b9cf9a19c58b2 TS80_1.07.hex
48e3d1be8f6a417596048f963e1ae1f6 TS80P_1.30.hex

5
Firmware/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Firmware directory
This directory contains original proprietary firmware of supported hardware for the purpose of backup & for easy reference in the documentation.
**DISCLAIMER**: All copyrights & authorship belong to their original holders (such as Miniware, Sequre, etc.)

View File

@@ -2,7 +2,22 @@
Storing meta information for IronOS.
This are things that are not part of the core "OS".
This includes photographs of hardware, datasheets, schematics and of course **bootup logos**.
This includes photographs of hardware, datasheets, schematics, original proprietary firmware and of course **bootup logos**.
This repository uses github actions to automagically build the logos for each device.
Periodically a "release" will be tagged and pre-compiled logo's will be put there as well to make it easy.
# Boot-Up Logos
The IronOS firmware supports a user created bootup logo.
By default, there is _not_ one included in the firmware. This means that once flashed they generally stay. If you want no logo again, you would have to flash a blank image to the bootup logo.
- Safe & Fun: will not over write your firmware
- Easy install: use dfu tool just like updating firmware (or Pine64 Updater if you have a Pinecil).
## Generating the Logo files
There are community logo's already converted and ready to use in [IronOS-Meta/releases](https://github.com/Ralim/IronOS-Meta/releases).
Download the zip for Pinecil or Miniware and then install using the instructions on the [main IronOS documentation](https://ralim.github.io/IronOS/Logo/).
Alternatively if you want to make your own logo files, there is also documentation on how best to do this in the [main IronOS documentation](https://ralim.github.io/IronOS/Logo/).