Bananapi M64

This tutorial will show the details of Bananapi M64 board mainline support and other needed details, for more information about hardware and linux-sunxi

Hardware Access

Serial debug and Power connections

../../../_images/bpi-m64.jpeg

BSP Build

Manual Build

For manual building refer here for all necessary information.

Image building need host to ready with all necessary tools ready, refer here

Below are the details of Image build for Banana Pi BPI-M64 board.

ATF

git clone https://github.com/apritzel/arm-trusted-firmware.git
cd arm-trusted-firmware
make PLAT=sun50iw1p1 bl31
export BL31=/path/to/arm-trusted-firmware/build/sun50iw1p1/release/bl31.bin

U-Boot

git clone git://git.denx.de/u-boot.git
cd u-boot
make bananapi_m64_defconfig
make

Linux

git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
cd linux-next
make mrproper
ARCH=arm64 make defconfig
ARCH=arm64 make -j 4 Image dtbs

Buildroot

It’s easy to build entire system using buildroot and mainline supported bananapi-m64 already. See read this readme.txt for more info.

git clone git://git.busybox.net/buildroot
cd buildroot
make bananapi_m64_defconfig
make

Booting

SD Boot

Partition the SD card in host with Single Falcon partition

Prepare SD

Write boot image

cd /to/u-boot
cat spl/sunxi-spl.bin u-boot.itb > u-boot-sunxi-with-spl.bin
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=8k seek=1

Write rootfs, update boot/extlinux/extlinux.conf

