Orange Pi i96 Getting Started Guide

Orange Pi i96
Orange Pi i96

Recently I reviewed the Orange Pi Zero 2 and thought it was a fantastic board. I really like the amount of polish that the Orange Pi line of products have as it is the closest I have seen to anything approaching a Raspberry Pi experience. We also benchmarked the Orange Pi Zero 2 and determined it’s a very capable board.

I recently got a Orange Pi i96 (thanks munecito!) and this board is very exciting because it was purchased on sale for ~$10! That is insanely cheap. The reason it’s so cheap is because it’s a headless board that doesn’t contain any display-out ports.

If you are going to be using the board headless anyway (I use most of my SBCs headlessly) you may be able to save a fortune with this board. Let’s get started!

Hardware Used

Orange Pi i96
Orange Pi i96

The Orange Pi i96 is a low-cost board from the Orange Pi line of SBCs. It uses the RDA8810 SoC and has 256MB LPDDR2 SDRAM. It’s well suited for headless tasks and is astonishingly cheap.

Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg*

Geekworm Copper Heatsink Set
Geekworm Copper Heatsink Set

The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks.

Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*

Getting Started

First head to the official Orange Pi downloads page:

Orange Pi - Official Downloads Page
Orange Pi – Official Downloads Page

Now select the Orange Pi i96 from the list. I will be using Ubuntu Linux for this guide but you may use Armbian as well.

If you are wanting to try Android I highly recommend seeing my Orange Pi Android Installation Guide as the installation process is different than Linux.

EDIT: I now recommend using my fixed Orange Pi i96 image as it will fix your USB port to be able to operate at full speed and give you a much newer OS of Debian Bullseye.

Writing the Image

The images are typically distributed as a .tar.gz file. The name of the Ubuntu image tar.gz file at time of writing was OrangePi_i96_ubuntu_xenial_server_linux3.10.62_v0.0.4.tar.gz.

We will need to extract this file. If you are using Windows then grab 7-zip to be able to extract a .tar.gz file.

Inside this file will be a .img file. Since I downloaded the Ubuntu image the name of my file was OrangePi_i96_ubuntu_xenial_server_linux3.10.62_v0.0.4.img. This is the image that we are going to write to our SD card.

There are several choices to write the image to your SD card. If you are on Windows I recommend Win32DiskImager. Etcher is also available for Windows/Linux/Mac OS X.

Write the image to the SD card using your preferred software.

First Startup

Before starting up you should make sure that the Orange Pi’s switches are in these positions (indicating to boot from SD card):

Orange Pi - SD Startup Position
Orange Pi – SD Startup Position
Orange Pi - SD Startup Position
Orange Pi – SD Startup Position

We’re ready to put the SD card into the Orange Pi i96. But how are we going to connect to the device? There’s no network port and the device isn’t configured to connect to our WiFi yet.

Connection Option #1

If you happen to have a USB to Ethernet adapter that is the easiest way to connect to the device for initial configuration:

USB to Ethernet Adapter
USB to Ethernet Adapter

Connection Option #2

The Orange Pi is configured to connect to a pre-set wireless point with the SSID of orangepi and a password of orangepi.

Most phones these days have an option to set up a wireless hotspot. If your phone allows it then one way to do your initial connection to the Orange Pi i96 is to set up a hotspot with the SSID of orangepi and a password of orangepi. If you set up a point with these credentials the Orange Pi will connect to it and you can access it over SSH via your phone. There are many apps for both Android and iOS that allow you to make SSH connections and any of these will do.

Once you know the IP of the Orange Pi you can connect to it using the username orangepi and the password orangepi or:

ssh orangepi@192.168.X.X

Connection Option #3

If you have a TTL to USB serial debug adapter you can use that as well. See the OrangePi instructions for that method.

Initial Configuration

orangepi-config Utility

Once you’ve connected it’s time to do some basic configuration. We will use the tool orangepi-config:

sudo orangepi-config

You may now set the WiFi settings, etc. The orangepi-config is just like raspi-config if you’ve ever used that on a Raspberry Pi.

Don’t reboot before doing the next section.

Fix Second Startup (Debian / Ubuntu)

You will notice if you reboot the device it will often not come up the second startup. This is especially likely if you performed a sudo apt dist-upgrade.

