VoCore: Dock2 Firmware

This is the first version of the firmware
This firmware is only for dock2(with WM8960 chip at bottom)
Download at
http://vonger.cn/upload/firmware/vocore.dock2.bin

Compile by yourself:

1. clone openwrt 14.07 to your linux pc or vm.
git clone git://git.openwrt.org/14.07/openwrt.git

2. update VOCORE.dts, the following one is mine.

/dts-v1/;

/include/ "rt5350.dtsi"

/ {
	compatible = "VoCore", "ralink,rt5350-soc";
	model = "VoCore";

	palmbus@10000000 {
		gpio1: gpio@660 {
			status = "okay";
		};

		spi@b00 {
			status = "okay";

			m25p80@0 {
				#address-cells = <1>;
				#size-cells = <1>;
				compatible = "s25fl064k";
				reg = <0>;
				linux,modalias = "m25p80", "s25fl064k";
				spi-max-frequency = <10000000>;

				partition@0 {
					label = "uboot";
					reg = <0x0 0x30000>;
					read-only;
				};

				partition@30000 {
					label = "uboot-env";
					reg = <0x30000 0x10000>;
					read-only;
				};

				factory: partition@40000 {
					label = "factory";
					reg = <0x40000 0x10000>;
					read-only;
				};

				partition@50000 {
					label = "firmware";
					reg = <0x50000 0xfb0000>;
				};
			};

			spidev@1 {
				compatible = "linux,spidev";
				spi-max-frequency = <10000000>;
				reg = <1>;
			};
		};

                gdma: gdma@2800 {
                        compatible = "ralink,rt2880-gdma";
                        reg = <0x2800 0x800>;

                        resets = <&rstctrl 14>;
                        reset-names = "dma";

                        interrupt-parent = <&intc>;
                        interrupts = <7>;

			#dma-cells = <1>;
			#dma-channels = <16>;
			#dma-requests = <8>;
                };

		i2s: i2s@a00 {
			compatible = "ralink,mt7620a-i2s";
			reg = <0xa00 0x100>;

			resets = <&rstctrl 17>;
			reset-names = "i2s";

			interrupt-parent = <&intc>;
			interrupts = <10>;

			dmas = <&gdma 2 &gdma 3>;
			dma-names = "tx", "rx";
		};
	};

	pinctrl {
		state_default: pinctrl0 {
			gpio {
				ralink,group = "jtag", "led";
				ralink,function = "gpio";
			};

			gpio_i2s {
				ralink,group = "uartf";
				ralink,function = "gpio i2s";
			};
		};
	};

	ethernet@10100000 {
		mtd-mac-address = <&factory 0x4>;
	};

	esw@10110000 {
		ralink,portmap = <0x17>;
	};

	wmac@10180000 {
		ralink,mtd-eeprom = <&factory 0>;
	};

	ehci@101c0000 {
		status = "okay";
	};

	ohci@101c1000 {
		status = "okay";
	};

	i2c-gpio {
		compatible = "i2c-gpio";
		gpios = <&gpio0 11 0 &gpio0 14 0>;
		i2c-gpio,delay-us = <2>; /* around 400KHz */

		#address-cells = <1>;
		#size-cells = <0>;

		wm8960: wm8960@1a {
			compatible = "wm8960";
			reg = <0x1a>;
		};
	};

	audio {
		compatible = "ralink,wm8960-audio";
		model = "wm8960-audio";
		
		cpu-dai = <&i2s>;
		codec-dai = <&wm8960>;
	};

	gpio-export {
		compatible = "gpio-export";
		#size-cells = <0>;

		gpio0 {
			gpio-export,name = "gpio0";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 0 0>;
		};

		gpio12 {
			/* UARTF_DCD_N */
			gpio-export,name = "gpio12";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 12 0>;
		};
		gpio13 {
			/* UARTF_DSR_N */
			gpio-export,name = "gpio13";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 13 0>;
		};

		/* JTAG */
		gpio17 {
			/* JTAG_TDO */
			gpio-export,name = "gpio17";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 17 0>;
		};
		gpio18 {
			/* JTAG_TDI */
			gpio-export,name = "gpio18";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 18 0>;
		};
		gpio19 {
			/* JTAG_TMS */
			gpio-export,name = "gpio19";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 19 0>;
		};
		gpio20 {
			/* JTAG_TCLK */
			gpio-export,name = "gpio20";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 20 0>;
		};
		gpio21 {
			/* JTAG_TRST_N */
			gpio-export,name = "gpio21";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio0 21 0>;
		};

		/* ETH LEDs */
		gpio23 {
			/* ETH1_LED */
			gpio-export,name = "gpio23";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio1 1 0>;
		};
		gpio24 {
			/* ETH2_LED */
			gpio-export,name = "gpio24";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio1 2 0>;
		};
		gpio25 {
			/* ETH3_LED */
			gpio-export,name = "gpio25";
			gpio-export,direction_may_change = <1>;
			gpios = <&gpio1 3 0>;
		};
	};

	gpio-leds {
		compatible = "gpio-leds";
		status {
			label = "vocore:green:status";
			gpios = <&gpio1 0 0>;
		};
		eth {
			label = "vocore:orange:eth";
			gpios = <&gpio1 4 0>;
		};
	};
};

