ZTE B860H: Getting Armbian into it

This blog will cover the Armbian installation guide for B860H V1 / V2.

Caution: This model MUST not be confused with V5, as both revision have an entirely different hardware inside.

B860H V1 STB Top B860H V1 STB Bottom

The method that's used here will not be requiring the set top box to be already rooted, or at most, outside of the stock rom. Assuming that the STB is still in the stock.

At best, It's recommended to do all of the flashing in Linux desktop, Otherwise the Windows equivalent exists, which i will talk about later.

This guide also works on FiberHome HG680P box (however, check Trivia).


Requirements


Installation

The B860H must use the HG680P U-Boot bootloader to work, Which you can obtain it from here (save it as u-boot.bin).

The following steps must be done in order.

1. Flashing the Armbian

You can obtain the Armbian image from ophub/amlogic-s9xxx-armbian, With each consisting of different distros. For example, as of the time of this writing: – resolute is a Ubuntu edition of Armbian OS – trixie is a Debian edition of Armbian OS.

You will want to look for a release with the two keywords: s905x, and b860h. For example:

Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz

Once you have downloaded it, Uncompress it:

gzip -k -d -v Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz

Note: Adjust the filename with the release that you have downloaded.

Insert a microSD card to be flashed on, check where it was located:

yonle@yonle:/mnt$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  58.6G  0 disk 
├─mmcblk0p1 179:1    0   511M  0 part
└─mmcblk0p2 179:2    0  58.1G  0 part 

In this case, it's /dev/mmcblk0

Special: If you're using an SDcard USB adapter, These usually are named with sd[a...c] prefix (example: sdb). It must not be confused with an existing main SATA drive.

and then flash the Armbian image to the card:

sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress

sync

(yes, sync IS a command)

Adjust /dev/mmcblk0 to the path to your microSD slot, Which you can check via lsblk command.

Caution: Doing this will wipe ALL the datas that's in the microSD card. Please back up important stuff if there's one before proceeding.


There is no need to alter the BOOT partition after flashing as these will be done automatically during boot stage.

2. Flashing the U-Boot

On Windows, Doing this step is essentially done by using a program called Amlogic Bootcard Maker.

Similarly, we can do the same on Linux.

Head to the directory where the earlier u-boot.bin is downloaded, for example:

cd ~/Downloads

Then flash it:

sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1

sync

And finally, Yeet the microSD card out.

Flashing TL;DR

To put it simply, The above tasks is simply:

sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1

sync

To the box...

the box, already on Linux

You can determine whenever the box is already hacked or not, And it's usually determined via the LED indicator: – If it's green, Chances are it's running Android. – If it's orange, It's not using a regular android bootloader or is in emergency download mode

On a box with the factory Android rom inside, You usually cannot just insert the microSD right into the box, and then hopes it will boot immediately to what's on the microSD card. The stock bootloader will immediately boot to the Android OS anyway and then indirectly alter the BOOT partition, which is probably not what you wanted.

the specialized HDMI dongle

A specialized HDMI dongle is made specifically to make the bootloader on this box to boot whatever that's in the microSD card, supposedly for emergency / download mode.


To check whenever this HDMI dongle is exactly what we wanted, We can use i2cdetect (installable via i2c-tools) to check the HDMI bus:

First, we will want to know which bus is the bus for the HDMI port in my laptop:

yonle@yonle:~$ sudo i2cdetect -l
i2c-0	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-1	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-2	i2c       	i915 gmbus dpa                  	I2C adapter
i2c-3	i2c       	i915 gmbus dpb                  	I2C adapter
i2c-4	i2c       	i915 gmbus dpc                  	I2C adapter

On the above example, My bus is at i2c-2, Which is i915 gmbus dpa (notice the dpX prefix). From the 2 at the end of the i2c-2, Add it by +1, Which then: 3.

So now we plug our HDMI dongle to our HDMI port in our laptop:

yonle@yonle:~$ sudo i2cdetect -y -r 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   