To prevent this I recommend removing the alsautils package. This will impact sound functionality on the board but as I was not using it and intended to use this more as a headless board this was fine for me.

sudo apt purge alsa-utils

If you need to have the sound working on the board there is an alternate solution available here.

This is not necessary in my Legendary image as it has kernel fixes for these issues (highly recommended)

Set Timezone

Replace my timezone with yours in the following commands:

rm /etc/localtime
ln -s /usr/share/zoneinfo/America/Denver /etc/localtime

Setup Locales

Setting the locales isn’t in orangepi-config (such as it is in raspi-config) but here’s a quick way to set them:

sudo apt install locales -y
sudo dpkg-reconfigure locales

Setup Wireless CRDA Regulatory Domain

For the wireless to function very well at all you need to set the wireless regulatory domain.

If you are not using my image then you will first need to install the crda package with:

sudo apt install crda -y

Now we can set the regulatory domain by editing the following file:

sudo nano /etc/default/crda

At the bottom of the file there is this line:

REGDOMAIN=

Put the 2 letter country code for your country. Mine is “US”. Once finished press Ctrl+X then Y to save the file.

Optional – Upgrade Debian OS to Buster/Bullseye

Note that this will not upgrade the kernel. You can upgrade everything else though including all the way up to Bullseye. You should do this one release at a time and start with “Stretch” and then do “Bullseye” afterward.

If you are using the Debian installation you can upgrade to Buster by editing your /etc/apt/sources.list file.

Change all instances of “stretch” in the file to “buster” and then do the following:

sudo apt update && sudo apt dist-upgrade -y

Once this has completed reboot the system (make sure you’ve done my fix second reboot section first by purging alsa-utils). Verify you are on Buster with

cat /etc/os-release

for example:

root@orangepii96:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Now you can upgrade to Bullseye. It’s almost the same as upgrading from Stretch to Buster but there has been a change in the security updates server format. Here is a working “Bullseye” apt sources file for the Debian Orange Pi i96 image:

root@orangepii96:/# cat /etc/apt/sources.list
deb http://ftp.debian.org/debian bullseye main contrib non-free
#deb-src http://ftp2.cn.debian.org/debian bullseye main contrib non-free
deb http://ftp.debian.org/debian bullseye-updates main contrib non-free
#deb-src http://ftp2.cn.debian.org/debian bullseye-updates main contrib non-free

deb http://security.debian.org/ bullseye-security main contrib non-free
#deb-src http://security.debian.org/ bullseye-security main contrib non-free

Once you’ve changed the files do a sudo apt update and make sure you don’t see any errors. If everything looks okay start the Bullseye upgrade with:

sudo apt full-upgrade -y

After a reboot you should be on Bullseye! We can verify this with cat /etc/os-release:

orangepi@orangepii96:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
orangepi@orangepii96:~$ uname -a 
Linux orangepii96 3.10.62-rel5.0.2+ #4 PREEMPT Wed Mar 18 18:49:25 CST 2020 armv7l GNU/Linux

Notice that the kernel has not changed at all (as cautioned at the beginning of the section) but everything else on the system will be Bullseye!

Performance Benchmarking

I benchmarked the board using a SanDisk Extreme SD card on my Pi Benchmarks web site. This gives us comparable results between boards and there are over 30,000 benchmarks submitted for various boards / storage devices.

I had a total score of 497. This was below average or off from an average Raspberry Pi setup by about 47%.

To be clear the storage performance on the board is relatively low compared to the Orange Pi Zero 2 or a Raspberry Pi (Zero or 4). That is to be expected for a price of around ~$7-$10.

I’m not sure I would say this is a disappointing result though. We are talking about a board that is a single digit number of dollars. For the price point that is fantastic performance! In fact for the price point it’s a wonder that it works at all.

Conclusion

It’s a great board. At a price point of $7-$10 it reminds me of the really, really old Raspberry Pi Zero days where you could actually get a Raspberry Pi for around that price point.

The Zero 2 is a significantly more powerful board. It benchmarked much higher than the i96 but it also costs significantly more. If you need more power that board will be a better choice. If you’ve never had an Orange Pi before I would recommend the Zero 2 first as this board is quite a bit trickier and has more outdated software available for it.

