Author Archives: vonger

Beginner: OpenWrt 18.06 stable version 3

OK, now install luci for noobs 🙂

install LuCI for openwrt.

./scripts/feeds update luci
./scripts/feeds install -a -p luci

note: if you download speed is slow from, you can modify ./feeds.conf.default, change its ‘’ to ‘’, then do it feeds update/install again, github should be much faster.

After this we have LuCI, as usual, patch it…
patch is at ./feeds/vocore2/mt7628/openwrt/luci/010-luci-vocore2-compatible.patch

note: this patch is to enable LuCI setting WPA2 for wireless.

This is for latest LuCI, so do not compatible with 18.06, need a little change, because some people change the folder name from luci-mod-admin-full to luci-mod-network. So we just change luci-mod-network in the patch back to luci-mod-admin-full.

After the change, now we can patch it, run patch in openwrt folder.

patch -p1 < ./package/kernel/mt7628/openwrt/luci/*.patch

Now make menuconfig, select LuCI -> Collections -> luci
Then compile, you will get firmware at ./bin/targets/ramips/mt76x8/openwrt-ramips-mt76x8-vocore2-squashfs-sysupgrade.bin

Beginner: OpenWrt 18.06 stable version 2


Why we can not use official version:

1. its wifi is default disabled.
2. it do not have default password.
3. its wifi driver is not works well.

And point 1,2,3, openwrt do not allow me submit patch, because it will broken other device. Point 3 is pretty important, use official mt76 driver, wireless speed only 5~10Mbps, and frequently disconnect…

So as openwrt community suggested, I have to use external patch. Some patch like SD card fix etc that they allow to submit, already in the openwrt source code.


Now, we need to port mt7628 driver to replace official mt76 driver for better speed and experience.

PS: use non-official driver also brings new problem, because it do not support standard linux wireless interface, have to patch LuCI and iwinfo to make it work…that is a lot of work and bring in bugs. So best way is to fix that mt76 driver. I am trying, but it is very long code hard to read…

I have tutorial about how to imply mt7628 driver, it is at, just copy it here

How to use it
1. add this feeds to your openwrt source.

cd ~/openwrt
cp feeds.conf.default feeds.conf
echo src-git vocore2 >> feeds.conf
./scripts/feeds update vocore2
cp -r ./feeds/vocore2/mt7628 ./package/kernel

2. patch your openwrt with necessary patches to use this driver.

cd ~/openwrt
patch -p1 < ./package/kernel/mt7628/openwrt/000-*.patch

mkdir ./package/network/utils/iwinfo/patches
cp ./package/kernel/mt7628/openwrt/080-*.patch ./package/network/utils/iwinfo/patches

3. config mt7628 in make menuconfig Kernel modules -> Wireless Drivers -> kmod-mt7628
Target System: MediaTek Ralink MIPS
Subtarget: MT76x8 based boards
Kernel modules -> Wireless Drivers -> unselect kmod-mt76 / select kmod-mt7628 -> select WiFi Operation Mode -> enable AP-Client support for AP+STA mode; enable SNIFFER for monitor mode.
Base System -> select wireless-tools (need its iwpriv)
Network(option): unselect wapd-mini/hostapd-common (mt7628.ko already have WPA support)
Global build settings(option): Kernel build options -> /dev/mem virtual device support(enable /dev/mem for easy debug)
Global build settings(option): unselect Cryptographically signed package lists (this will block compile)

When apply the patch, there is an small warning: openwrt/target/linux/ramips/base-files/etc/board.d/01_leds
PS: It is because my patch is for latest trunk, so it not patch well.

just delete openwrt/target/linux/ramips/base-files/etc/board.d/01_leds.orig, and modify openwrt/target/linux/ramips/base-files/etc/board.d/01_leds

1. remove this if there is any:

set_wifi_led "$boardname:fuchsia:status"
set_wifi_led "$boardname:green:status"

2. keep this lines:

set_wifi_led "$boardname:fuchsia:status" "ra0"
set_wifi_led "$boardname:green:status" "ra0"

If you can not do this, please read some tutorials about “How to use patch”
Or lazy way, just remove 01_led patch from the pacth file in openwrt/package/kernel/mt7628/openwrt/000-vocore2-compatible.patch it will cause VoCore2 LED do not flash after wifi connected.

Finally, we can make, after that, we can get a firmware with mt7628 driver support.
PS: make will take hours, so be patient…

Beginner: OpenWrt 18.06 stable version 1

Actually there is a lot of tutorials already, but maybe we need to restart a full version. And some people just want to use the final firmware without compile, sooooo, anyway, OK, now let’s start compile 18.06 from scratch..

note: I assume you already have some knowledge about Linux and compile(such as gcc, makefile). If not, come back later, I will release a firmware, you can directly upgrade your VoCore2.

Prepare a develop environment, which is necessary 🙂
I have write this in

Prepare VM for VoCore2
video tutorial:

1. install Ubuntu 14.04 64bit Server to Virtual Machine.

2. in virtualbox, we will need install some packages to compile openwrt:

sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev libssl-dev python git

We need to compile from openwrt 18.06 stable version, need to get its source code, type this command in console of Ubuntu.

git clone

It will show something like this:

Cloning into 'openwrt'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 452174 (delta 11), reused 0 (delta 0), pack-reused 452155
Receiving objects: 100% (452174/452174), 156.94 MiB | 8.31 MiB/s, done.
Resolving deltas: 100% (306772/306772), done.
Checking out files: 100% (8172/8172), done.

Now we have openwrt trunk in current folder, but we need to switch it back to old version v18.06.1, we need to use git.

git checkout v18.06.1

It is version 18.06.1 now, once we compile it, it is the ‘stable’ version.

call “make menuconfig”

note: for macos, already embed getopt, it will report error: –long do not support. so we need to install gnugetopt and add its path to $PATH to cover default system one.

now, we can select in menu:

Target System (MediaTek Ralink MIPS)
Subtarget (MT76x8 based boards)
Target Profile (VoCore VoCore2)

Exit and compile by make, we have the official version.
Official version wifi is not very good, have to continue the fix. 🙂

PS: VoCore2 and VoCore2 Ultimate both using “VoCore VoCore2” config, because they both have same 128MB memory and 16MB flash. VoCore2 Lite is 8MB flash and 64MB memory, so need to use other configure.

Beginner: OpenWrt 18.06 stable version

I think we need a stable version based on 18.06 for beginner 🙂
So this week I am going to work on a firmware. And I will also write how I do this to help beginner of openwrt.


1. port mt7628 driver for 18.06.
2. port sound driver for 18.06.
3. fix possible SD card driver broken.
4. fix LuCI WPA2 encryption bug.
5. make it able to download/upgrade package by LuCI directly.

Once finish all of above, I hope it is easy for beginners to use. 🙂

PS: if you are a beginner and have questions, please email to, we are glad to hear from you.

Tutorial: VoCore2+Screen Port Super Marie Bros.

The screen is ready and works pretty well, I am having a lot of fun 🙂

I am trying to port two version of NES simulators, one is LiteNES, another one is LaiNES. LiteNES is working pretty smooth but it has many bugs, some codes are broken; LaiNES is good and less bugs, but it is very very very slow, only 1/6 speed of LiteNES. I do not have much time to fix the bugs or optimize code. I guess it is a pretty funny process to fix it.

Here I explain how I port the two NES. Please download latest SDK of the screen(, in demo folder, we have a firmware with frame buffer driver, which is much easier for you port applications, or you can use the fbusb.ko driver to make your own.

fbusb.ko depends on framebuffer driver, usb driver and some sys_* draw function of framebuffer, please make sure every function is implied in kernel to make sure it works normal.

LiteNES requires to port keyboard and pixel display function.

To use framebuffer, here is my sample code.

void nes_hal_init()

	// map framebuffer to local, so we can access it directly.
	int fd = open("/dev/fb0", O_RDWR);
	if (fd <= 0) {
		printf("frame buffer is not exist, exit.\n");

	framebuffer = mmap(NULL, FBMAP_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
	if (framebuffer == NULL) {
		printf("can not map to frame buffer, exit.\n");




void nes_flip_display()
	if (framecount++ % 2)

	// directly write to middle of the frame buffer.
	memcpy(framebuffer + 144 * 480, local, LOCAL_SIZE);

I use a thread to handle the keyboard input…Maybe async is another better way, but its code might complex, so I make it easy.

Thread will update a key table, so app can directly read from the key table to get keys’ states.

void* keyboard_thread(void *arg)
	struct input_event ie;
	int kf;

	kf = open("/dev/input/event0", O_RDONLY);
	if (kf < 0) {
		printf("keyboard is not exist, input ignore.\n");
		return NULL;

	while (1) {
		int size;
		size = read(kf, &ie, sizeof(struct input_event));
		if (size != sizeof(struct input_event))

		if (ie.type != EV_KEY || ie.code >= MAX_KEYCODE)

		key_table[ie.code] = ie.value;
		if (ie.code == KEY_ESC)

	return arg;

PS: LiteNES is great but just bugs are weird, it has memory leak, no idea where it is but it write to the framebuffer area do not belong to it, should be the ppu engine issue.

PSS: source code here,

VoCore2: Port Qt Success

Smooth Qt UI, at 30fps, WVGA.
I think it should be a good replace for UI devices who requires wifi or ethernet.
10K units for this solution price should be less than 15USD(screen + VoCore2)

Now I am porting a weather app on Qt to it, it should be good.

VoCore2: Port Qt

Now we have screen 🙂 So I’d like to port Qt. Thanks to pawelkn,, this package works well, just need to add one line. I search google, this is because MIPS do not have 64bit atomic operation, so we need to use the library to simulate it.

@@ -171,6 +171,7 @@
 	$(CP) $(PKG_BUILD_DIR)/qtbase/lib/* $(1)/usr/lib/
 	$(CP) $(PKG_BUILD_DIR)/qtbase/lib/libQt5Core.prl $(1)/usr/lib/
 	$(CP) $(PKG_BUILD_DIR)/qtbase/lib/ $(1)/usr/lib/
+	$(CP) $(TOOLCHAIN_DIR)/lib/* $(1)/usr/lib/
 define Package/qt5-concurrent/install

Put this Makefile and other files to openwrt/package, then make menuconfig, in Library -> Qt5, select qt5-core, make V=s

Compile is smooth and take a long time…After upgrade, also make the example file and copy to VoCore2.

Like usual, it is not work at first time, the screen part only. 🙂

This is necessary: export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
We must use this command setup framebuffer device.

I do not know why it not work, possible reasons:

1. Qt support DRM but not framebuffer anymore, need to check linuxfb plugin for Qt5.
2. My framebuffer driver has bug, that block the demo runs on the screen.
3. VoCore2 do not fast enough for Qt(this is not likely, because I can find it actually works, but just stopped at somewhere, looks like it is wait for some device ready)
4. Other necessary device such as keyboard, mouse block the process.

From my first test, I guess Qt application bootup on VoCore2 is pretty fast. It takes around three seconds to start, just eat a lot of memory, demo consume around 22MB memory, maybe it can not work on vocore2 lite which free memory only around 30MB.

Also I port Qt5.11.3, here is the link:

VoCore2: USB Device Develop 4

The driver develop is done.

Try this firmware( and video tutorial(

Upgrade your VoCore2 to 20181218.screen.bin, connect the screen then reboot, it will work.

Later I will release a blob for the driver so you can embed it into your project/firmware easily.

VoCore2: USB Device Develop 3

This blog do not have any tech included. Just want to write down something to boost myself, I need to spend more time on it because the screen is still need a lot polishing.

First of all, I need to imply all drivers to kernel level. My demo just show the result, actually I did a lot of prepare before that, it is not plugin and play yet.

And Christmas is near, I do not have much out-source work for now, so I can focus on this screen. I will try my best to finish it before that holiday.

Next step, I am going to port FC games simulator or dos games simulator(except DOOM, not a challenge for me anymore 🙂 after this and with exists sound support, VoCore will like a real small computer.

Maybe before step two, another good choice is to port X-window system to VoCore2(with a SD card for more storage). As I know a lot of desktop linux is able to run in 128MB memory(even 64MB, very old computer). If I can do optimize on it, it should be no problem to run on VoCore2.

This is also a tech prepare for VoCore3.

PS: VoCore3 still have a long way to go. I need its solution price lower enough, power consume lower enough, also tons of interfaces. VoCore2 is the best choice in the market as I know and for further two year it should be. Anyway, VoCore2 will keep production, nearly ten years should no such worry 🙂

PSS: I know USB2.0 screen is kind of out-of-date, if we do screen in USB3.0, it should be pretty easy. I spend almost one year and a lot of money to finish it has three reasons:

1. USB 3.0 power consume is super high. Of course, you can not let 10GHz bus eat only a little power.
2. USB 2.0 is common and compatible with USB3.0, so for small screen, it is good enough in most situation.
3. USB 3.0 supported chip is very expansive for now, everybody like cheap but fantastic production, so any unnecessary cost is a waste.
3.1 VoCore and RaspberryPi do not support USB3.0.
no reason four. 🙂

VoCore2: USB Device Develop 2

Actually the bug is easy to fix. URB can not use buffer alloced in stack, that cause the driver broken…

So fix that driver is super simple, remove that line: u8 buf[6] = {…};, and replace with u8 *buf; buf = kzalloc(8, GPF_KERNEL); everything will work.

After this simple fix, now I have make fbcon works on VoCore2 and its small display.
Here is the picture:

This driver will map /dev/fb0 and we can easily control it as framebuffer, fbcon need to select from kernel, then it will automatically bind to /dev/tty0. We can use command “/bin/ash –login > /dev/tty0 2>&1” to redirect serial port input/output to the display.

After that, we can get output from the little display.

Next blog, I will try to make it easy to use and public every steps of how to use it.
Later I will public most of its source code to help you easy hack 🙂

attach youtube video, smooth like baby skin. 😉

PS: another best thing is CPU usage is 0%