ION iCade BT Controller


I’m really close to completing an amazing build! I was testing everything with a N64 USb controller, to test this iPad HDMI controller board I got for cheap, using some USB based speakers managed to put them all on a board and place it into the iCade…

I managed to read the Lakka Bluetooth Wiki page and it helped me get the iCade joystick system paired up with my rPi3 Mod B… but now I’m in the same boat as this guy…

I can’t seem to map anything, and checking the SSH console I am only able to see an event for my USB controller, but nothing for the iCade’s BT controller. :frowning: Please any help is greatly appreciated.

I’m waiting to get past this hurdle, then I want to theme it a lil bit and post it on my blog once it’s all ready. This hurdle has been stressful. :frowning:

What hardware do you use Lakka on? (Version 2.0)

My buddy told me that even if I managed to get an event I could have issues with binding due to how the iCade controller does it “keystrokes” using one key for a button press and another for it’s release…

He managed to find this open source driver, if it’s of any help?



Can you try to give the information doing the operation from this post.

Thank you.


Thank for replying gouchi, I’m amazed you didn’t notice I sourced that exact topic in my initial topic post. and I stated “I’m not getting any events”.

Yet ShcokWave mentions that the retro-arch config library does contain the iCade cng file… here…

and indeed I do see the cnf file… but how come I don’t get an “event” after pairing? How do I force this, or hardcode it maybe?

evtest still doesn’t exist in the lakka version I’m running from the latest n00bs 2_8. You stated in the topic that you’d work on getting evtest imbedded into lakka, any update on that?

I’m reading the knock off China Controller thread now in hopes I can get some more nitty gritty info for you to help me with. You seem to be the top dev helping people with this common issue. So thank you for all your hard work in these community forms.


With 2 SSH sessions, in one I ran:

formatting here is getting terrible, if this isn’t allowed let me know I’ll remove all the content and simply leave this paste bin active:

udevadm test output:

Just so we are on the same page I read the end of this post.

I seem to be pretty much in the same boat, as the guy you were helping there, maybe there’s a mismatch for me… I haven’t checked the SYSTEM attribute just yet, a lot of output. And the same issue with the connect happens to me (even though I haven’t even got the binding stuff to work) in that after some time of no use the controller shuts off (to be expected) but then I have to go into SSH and do the bluetoothctl - connect MAC for it to re-connect.

Sorry for my ignorance, I looked through all the data and I don’t know enough of how this was built to fix this :frowning: I don’t know what SYSTEM value (alealv) was referring to :frowning:


OK, you’re on the right track, but probably missing this little nugget of information:

It’s the Bluetooth synching process for the 8bitdo NES30 Pro Controllers, but works for any Bluetooth-enabled controllers and the process is remarkably similar (it also worked for my x64-based Lakka unit with the Wii U Pro Controllers I have).

With that said, I’d probably try to boot Lakka, the Pi and the monitor separately while making sure the iCade joystick/buttons have power as well and triggering their pairing sequence to see if the Pi/Lakka can pick up the Bluetooth Hardware ID of the iCade controller.


I see that we have udev rule for the ION Icade so it should work.


Gouchi, IKR, I don’t get why it’s not working… is my ION iCade reporting a different SYSTEM or ID or something, that you can tell base don the pastebins?

Thanks Shockwave I’ll look at the reference link you provided and report some feed back, I don’t get what I’m missing…


Sigh I don’t get it… grabbed the latest nightly versino of lakka or RPi2(arm) put on SD booted Pi, enabled bluetooth and ssh in the GUI…

SSH’d in…

I get nothing on the Lakka screen with yellow writting at the bottom showing a new device… what am I missing, I even got trusted true… connected success… arggg!!!