The version of Ubuntu on this board is also quite old (Ubuntu 16.04 / Xenial) compared to the Orange Pi Zero 2 which is actually running a modern 5.X kernel whereas this one is a 3.X kernel. Make sure that is not going to be a problem or you will want to step up to a higher Orange Pi. The i96 is definitely meant for simple services / projects that don’t need a lot of power. It’s perfect for those.

If you need a headless board then the Orange Pi i96 may very well fit the bill for you, the price is certainly right! Don’t skip the heatsinks though. It got very warm during testing (warm enough to freeze once during consecutive benchmarks) and Orange Pis are known to get quite hot!

Other Resources

I highly recommend using the Legendary i96 Debian Bullseye image available here

Don’t miss my Orange Pi Zero 2 Review / Tips / Guide for another great board (with display connections)

I’ve also reviewed the Orange Pi 3 LTS which is roughly equivalent in power to a 2GB Pi 4

If you’re trying to set up Android definitely see my Orange Pi Android Installation Guide

For the fastest storage options check out my Linux storage benchmarking script

guest

328 Comments
Inline Feedbacks
View all comments

Grzegorz
Grzegorz
2 months ago

Hi,
What do you think about external hub connected to built-in usb port? By default external usb hub is disabled 🙁
Below you can find the information that I was able to find out

dmesg | grep hub shows
hub 1-1: ignoring external hub
(as a result from CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB = y setting and usb/core/hub.c file )

if you want to delete this line from config, I warn you because another message will pop up

usb: kernel must blacklist external hubs (as a result from this file: usb / musb / musb_core.c)

Here I’m stuck and have no idea where to look further

Is it possible to get usb hub working?

Grzegorz
Grzegorz
2 months ago

Thanks for your response.

I think that usb hubs are disabled due to low powering capacity & to prevent powering too much usb devices (when you plug in sth like usb wireless card the sbc board turns off).

I’ve analyzed the RDA8810PL documentation (link at the end), in it is written:

“USB controller supports up to 15 ‘Transmit’ endpoints and/or up to 15 ‘Receive’ endpoints in addition to Endpoint
0” (Page 62) <– so it is multipoint. There are more informations about the USB controller but I don't understand them…

From what I could deduce and what you may already know, there is one physical connection to the usb port (there is 8 dip switch, where you set which port (microusb / usb A) has to be connected to the usb controller)

Btw, I appreciate your hard work 🙂

RDA8810PL.Smartphone.Application.Processor.V1.04.pdf – just look at page 62

rda8810 schematic – look at page 7 (left bottom corner – dip switch)

Jack
Jack
2 months ago

I want to use this board as a webrtc client, the offical img existed many problems and already stoped maintenance several years ago, i had all most drop it until see this blog.
I tried to use the usb sound card on this board, but it could not work normally.
When i inserted the usb sound card into the board, dmesg log show:
[ 2734.458007] musb-hdrc musb-hdrc: VBUS_ERROR in a_wait_bcon (98, VALID), retry #1, port1 00000100
[ 2735.932495] usb 1-1: new full-speed USB device number 3 using musb-hdrc
[ 2736.086547] input: C-Media Electronics Inc. USB PnP Sound Device as /devices/platform/musb-rda.0/musb-hdrc/usb1/1-1/1-1:1.3/input/input2
[ 2736.095520] hid-generic 0003:08BB:2902.0002: input,hidraw0: USB HID v1.00 Device [C-Media Electronics Inc. USB PnP Sound Device] on usb-musb-hdrc-1/input3

I used the cmd "aplay -l", the usb sound card device could not be found, just show the rda sound device on this board:
**** List of PLAYBACK Hardware Devices ****
card 0: rdasoundcard [rda-soundcard], device 0: rdaaud-stream rda-codec-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: rdasoundcard [rda-soundcard], device 1: rdavoice-stream rda-voice-codec-dai-1 []
Subdevices: 1/1
Subdevice #0: subdevice #0

I don’t know about USB drivers, is it existed any problmes?
Any help will be very appreciated!

Jack
Jack
2 months ago
Reply to  Jack

Image version:Legendary_OrangePi_i96_debian_bullseye_server_v1.15

Jack
Jack
2 months ago

I will try it, thanks!

Jack
Jack
2 months ago

