VoCore2: Wifi driver(mt7628.ko) for LEDE

Finally I success make mediatek wifi driver run on LEDE 🙂 But mediatek do not allow to public the source code, I have to upload it somewhere as blob.

Now I guess a lot of features could unlock now.

1. monitor mode.
LEDE mt76 driver is very slow, but mediatek official driver is fast and stable.

2. more than one ssid.
we can create one ssid named VoCore2 and one named VoCore2-Guest for host and guest. It supports up to 16 ssid.

3. low level wifi control.
normally we use this for certification like FCC, KC…Last time I have to use mediatek openwrt, but now we can directly use LEDE.

VoCore2: Connect to SPI Screen 4

Now the LCD works 🙂

I change CPOL/CHPA from mode 0 to mode 3, that SPI wave shape is correct now.

Also finish a simple app to drive the TFT, refresh full screen from red/green/blue pixel by pixel. Download source code here: tft.c

From my test, the LCD screen max speed is around 3.8MHz (speed=49), can not reach 6MHz, that’s bad news. We can not use it as a game display but only for low frame rate usage — such as digital photo display, display 480×320 picture will take around 1~2 seconds.

Here is the real time video:

I called the following command in this video(tft is compiled from the source):

tft r 49
tft g 49
tft b 49

Power consume is 5V 0.21~0.23A, a little more than 1 watt, 10000mAh battery should make it last over 30 hours. 🙂

Next blog I will update the source code a little to make it display some real photos.

Crazy flash chip!

Recently six months flash chip price is almost doubled, it is a key chip of VoCore. The world is sick, nobody invest the chip factory and real economy…It is almost ten years since 2008, hope everything goes well.

Maybe its time to consider remove flash from VoCore and add a tf card slot 😂

I think it is possible, all we need in the flash chip is the bootloader, it is around 128KB, can be store in 1Mb flash, that one price is doubled but still acceptable 🙂

Bootloader will need add two drivers, one read from USB disk, one read from sd card. disk format is a problem, we can make bootloader use SD card first 16MB as the old flash, and read Linux from there.

Actually many customized u-boot has already done that. It’s time!

VoCore2: Connect to SPI Screen 3

Arrrr!!!! Last day after updated Eagle, I find it is now need to pay monthly…I know this six months delayed. 😅 Stupid autodesk. Thanks God, there is an opensource toolkit named KiCAD. I spend two days to study KiCAD, now EAGLE has moved into trash.

Now continue my adventure.

This time I will show you how to make spi master work.

I am trying to send some data to SPI, and data analyser read like this.

The screen protocol is like this: first bit is command/data bit, 0 means the following bits are command and 1 means the following data is parameter, from the upper picture, my send is data(1) + 0x78 + 0x56 + 0x34, totally it is 25 bits.

Send such SPI package is easy on VoCore2, you will need a directly memory writing tool, mine is mem, link here: http://vonger.cn/misc/vocore2/tools/mem.zip

First. let’s setup its speed. (PS: do not forget download the datasheet) I want to set it to 2Mbps. From datasheet, it is 193.3MHz / (rs_clk_sel + 2) = 2Mbps, we get rs_clk_sel = 94.

Now read the register 0x10000b28, get its current value. We do not need change other bits of 0x10000b28, so we must read it and put same value back to it to make sure it works normal. call “mem 0x10000b28 bit”

root@OpenWrt:/# mem 0x10000b28 bit
31:1 30:1 29:1 28:0 27:0 26:0 25:0 24:0 23:0 22:0 21:0 20:1 19:0 18:0 17:1 16:0
15:1 14:0 13:0 12:0 11:1 10:0 09:0 08:0 07:1 06:0 05:0 04:0 03:0 02:1 01:0 00:0
= 0xE02E8884

rs_clk_sel is 27:16 bits, change the 8bits from 000000010010 to 000000101110 (94 in decimal), so we should set it to 0xe02e8884, call “mem 0x10000b28 0xe02e8884” write back the register.

Rest register is similar, set 0x10000b2c(for short, I will write 0x2c) command length (cmd_bit_cnt) to 1bit, mosi bit (mosi_bit_cnt) to 24bits. 0x04 set to 1, 0x08 set to 0x12345678 (we set data length to 24bits, so spi will only send 0x345678 in 0x78, 0x56, 0x34 order).

Example: set 0x08 to 0x12345678, call “mem 0x10000b08 0x12345678”

Now, the data registers are all ready, we need to tell SPI master pump the data to physics wires. Three steps:

1. enable chip select for spi 1. (0x38 register set to 0x02)
2. start transfer. (0x00 register spi_master_start bit:8)
3. wait data transfer done. (0x00 register spi_master_busy bit:16)
4. disable chip select spi 1. (0x38 register set back to 0)

After this, you will find the same wave as my upper picture.
Looks like everything works smoothly, I should send the commands as ILI9488 datasheet described then everything should work.

But…shit always happening. I find a weird bug on ILI9488 screen 😅  have to stop there a long time and try to detours that weird bug. I will explain on my next blog.😘

VoCore2: wifi driver mt76 vs mtwifi

Use iperf3 test same VoCore2, enable one antenna.

official driver from mediatek:

[ 4] 0.00-1.00 sec 5.46 MBytes 45.8 Mbits/sec
[ 4] 1.00-2.00 sec 5.71 MBytes 47.8 Mbits/sec
[ 4] 2.00-3.00 sec 5.51 MBytes 46.2 Mbits/sec
[ 4] 3.00-4.00 sec 5.24 MBytes 44.0 Mbits/sec
[ 4] 4.00-5.00 sec 5.60 MBytes 47.0 Mbits/sec
[ 4] 5.00-6.00 sec 5.61 MBytes 47.0 Mbits/sec
[ 4] 6.00-7.00 sec 5.64 MBytes 47.3 Mbits/sec
[ 4] 7.00-8.00 sec 5.34 MBytes 44.8 Mbits/sec
[ 4] 8.00-9.00 sec 5.39 MBytes 45.2 Mbits/sec
[ 4] 9.00-10.00 sec 5.34 MBytes 44.8 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 54.8 MBytes 46.0 Mbits/sec sender
[ 4] 0.00-10.00 sec 54.8 MBytes 45.9 Mbits/sec receiver

mt76 driver from LEDE/openwrt(https://github.com/openwrt/mt76):

[ 4] 0.00-1.00 sec 2.29 MBytes 19.2 Mbits/sec
[ 4] 1.00-2.00 sec 2.28 MBytes 19.1 Mbits/sec
[ 4] 2.00-3.00 sec 3.57 MBytes 29.8 Mbits/sec
[ 4] 3.00-4.00 sec 2.98 MBytes 25.1 Mbits/sec
[ 4] 4.00-5.00 sec 4.98 MBytes 41.8 Mbits/sec
[ 4] 5.00-6.00 sec 2.68 MBytes 22.5 Mbits/sec
[ 4] 6.00-7.00 sec 4.21 MBytes 35.4 Mbits/sec
[ 4] 7.00-8.00 sec 3.79 MBytes 31.8 Mbits/sec
[ 4] 8.00-9.00 sec 4.55 MBytes 38.1 Mbits/sec
[ 4] 9.00-10.00 sec 2.79 MBytes 23.5 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 34.1 MBytes 28.6 Mbits/sec sender
[ 4] 0.00-10.00 sec 33.4 MBytes 28.1 Mbits/sec receiver

mt76 driver is not very stable, and speed is only 60% of official driver. 🙂 So there is something I can help to improve.

VoCore2: Connect to SPI Screen 2

I am lucky, the screen backlight is not damaged by my mistake. 😂

1. connect the super tiny driver board to the screen.


2. power it up with 3.3V.

The LCD backlight power consume is 5V 100mA, 0.5w, pretty much. I think that’s why the media always says the screen is one of the most power-hungry components in the phone. 😅

Next part, let’s hack SPI and check if we can display anything to it.

PS: many people(include me) find white VoCore2 is hard to clean and go ugly after solder wires, so if no special request, we will ship green pcb version at vocore.io/store(also we still product white pcb version).

VoCore2: Its time to LEDE

Thanks to all LEDE contributors, I just find current LEDE is very fast and stable, I think it is the time to merge all drivers to LEDE 🙂

New LEDE firmware is here: https://downloads.lede-project.org/snapshots/targets/ramips/mt7628/lede-ramips-mt7628-vocore2-squashfs-sysupgrade.bin

Note: make sure you have a USB2TTL, its wifi is default off, as I know that is for secure reason?

Same as usual, I will also share my advanture on this blog.

VoCore2: Fix microSD randomly umount issue

The day before yesterday I released a firmware fixed the microSD randomly umount issue. Now let me explain how it works. (Lastest Firmware: Link)

People report this issue: they find the following log in console when they trying to using microSD.

[ 112.750000] msdc-1 -> cmd card power PID<kworker/u2:1>
[ 112.750000] msdc-1 -> cmd card power PID<kworker/u2:1>
[ 112.760000] msdc-1 -> cmd card power PID<kworker/u2:1>
[ 112.770000] msdc-1 -> cmd card power PID<kworker/u2:1>
[ 112.780000] mmc0: card aaaa removed
[ 112.800000] EXT4-fs error (device mmcblk0p1): ext4_wait_block_bitmap:494: comm kworker/u2:3: Cannot read block bitmap - block_group = 0, block_bitmap = 475
[ 112.820000] EXT4-fs warning (device mmcblk0p1): ext4_end_bio:317: I/O error -5 writing to inode 12 (offset 0 size 4194304 starting block 34175)
[ 112.820000] Buffer I/O error on device mmcblk0p1, logical block 33792
[ 112.820000] Buffer I/O error on device mmcblk0p1, logical block 33793
[ 112.820000] Buffer I/O error on device mmcblk0p1, logical block 33794
[ 112.820000] Buffer I/O error on device mmcblk0p1, logical block 33795
[ 112.820000] Buffer I/O error on device mmcblk0p1, logical block 33796

microSD is umount randomly and microSD card can not use at all.

After some research, I find it is caused by microSD driver. VoCore2 do not have CD(card detect pin), but driver use that pin for card detect, even we already set “cd-poll” and “broken-cd” in VOCORE2.dts, but looks like the mmc driver did not code such flag.

I have to make a patch to fix it.

--- a/drivers/mmc/host/mtk-mmc/sd.c
+++ b/drivers/mmc/host/mtk-mmc/sd.c
@@ -580,6 +580,7 @@
inserted = (status & MSDC_PS_CDSTS) ? 0 : 1;
inserted = (status & MSDC_PS_CDSTS) ? 1 : 0;
+ inserted = 1;

#if 0
@@ -2328,6 +2329,7 @@
present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1;
present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 1 : 0;
+ present = 1;
host->card_inserted = present;
spin_unlock_irqrestore(&host->lock, flags);

This upper code force the driver always “believe” the microSD is inserted, so the float CD pin will not randomly unmount microSD card, and let cd-polling do the real card-detect work. 🙂

VoCore2: Firmware Update

This update fixed:

  1. microSD can not auto mount: VoCore2 Ultimate.
  2. microSD driver keep popup noise log to serial console: all version
  3. default IP set to
  4. remove several unused package.
  5. fix microSD auto umount randomly bug.

Download at:

VoCore2 Ultimate: vocore2.io/v2u.html (Download/Firmware)
VoCore2: vocore2.io/v2.html (Download/Firmware/128MB)
VoCore2 Lite: vocore2.io/v2.html (Download/Firmware/64MB, for Lite)