So the “magic” I can’t figure out, is him creating a new rule under /storage/.config/udev.rules.d/*HisController is cause he was actually “Getting an event” where as I’m not.

After following the “8bitdo” guide that does take care of having to repair everytime, however it doesn’t solve the fact i’m “not getting an event”. This is the magic I’m now trying to figure out.


From my udevadm monitor… and the primary relative post… I figured there was suppose to be a input folder under the device that gets added, there didn’t seem to be a /devices folder directly off root but a bit of digging I found the relative path was actually under /sys… but I didn’t see the input folder…

How does this event magic work?


Sigh, since I can’t reverse engineer this “event magic” I’m probably going to end up getting a USB based I/O controller board and manually wire them for that. I could also hardwire them into the GPIO ports.

I did manage to get my RetroPi to pair with the iCade controller via Bluetooth, and their menu options had an option to create a uDev rule after pairing. It’s went like this:

SUBSYSTEM==“input”, ATTRS{name}==“ION iCade Game Controller”, MODE=“0666”, ENV{ID_INPUT_JOYSTICK}=“1”

to /etc/udev/rules.d/99-bluetooth.rules.

When I go into it’s input config wizard it states 2 gamepads found, but I can’t “hold down a” to configure in it’s GUI I believe due to the odd fact that these BT controller boards send a keystroke for a button press, then send another keystroke for the button release. So it’s impossible to “hold” a key down unless I guess the driver knows this?


That’s exactly what I did Shockwave, and I provided the udevadm monitor results which show the device path thats being seen by the system. But no one is telling me how udevadm info --name=input/event# is created. Since I do not see an event taking place I’m assuming udev rules wouldn’t work, as there is something else the system needs to do for this to work, but is no where to be documented or discussed… Most people that use Lakka have no need to get into the nitty gritty of the OS or it’s development, but in my case I do have some development background, but without knowing how it works my generic programming skills do not help.


After the “Connection Successful” message on the SSH terminal, use another controller to navigate to Settings -> Input -> Input User 1 Binds -> Controller and check to see if your ION ICade is a selectable option. If it is, then you can bind your key settings and should be able to use it. I have to do this with controllers that aren’t immediately recognized by Lakka/Retroarch, but as long as it picks it up in the Input/udev part of the bindings, it should be OK (save the configuration once you’re done!).


I checked that too and no dice… since there is no event, it doesn’t when show up when I do:

cat /proc/bus/input/devices

It only shows my N64 USB controller.

Gouchi even said in the original thread when he said to manually create the udev rule that it probablly wouldn’t work cause he assumed the other op wasn’t getting an event. Which is my problem unlike the source thread. I do not get an event.

I keep asking about it but there doesn’t seem to be a response as to exatcly what this “event” is, and how to manually replicate it in the linux OS. Without that event, and without it showing up under the /proc/bus/input/devices and without udevadm info --name=input/event# showing up past 0(My N64 USB controller) I’ll never be able to bind anything.


An “event” is the acknowledgement that the hardware ID is recognized by the software. Drivers for the device(s) in question usually handle the handshaking.

And I think I know why: your ION ICade joystick is not going to show up as a joystick…the Pi doesn’t support the iCade’s Bluetooth stack/drivers. Sorry bud.


If the CNF file exists, wouldn’t that mean someone had done it before and made it work? It seems bazzar to me otherwise, why is there an existing CNF file if it would never have worked?


Because it’s not compatible…with the Raspberry Pi 3. The ION iCade’s bluetooth stack shows up as a keyboard for iOS devices, which means it’s not an ordinary stack. The Pi’s not going to be able to read it, no matter what software you use (the ION iCade udev drivers are for Retroarch, which can be for the PC version and also work for Lakka, but not if the hardware is not compatible and the drivers don’t play nice with each other).

It’s your Pi, but not the Pi’s fault.

How I found this out:

The way you’re going to have to get around it is to unplug the iCade’s buttons and joystick from the Bluetooth controller and either use a USB encoder or use the GPIO pins on the Pi.


Thanks ShockWave,

I just came on here to post that yup I gave up. I was starting to think about compiling a custom build then just like you suggested, said nah… not worth it for a slower, higher cycle costing interface then simply USB.

So I ordered this piece to do exactly as you suggested. Thanks for clearing it all up.