I had tested the latest version 1.18, the usb sound card can’t be found at the List of PLAYBACK Hardware Devices:
root@orangepii96:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rdasoundcard [rda-soundcard], device 0: rdaaud-stream rda-codec-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: rdasoundcard [rda-soundcard], device 1: rdavoice-stream rda-voice-codec-dai-1 []
Subdevices: 1/1
Subdevice #0: subdevice #0

Jack
Jack
2 months ago

I had prepared the ubuntu envirement , I will try to build the kernal on my vmware machine.

Marco
Marco
2 months ago

you could try to add

CONFIG_SND_DRIVERS

but i dont know if that would help

Marco
Marco
2 months ago

i should have one of those usb soundcards somewhere, if ill find it, i will try to test it and report

Dustin
Dustin
2 months ago

Hey James,

Got the boards from AliExpress. It only 2 weeks, which was surprising with all the supply chain stuff you hear about. Installed your image, worked great. So, I did a bit of an ID10T move. I AssUMed that I could use a Raspberry Pi camera on one of these boards. Well, I didn’t fry the board, but it got super hot. Haven’t tried the Pi Cam (nervous).

Anyway, I guess I need one like the link. Anybody tried one of these?

Dustin
Dustin
2 months ago

Alrighty, once again, I’m throwing caution to the wind and I’m going to ordering up some cameras. Assuming these guys don’t have H264 encoders, I’m hoping they can handle some light MJPEG compression. 🙂

On an unrelated note, I was getting -32dBm WiFi signal (reported by wavemon), which is pretty amazing. (My phone is currently sitting at -49dBm) The throughput speed was only like 250-750K/s which is disappointing. I’ve tried serving a file off both SD and USB using SFTP and FTP, no difference. I have a EERO 6 mesh router and my desktop is wired GBE. Generally, the shell is unresponsive, so I think something is up. Any ideas?

MZA
MZA
2 months ago

Hi James,
I’ve got the spi2 working with spi_gpio driver at 1Mbps. It won’t be a rapid port.
For this, I’ve modified devices.c and the script gpio_fixup.sh to assign back the SPI2 pins to gpio function for the spi_gpio driver to work.
I’ve also modified the default spidev port in the WiringPi lib and the pin labels in the gpio tool.
I’ve declared two slaves to have spidev2.0 with CS pin A10 ( Header 16) and spidev2.1 with CS pin A6 ( Header 12)
All is committed under :
OrangePi-I96-Work.git ( OrangePIRDA/kernel and OrangePIRDA/output/rootfs)
WiringPi.git

I’ve tested the spi communication using physical loop and read some registers on an MCP2515 CAN transciever, but I failed to have any lcd display work, There are still things to correct in the framebuffer driver I downloaded.
Now the good news is that we could have CAN communication, pin voltage won’t be a problem, the i96 outputs nearly 2.9 V which seems to be compatible with MCP2515. There is a road to go to add socket can and link an mcp2515 driver to the spi port.

MZA
MZA
2 months ago

James,

I did add the tfbt drivers to the kernel tree, added the device to the board_info etc, the ST7735R driver uses spi transfer and needs either native rda-spi driver or gpio-spi. I set it to spi-gpio like did the russian guy.
Unfortunately, I did not get it display anything, the /dev/fb0 was mounted and every thing seemed OK.
I also tested another e-Ink display without success.
A least, I swapped to the MCP and read a rigister to confirm the spi was working.

MZA
MZA
2 months ago

Hey James,
I’ve got the same messages, I don’t see any lcd activated and I checked the datasheet, they’re separate from SPI pins.
I’m back to rda-spi driver without DMA and working with the mcp2515 CAN transciver, code and execution seems coherent but the port gets stuck after 3 bytes transfer all RX become 00.
With the gpio-spi driver the MCP2515 device is probed, I can have the can0 interface, bring it up, set its bitrate but then no TX, no RX and no indicators. I think spi-gpio does’nt work with this MCP, the mcp2515 driver uses spi transfers that cannot be mapped obviously to spi-gpio. I could not see where to tell the mcp driver which gpio chip select pin to use. I’ll continue some time my unfortunate effort to bring this CAN.

Marco
Marco
2 months ago

i have been tinkering, trying to get the wifi working better and i dont know for 100% if this affects the wifi-ability, but for me it did.
i set all baudrates which are set from 921600 to 115200, even on uboot. uboot doesnt seem to bother about the new baudrate, so still dont know if i can set it there (i set it in all config files i could find but it still runs on 921600).

since then my wifi is stable enough to get roughly 2.3MB/s over wifi, and bluetooth seems also to work smoother.
this could be a false positive tho but i have the feeling iam not imagine it.

i can even have multiple ssh sessions open without random freezings on the sessions, in adittion i am downloading a file with fullspeed (2.3MB/s), and the shells are still available.

i had so much more problems with the wifi before that, can anyone test that out?

files i changed the baudrate in were

kernel/drivers/tty/serial/rda_uart.c
uboot/board/rda/common/uart_test.c
uboot/drivers/serial/serial_ixp.c
uboot/include/configs/rda_config_defaults.h
external/chips/RDA/bootarg/boot.scr
external/chips/RDA/bootarg/boot.cmd
include/configs/rdaarm926ejs.h
include/configs/rda_config_defaults.h

and i also commented out power managment for wifi device
in drivers/net/wireless/rdaw80211/rdawlan/wland_defs.h
(but later)

sometimes when bluetooth “scan on” is set, wifi still drops and “scan off” is not applicable, then i use “power off” to disable bluetooth

Marco
Marco
2 months ago
Reply to  Marco

and after testing further file transfer (download) on the pi, i discovered that the pis speed will drop very quick and drastically, when the cpu is getting hotter, so a heatsink is a musthave

Marco
Marco
2 months ago
Reply to  Marco

i added cpufrequtils as a pullrequest, after setting the cpugovenor to performance, i didnt receieved that much of a drop after that. the load is still at 2, but the connection seems to be stable and continiously over 2MB/s

Marco
Marco
2 months ago
Reply to  Marco

after downloading a ton of gigabytes, i ran into the following error.

Marco
Marco
2 months ago

actually rda_5991g_power_ctrl.c is the correct file for us.

Sparques
Sparques
2 months ago

Thanks for the info / guide on bluetooth. I was able to connect to a Nintendo Pro Controller and got a /dev/hidraw0 interface like I wanted! I think I’ll try integrating the bt_init into the in-kernel driver so it should Just Work.

I’m custom configuring and compiling my kernel in an attempt to get everything working while stripping out all the stuff I don’t need. I don’t have USB working, but I think I’m close. I think one of the reasons why all the RDA support isn’t in upstream kernel is that it wasn’t added correctly. It’s possible to configure the kernel and then it won’t compile because of missing dependencies–i.e. the RDA specific additions don’t specify their dependencies and conflicts correctly.

Eventually I’d like to port all the RDA-specific bits of code to a modern kernel version, (looking at 5.19.9, latest stable) but for now I’m just trying to get the 3.10.62 one from Orange Pi fully working.

I’m also doing a custom-ish userland–I started with the Alpine mini-root filesystem, added OpenRC and other sundries. For my use cases, I don’t really need to boot into a normal R/W root, so I have my whole userland as an initramfs. Pretty neat, not including the compressed kernel image, my rootfs is ~29MB and the compressed initramfs is 11MB. At boot with dbus, bluetooth, and getty running on ttyS0, I’m using 7MB of RAM.

Sparques
Sparques
2 months ago

Yup, this kernel code is a mess. There were some comments that were not marked as comments (how???) and I just had to add some EXPORT(); macros to get the thing to compile. Once I’m reasonably confident I have fixed everything I can, I’ll publish a diff or something.

Marco
Marco
2 months ago

i discovered something disturbing at my gf place while testing the orangepi i96, i dont have an uart-usb adapter latlely so i can just use the wifi, the wifi is pretty unstable as we already know, but now i discovered something i dont understand already

lets say iam connected via wifi and trying to download a big file with multiple connections over axel the download accelerator, the download doesnt even start with multiple connection, but thats enough to jam the whole wifi.

no device is able to connect locally or externally (internet) while the download accelerator (axel) is running.

i have to check that at my place home, but this doesnt shed light on the wifi chip….

Marco
Marco
2 months ago

yes i have. its odd because i cant reproduce that error at my home, just am my gf place this error occures