Skip to content

About

HP-IL Pico Interface board with display and mass-storage

Resources

Stars

2 stars

Watchers

1 watching

Forks

Repository files navigation

HIPI Board — HP-IL Pico Interface

HIPI is a small touch-screen box on a Raspberry Pi Pico 2 (RP2350) that sits on the HP-IL loop of an HP-41, HP-71 or HP-75 and acts as a whole set of classic HP peripherals at once:

HIPI acts as… Original HP device Loop name
Video display HP 82163 Video Interface, or HP 92198 80-column (a setting) TFDISPLAY
Cassette drive HP 82161A Digital Cassette Drive TFDRIVE
Plotter HP 7470A TFPLOT
Thermal printer (7" view) HP 82162A Thermal Printer TFPRINT
Any I2C chip / sensor — TFI2C
LEDs and colour pixels — TFLEDS, TFPIXEL
Link to a PC (e.g. pyILPER) PIL-Box PILBOX
Terminal over USB — TFTERM

Cassettes are LIF image files on a micro-SD card. Besides the device views (display, plotter, tape drive, printer) there is an HP-IL analyzer, a loop map, an HP-IL signal view, screen savers, screen dumps, and a mirror of the screen to a PC for recording videos.

The project started as a C++17 port of J. Chilla's MicroPython project JCILD (HP 82163 video display and HP 82161 drive emulator), including its RA8875 display driver (HIPI's first, 5" panel; after 1.3.0 HIPI has only the 7" LT7683 panel).

Documentation

Document For Contents
User Manual Users Getting started, views, menus, devices, settings, troubleshooting
User & Developer Guide Developers Setting up, building, flashing, USB interfaces, adding your own HP-IL device
pcb/README.md Builders The circuit board and choice of display; BOM, schematics
tools/hipiview Users Showing and recording the screen on a PC
tools/ilctrl Users A command-line HP-IL controller for the PC (PIL-Box CON mode)

Hardware at a glance

Part
MCU Raspberry Pi Pico 2 / Pico 2 W (RP2350)
Display 7", 1024 × 600, LT7683, FT5316 touch
Storage micro-SD card (FAT32 recommended, exFAT works)
USB 4 serial ports (console, PILBOX, terminal, display mirror) and the SD card as a USB drive — see GUIDE § 7

Display SPI wiring (same as the original share.py):

Function GPIO
SPI0 SCK GP2
SPI0 MOSI GP3
SPI0 MISO GP0
CS (low) GP1
RST not wired — the module has its own power-on reset

Building

The build makes build/hipi_7_pico.uf2. The details, including the PicoLED library, are in GUIDE.md § 1–3.

In VS Code (Raspberry Pi Pico extension)

  1. Install the Raspberry Pi Pico extension.
  2. pico-sdk 2.2.0: if the extension hasn't installed it, clone it and point PICO_SDK_PATH at it:
    git clone -b master https://github.com/raspberrypi/pico-sdk.git ~/pico-sdk
    cd ~/pico-sdk && git submodule update --init
    export PICO_SDK_PATH=$HOME/pico-sdk        # or $HOME/.pico-sdk/sdk/2.2.0
  3. Import the project — not File → Open Folder, but Ctrl+Shift+P → Raspberry Pi Pico: Import Project, pick the folder with CMakeLists.txt, and board pico2 (or pico2_w).
  4. Build with the Build button in the status bar or Ctrl+Shift+B. The first build takes a minute or two.

From the command line

export PICO_SDK_PATH=$HOME/.pico-sdk/sdk/2.2.0   # or ~/pico-sdk
cmake -G Ninja -B build -S .
cmake --build build

Flashing

Hold BOOTSEL while plugging in (or resetting) the Pico 2 and drop the .uf2 onto the drive that appears — or use picotool:

picotool load -f build/hipi_7_pico.uf2

Later updates can be started from the menu: More → System → Bootsel mode.

SD card