If this dongle is what we are looking for, In 0x50, There should have 52 in the third column just like shown above.

Then verify what's inside:

yonle@yonle:~$ sudo i2cdump -y -r 0xf8-0xff 3 0x52
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
f0:                         62 6f 6f 74 40 53 44 43            boot@SDC

The string value must be boot@SDC.


Now that we know that the dongle is exactly what we're looking for, Let's begin the installation process:

Now unplug the box from any power source, – Insert the microSD card that we flashed earlier to the microSD card slot, – Plug the HDMI dongle to the box

Then plug it to the power source, and pay attention to the power LED indicator, The green indicator must have turned into orange on this phase.

Keep in mind that the indicator MUST STAY on orange LED light for as long as 15 seconds (it mustn't turn green on this phase, If it did, Then you're flashing it wrong!).

If after 15 seconds passed the LED is staying orange, You can now unplug the HDMI dongle and plug a HDMI cable from your TV/Monitor/CaptureCard to your box, You must see something resembling TTY:

the screen

From there, Once you get into a phase where Armbian asks you for setup, There's two method you can do this: 1. Keyboard way: Plug your keyboard to the STB, and do set up from here 2. Networking: You want to set this box up via ssh: Plug a LAN cable from your router to the box, Check for it's IP address on the router page, and ssh into it:

ssh root@10.42.x.x

The default password is 1234. You will be asked for setup and a new password setup.

The default ARMBian experience

Once you're done, Then that's it. You're done installing Armbian to your microSD via your box, However you will still need to use that HDMI dongle to force it using U-Boot.

Making U-Boot permanent

Just like earlier, Send the earlier u-boot.bin to the box via network:

scp u-boot.bin root@10.42.xx.xx:u-boot.bin

Get into the shell, and check which MMC is our eMMC:

root@armbian:~# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk1      179:0    0 58.6G  0 disk 
├─mmcblk1p1  179:1    0  511M  0 part /boot
└─mmcblk1p2  179:2    0 58.1G  0 part /
mmcblk2      179:32   0  7.3G  0 disk 
├─mmcblk2p1  179:33   0  511M  0 part 
└─mmcblk2p2  179:34   0  6.1G  0 part 
mmcblk2boot0 179:64   0    4M  1 disk 
mmcblk2boot1 179:96   0    4M  1 disk 

In this case, Since we're booting from SDcard, mmcblk2 is our target, So:

sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1

Caution: This will permanently wipe the android bootloader in the eMMC. If you plan to install Armbian to eMMC, Do armbian-install and reflash U-Boot to the eMMC via steps above again

Installing to eMMC

Caution: Doing the following will wipe what's in the eMMC, Which includes the Android base itself.

Assuming you have been in the shell, run armbian-install as root:

root@armbian:~# armbian-install 
[ STEPS ] Installing Armbian to internal eMMC...
[ STEPS ] Checking dependencies...
[ INFO ] Dependency check completed. Proceeding installation...
[ STEPS ] Initializing the environment...
[ INFO ] Use mainline u-boot: [ no ]
[ INFO ] Use ampart tool: [ no ]
[ INFO ] Show all devices: [ no ]
[ INFO ] Detected eMMC device: [ /dev/mmcblk2 ]
[ STEPS ] Start selecting device...
-----------------------------------------------------------------------------------------------------
ID    SOC        MODEL                                         DTB                                               
-----------------------------------------------------------------------------------------------------
101   s905d      Phicomm-N1                                    meson-gxl-s905d-phicomm-n1.dtb                    
102   s905d      Phicomm-N1(DMA-thresh)                        meson-gxl-s905d-phicomm-n1-thresh.dtb             
103   s905d      MECOOL-KI-Pro                                 meson-gxl-s905d-mecool-ki-pro.dtb                 
104   s905d      SML-5442TW                                    meson-gxl-s905d-sml5442tw.dtb                     
105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          
106   s905x      B860H                                         meson-gxl-s905x-b860h.dtb                         
107   s905x      Nexbox-a95x                                   meson-gxl-s905x-nexbox-a95x.dtb                   
108   s905x      TX9                                           meson-gxl-s905x-tx9.dtb                           
109   s905x      T95,XiaoMI-3S,X96,BTV9                        meson-gxl-s905x-p212.dtb                          
110   s905x      TBee                                          meson-gxl-s905x-tbee.dtb                          
-----------------------------------------------------------------------------------------------------
111   s905w      TX3-Mini,MeCool-m8s-pro-W                     meson-gxl-s905w-tx3-mini.dtb                      
112   s905w      W95                                           meson-gxl-s905w-p281.dtb                          
113   s905w      X96-Mini                                      meson-gxl-s905w-x96-mini.dtb                      
114   s905w      X96W,FunTV,MXQ-Pro-4K                         meson-gxl-s905w-x96w.dtb                          
115   s905l      UNT402A,M201-S,MiBox-4C,IP108H,B860AV2.1      meson-gxl-s905l3b-m302a.dtb                       
116   s905l      MG101,Mibox-4,E900V21C,XiaoMI-4C              meson-gxl-s905l-venz-v10.dtb                      
117   s905l      Tencent-Aurora-1s                             meson-gxl-s905x-p212.dtb                          
118   s905l      ZXV10-B860AV2.1U,HM201                        meson-gxl-s905x-tx9.dtb                           
119   s905l2     MGV2000,MGV3000,M301A,CM201-1,IP108H          meson-gxl-s905l2-x7-5g.dtb                        
120   s905l2     E900v21E,MGV2000-K,e900v21d                   meson-gxl-s905l2-x7-5g.dtb                        
-----------------------------------------------------------------------------------------------------
121   s905l2     Wojia-TV-IPBS9505                             meson-gxl-s905l2-ipbs9505.dtb                     
122   s905l3     CM311-1,HG680-LC,M401A,UNT402A,CM201-1-6-YS   meson-gxl-s905l2-x7-5g.dtb                        
123   s905l3     CM211-1,M411A,B860AV3.2M,B860AV2.1U,M301A     meson-gxl-s905l3b-m302a.dtb                       
124   s905l3     UNT400G1,E900V22D-2,UNT400G,IP108H            meson-gxl-s905l2-x7-5g.dtb                        
125   s905l3     UNT402A,UNT400G                               meson-gxl-s905l3b-m302a.dtb                       
126   s905l3b    E900V21E,E900V22E,MGV2000/CW,M411A            meson-gxl-s905l3b-e900v22e.dtb                    
127   s905l3b    M302A,M304A,CM201-1,CM211-1,CM311-1           meson-gxl-s905l3b-m302a.dtb                       
128   s905l3b    UNT403A                                       meson-gxl-s905l3b-m302a.dtb                       
129   s905l3b    RG020ET-CA                                    meson-gxl-s905l3b-e900v22e.dtb                    
130   s905l3b    IP103H,TY1608,BV310,B860AV-2.1M               meson-gxl-s905l3b-m302a.dtb                       
-----------------------------------------------------------------------------------------------------
131   s905l3b    E900V22D,TY1608                               meson-gxl-s905l2-x7-5g.dtb                        
132   s905l3b    E900V21D,B860AV2.1-A                          meson-gxl-s905l2-x7-5g.dtb                        
133   s905mb     S65                                           meson-gxl-s905x-p212.dtb                          
134   s905lb     BesTV-R3300L,SumaVision-Q7,MG101              meson-gxl-s905x-p212.dtb                          
135   s905lb     Q96-mini                                      meson-gxl-s905x-p212.dtb                          
136   s905lb     IPBS9505                                      meson-gxl-s905l2-x7-5g.dtb                        
0     Other      Customize                                     Enter-custom-dtb-name                             
-----------------------------------------------------------------------------------------------------
[ OPTIONS ] Please Input ID: 106

