Wednesday 13 March 2024

Amazon Customer Obsession

Amazon removed side stripe and images for "affiliates" so you can't embed pictures in your own web sites anymore that link to the products.

Amazon likes to say they are customer obsessed, but they really aren't.  Its all about Amazon.

Remember auto rip? Music library? Twitch ad free viewing? All good examples of features people loved but were "marinal" in their returns.

When I singned up to be an affiliate, I had some folks buy stuff through my links, but I was lazy in setting up my tax info for spifs. So Amazon cancelled my affiliate account because I couldn't sell enough, and then locked me out so I couldn't get the spif payments.

Amazon is evil. 

Friday 1 March 2024

Day Off Fixes

Today is a "Global Reset Day" so I took the opportunity to fix some things on the PacMan cabinet. First, I never hooked up the 2 pin header buttons to the 3 pin sockets - and so re-use the buttons from the original cabinet. After some research, I discovered it is as simple as "forcing" the 2 pin header into the socket leaving pin 3 disconnected. However, these buttons are cheap, and sound terrible side mounted. Then, my research on audio cables implied I should twist my speaker wires together - braid them - to reduce noise. I did this, and low and behold the hum from the HDMI connector to the speaker disappeared. I was able to remove the lo-hi pass filter and the sound is less muffled. Important to remember that the Odroid uses HDMI out, so with my last update, I need to reset sound output to the HDMI device. Also important to remember that over driving the ALSA mixer is a very bad idea (and MAME sound, like for Karate Champ, will clip out.) Good day off.

Monday 12 February 2024

Fixing Galaxian sound on ARM 8 core

** updated ** I was wrong about adding a mutex. One of the MAME developers, in pointing out I was wrong, also pointed out what was wrong, and subsequently fixed the issue and more. See https://github.com/mamedev/mame/pull/12034 for details.
 

Sunday 11 February 2024

4:3 MAME Project

After turning my 1Up PacMan into a MAME cabinet, I wanted to get two more cabinets because I wanted full screen experience for horizontal and square displays in addition to vertical.

I found a Marvel Super Heroes aka Marvel vs Capcom 1Up used for $200 on Facebook Marketplace.

When I went to pick it up,  I had an unexpected visitor: George.


I set it up in the living room and played a few games with the boy.


Taking it apart, I noticed the controller looked a lot like a stock USB encoder.  I wanted to reuse as much hardware as possible.  (I have another project now to revers engineer the encoder.)



The brain had an on/off switch, and a power outlet (likely for a marquee in other 1Up models).