Everything the SD card needs is in HIPI-SD-card.zip in the project folder (and with every release):

  1. Format a micro-SD card as FAT32 (exFAT works too).
  2. Unzip HIPI-SD-card.zip onto it, keeping the folders.
  3. Put your own cassettes (.dat or .lif files) in lif/.

The card then holds:

README.txt      what's what
resources/      Tape view pictures: hp82161a.bmp, tape-in.bmp, open.bmp, leds.bmp, reels.bmp
                Printer view pictures: hp82162a.bmp, prtparts.bmp
lif/            cassettes (*.dat or *.lif, LIF) — one example to start with
CONFIG.TXT      settings — created by HIPI on first start
screenshots/    screen dumps — created by the first Screendump
text/           the display's text (display_<n>.txt) — created by the first "Save as text"
logs/           analyzer logs — created by the first "Log to file"

The zip is made by sdcard/make_sd_card.py and remade by the build whenever one of its files changes. The script can also copy straight onto a mounted card: sdcard/make_sd_card.py --to /media/$USER/HIPI. To change what's on the card, edit sdcard/ (README, example cassettes) or the pictures in resources/.

The button strip and the logo are built into the firmware, so HIPI starts and its menus work without an SD card.


Using HIPI — in brief

The User Manual has the full story; these are the essentials.

Buttons. Touch the right edge of the screen to slide in the button strip (it hides again after 5 s):

Button Menu closed In the menu After Shift
OK Opens the menu Chooses EXIT — closes the menu
▲ / ▼ Scrolls the text back / forward one line Moves up / down One page
X Back to the live text Back one level CLR — clears the screen

Touch. Top-left corner: info box. Bottom-left corner: the devices on the loop and their addresses. Swipe left/right: next/previous device view.

Menus. OK opens the menu of the view on the screen (e.g. Clear plotter in the Plotter view). Its last row, More, leads to HIPI's own menu:

More >
├── Go to view >   Display · Plotter · Tape · Analyzer · Loop map · HP-IL signals
├── Settings >     Screen · Screen saver · Devices · PC link
└── System >       Connect to PC · Loopback test · Hardware test · Demo · Character table ·
                   About · Bootsel mode

While a menu is open HIPI keeps working: nothing the HP-41 sends is lost, and the view underneath is up to date when the menu closes.

Settings are saved at once to CONFIG.TXT on the SD card as key=value lines; unknown keys are ignored, so old files keep working. All keys are listed in the User Manual § 12.

Characters. The display font (hp82163_font.hpp) is an 8×16 font with the HP-41 characters plus Å Ä Ö å ä ö. txtWrite() decodes UTF-8, so a string like "Fänge" in the source code shows correctly.


Project structure

CMakeLists.txt   build: the firmware (hipi_7_pico)
include/, src/   the firmware (below)
lib/             no-OS-FatFS (SD card), vendored, unmodified
PicoLED/         WS2812 library for TFPIXEL, vendored
resources/       artwork: Tape and Printer view pictures (SD card), buttons and logo (built in)
sdcard/          the SD card: README.txt, example cassette in lif/, make_sd_card.py
HIPI-SD-card.zip everything for a new SD card (made by the build)
scripts/         build/flash helpers, bmp_to_rgb565.py (turns BMPs into C++)
tools/           PC programs: hipiview (display mirror), ilctrl (HP-IL controller), pixeltest,
                 printertest; images/ (how the Printer view pictures are made)
documents/       USER_MANUAL.md, GUIDE.md, images
pcb/             hardware: README, BOM, schematics, PCB

The firmware, by area (.h/.hpp in include/, .cpp in src/):

