I saved 6 of these obsolete POS terminals from being thrown out. Once examined, I was pleasantly surprised that they sport x64 capable ATOM processors and relatively fancy (for me) USB compliant resistive touchscreens. They are POS terminals like you will find at the supermarket checkout and were originally intended to run Windows Embedded CE 6.0 and Windows Embedded POS Ready 2009, but are capable of being repurposed and run modern lightweight Linux distributions. Looking through the specs and documentation, the Powered USB Port (+5V, +12V, +24V) is also of interest for being different than any ordinary PC, as is the magnetic card reader.
I use one as a touch-screen jukebox (running Silverjuke). It's for a child to use, and it's perhaps their most loved item because they can play their music whenever they want and mess around with games like chess and mahjong. Connected to a stereo with decent speakers the audio is quite good. The kid's music selection is played from a permanently installed USB drive (removed only to add new songs) but I also have set up the bluetooth to pair with my phone so that the system can play music from my phone via bluetooth.
Following are my rough (incomplete/incorrect & out-of-date) notes and links collected in the process of repurposing some of these terminals to run Linux. This page should not be seen as a tutorial but simply rough notes.
Processor: Intel Atom N450, Single Core, 1.6GHz
Display: Standard 1024x768 15” TFT Color LCD
Operating System: Windows CE 6 or POSReady 2009
Memory: 2 SO-DIMM Sockets - Max 2 GB DDR2 667
Case Style: Standard Low Profile or Optional Adjustable Stand
Case Material: PC-ABS Plastic
Weight: 10.5 lbs. (4.7 kg) / Shipping Weight 14.0 lbs. (6.35 kg)
Physical Dimensions: The Equipment Dimensions section contains more information.
Optional Customer Displays (Series 1): Integrated or Pole 240x64 STN Graphics Capable LCD Integrated or Pole Protégé Customer Display System
Cash Drawers: 2 MICROS 4-Pin DIN Connectors - +12V or +24V selectable in BIOS
COM Ports: 1 DB9 RS232 (COM1 - Non Powered), 1Combination RS232/RS422 (COM4), 2 Modular RS232 (COM2, COM5)
USB Ports: Four IO Panel USB 2.0 Ports (can be disabled)
Powered USB Ports: One MICROS Powered USB Port (+5V, +12V, +24V)
LAN Interface: On Board 10/100/1000 Mbps Ethernet - RJ45
AC Input Voltage: Universal Input - 85 to 264VAC, 47 to 63Hz.
Input Power: 24W Typical
BTU/Hour: 83 Typical
Operating Temperature: 0°C (32°F) to 45°C (113°F), 90% relative humidity max.
Storage Temperature: -25°C (-13°F) to 80°C (176°F)
MICROS Workstation 5A Features
MICROS Workstation 5a Document Library
Workstation 5 and Workstation 5A Field Service Guide, and here
Beagle Hardware: icros Terminal Help & Support
Convert A MICROS PCWS 5A w/ HDD and Win?
Output of $inxi -Fxz
:
System:
Host: antiX1-WS01 Kernel: 4.9.160-antiX.1-amd64-smp x86_64 bits: 64 compiler: gcc
v: 6.3.0 Desktop: IceWM 1.4.2
Distro: antiX-17.4.1_x64-base Helen Keller 28 March 2019
base: Debian GNU/Linux 9 (stretch)
Machine:
Type: Unknown System: Intel product: Intel Moon Creek Evaluation Board
v: No System Version serial: <filter>
Mobo: Intel model: Moon Creek Evaluation Board v: No Board Version serial: <filter>
BIOS: Phoenix v: Q2010g EB(SF) (006) date: 02/22/2012
CPU:
Topology: Single Core model: Intel Atom N450 bits: 64 type: MT arch: Bonnell rev: A
L2 cache: 512 KiB
flags: lm nx pae sse sse2 sse3 ssse3 bogomips: 6666
Speed: 1667 MHz min/max: N/A Core speeds (MHz): 1: 1667 2: 1667
Graphics:
Device-1: Intel Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics driver: i915
v: kernel bus ID: 00:02.0
Display: server: X.Org 1.19.2 driver: intel resolution: 1024x768~60Hz, 1024x768~60Hz
OpenGL: renderer: Mesa DRI Intel Pineview M v: 2.1 Mesa 13.0.6 direct render: Yes
Audio:
Device-1: Intel 82801H HD Audio vendor: Realtek driver: snd_hda_intel v: kernel
bus ID: 00:1b.0
Sound Server: ALSA v: k4.9.160-antiX.1-amd64-smp
Network:
Device-1: Intel 82567V-3 Gigabit Network driver: N/A port: fc20 bus ID: 00:19.0
Drives:
Local Storage: total: 11.36 GiB used: 3.73 GiB (32.8%)
ID-1: /dev/sda model: CF 4GB 2013A size: 3.90 GiB
Partition:
ID-1: / size: 3.78 GiB used: 3.30 GiB (87.4%) fs: ext4 dev: /dev/sda1
Sensors:
System Temperatures: cpu: 52.0 C mobo: N/A
Fan Speeds (RPM): N/A
Info:
Processes: 135 Uptime: 6m Memory: 472.8 MiB used: 167.1 MiB (35.3%) Init: SysVinit
runlevel: 5 Compilers: gcc: 6.3.0 Shell: bash v: 4.4.12 inxi: 3.0.33
With only a 4GB CF card, and 512MB RAM, useful OS options are extremely limited. It depends on what you plan to do with the machine. So far my plans for them include a dedicated Jukebox, simple touch gaming and kids painting machine for the loungeroom.
For the Jukebox I will see if we can make do the stock 4GB CF card and 512MB ram. Attempts to install Xubuntu/Lubuntu failed due to space considerations, so I settled on antiX Linux, which seems pretty perfect for the job.
To reduce wear on the CF card I ensured that any OS was not set up with a swap file/partition.
For heavier demands, we can up the ram to 2GB (I believe this is the max), and either use a larger CF card, bootable USB, or perhaps SATA SSD.
Although the 5A will accept a single 2G RAM stick I've not succeeded in booting with more than 2GB (having tried various combinations of 3G and 4G).
From the Workstation 5A Setup Guide: The Workstation 5A can support a single optional SATA 2.5” SSD. The drive mounts to a plate which in attaches to the rear of the LCD plate. A SATA data cable and custom power cable are provided connect the drive to the System board. So, we'll need to live with using a CF card or USB drive unless we cobble together a custom metal plate and custom power cable.
I realise I am using these machines outside of their original spec, and that being old machines (c2007) and not widely tested with Linux they are likely to have vulnerabilities and/or glitches.
One problem particularly evident is seen at boot, and when executing the dmesg command:
[ 9.504923] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.505378] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.505772] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.506352] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.506732] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.507134] [Firmware Bug]: ACPI: Invalid BIOS _PSS frequency found for processor 0: 0xffffffff MHz
[ 9.507504] [Firmware Bug]: ACPI: No valid BIOS _PSS frequency found for processor 0
[ 9.507829] [Firmware Bug]: BIOS needs update for CPU frequency support
Something to do with CPU Frequency Scaling BIOS bug? Regardless of the error's reason, the 4GB CF card very quickly filled up with these messages. /var/log/messages
/var/log/syslog
and /var/log/kern.log
were all getting huge, there are obviously a lot of messages being generated from 'problems' with the system, and these file writes will cause the SD card to fill up and/or wear out.
In order to avoid wear on the SD card, I disabled logging:
sudo /etc/init.d/rsyslog stop
sudo /etc/init.d/rsyslog disable
(actually with antiX, I disabled rsyslog though the antiX GUI).
Ubuntu: large syslog and kern.log files
Recommended way to disable/enable services?
I would like to fix the root of the error messages, but expect it can only be done through a BIOS update (unlikely to ever happen).
Perhaps there is some combination of BIOS options that would settle the system. I should have a closer look at the dmesg and logs.
Click here for dmesg output booting antiX (Debian).
The touch interface on the Workstation 5A is apparently an Elo TouchSystems, Inc. Elo TouchSystems 2216 AccuTouch® USB Touchmonitor Interface. Interestingly, of the two machines I have set up identically one is much more jittery with the tough-screen input, while the other is much smoother, though both are useable.
With all of the linux distros I tried, the touchscreen input was inverted and offset, and it took a bit of reading and patience to get it working right.
Although Debian seems to now use the libinput driver for touchscreens by default, I could not see a way to enable mouse button right-click emulation. I reverted to using the evdev driver (did not need to install separately), by moving the libinput config out of the way and adding a section to 10-evdev.conf for the "Elo touchscreen Catchall":
$ mv /usr/share/X11/xorg.conf.d/40-libinput.conf /usr/share/X11/xorg.conf.d/40-libinput.conf.old
$ sudo nano /usr/share/X11/xorg.conf.d/10-evdev.conf
I was having touble calibrating with xinput_calibrator (`apt install xinput-calibrator') but turned out my problem was running the calibrator repeatedly in the same session, causing it to get further out of alignment. These are the settings I got on a fresh boot and which work for me, and also provide for right-click:
$ xinput_calibrator --output-type xinput --geometry 1024x768
xinput set-int-prop "Elo TouchSystems, Inc. Elo TouchSystems 2216 AccuTouch® USB Touchmonitor Interface" "Evdev Axis Calibration" 32 3568 523 3545 588
xinput set-int-prop "Elo TouchSystems, Inc. Elo TouchSystems 2216 AccuTouch® USB Touchmonitor Interface" "Evdev Axes Swap" 8 0
We could place the above in a startup script but instead listed the properties and added to /usr/share/X11/xorg.conf.d/10-evdev.conf, as follows:
$ xinput list
$ xinput list-props 9
Device 'Elo TouchSystems, Inc. Elo TouchSystems 2216 AccuTouch® USB Touchmonitor Interface':
Device Enabled (136): 1
Coordinate Transformation Matrix (138): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (265): 0
Device Accel Constant Deceleration (266): 1.000000
Device Accel Adaptive Deceleration (267): 1.000000
Device Accel Velocity Scaling (268): 10.000000
Device Product ID (258): 1255, 80
Device Node (259): "/dev/input/event0"
Evdev Axis Inversion (269): 0, 0
Evdev Axis Calibration (270): 3568, 523, 3545, 588
Evdev Axes Swap (271): 0
Axis Labels (272): "Abs X" (262), "Abs Y" (263), "Abs Misc" (264)
Button Labels (273): "Button Left" (139), "Button Unknown" (261), "Button Unknown" (261), "Button Wheel Up" (142), "Button Wheel Down" (143)
Evdev Scrolling Distance (274): 0, 0, 0
Evdev Middle Button Emulation (275): 0
Evdev Middle Button Timeout (276): 50
Evdev Middle Button Button (277): 2
Evdev Third Button Emulation (278): 1
Evdev Third Button Emulation Timeout (279): 750
Evdev Third Button Emulation Button (280): 3
Evdev Third Button Emulation Threshold (281): 30
Evdev Wheel Emulation (282): 0
Evdev Wheel Emulation Axes (283): 0, 0, 4, 5
Evdev Wheel Emulation Inertia (284): 10
Evdev Wheel Emulation Timeout (285): 200
Evdev Wheel Emulation Button (286): 4
Evdev Drag Lock Buttons (287): 0
$ sudo nano /usr/share/X11/xorg.conf.d/10-evdev.conf
Section "InputClass"
Identifier "Elo touchscreen Catchall"
MatchProduct "2216 AccuTouch"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
Option "Calibration" "3568 523 3545 588"
Option "EmulateThirdButton" "1"
Option "EmulateThirdButtonTimeout" "750"
Option "EmulateThirdButtonMoveThreshold" "30"
EndSection
Touch screen configuration using xinput
To increase visibility of a unit wall-mounted unit, I needed to set up a jukebox installation of one workstation upside down. There did not appear to be a screen rotation option under BIOS, so next was linux...
note: use xinput list
to ensure you are using the correct identifier for the touch screen below (in my case 8).
in the AntiX startup script /home/<user>/.desktop-session/startup
:
xrandr --output LVDS1 --rotate inverted
xinput set-prop 8 "Evdev Axis Inversion" 1, 1
Calibrate and rotate input of a TouschScreen
Click here for depreciated notes from when using libinput instead of the evdev driver.
how to enable long touch as right click
Re: Calibrate and rotate input of a TouschScreen (Ubuntu)
Translating Evdev Axis Calibration to Matrix or something else?
ELO Touchscreen Driver (using evtouch)
Elo Touch USB touchscreen not working on Ubuntu 18.04
Elo Touch Screen Intelli Touch (USB)
search for 'xinput "coordinate transformation matrix"'
Interesting, according to Configure touchscreen on Debian? perhaps it can be done with the evdev driver instead of libinput? (and here)
Archlinux - Calibrating Touchscreen
Ubuntu Wiki: InputCoordinateTransformation
Touchscreen Calibration in Debian9
touchscreen-debian-fix.sh (old, I think)
Wayland Touchpad Jumping - Motion Treshold?
Static device configuration via udev
Elo TouchSystems Driver User Manual(windows)
Using a Raspberry Pi with a Hope Industrial Systems Touch Screen Part II: Touch Screen Setup
I simply have onboard open as a user session startup application in the GUI.
$ sudo apt install onboard
To have it start automatically add the following line to ~/.desktop-session/startup
onboard &
Touchscreen Keyboard Ubuntu Onboard on antiX 15
Debian User Forums: Installing Onboard Virtual Keyboard
How can I add an onscreen keyboard at login?
Silverjuke makes an excellent jukebox software to run on a touch-screen terminal like the 5A, with touchscreen themes and the ability to lock out access to other applications with 'kiosk mode'. Unfortunately there were some problems installing it from the debian repository so we needed to compile from source, and now it works great! My current solution for getting music onto the 5A is to just place MP3 files on a local USB drive I have connected to the 5A, in addition to playing through bluetooth. Originally I had the 5A auto-syncing it's media library with the iTunes media held on a mac over WIFI, but USB makes more sense when it's just the kids' music.
When I install Silverjuke from the debian repository, and try to run it, I get an error.
$ apt install silverjuke
$ silverjuke
Warning: Mismatch between the program and the library build versions detected.
The library used 3.0 (wchar_t, compile with C ++ ABI 1010, wx containers, compatible with 2.8),
and your program used 3.0 (wchar_t, compile with C ++ ABI 1009, wx containers, compatible with 2.8).
Abandon
Well, I'm delaying sleep but finally got it working, something like this:
$ sudo apt install build-essential fakeroot devscripts autotools-dev automake
$ sudo apt install gawk automake python-docutils pkg-config zlib1g-dev libsqlite3-dev libgstreamer1.0-$ dev libgstreamer-plugins-base1.0-dev libupnp-dev libgl1-mesa-dev libwxbase3.0-dev libwxgtk3.0-dev
$ sudo apt install gstreamer1.0-plugins-good-dbg
$ sudo apt install gstreamer1.0-plugins-ugly
$ sudo apt install pulseaudio:amd64
$ sudo apt install pulseaudio
$ wget https://github.com/silverjuke/silverjuke/archive/master.zip
$ unzip master.zip
$ cd silverjuke-master
$ ./autogen.sh
$ make
$ sudo make install
Silverjuke was refusing to play files with "gstreamer error: cannot link audio", but that has thankfully passed.
Kioskmode would turn the screen black (apparently as it thought it was supposed to be opening on another display) but this is fixed by running silverjuke with the silverjuke command line option kioskrect.
$ silverjuke --kioskrect=1 &
I run Silverjuke automatically on system startup. I also tell it to open automatically in kiosk mode, and to use a specific settings file:
$ nano ~/.desktop-session/startup
sleep 10 && silverjuke --jukebox=/home/user/.config/silverjuke/yoda.jukebox --kioskrect=1 --kiosk &
I found the sleep 10 helpful to ensure my USB disk was mounted before silverjuke ran.
There's plenty of options in Silverjuke, including the option to auto-start the visualiser during idle, or play songs at intervals during periods of inactivity and at certain times of day. It makes for quite an authentic jukebox feeling and I plan to see how it handles our entire music collection via a network share. I'd also like it to have a small subset of my our collection reside on the machine, that could be switched to when the kid(s) are playing music with it.
silverjuke command line options
Audacity and GCC – Mismatch between the program and library build versions
wxwidgets: Mismatch between the program and library build versions detected
Notes about toggline between Silverjuke libraries.
My MICROS Workstation 5A's MiniPCI port (note this is not not MiniPCI-e) was unpopulated, and can accept a wifi card. A linux-friendly USB dongle would always work if not something in the MiniPCI slot!
I happened to have a WM3B2100) with the right MiniPCI form-factor, and according to this it should be supported. But I get the following dmesg error:
ipw2100: eth%d: Failed to start the card.
I have ordered a BCM4318 MiniPCI WIFI card and will report my success with it below.
This MiniPCI card did not work out of the box, but forcing the module to load seems to have worked, by adding b43 to /etc/modules. Now I can see the network card in the list of Network Interfaces, in the antiX GUI and am able to use WIFI.
$ lspci
01:08.0 Network controller: Broadcom Limited BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller (rev 02)
I am still getting some errors in dmesg, but will see if it works.
dmesg | grep wl
[ 11.981596] wl: loading out-of-tree module taints kernel.
[ 11.981609] wl: module license 'MIXED/Proprietary' taints kernel.
[ 12.021565] caller wl_pci_probe+0x2ba/0x5b0 [wl] mapping multiple BARs
[ 12.099749] wl driver 6.30.223.271 (r587334) failed with code 21
[ 12.099757] ERROR @wl_cfg80211_detach :
[ 12.099757] NULL ndev->ieee80211ptr, unable to deref wl
Ubuntu: WifiDocs/Driver/bcm43xx
Another option to get WIFI working would be to try ndisgtk (included in antiX) to utilize the Windows driver.
Linux Wi-Fi Card Activation in Ubuntu Using ndisgtk
Ubuntu Forum: Re: Broadcom Diver wont install, please help "Do you consider using Windows driver with ndisgtk ?"
Taking a system backup is a good idea to avoid loss of setup...
After plugging the CF card into a CF card reader on a linux PC:
determine the disk, e.g. sdb:
$ lsblk
backup the disk with dd (where X = your correct drive):
$ sudo dd if=/dev/sd[X] of=./BACKUP.dd bs=32M
to restore (where X = your correct drive):
$ sudo dd if=./BACKUP.dd of=/dev/sd[X] bs=32M
In case the volume was changed by a previous user I found it helpful to reset the volume on each boot...
In Antix, select Control centre > Session > User session desktop > Toggle to desktop-session.conf file and change the % in this line to whatever you wish:
STARTUPSOUNDLEVEL="25%"
Playing around to ensure that volume is set to certain levels at certain times of day...
$ echo $DISPLAY
$ crontab -e
* 1 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 0%
* 8 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 30%
* 9 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 50%
* 12 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 60%
WAIT! For some reason the % diddn't work in crontab?? (maybe due to this) always setting the volume to 0.. so using this:
* 1 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 0
* 8 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 20000
* 9 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 32768
* 12 * * * DISPLAY=:0.0 /usr/bin/amixer set Master 40000
For some reason this stopped working?... so using this:
0 1 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 0
0 8 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 20
0 9 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 50
0 12 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 60
Still experiencing problems, this time audiable even when set to 0 so:
0 1 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 20 off
0 8 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 20 on
0 9 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 50 on
0 12 * * * DISPLAY=:0.0 /usr/bin/amixer sset Master 60 on
How to use command line to change volume?
To clear playlist, and randomly play again if it had been paused (if silverjuke set to auto-play), etc...
0 3 * * * /usr/bin/pkill -f silverjuke
0 7 * * * DISPLAY=:0.0 /usr/local/bin/silverjuke
How do I run a cronjob on a display?
I added a USB bluetooth dongle to the 5A and set it up so that I could pair a phone and play music through the 5A to the connected stereo.
In AntiX there are some Bluetooth options under the GUI menu, however bluetoothctl under the command line was used to connect to i-devices, something as follows:
bluetoothctl -a
[NEW] Device XX:XX:XX:XX:XX:XX ipad
[bluetooth]# scan on
Discovery started
[bluetooth]# pair XX:XX:XX:XX:XX:XX
Attempting to pair with XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Request PIN code
[agent] Enter PIN code: 0000
[CHG] Device XX:XX:XX:XX:XX:XX Modalias: bluetooth:v004Cp6F05d1030
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 00000000-deca-fade-deca-deafdecacafe
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 00001000-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 0000110a-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 0000111f-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 00001132-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 00001801-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: 02030302-1d19-415f-86f2-22a2106a0a77
[CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: yes
[CHG] Device XX:XX:XX:XX:XX:XX Paired: yes
Pairing successful
Some BIOS notes here.