This is what the logic board looks like (AllWinner effectvely an Android device; note the debug uart pins, the micro USB, and other cool stuff.


I wanted to reuse the power and volume buttons on this thing, so all buttons are usable.

As reverse engineering the 1Up encoder will take time, I added two DragonRise USB controller.


The joystick is a four button model. The block 4 pin terminus doesn't fit the 5 pin sawa style, so I needed to splice on a couple 2 pin terminus (22 gauge wire).


No need to solder when you can use a mini marrette. 



You can split the 3 position switch for volume into 2 x 2 pin terminus.

+------------+
| A |  B | C | SWITCH
+------------+
  |    |    |
  |   / \   |
  |  |   |  |
+-----+ +-----+
| 1| 2| | 3| 4|
+-----+ +-----+

Next step was taking apart the speaker assembly to map right and left wires and check the Ohms and Watts on the speakers (8O3W).


So the usual Kinter amplifier will do. Cut off the 4 contact stereo jack and connect to 22 guage wire from the amplifier.

I used a modified SVG of my previous J Panel to have two buttons and I moved the amplifier up.  Cut with the Epilog laser cutter at work.


Using hot glue like last time with a joint to add some strength. Used a grinder to allow the screws to hide flush.



The buttons are for coin or service (or whatever.)


Here is a video of how to attach the button to the switch.


A picture of the assembled J Panel.



Like last project, I attached the encoders with screws and spacers from poly tubing.  I pointed the USB B towards the guts to make room but this was a mistake.  The cables molding was way to big and even though I left room, the monitor back panel descended too low and I had to notch two holes for the plugs.  (Also don't forget to label left and right wires; I just use colored tape.)


I attached the video controller to a bit of wood so I could hot glue it to the back of the display.


Secured.  Again, poly tube and screws to secure to the wood.


Zippies on all the cables, I also added a shelf for the Geekom Mini I'm using as the brain for this cabinet. I still need to secure the display buttons and mini with a VESA (or bigger zippie).

So booting the Mini Air 11 (Windows GONE, Ubuntu 22.04 with XFCE4), 


Attract is fine. (I compile everything from current source.)


JSTest all buttons/switches firing okay (including power and volume). Sound working fine through the headphone jack and amplifier in stereo.

And now time to play Tekken 2 with the boy.


And after... It took about 8 hours to convert the cabinet. Total project cost about $450 (including the 1Up used $200, the Air Mini at $150, and $100 for amp, buttons, 2 encoders...)





Thursday 25 January 2024

Youyeetoo R1: First Impressions

Unboxing and Language


In my search for multiple core ARM processors in SBCs (I was drooling over AmpereOne's 192 cores), I found a new board called youyeetoo R1. It appears to be an Orange Pi 5 competitor. Its got a Rockchip RK3588s 8 core, big little (A76/A55) 4 and 4 core and the big cores burst at 2.4GHz. Also like the OPi5, it has a Mali 610 GPU - and more features that seemed attractive like an NPU (neural processing unit, can do simultaneous operations like you'd want in a neural net firing your activation / objective functions and back propagation weighting adjustments), and a NFC (Near Field Communication) sensor (that could be used to read you Yubi key, phone, or allow for lil' robot communication if they are in proximity to each other). It also has support for two monitors via MIPI-DSI and HDMI ports. I ordered an 8/64 EMMC with Debian pre-installed so I could play... 

It arrived well packaged.


Double bubble wrap!


And the box wasn't squished in any way.


The box confirmed what I bought - though the Wifi module was misleading (it was not included). The power supply was typical 12V 4A barrel tip.


Inside we had a spacer and two anti-static bags.


The board was on top of the heat sink.


Board looked clean.



The heat sink looks like it blanket covers the CPU and other chips. It came with some thermal double sided tape.


The board is bigger than the Orange Pi.


I booted it up.  To my surprise, it did NOT launch a frame buffer (fb) console. It has U-Boot installed, and apparently dumps its console via serial tty (so if I had a debug serial cable that fit and a FTDI USB adapter, I might be able to watch it boot, and or interact with U-Boot.) See the picture below for the UART debug plug on the bottom of the board (and its #1, so pins are not shared with GPIO block.)


So it has a Debian/Linaro build with XFCE4.  I like XFCE4. But, I don't read simplified Chinese (though I have about 100 Mandarin/pinyin words in my vocabulary.)


So the first step, let's get a language we know.  Open a console, and install English.

sudo dpkg-reconfigure locales

sudo update-locale LC_ALL=en_US.UTF-8


The first command brings up a CURSES dialog in Chinese, but it is easy to find and select en_US and create the resources. The second command sets the default language to English. You need to `sudo reboot` after this.

Installing Software

So we are running a 5.10 kernel.  My Orange Pi is pegged at 5.15.  My Odroid and other machines are on 6.1.

There are a few tools I can't live without.  Most important for me are benchmarks, partition managers, developer tools, process monitors, and graphics drivers...

sudo apt install xfce4-terminal

sudo apt install gnome-system-monitor

sudo apt install gparted

sudo apt install build-essential


I hit my first glitch.  The system is pegged (more on this later).  Turns out I needed to force a dpkg and reinstall to get current build-essential.

sudo apt install --reinstall dpkg-dev libdpkg-perl

So now I can re-install build essentials.  Great. I try chromium browser, and get errors about bad dates and certs. Ok, lets fix the time ISO style.

sudo date -s "2024-01-25 17:15"

But I really want to autoset the time on boot - not just for the duration of whatever capacitor is on the board.

linaro@linaro-alip:~$ sudo timedatectl set-ntp true

Failed to set ntp: NTP not supported


Huh. No NTP?  Not good. And I can't  install timesyncd as its pegged. So how many packages are locked?

linaro@linaro-alip:~$ apt-mark showhold | wc -l 
1340

No way. Update only told me 96 packages were locked. Now I am worried. Where are the Debian packages actually coming from?

linaro@linaro-alip:/etc/apt$ cat sources.list

deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free

deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free

deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free

deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free

deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-freedeb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free

deb http://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free


Now I am worried. I am locked into an unofficial, Chinese repo. This is not uncommon.  The Orange Pi is also tied to Huawei. I know we also have Hon Hai / Foxconn SBC. I have heard horror stories (usually about Mini PCs) of all sorts of spyware and malware, usually on "Windows" distributions.  I install stock Ubuntu intel from Live USB on all my Minis.  It suffices to say, `netstat -epa` and process monitor's network traffic made me feel much better that information was not being sent somewhere I didn't want it to go. However, I could not redirect to official repos (that I can with Korean Odroid.)  This makes me unhappy.

Quick Orange Pi Comparison


The form factor is slightly bigger. But we have more ports. And we favor one side, that actually isn't bad (as it is more rack friendly.)


I am irritated by both that we don't have an EMMC socket (like Odroid). This means to flash the EMMC, you need to treat the board like an ADB/USB micro storage device (will cover in another blog).


On the Orange Pi 5 (that does have a fb console), we only have a power button.


But on Youyeetoo R1, we have 4 buttons.  From left to right: Reset, Power, Recover, and Boot.


I have not figured out exactly what the async behind the buttons actually does aside from the obvious (but I will talk about it in another blog post).

Quick GL Performance


XFCE4 performs well.  There is no cursor flicker (like on Le Potatoe). `glmark2-es2` runs okay, but oddly, benched about 760 compared to the Orange Pi 980 at same resolution (it should be the same, right, as it has the same hardware.) There were some odd artifacts with GL, so I suspect the Mali (Panfrost?) driver isn't current. Also, libmali.so, not there, so glmark2 will run with the LLVM pipe (effectively unaccelerated software rendering), that means any game emulators will need to support GLES. 



Other Quirks


When I tried to get to a fb console via `alt Fx`, the device hung.

I managed to completely corrupt OS and eventually the root partition... fixing that is for another blog.


Next Steps


My next step is to try build and install Ubuntu, as unfortunately there is not an image. I understand Youyeetoo plans to provide one eventually, but I believe this device is currently not for a casual hobbyist.  To do that, the following would need to happen
  • Baked in GRUB support
  • USB boot
  • fb console
  • Use of official repositories
  • Not locking down packages 
Note that vendors lock packages to have a stable OS. But this is at the expense of developers. So... 

I do look forward to continuing to play with the device, in particular its NPU and NFC, however I won't be sticking it in a game cabinet any time soon.  It will likely get added to my home-lab rack.









Monday 18 December 2023

MAME: Getting Things Working

Its frustrating when the games you love don't work.
  • Moon Cresta and Galaxian crash on ARM because of a threading glitch (possibly in discrete.cpp), with an "negative samples" exception because the threads to generate the sound go out of order
  • Tekken 1 and 2 play no sound, and the coin button doesn't work
  • Vector games look like crap (asteroid, star wars, etc.)

Multithreading Issues

When I turned off optimization, and turned on debugging, the threading issue did not manifest. Its hard to debug. I tried to ask Bard what was up with the code, and it suggested std::launder on the pointers, that only masked the issue. Then "chuckie_the_egg" on Reddit suggested something brilliant: Set the number of processors to one or two and the problem likely won't happen. And Chuckie was right. 48 hours, even with mame's debug on, and no crashing. So, in your .mame folder, create a mooncrst.ini and galaxian.ini and add numprocessors 2.

Compiling for Aarch64

Chuckie also pointed out that he compiles with -fsigned-char on as this is a key difference between ARM and Intel (gcc vs mscode). I got to thinking, maybe this, and the odd behaviors I was experiencing on games like Tekken are due to this. Decades ago I wrote a uLaw to PCM converter. I know the old Sun Microsystems machines used signed bytes to represent the signed 8 bit audio. Maybe I should care about tuning MAME for the ODroid N2L too. In the makefile: ARCHOPTS = -fsigned-char -mtune=cortex-a73.cortex-a53 -march=armv8-a Wonderful, Tekken 1 and 2 both started working with sound. (Soul Edge does not, so I need to figure out why as it does on Intel.)

Vector

This is posted in many places, but vector games at high resolutions lose points and have weak lines. To fix all vector games, created a vector.ini and put this in as it will make points and lines bigger and brighter:
beam_width_min 1.5
beam_width_max 1.5
beam_dot_size 1.5
beam_intensity_weight 1.0

Sunday 16 July 2023

Geekom Mini-Air 11

Pregame Show

I thought this would be a good gaming alternative - unlike SBCs this is a mini computer so has all the I/O ports you need, SD card reader, and expandable SSD and DRAM slots inside. This machine has built in wireless, JasperLake GPU, and 4 core Celeron M5105 @ 2GHz. It does run hot though; and takes 19V 3.42A 65W power (like some Chromebooks). I zapped it with my temp gun, and its 110F (43C), and its "rated" for 50C - with NO load.

WSL2 Failure

I tried to use WSL2 server, and after a couple hours gave up, as it seems set for Wayland not X11. It would be more useful if you could install Xubuntu; maybe you can but I gave up. (Linux support is something Chromebook does right.)

Windows 11 Must Die

I installed MAME and other tools and they stuttered. This can't be right, I thought. So given my WSL failure, and that I had to hunt down some older directX kits to get anything working, I said to heck with it - I must install Ubuntu 22 and benchmark with somewhat more apples to apples.

Installing Ubuntu Pains

Yes, you hit del to enter BIOS and set the startup device. Using EFI, I had to set to boot from "USB KEY". I had to blow away /dev/sda2 and other Windowsy partitions. I had to reformat the partition in ext4... and it seems the drivers on Xubuntu 22.04 image are not fully compatible with the Air Mini. (The RealTek 8821c driver continue to blow kernel errors, frame errors, and hung several times during install.) After several attempts, and update/upgrades, I managed to get Xubuntu installed and up-to-date/stable. I really don't know why Geekom doesn't have a working image, or sell the devices without Windows...

Quelle Surprise

Even though it only has 4 cores, the rendering capability of the device is solid.
  • geekom-miniair-11: 1378 ($150)
  • opi5: 975 ($110)
  • odroid n2l: 509 ($70)
So graphics from JSL makes this device 2.7x faster than my N2L, and 1.4x faster than the OPi5 (note not all benches were faster). But, sound emulation is multi-threaded and runs on multiple cores, so the next benches will be more interesting... yay symetric multi-processing.
# uname -a
Linux geekom-MiniAir-11 5.19.0-46-generic #47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC
# glmark2
=======================================================
    glmark2 2021.02
=======================================================
    OpenGL Information
    GL_VENDOR:     Intel
    GL_RENDERER:   Mesa Intel(R) UHD Graphics (JSL)
    GL_VERSION:    4.6 (Compatibility Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3
=======================================================
[build] use-vbo=false: FPS: 1702 FrameTime: 0.588 ms
[build] use-vbo=true: FPS: 2127 FrameTime: 0.470 ms
[texture] texture-filter=nearest: FPS: 1929 FrameTime: 0.518 ms
[texture] texture-filter=linear: FPS: 1898 FrameTime: 0.527 ms
[texture] texture-filter=mipmap: FPS: 1891 FrameTime: 0.529 ms
[shading] shading=gouraud: FPS: 1753 FrameTime: 0.570 ms
[shading] shading=blinn-phong-inf: FPS: 1759 FrameTime: 0.569 ms
[shading] shading=phong: FPS: 1707 FrameTime: 0.586 ms
[shading] shading=cel: FPS: 1689 FrameTime: 0.592 ms
[bump] bump-render=high-poly: FPS: 1272 FrameTime: 0.786 ms
[bump] bump-render=normals: FPS: 2039 FrameTime: 0.490 ms
[bump] bump-render=height: FPS: 2022 FrameTime: 0.495 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 1445 FrameTime: 0.692 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 912 FrameTime: 1.096 ms
[pulsar] light=false:quads=5:texture=false: FPS: 1696 FrameTime: 0.590 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 759 FrameTime: 1.318 ms
[desktop] effect=shadow:windows=4: FPS: 1125 FrameTime: 0.889 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 364 FrameTime: 2.747 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 647 FrameTime: 1.546 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 354 FrameTime: 2.825 ms
[ideas] speed=duration: FPS: 1624 FrameTime: 0.616 ms
[jellyfish] : FPS: 1232 FrameTime: 0.812 ms
[terrain] : FPS: 193 FrameTime: 5.181 ms
[shadow] : FPS: 562 FrameTime: 1.779 ms
[refract] : FPS: 326 FrameTime: 3.067 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 1541 FrameTime: 0.649 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 1547 FrameTime: 0.646 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 1545 FrameTime: 0.647 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 1534 FrameTime: 0.652 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 1534 FrameTime: 0.652 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1578 FrameTime: 0.634 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 1597 FrameTime: 0.626 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1595 FrameTime: 0.627 ms
=======================================================
                                  glmark2 Score: 1378 
=======================================================