Area Files
Start-up pico_main, hipi, boot_service, hipi_features.h Boot sequence and main loop; creates the HP-IL devices; build switches
HP-IL hpil, hpil.pio, device Frames, the PIO physical layer, the CDevice base class
HP-IL devices display, drive + tape, plotter, printer, illeds, ilpixels, terminal, pilbox, ili2c TFDISPLAY (HP 82163 or HP 92198), TFDRIVE (LIF on SD), TFPLOT (HP-GL), TFPRINT (HP 82162A), TFLEDS, TFPIXEL, TFTERM, PILBOX, TFI2C (any I2C chip: temperature, pressure, distance, clock ...)
Display driver LT7683, *Transport, display_config.h The 7" panel's controller; SPI on the Pico (or spidev on Linux)
Text display Screen, hp82163_font.hpp, video80 HP 82163 emulation: text buffer, escape codes, scroll-back; the HP 92198's 80-column screen
Views views, plotterview, analyzer, loopmap, hpil_diag (+ .pio), chartable Display / Tape / Printer views and switching (views), the Plotter view (plotterview); analyzer, loop map, HP-IL signals, character table
User interface boardui, uidialog.hpp, ui_buttons.hpp, touch, bootscreen Button strip, menus, info box, device list, touch, start-up screen
Screen extras backlight, clock, rtc, saver_anim, screendump Backlight and screen savers, DS3231 clock, screen dumps
Display mirror display_mirror, mirror_*.h(pp) The screen mirrored to a PC (tools/hipiview)
Settings & files config.hpp, sd_paths.h, bmp_loader.hpp, lif_info.hpp, hw_config CONFIG.TXT, SD folders, BMP loading, LIF directories, SD card wiring
USB usb_serial.h, usb_msc, my_descriptors.c, tusb_config.h Serial ports, the SD card as a USB drive, descriptors
Hardware drivers leds, pixels, bmp280, i2c_device, i2c_ident, i2c_chips LEDs, NeoPixels, pressure sensor, I2C; what's on the I2C bus (chips described in sdcard/i2c/*.txt)
Fonts & pictures *_font*.cpp, glyph_font, buttons_image.cpp, logo_image.cpp Generated data (see scripts/)
Other display_test.hpp, display_boot_test.hpp, linux_main Optional diagnostics; a Linux demo (off by default)

Port notes (vs. the MicroPython original)

  • Global state from share.py became constructor arguments.
  • DisplayTransport is a virtual SPI/GPIO interface, so the platform is easy to swap (PicoSpiTransport, LinuxSpiDevTransport).
  • delayMs() replaces time.sleep(); _write_reg/_write_reg16 became the public writeReg/writeReg16.
  • The display runs in 16-bit RGB565 instead of 8-bit RGB332.
  • New: the touch UI, persistent settings, the extra HP-IL devices and views, the LT7683 (7") driver, and the Swedish characters.

Reference: LED commands (TFLEDS)

The HP-41 sends compact command strings to TFLEDS, for example "1B0:100:900" (LED 1 blinks forever, 100 ms on, 900 ms off). A command is <leds><command>[<parameters>]; several commands are separated by spaces.

LEDs: 1–5 select single LEDs and can be combined (135 = LEDs 1, 3 and 5); 0 selects all.

Command Parameters Meaning Example
O — On 12O
C — Off 345C
B none, or n Blink n times, 200 ms on/off (none or 0 = forever) 15B5
B n:ms Blink n times, ms on and off 3B10:150
B n:on:off Blink n times, on ms on, off ms off 3B10:100:400
S n Brightness n % (0–100) 1S75
F+ t Fade on over t ms 2F+800
F- t Fade off over t ms 2F-500
F n:t Fade to n % over t ms 4F30:600
01 LBL "TEST"
02 3
03 SELECT
04 "1B0:100:900"
05 OUTA

More examples:

"0C"                  all LEDs off
"12O 345C"            LEDs 1 and 2 on, LEDs 3, 4 and 5 off
"0S50 0F+2000"        all LEDs: brightness 50 %, then fade on over 2 s
"1B3:100:200 2F+500"  LED 1 blinks 3 times; LED 2 fades on over 0.5 s
  • Put a space between commands when a number is followed by the next LED digit: "1B5 23C", not "1B523C" (that is LED 1 blinking 523 times).
  • \n, ; or flush() also end the last command.
  • S and the F commands need PWM (CLED_NO_PWM not defined, see leds.h); without it, brightness does nothing and fades switch at once.

References

About

HP-IL Pico Interface board with display and mass-storage

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages