Recently The well known Corona Virus from Wuhan is spreading very fast…Our China government extended Chinese New Year holiday to Feb.9 in order to slow down the virus spreading. From Jan.20 to Feb.10, we can not ship out any package.
Sorry about the delay, hope the disaster will pass soon…
<GPIO0 5> <GPIO0 10> is not really used as GPIO, just a place holder for CS0, CS1. <GPIO1 5> is CS2, it is GPIO37(32+5), <GPIO1 6> is CS3, it is GPIO38(32+6). Once we have this, we can connect SPI device CS pins to it, I use spidev_test check if it is working.
Note: spi-mt7621 max allowed data length is 16byte, so do not send data exceeds this number, or it will oops. Use ‘-p’ parameter to avoid spidev_test default send 38 bytes.
This blog will include two parts, first, make one VoCore2(name it host) into a JTAG compatible device, like JLINK; second, enable another one VoCore2(name it client) JTAG port, so we can use host JTAG connect to it and debug.
OK, let’s start how to make it.
JTAG Host Device
OpenOCD only requires some GPIOs to make the JTAG work in TAP mode, so let’s define some GPIOs as JTAG pins.
JTAG has five pins, TMS, TCLK, JRST, TDO, TDI. SRST is for system reset, openOCD will use this pin to reset client VoCore.
2. Add pull up resistor to all of the JTAG pins.
3. Now install openocd to VoCore2. I have uploaded openocd package Makefile to github.com/vonger/vocore2, in utils/openocd folder, or you can directly use the openocd Makefile in openwrt official feeds named “package”.
It will require some depends: hidapi_0.8.0-rc1-2_mipsel_24kc.ipk, libftdi1_1.4-6_mipsel_24kc.ipk, libusb-1.0_1.0.22-1_mipsel_24kc.ipk, libusb-compat_0.1.5-1_mipsel_24kc.ipk
Note: actually we do not need hidapi, libusb, but install it is the most easy way, so we do not have to modify its Makefile.
4. Download openOCD configure file for VoCore2. I am using configure from https://github.com/Neutree/MT7688-OpenOCD, jlink-gpio.cfg. Because my GPIO setting is different, so need to modify its pin define.
Now, this host JTAG VoCore2 prepare is done. Actually it is ready to debug any JTAG compatible device, just need different cfg files.
If you want to access it from remote, must add bindto command, or openocd will bind to localhost only, can not access from outside. Sad, I spend two hours to solve this problem, I thought it was firewall issue. 🙁
JTAG Client Device
We need to change default bootstrap from GPIO to JTAG. One way is directly modify register 0x10000010 SYSCFG0, but it will back to GPIO mode once you reboot. Another way is to modify bootstrap resistor, we have to use this way.
2. connect host JTAG cables to it. All of the six cables are necessary.
3. connect client VoCore2 and host VoCore2 GND together, to avoid data transfer issue.
Ready to RUN!
Now we have prepared the JTAG host device and a test client device. We can power them on with 5V.
In host VoCore2, run command: openocd -f jlink-gpio.cfg &, it will create a server process, in jlink-gpio.cfg, we define telnet port is 4444 and gdb port is 3333, then we can use telnet connect to VoCore2 4444 port(remember to open the port at firewall).
Here is my log:
root@OpenWrt:~# openocd -f jlink_gpio.cfg Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html SysfsGPIO nums: tck = 40, tms = 41, tdi = 42, tdo = 43 SysfsGPIO num: srst = 39 SysfsGPIO num: trst = 38 adapter_nsrst_delay: 100 Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'. jtag_ntrst_delay: 100 trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain connect_deassert_srst 0 Info : SysfsGPIO JTAG/SWD bitbang driver Info : JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode) Info : This adapter doesn't support configurable speed Info : JTAG tap: mt7688.cpu tap/device found: 0x1762824f (mfg: 0x127 (MIPS Technologies), part: 0x7628, ver: 0x1)
And telnet side (I am new to openOCD, I guess this log means it already works somehow)
On VoCore2 Ultimate dock, we have a chip GD32F150G8U6 which is used as USB2TTL chip, so we can login to VoCore2 console through USB.
But GD32F150G8U6 has much more function than just USB2TTL, it has AD/DA convert inside. We can disable USB2TTL and switch it to AD/DA function. VoCore2 UART2 can be used to get AD/DA data from GD32F150.
This is current dock GD32F150 part of sch, PA0-PA7 and BOOT are exported; TXD/RXD are connected to VoCore2; USB DM/DP are connected to microUSB on dock.
Also we need some library to help us use the chip. GD32F150 library I upload to the blog server, can download here: http://vonger.cn/misc/vocore2/GD32F1x0_Firmware_Library_v3.1.0.rar
Once compiled finish, we can use gd32up to load it to chip(do not forget to set the BOOT pin to high-5V when flash firmware), source code at github.com/vonger/gd32tools, this one can be compiled by VoCore2 toolchain gcc and run in VoCore2 directly.
Here are some examples source code about GD32F150: http://vonger.cn/misc/vocore2/GD32150G8U6.HSI.zip
VoCore2 Ultimate is using example 22_USB_VirtualComPort, I modified its USB pull up pin in usb_hwp.c to GPIOA,GPIO_PIN_13 to fit the hardware.
To be continue… later I will try to write a demo code about AD/DA firmware.If you want to try it first, check example 18_ADC_conversion_triggered_by_timer and 19_DAC_Digital_To_Analog_Conversion
Currently we can directly use python3.6 on VoCore2.
Install python3 is easy, need to download some ipk packages.
I have uploaded them to http://vonger.cn/misc/vocore2/ipk/
Download the ipk files to VoCore2 /tmp folder, call opkg install *.ipk to install.
note: or download from http://downloads.openwrt.org/releases/18.06.5/packages/mipsel_24kc/packages/, it should be latest version.
In order to start further hack on MT7628 spi driver, must make the test process clear first.
I am using spidev_test.c in linux kernel for the test.
To compile it,
1. enable spidev in make menuconfig -> Kernel Modules -> SPI Support -> kmod-spi-dev
2. enable spidev_test in make menuconfig -> Utilities -> spidev_test
For firmware part, need to prepare DTS.
add this to openwrt/target/linux/ramips/dts/VOCORE2.dts:&spi0
And we can use this way to add more SPI device by set some GPIO as CS pin. Later I will write a patch for it.
compatible = “rohm,dh2228fv” this line is necessary, without it, kernel will complain…but actually we do not care which type of device is used. spi-max-frequency = <100000000> this line means max spi we can set upto 100MHz, I do not think its SPI can reach 100MHz. And from my test, 66MHz should be its max speed. Anyway, without DMA, even 10MHz it can not reach.
spi-mt7621.c this spi driver full duplex mode do not allow buffer size more than 16byte, we use half duplex to avoid issue when test, remove it.
Every time when macos update to new version, always broken something, I guess that is an important reason it has very few virus.
When I compile openwrt 18.06.5 in macos, I get new problems.
1. GCC compiler version must greater than 4.8
I have no idea about this issue…it works before, I do not remember I change anything.
brew install gcc@9
ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
add /usr/local/bin to $PATH(in ~/.profile), set it at higher level than /usr/bin to cover macos default gcc path.
2. variably modified ‘bytes’ at file scope
I think this is because xcode update change the header file…
in standard C language, array size must be const, a fixed number.
This is not allowed(as I remember this way is allowed in C++?):
const int kAuthorizationExternalFormLength = 32;
But this is OK:
#define kAuthorizationExternalFormLength 32
sudo vi /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Security.framework/Headers/Authorization.h
directly change const to #define. Ugly but works 🙂
3. Emm, after a while, cmake can not compile…
rm /usr/local/bin/gcc /usr/local/bin/g++
ln -s /usr/bin/gcc /usr/local/bin/gcc
ln -s /usr/bin/g++ /usr/local/bin/g++
change it back, then works…maybe I should directly patch openwrt Makefile. :’)
Finally I find a better solution
Once 1 passed, we can change it back to gcc 4.2.1 which is macos clang, then everything works normal. so weird.
Once I want to use AdHoc as mesh network base…but mt7628 driver do not support it.
Now I just find WDS in the menu…it should be a better way to do mesh, I will study into this, must be a lot of fun 🙂
VoCore2 has so many hidden features, from 2014, it is almost five years, I still can not totally master it.
I wrote a simple tool to update vocore2 firmware or uboot through serial port, now upload to github.
This tool might still have bugs…use carefully, I only tested it with VoCore2 uboot. 🙂
Usage is very simple:
1. use usb2ttl connect to your vocore2 uart2(TXD2/RXD2)
2. reboot vocore2 (or power up it), it will show a list of uboot.
3. press ‘0’, call uboot upgrade firmware.
4. once VoCore2 uboot console shows “## Ready for binary (kermit) download to 0x80100000 at 115200 bps…”, close console. then use this tool, call “nkermit [your port] [file]”
The port is the TTY port, for example, in windows, it is COM1, COM2, COM4 etc…in macos it is /dev/tty.xxxxxxxxx. File is the file you want to upload, normally VoCore2 upgrade firmware file is named by date, like 20191127.bin.