3. Setup dma driver, add dma.mk to [openwrt]/package/kernel/linux/modules/

DMA_MENU:=DMA support


define KernelPackage/ralink-gdma
  TITLE:=Ralink GDMA driver
  SUBMENU:=$(DMA_MENU)
  KCONFIG:= \
        CONFIG_DMADEVICES=y \
	CONFIG_DMA_ENGINE=y \
        CONFIG_DMA_VIRTUAL_CHANNELS \
        CONFIG_DMA_RALINK 
  FILES:= \
        $(LINUX_DIR)/drivers/dma/virt-dma.ko \
        $(LINUX_DIR)/drivers/dma/ralink-gdma.ko
  AUTOLOAD:=$(call AutoLoad,11,ralink-gdma)
endef

define KernelPackage/ralink-gdma/description
 Kernel module for Ralink GDMA device support
endef

$(eval $(call KernelPackage,ralink-gdma))

4. Setup ALSA DMA
Whatever I do to the makefile/config, still two files can not be compiled, no idea what is wrong.
They are $LINUX/sound/soc/soc-dmaengine-pcm.c soc-generic-dmaengine-pcm.c
I have to force them to be compiled.

4.1. modify $LINUX/sound/Kconfig, comment that ifneq and endif.

#ifneq ($(CONFIG_SND_SOC_DMAENGINE_PCM),)
snd-soc-core-objs += soc-dmaengine-pcm.o
#endif

#ifneq ($(CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM),)
snd-soc-core-objs += soc-generic-dmaengine-pcm.o
#endif

4.2. modify $OPENWRT/target/linux/ramips/rt305x/config-3.10 to force it compiled.
add two line at end of it.

CONFIG_SND_SOC_DMAENGINE_PCM=y
CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y

5. Setup ALSA WM8960/I2S driver.
modify $OPENWRT/target/linux/ramips/modules.mk
@TARGET_ramips_mt7620a to @TARGET_ramips, so it will show not only MT7620a kernel but also in RT5350.