git clone https://github.com/openedev/rootfs-sun64
cp -rf rootfs-sun64/* /media/jagan/rootfs/
cp /to/linux-next/arch/arm64/boot/Image /media/jagan/rootfs/boot
cp /to/linux-next/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dtb /media/jagan/rootfs/boot
sync && umount /dev/mmcblk0*

Insert the SD card and power-on the board. See the Linux boot start from SPL - unplug SD Card during U-Boot proper boot

USB Boot

Prepare SD card with from SD Boot and prepare USB mass storage with single partition by copying rootfs and update boot/extlinux/extlinux.conf

Insert the SD card, USB Mass storage and power-on the board. See the Linux boot start from SPL

U-Boot SPL 2017.11-00063-gfb344e3-dirty (Nov 27 2017 - 12:38:05)
DRAM: 2048 MiB
Trying to boot from MMC1
NOTICE:  BL3-1: Running on A64/H64 (1689) in SRAM A2 (@0x44000)
NOTICE:  Configuring SPC Controller
NOTICE:  BL3-1: v1.0(debug):aa75c8d
NOTICE:  BL3-1: Built : 23:14:48, Nov  4 2017
NOTICE:  Configuring AXP PMIC
NOTICE:  PMIC: setup successful
INFO:    BL3-1: Initializing runtime services
INFO:    BL3-1: Preparing for EL3 exit to normal world
INFO:    BL3-1: Next image address: 0x4a000000, SPSR: 0x3c9


U-Boot 2017.11-00063-gfb344e3-dirty (Nov 27 2017 - 12:38:05 +0530) Allwinner Technology

CPU:   Allwinner A64 (SUN50I)
Model: BananaPi-M64
DRAM:  2 GiB
MMC:   SUNXI SD/MMC: 0, SUNXI SD/MMC: 1
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
starting USB...
USB0:   USB EHCI 1.00
scanning bus 0 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0
Card did not respond to voltage select!
mmc_init: -95, time 22
switch to partitions #0, OK
mmc1(part 0) is current device
** No partition table - mmc 1 **

Device 0: Vendor: Sony     Rev: 0100 Prod: Storage Media
            Type: Removable Hard Disk
            Capacity: 30040.8 MB = 29.3 GB (61523712 x 512)
... is now current device
Scanning usb 0:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
151 bytes read in 157 ms (0 Bytes/s)
1:      linux-next
Retrieving file: /boot/Image
16908800 bytes read in 21856 ms (754.9 KiB/s)
append: console=ttyS0,115200 earlyprintk root=/dev/sda1 rootwait
Retrieving file: /boot/sun50i-a64-bananapi-m64.dtb
12817 bytes read in 142 ms (87.9 KiB/s)
## Flattened Device Tree blob at 4fa00000
   Booting using the fdt blob at 0x4fa00000
   Loading Device Tree to 0000000049ff9000, end 0000000049fff210 ... OK

Starting kernel ...

[�r��������Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 4.14.0-next-20171123-00001-gae19a8e (root@jagan-XPS-13-9350) (gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02)) 7
[    0.000000] Machine model: BananaPi-M64
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] cma: Reserved 16 MiB at 0x00000000bf000000
[    0.000000] NUMA: No NUMA configuration found
[    0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000bfffffff]
[    0.000000] NUMA: NODE_DATA [mem 0xbefe3000-0xbefe4aff]
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv0.2 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: Trusted OS migration not required
[    0.000000] random: get_random_bytes called from start_kernel+0xa4/0x408 with crng_init=0
[    0.000000] percpu: Embedded 23 pages/cpu @ffff80007ef80000 s55832 r8192 d30184 u94208
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: enabling workaround for ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 516096
[    0.000000] Policy zone: DMA
[    0.000000] Kernel command line: console=ttyS0,115200 earlyprintk root=/dev/sda1 rootwait

U-Boot

USB Mass Storage gadget

We can use the board as a USB Mass Storage device:

You will be able to access all the partitions of any block device that is on the board or connected to it,

from your host PC - You will see them as /dev/sdXX, just like connecting a regular USB storage to your PC,

and you’ll be able to mount them, and have full read/write access to them.

We can even use it to flash a new U-Boot, re-partition the storage, re-format it, etc.

This is especially useful for updating the internal eMMC.

To do this you need to connect a USB cable between the OTG/Client port of the board and a regular USB Host port on your PC,

and use U-Boot’s ums command.

Linux

USB OTG

Here, we can take mass storage as gadget function and will show how it can work with ‘host’ and ‘peripheral’ modes

Build otg mass storage as statically linked module with

CONFIG_USB_MASS_STORAGE=y

Append bootargs with ‘g_mass_storage.removable=1 g_mass_storage.luns=1’

Peripheral

Plug USB otg cable A-type to host pc and B-type to bananapi

[    1.952386] usb_phy_generic usb_phy_generic.0.auto: usb_phy_generic.0.auto supply vcc not found, using dummy regulator
[    1.952954] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[    1.952965] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 5
[    1.957274] hub 5-0:1.0: USB hub found
[    1.957303] hub 5-0:1.0: 1 port detected
[    1.961702] Mass Storage Function, version: 2009/09/11
[    1.961708] LUN: removable file: (no medium)
[    1.961761] LUN: removable file: (no medium)
[    1.961764] Number of LUNs=1
[    1.972523] g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11
[    1.972527] g_mass_storage gadget: userspace failed to provide iSerialNumber
[    1.972530] g_mass_storage gadget: g_mass_storage ready
# cat /proc/cmdline
console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p1 rootwait g_mass_storage.removable=1 g_mass_storage.luns=1
# fdisk -l
Disk /dev/mmcblk0: 15 GB, 15931539456 bytes, 31116288 sectors
486192 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1    320,0,1     815,3,16         20480   31116287   31095808 14.8G 83 Linux
# echo /dev/mmcblk0 > /sys/devices/platform/soc/1c19000.usb/musb-hdrc.1.auto/gadget/lun0/file

Access the disk at host pc and write and umount

Host

Plug USB host cable where A-type connect with USB stick and B-type connect to bananapi and

See USB stick detection on bananapi

# cat /sys/devices/platform/soc/1c19000.usb/musb-hdrc.1.auto/mode
b_peripheral
# echo host > /sys/devices/platform/soc/1c19000.usb/musb-hdrc.1.auto/mode
[   19.231613] phy phy-1c19400.phy.0: Changing dr_mode to 1
# [  451.961240] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  452.133893] usb-storage 1-1:1.0: USB Mass Storage device detected
[  452.140884] scsi host0: usb-storage 1-1:1.0
[  453.151349] scsi 0:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
[  453.161156] sd 0:0:0:0: [sda] 15728640 512-byte logical blocks: (8.05 GB/7.50 GiB)
[  453.169900] sd 0:0:0:0: [sda] Write Protect is off
[  453.175770] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[  453.191292]  sda: sda1
[  453.197283] sd 0:0:0:0: [sda] Attached SCSI removable disk