Pick 106, or B860H.

Pressing enter will tell you to pick filesystem type:

[ INFO ] Input Box ID: [ 106 ]
[ INFO ] Model Name: [ B860H ]
[ INFO ] FDTFILE: [ meson-gxl-s905x-b860h.dtb ]
[ INFO ] MAINLINE_UBOOT: [  ]
[ INFO ] BOOTLOADER_IMG:  [  ]
[ INFO ] UBOOT_OVERLOAD: [ u-boot-p212.bin ]
[ INFO ] NEED_OVERLOAD: [ no ]
[ STEPS ] Selecting root filesystem type...
-----------------------------------------------
  ID   TYPE
-----------------------------------------------
  1    ext4
  2    btrfs
-----------------------------------------------
[ OPTIONS ] Please Input ID (1/2): 

Depending on your workload, you can use either ext4 or btrfs for your eMMC. But if you're unsure, I'd recommend ext4.

It has received plenty of improvements over the years, so it's not the same ext4 people might remember from years ago. It's still a very solid choice for eMMC.

From there, It will install the system to the eMMC from SDcard, which will take several minutes until it's finished.

After it's finished, Reflash U-Boot to the eMMC like how we flash it to microSD:

sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1

sync

So:

[ INFO ] Copying ROOTFS partition data...
[ INFO ] Copying [ etc ] ...
[ INFO ] Copying [ home ] ...
[ INFO ] Copying [ opt ] ...
[ INFO ] Copying [ root ] ...
[ INFO ] Copying [ selinux ] ...
[ INFO ] Copying [ srv ] ...
[ INFO ] Copying [ usr ] ...
[ INFO ] Copying [ var ] ...
[ INFO ] Generate the new fstab file.
[ INFO ] Update parameters related to the releases file.
[ SUCCESS ] Installation completed successfully. Run [ poweroff ], remove the installation media, then re-insert the power supply to boot the new system.
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
442+0 records in
442+0 records out
442 bytes copied, 0.00554292 s, 79.7 kB/s
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
4095+0 records in
4095+0 records out
2096640 bytes (2.1 MB, 2.0 MiB) copied, 0.1678 s, 12.5 MB/s
root@armbian:~# 

After these are all done, Run poweroff. Once it's off (the LED light will turn to green, Don't worry), Unplug from power source, now you can also unplug the microSD card.

And now let it boot into it's own glory by plugging the power source back, And lo and behold, Look. It runs without the microSD card!:

The Linux boot sequence

Extra: Setting up zram

This can save us some room in our RAM.

sudo apt update && sudo apt install systemd-zram-generator
sudo nano /etc/systemd/zram-generator.conf 

Put:

[zram0]
zram-size = ram
compression-algorithm = lzo-rle zstd(level=3) (type=idle)

Save it (CTRL+S), Exit (CTRL+X), and load it:

sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service

Trivia

Given how similar the hardware that's in B860H V1 and HG680P, Especially the SOC (you can flash the same u-boot.bin and it will still boots!), You can probably follow this guide alongside the same HDMI dongle trickery on HG680P too

especially when it's bootloader is broken (which i saw most HG680P had on), you can force Amlogic to boot the bootloader in microSDcard via the HDMI dongle like what i did here.

They will still boot and will work, But the device tree for the hardware will be partially different and might conflict to each other, So during armbian-install, You must instead chose this:

105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          

Alternatively, if you don't have the HDMI dongle, you can bypass the eMMC boot on the HG680P and make the device boot from the SD card by shorting R162, 4C6, and GND on the motherboard simultaneously. The USB port can be used as the ground point. A pair of tweezers or a similar conductive tool can be used to make the connection (found by Jimed-rand).

A similar method can be used on the B860H V1/V2 by shorting R87 to enter boot/recovery mode.

Baffled?

There's a YouTube Video that i made specifically for this. The video won't reexplain what has been mentioned on this page, So feel free to watch how it was done in raw.