define KernelPackage/sound-mt7620
  TITLE:=MT7620 PCM/I2S Alsa Driver
  DEPENDS:=@TARGET_ramips +kmod-sound-soc-core +kmod-regmap
  KCONFIG:= \
        CONFIG_SND_MT7620_SOC_I2S \
        CONFIG_SND_MT7620_SOC_WM8960
  FILES:= \
        $(LINUX_DIR)/sound/soc/ralink/snd-soc-mt7620-i2s.ko \
        $(LINUX_DIR)/sound/soc/ralink/snd-soc-mt7620-wm8960.ko \
        $(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8960.ko
  AUTOLOAD:=$(call AutoLoad,90,snd-soc-wm8960 snd-soc-mt7620-i2s snd-soc-mt7620-wm8960)
  $(call AddDepends/sound)
endef

define KernelPackage/sound-mt7620/description
 Alsa modules for ralink i2s controller.
endef

$(eval $(call KernelPackage,sound-mt7620))

6. Now, everything is ready. make menuconfig
Select in Kernel modules:
add I2C support/kmod-i2c-gpio-custom;
del I2C support/kmod-i2c-ralink;
add DMA support/kmod-ralink-gdma
add Sound support/kmod-sound-mt7620

7. That’s all, make V=s, build the bin file.

Later I will do more test on this firmware, dma, i2c and i2s works well in this firmware.

Drivers works:

root@OpenWrt:/dev# ls
audio               i2c-0               mtd0ro              mtd3ro              mtdblock1           network_throughput  shm                 urandom
bus                 kmsg                mtd1                mtd4                mtdblock2           null                snd                 watchdog
console             log                 mtd1ro              mtd4ro              mtdblock3           ppp                 spidev32766.1       watchdog0
cpu_dma_latency     mem                 mtd2                mtd5                mtdblock4           ptmx                tty                 zero
dsp                 mixer               mtd2ro              mtd5ro              mtdblock5           pts                 ttyS0
full                mtd0                mtd3                mtdblock0           network_latency     random              ttyS1
root@OpenWrt:/dev# cd snd
root@OpenWrt:/dev/snd# ls
controlC0  pcmC0D0c   pcmC0D0p   timer

root@OpenWrt:/dev/snd# lsmod
arc4                    1312  2 
cfg80211              197639  2 rt2x00lib
compat                  2285  3 rt2800soc
crc_ccitt               1019  2 rt2800lib
crc_itu_t               1019  0 
crypto_blkcipher       10375  1 arc4
eeprom_93cx6            1807  0 
ehci_hcd               29964  1 ehci_platform
ehci_platform           2272  0 
gpio_button_hotplug     5984  0 
i2c_algo_bit            4538  1 i2c_gpio
i2c_core               15054  6 snd_soc_wm8960
i2c_dev                 4064  0 
i2c_gpio                2400  0 
input_core             24281  1 snd
ip6_tables              8993  3 ip6table_raw
ip6t_REJECT             2336  2 
ip6table_filter          608  1 
ip6table_mangle         1024  1 
ip6table_raw             576  1 
ip_tables               9165  4 iptable_nat
ipt_MASQUERADE          1136  1 
ipt_REJECT              1776  2 
iptable_filter           672  1 
iptable_mangle           928  1 
iptable_nat             1680  1 
iptable_raw              640  1 
ipv6                  238854 26 ip6t_REJECT
leds_gpio               2944  0 
lzo_compress            2082  1 regmap_core
lzo_decompress          1351  1 regmap_core
mac80211              344225  3 rt2800lib
nf_conntrack           44715 13 iptable_nat
nf_conntrack_ftp        5136  1 nf_nat_ftp
nf_conntrack_ipv4       4676  8 
nf_conntrack_ipv6       4976  3 
nf_conntrack_irc        2784  1 nf_nat_irc
nf_defrag_ipv4           758  1 nf_conntrack_ipv4
nf_defrag_ipv6          8695  1 nf_conntrack_ipv6
nf_nat                  9759  7 iptable_nat
nf_nat_ftp              1216  0 
nf_nat_ipv4             2526  1 iptable_nat
nf_nat_irc              1008  0 
nls_base                5006  1 usbcore
of_i2c                  1344  1 i2c_gpio
ohci_hcd               13360  0 
ppp_async               6176  0 
ppp_generic            19650  3 pppoe
pppoe                   7744  0 
pppox                   1338  1 pppoe
ralink_gdma             4032  2 
regmap_core            25039  4 snd_soc_wm8960
regmap_i2c               966  2 snd_soc_wm8960
regmap_spi              1078  1 snd_soc_core
rt2800lib              91441  2 rt2800soc
rt2800mmio              6338  1 rt2800soc
rt2800soc               2464  0 
rt2x00lib              34047  5 rt2800soc
rt2x00mmio              1952  2 rt2800soc
rt2x00soc               1218  1 rt2800soc
slhc                    4347  1 ppp_generic
snd                    39083 10 snd_soc_wm8960
snd_compress            6175  1 snd_soc_core
snd_hwdep               4302  0 
snd_mixer_oss          12393  1 snd_pcm_oss
snd_page_alloc          3249  1 snd_pcm
snd_pcm                56509  2 snd_soc_core
snd_pcm_oss            33553  0 
snd_rawmidi            14995  0 
snd_seq_device          4301  1 snd_rawmidi
snd_soc_core           91031  3 snd_soc_mt7620_wm8960
snd_soc_mt7620_i2s      2896  2 
snd_soc_mt7620_wm8960    2048  0 
snd_soc_wm8960         16944  1 
snd_timer              14382  1 snd_pcm
soundcore               3788  1 snd
usb_common              1160  1 usbcore
usbcore               106727  3 ohci_hcd
virt_dma                1333  1 ralink_gdma
x_tables               10997 26 ipt_MASQUERADE
xt_CT                   2272  0 
xt_LOG                  9552  0 
xt_REDIRECT             1056  0 
xt_TCPMSS               2704  2 
xt_comment               480 53 
xt_conntrack            2144 10 
xt_id                    480  0 
xt_limit                 992 20 
xt_mac                   608  0 
xt_mark                  672  0 
xt_multiport            1200  0 
xt_nat                  1072  0 
xt_state                 688  0 
xt_tcpudp               1712  8 
xt_time                 1664  0 

root@OpenWrt:/sys/class/dma# ls
dma0chan0   dma0chan1   dma0chan10  dma0chan11  dma0chan12  dma0chan13  dma0chan14  dma0chan15  dma0chan2   dma0chan3   dma0chan4   dma0chan5   dma0chan6   dma0chan7   dma0chan8   dma0chan9

root@OpenWrt:/proc# cat interrupts
           CPU0       
  5:        203      MIPS  10100000.ethernet
  6:     229856      MIPS  rt2800_wmac
  7:     353640      MIPS  timer
  9:          0      INTC  10000100.timer
 15:        121      INTC  10002800.gdma
 20:         30      INTC  serial
 25:          1      INTC  esw
 26:          1      INTC  ehci_hcd:usb1, ohci_hcd:usb2
ERR:          0

ralink-gdma.c might have a bug, once I remove the log output, it will not trigger 10002800.gdma interrupts, very weird.