From b8508a73ffd1b0a6fe57c22330afecb1a6ce17ef Mon Sep 17 00:00:00 2001 From: Jev Date: Thu, 6 Nov 2025 23:58:42 +0100 Subject: [PATCH] add files --- BUSTER_MIGRATION.md | 91 ++++++++++++++++++ iotg-rpi4-config_1.3-1_all.deb | Bin 0 -> 11896 bytes iotg-rpi4-config_1.3-1buster1_all.deb | Bin 0 -> 12254 bytes repackage_for_buster.py | 128 ++++++++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 BUSTER_MIGRATION.md create mode 100644 iotg-rpi4-config_1.3-1_all.deb create mode 100644 iotg-rpi4-config_1.3-1buster1_all.deb create mode 100755 repackage_for_buster.py diff --git a/BUSTER_MIGRATION.md b/BUSTER_MIGRATION.md new file mode 100644 index 0000000..31973f8 --- /dev/null +++ b/BUSTER_MIGRATION.md @@ -0,0 +1,91 @@ +# IOT-GATE-RPI4 Configuration - Debian Buster Migration + +## Overview + +The original `iotg-rpi4-config_1.3-1_all.deb` package was designed for Debian releases prior to Buster. Starting with Debian Buster, the boot partition structure changed: + +- **Pre-Buster**: Boot files at `/boot/` (config.txt, overlays/) +- **Buster+**: Boot files at `/boot/firmware/` (config.txt, overlays/) + +## Changes Made + +The repackaged version `iotg-rpi4-config_1.3-1buster1_all.deb` includes: + +### 1. Script Path Update +**File**: `usr/local/bin/iotg-rpi4-functions` +```bash +# Before +CONFIG=/boot/config.txt + +# After +CONFIG=/boot/firmware/config.txt +``` + +### 2. Overlay Relocation +**Directory structure**: +``` +# Before +/boot/overlays/iotg-rpi4/*.dtbo + +# After +/boot/firmware/overlays/iotg-rpi4/*.dtbo +``` + +### 3. Version Update +- Version changed from `1.3-1` to `1.3-1buster1` + +## Installation + +On Debian Buster or later systems: + +```bash +sudo dpkg -i iotg-rpi4-config_1.3-1buster1_all.deb +``` + +The package will: +1. Install device tree overlays to `/boot/firmware/overlays/iotg-rpi4/` +2. Install configuration utilities to `/usr/local/bin/` +3. Install systemd service for IE module detection +4. Install udev rules for CAN and TTY devices +5. Run the configuration utility in quiet mode + +## Usage + +After installation, run the configuration utility: + +```bash +sudo iotg-rpi4-config +``` + +This provides an interactive menu to: +- Configure Industrial I/O modules (slots A, B, C, D) +- Enable/disable TPM +- Detect currently installed modules +- Apply configuration changes to `/boot/firmware/config.txt` + +## Technical Details + +### How It Works +1. The utility detects installed IE modules via GPIO expanders +2. User configures desired module types (CAN, RS232, RS485, Digital I/O) +3. Configuration is written to `/boot/firmware/config.txt` as dtoverlay entries: + ``` + dtoverlay=iotg-rpi4/iotg-rpi4-ie-a,can + dtoverlay=iotg-rpi4/iotg-rpi4-ie-b,uart + ``` +4. After reboot, the firmware loads the appropriate overlays + +### Compatibility +- Device tree overlay syntax remains unchanged (relative paths) +- All functionality preserved from original package +- Works with Raspberry Pi OS (Debian Buster/Bullseye/Bookworm) + +## Repackaging + +To repackage again or modify further, use the included script: + +```bash +python3 repackage_for_buster.py +``` + +This automates the extraction, modification, and repackaging process. diff --git a/iotg-rpi4-config_1.3-1_all.deb b/iotg-rpi4-config_1.3-1_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..50dab3de2908fd3faede50ad97be7d4595339dcb GIT binary patch literal 11896 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 Lt?vJw%lSV593s5~ literal 0 HcmV?d00001 diff --git a/iotg-rpi4-config_1.3-1buster1_all.deb b/iotg-rpi4-config_1.3-1buster1_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..46c691dd0458cb901973f702fef239fd79b497d0 GIT binary patch literal 12254 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 None: + """Run shell command and handle errors.""" + result = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError(f"Command failed: {' '.join(cmd)}\n{result.stderr}") + + +def modify_functions_file(functions_path: Path) -> None: + """Update CONFIG path in iotg-rpi4-functions.""" + content = functions_path.read_text() + + # Replace the CONFIG path + modified = content.replace( + "CONFIG=/boot/config.txt", + "CONFIG=/boot/firmware/config.txt" + ) + + # Also update the backup path reference (it uses ${CONFIG} so should be fine) + # But let's verify the change was made + if modified == content: + raise RuntimeError("Failed to modify CONFIG path - pattern not found") + + functions_path.write_text(modified) + print(f"✓ Modified {functions_path.name}") + + +def relocate_overlays(extract_dir: Path) -> None: + """Move overlays from /boot/overlays to /boot/firmware/overlays.""" + old_path = extract_dir / "boot" / "overlays" / "iotg-rpi4" + new_path = extract_dir / "boot" / "firmware" / "overlays" / "iotg-rpi4" + + if not old_path.exists(): + raise RuntimeError(f"Overlay directory not found: {old_path}") + + # Create new directory structure + new_path.parent.mkdir(parents=True, exist_ok=True) + + # Move the iotg-rpi4 directory + shutil.move(str(old_path), str(new_path)) + + # Remove old empty directories + (extract_dir / "boot" / "overlays").rmdir() + + print(f"✓ Relocated overlays to boot/firmware/overlays/iotg-rpi4/") + + +def repackage_deb(original_deb: Path, output_deb: Path) -> None: + """Extract, modify, and repackage the .deb file.""" + + with tempfile.TemporaryDirectory() as tmpdir: + work_dir = Path(tmpdir) + extract_dir = work_dir / "package" + control_dir = work_dir / "DEBIAN" + + extract_dir.mkdir() + control_dir.mkdir() + + print(f"Extracting {original_deb.name}...") + run_cmd(["dpkg-deb", "-x", str(original_deb), str(extract_dir)]) + run_cmd(["dpkg-deb", "-e", str(original_deb), str(control_dir)]) + + # Modify the functions file + functions_file = extract_dir / "usr" / "local" / "bin" / "iotg-rpi4-functions" + modify_functions_file(functions_file) + + # Relocate overlays + relocate_overlays(extract_dir) + + # Update control file version + control_file = control_dir / "control" + control_content = control_file.read_text() + control_content = control_content.replace( + "Version: 1.3-1", + "Version: 1.3-1buster1" + ) + control_file.write_text(control_content) + print("✓ Updated control file version") + + # Copy DEBIAN directory into extract_dir + shutil.copytree(control_dir, extract_dir / "DEBIAN") + + # Build new .deb + print(f"Building {output_deb.name}...") + run_cmd(["dpkg-deb", "-b", str(extract_dir), str(output_deb)]) + + print(f"\n✓ Successfully created {output_deb}") + + +def main() -> None: + """Main entry point.""" + script_dir = Path(__file__).parent + original_deb = script_dir / "iotg-rpi4-config_1.3-1_all.deb" + output_deb = script_dir / "iotg-rpi4-config_1.3-1buster1_all.deb" + + if not original_deb.exists(): + raise FileNotFoundError(f"Original .deb not found: {original_deb}") + + if output_deb.exists(): + print(f"Removing existing {output_deb.name}...") + output_deb.unlink() + + print("Repackaging for Debian Buster+ compatibility\n") + repackage_deb(original_deb, output_deb) + + print("\nChanges made:") + print(" • CONFIG=/boot/config.txt → CONFIG=/boot/firmware/config.txt") + print(" • Overlays moved from /boot/overlays/ → /boot/firmware/overlays/") + print(" • Version updated to 1.3-1buster1") + print(f"\nInstall with: sudo dpkg -i {output_deb.name}") + + +if __name__ == "__main__": + main()