.. SPDX-License-Identifier: GPL-2.0+ AX25-AE350 ========== AE350 is the mainline SoC produced by Andes Technology using AX25 CPU core base on RISC-V architecture. AE350 has integrated both AHB and APB bus and many periphals for application and product development. AX25-AE350 is the SoC with AE350 hardcore CPU. AX25 is Andes CPU IP to adopt RISC-V architecture. AX25 Features ------------- CPU Core - 5-stage in-order execution pipeline - Hardware Multiplier - radix-2/radix-4/radix-16/radix-256/fast - Hardware Divider - Optional branch prediction - Machine mode and optional user mode - Optional performance monitoring ISA - RV64I base integer instructions - RVC for 16-bit compressed instructions - RVM for multiplication and division instructions Memory subsystem - I & D local memory - Size: 4KB to 16MB - Memory subsyetem soft-error protection - Protection scheme: parity-checking or error-checking-and-correction (ECC) - Automatic hardware error correction Bus - Interface Protocol - Synchronous AHB (32-bit/64-bit data-width), or - Synchronous AXI4 (64-bit data-width) Power management - Wait for interrupt (WFI) mode Debug - Configurable number of breakpoints: 2/4/8 - External Debug Module - AHB slave port - External JTAG debug transport module Platform Level Interrupt Controller (PLIC) - AHB slave port - Configurable number of interrupts: 1-1023 - Configurable number of interrupt priorities: 3/7/15/63/127/255 - Configurable number of targets: 1-16 - Preempted interrupt priority stack Configurations -------------- CONFIG_SKIP_LOWLEVEL_INIT: If you want to boot this system from SPI ROM and bypass e-bios (the other boot loader on ROM). You should undefine CONFIG_SKIP_LOWLEVEL_INIT in "include/configs/ax25-ae350.h". Build and boot steps -------------------- Build: 1. Prepare the toolchains and make sure the $PATH to toolchains is correct. 2. Use `make ae350_rv[32|64]_defconfig` in u-boot root to build the image for 32 or 64 bit. Verification: 1. startup 2. relocation 3. timer driver 4. uart driver 5. mac driver 6. mmc driver 7. spi driver Steps ----- 1. Define CONFIG_SKIP_LOWLEVEL_INIT to build u-boot which is loaded via gdb from ram. 2. Undefine CONFIG_SKIP_LOWLEVEL_INIT to build u-boot which is booted from spi rom. 3. Ping a server by mac driver 4. Scan sd card and copy u-boot image which is booted from flash to ram by sd driver. 5. Burn this u-boot image to spi rom by spi driver 6. Re-boot u-boot from spi flash with power off and power on. Messages of U-Boot boot on AE350 board -------------------------------------- .. code-block:: none U-Boot 2018.01-rc2-00033-g824f89a (Dec 21 2017 - 16:51:26 +0800) DRAM: 1 GiB MMC: mmc@f0e00000: 0 SF: Detected mx25u1635e with page size 256 Bytes, erase size 4 KiB, total 2 MiB In: serial@f0300000 Out: serial@f0300000 Err: serial@f0300000 Net: Warning: mac@e0100000 (eth0) using random MAC address - be:dd:d7:e4:e8:10 eth0: mac@e0100000 RISC-V # version U-Boot 2018.01-rc2-00033-gb265b91-dirty (Dec 22 2017 - 13:54:21 +0800) riscv32-unknown-linux-gnu-gcc (GCC) 7.2.0 GNU ld (GNU Binutils) 2.29 RISC-V # setenv ipaddr 10.0.4.200 ; RISC-V # setenv serverip 10.0.4.97 ; RISC-V # ping 10.0.4.97 ; Using mac@e0100000 device host 10.0.4.97 is alive RISC-V # mmc rescan RISC-V # fatls mmc 0:1 318907 u-boot-ae350-64.bin 1252 hello_world_ae350_32.bin 328787 u-boot-ae350-32.bin 3 file(s), 0 dir(s) RISC-V # sf probe 0:0 50000000 0 SF: Detected mx25u1635e with page size 256 Bytes, erase size 4 KiB, total 2 MiB RISC-V # sf test 0x100000 0x1000 SPI flash test: 0 erase: 36 ticks, 111 KiB/s 0.888 Mbps 1 check: 29 ticks, 137 KiB/s 1.096 Mbps 2 write: 40 ticks, 100 KiB/s 0.800 Mbps 3 read: 20 ticks, 200 KiB/s 1.600 Mbps Test passed 0 erase: 36 ticks, 111 KiB/s 0.888 Mbps 1 check: 29 ticks, 137 KiB/s 1.096 Mbps 2 write: 40 ticks, 100 KiB/s 0.800 Mbps 3 read: 20 ticks, 200 KiB/s 1.600 Mbps RISC-V # fatload mmc 0:1 0x600000 u-boot-ae350-32.bin reading u-boot-ae350-32.bin 328787 bytes read in 324 ms (990.2 KiB/s) RISC-V # sf erase 0x0 0x51000 SF: 331776 bytes @ 0x0 Erased: OK RISC-V # sf write 0x600000 0x0 0x50453 device 0 offset 0x0, size 0x50453 SF: 328787 bytes @ 0x0 Written: OK RISC-V # crc32 0x600000 0x50453 crc32 for 00600000 ... 00650452 ==> 692dc44a RISC-V # crc32 0x80000000 0x50453 crc32 for 80000000 ... 80050452 ==> 692dc44a RISC-V # *** power-off and power-on, this U-Boot is booted from spi flash *** U-Boot 2018.01-rc2-00032-gf67dd47-dirty (Dec 21 2017 - 13:56:03 +0800) DRAM: 1 GiB MMC: mmc@f0e00000: 0 SF: Detected mx25u1635e with page size 256 Bytes, erase size 4 KiB, total 2 MiB In: serial@f0300000 Out: serial@f0300000 Err: serial@f0300000 Net: Warning: mac@e0100000 (eth0) using random MAC address - ee:4c:58:29:32:f5 eth0: mac@e0100000 RISC-V # Boot bbl and riscv-linux via U-Boot on QEMU ------------------------------------------- 1. Build riscv-linux 2. Build bbl and riscv-linux with --with-payload 3. Prepare ae350.dtb 4. Creating OS-kernel images .. code-block:: none ./mkimage -A riscv -O linux -T kernel -C none -a 0x0000 -e 0x0000 -d bbl.bin bootmImage-bbl.bin Image Name: Created: Tue Mar 13 10:06:42 2018 Image Type: RISC-V Linux Kernel Image (uncompressed) Data Size: 17901204 Bytes = 17481.64 KiB = 17.07 MiB Load Address: 00000000 Entry Point: 00000000 5. Copy bootmImage-bbl.bin and ae350.dtb to qemu sd card image 6. Message of booting riscv-linux from bbl via u-boot on qemu .. code-block:: none U-Boot 2018.03-rc4-00031-g2631273 (Mar 13 2018 - 15:02:55 +0800) DRAM: 1 GiB main-loop: WARNING: I/O thread spun for 1000 iterations MMC: mmc@f0e00000: 0 Loading Environment from SPI Flash... *** Warning - spi_flash_probe_bus_cs() failed, using default environment Failed (-22) In: serial@f0300000 Out: serial@f0300000 Err: serial@f0300000 Net: Warning: mac@e0100000 (eth0) using random MAC address - 02:00:00:00:00:00 eth0: mac@e0100000 RISC-V # mmc rescan RISC-V # mmc part Partition Map for MMC device 0 -- Partition Type: DOS Part Start Sector Num Sectors UUID Type RISC-V # fatls mmc 0:0 17901268 bootmImage-bbl.bin 1954 ae2xx.dtb 2 file(s), 0 dir(s) RISC-V # fatload mmc 0:0 0x00600000 bootmImage-bbl.bin 17901268 bytes read in 4642 ms (3.7 MiB/s) RISC-V # fatload mmc 0:0 0x2000000 ae350.dtb 1954 bytes read in 1 ms (1.9 MiB/s) RISC-V # setenv bootm_size 0x2000000 RISC-V # setenv fdt_high 0x1f00000 RISC-V # bootm 0x00600000 - 0x2000000 ## Booting kernel from Legacy Image at 00600000 ... Image Name: Image Type: RISC-V Linux Kernel Image (uncompressed) Data Size: 17901204 Bytes = 17.1 MiB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK ## Flattened Device Tree blob at 02000000 Booting using the fdt blob at 0x2000000 Loading Kernel Image ... OK Loading Device Tree to 0000000001efc000, end 0000000001eff7a1 ... OK [ 0.000000] OF: fdt: Ignoring memory range 0x0 - 0x200000 [ 0.000000] Linux version 4.14.0-00046-gf3e439f-dirty (rick@atcsqa06) (gcc version 7.1.1 20170509 (GCC)) #1 Tue Jan 9 16:34:25 CST 2018 [ 0.000000] bootconsole [early0] enabled [ 0.000000] Initial ramdisk at: 0xffffffe000016a98 (12267008 bytes) [ 0.000000] Zone ranges: [ 0.000000] DMA [mem 0x0000000000200000-0x000000007fffffff] [ 0.000000] Normal empty [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000200000-0x000000007fffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000200000-0x000000007fffffff] [ 0.000000] elf_hwcap is 0x112d [ 0.000000] random: fast init done [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 516615 [ 0.000000] Kernel command line: console=ttyS0,38400n8 earlyprintk=uart8250-32bit,0xf0300000 debug loglevel=7 [ 0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes) [ 0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes) [ 0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes) [ 0.000000] Sorting __ex_table... [ 0.000000] Memory: 2047832K/2095104K available (1856K kernel code, 204K rwdata, 532K rodata, 12076K init, 756K bss, 47272K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0 [ 0.000000] riscv,cpu_intc,0: 64 local interrupts mapped [ 0.000000] riscv,plic0,e4000000: mapped 31 interrupts to 1/2 handlers [ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns [ 0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 20.00 BogoMIPS (lpj=40000) [ 0.000000] pid_max: default: 32768 minimum: 301 [ 0.004000] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes) [ 0.004000] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes) [ 0.056000] devtmpfs: initialized [ 0.060000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.064000] futex hash table entries: 256 (order: 0, 6144 bytes) [ 0.068000] NET: Registered protocol family 16 [ 0.080000] vgaarb: loaded [ 0.084000] clocksource: Switched to clocksource riscv_clocksource [ 0.088000] NET: Registered protocol family 2 [ 0.092000] TCP established hash table entries: 16384 (order: 5, 131072 bytes) [ 0.096000] TCP bind hash table entries: 16384 (order: 5, 131072 bytes) [ 0.096000] TCP: Hash tables configured (established 16384 bind 16384) [ 0.100000] UDP hash table entries: 1024 (order: 3, 32768 bytes) [ 0.100000] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes) [ 0.104000] NET: Registered protocol family 1 [ 0.616000] Unpacking initramfs... [ 1.220000] workingset: timestamp_bits=62 max_order=19 bucket_order=0 [ 1.244000] io scheduler noop registered [ 1.244000] io scheduler cfq registered (default) [ 1.244000] io scheduler mq-deadline registered [ 1.248000] io scheduler kyber registered [ 1.360000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled [ 1.368000] console [ttyS0] disabled [ 1.372000] f0300000.serial: ttyS0 at MMIO 0xf0300020 (irq = 10, base_baud = 1228800) is a 16550A [ 1.392000] console [ttyS0] enabled [ 1.392000] ftmac100: Loading version 0.2 ... [ 1.396000] ftmac100 e0100000.mac eth0: irq 8, mapped at ffffffd002005000 [ 1.400000] ftmac100 e0100000.mac eth0: generated random MAC address 6e:ac:c3:92:36:c0 [ 1.404000] IR NEC protocol handler initialized [ 1.404000] IR RC5(x/sz) protocol handler initialized [ 1.404000] IR RC6 protocol handler initialized [ 1.404000] IR JVC protocol handler initialized [ 1.408000] IR Sony protocol handler initialized [ 1.408000] IR SANYO protocol handler initialized [ 1.408000] IR Sharp protocol handler initialized [ 1.408000] IR MCE Keyboard/mouse protocol handler initialized [ 1.412000] IR XMP protocol handler initialized [ 1.456000] ftsdc010 f0e00000.mmc: mmc0 - using hw SDIO IRQ [ 1.464000] bootconsole [early0] uses init memory and must be disabled even before the real one is ready [ 1.464000] bootconsole [early0] disabled [ 1.508000] Freeing unused kernel memory: 12076K [ 1.512000] This architecture does not have kernel memory protection. [ 1.520000] mmc0: new SD card at address 4567 [ 1.524000] mmcblk0: mmc0:4567 QEMU! 20.0 MiB [ 1.844000] mmcblk0: Wed Dec 1 10:00:00 CST 2010 / # Running U-Boot SPL ------------------ The U-Boot SPL will boot in M mode and load the FIT image which include OpenSBI and U-Boot proper images. After loading progress, it will jump to OpenSBI first and then U-Boot proper which will run in S mode. How to build U-Boot SPL ----------------------- Before building U-Boot SPL, OpenSBI must be build first. OpenSBI can be cloned and build for AE350 as below: git clone https://github.com/riscv/opensbi.git cd opensbi make PLATFORM=andes/ae350 Copy OpenSBI FW_DYNAMIC image (build\platform\andes\ae350\firmware\fw_dynamic.bin) into U-Boot root directory How to build U-Boot SPL booting from RAM ---------------------------------------- With ae350_rv[32|64]_spl_defconfigs: U-Boot SPL will be loaded by gdb or FSBL and runs in RAM in machine mode and then load FIT image from RAM device on AE350. How to build U-Boot SPL booting from ROM ---------------------------------------- With ae350_rv[32|64]_spl_xip_defconfigs: U-Boot SPL can be burned into SPI flash and run in flash in machine mode and then load FIT image from SPI flash or MMC device on AE350. Messages of U-Boot SPL boots Kernel on AE350 board -------------------------------------------------- .. code-block:: none U-Boot SPL 2020.01-rc1-00292-g67a3313-dirty (Nov 14 2019 - 11:26:21 +0800) Trying to boot from RAM OpenSBI v0.5-1-gdd8ef28 (Nov 14 2019 11:08:39) ____ _____ ____ _____ / __ \ / ____| _ \_ _| | | | |_ __ ___ _ __ | (___ | |_) || | | | | | '_ \ / _ \ '_ \ \___ \| _ < | | | |__| | |_) | __/ | | |____) | |_) || |_ \____/| .__/ \___|_| |_|_____/|____/_____| | | |_| Platform Name : Andes AE350 Platform HART Features : RV64ACIMSUX Platform Max HARTs : 4 Current Hart : 0 Firmware Base : 0x0 Firmware Size : 84 KB Runtime SBI Version : 0.2 PMP0: 0x0000000000000000-0x000000000001ffff (A) PMP1: 0x0000000000000000-0x00000001ffffffff (A,R,W,X) U-Boot 2020.01-rc1-00292-g67a3313-dirty (Nov 14 2019 - 11:26:21 +0800) DRAM: 1 GiB Flash: 64 MiB MMC: mmc@f0e00000: 0 Loading Environment from SPI Flash... SF: Detected mx25u1635e with page size 256 Bytes, erase size 4 KiB, total 2 MiB OK In: serial@f0300000 Out: serial@f0300000 Err: serial@f0300000 Net: no alias for ethernet0 Warning: mac@e0100000 (eth0) using random MAC address - a2:ae:93:7b:cc:8f eth0: mac@e0100000 Hit any key to stop autoboot: 0 6455 bytes read in 31 ms (203.1 KiB/s) 20421684 bytes read in 8647 ms (2.3 MiB/s) ## Booting kernel from Legacy Image at 00600000 ... Image Name: Image Type: RISC-V Linux Kernel Image (uncompressed) Data Size: 20421620 Bytes = 19.5 MiB Load Address: 00200000 Entry Point: 00200000 Verifying Checksum ... OK ## Flattened Device Tree blob at 20000000 Booting using the fdt blob at 0x20000000 Loading Kernel Image Loading Device Tree to 000000001effb000, end 000000001efff936 ... OK Starting kernel ... OF: fdt: Ignoring memory range 0x0 - 0x200000 Linux version 4.17.0-00253-g49136e10bcb2 (sqa@atcsqa07) (gcc version 7.3.0 (2019-04-06_nds64le-linux-glibc-v5_experimental)) #1 SMP PREEMPT Sat Apr 6 23:41:49 CST 2019 bootconsole [early0] enabled Initial ramdisk at: 0x (ptrval) (13665712 bytes) Zone ranges: DMA32 [mem 0x0000000000200000-0x000000003fffffff] Normal empty Movable zone start for each node Early memory node ranges node 0: [mem 0x0000000000200000-0x000000003fffffff] Initmem setup node 0 [mem 0x0000000000200000-0x000000003fffffff] software IO TLB [mem 0x3b1f8000-0x3f1f8000] (64MB) mapped at [ (ptrval)- (ptrval)] elf_platform is rv64i2p0m2p0a2p0c2p0xv5-0p0 compatible privileged spec version 1.10 percpu: Embedded 16 pages/cpu @ (ptrval) s28184 r8192 d29160 u65536 Built 1 zonelists, mobility grouping on. Total pages: 258055 Kernel command line: console=ttyS0,38400n8 debug loglevel=7 log_buf_len individual max cpu contribution: 4096 bytes log_buf_len total cpu_extra contributions: 12288 bytes log_buf_len min size: 16384 bytes log_buf_len: 32768 bytes early log buf free: 14608(89%) Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes) Inode-cache hash table entries: 65536 (order: 7, 524288 bytes) Sorting __ex_table... Memory: 944428K/1046528K available (3979K kernel code, 246K rwdata, 1490K rodata, 13523K init, 688K bss, 102100K reserved, 0K cma-reserved) SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 Preemptible hierarchical RCU implementation. Tasks RCU enabled. NR_IRQS: 72, nr_irqs: 72, preallocated irqs: 0 riscv,cpu_intc,0: 64 local interrupts mapped riscv,cpu_intc,1: 64 local interrupts mapped riscv,cpu_intc,2: 64 local interrupts mapped riscv,cpu_intc,3: 64 local interrupts mapped riscv,plic0,e4000000: mapped 71 interrupts to 8/8 handlers clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1bacf917bf, max_idle_ns: 881590412290 ns sched_clock: 64 bits at 60MHz, resolution 16ns, wraps every 4398046511098ns Console: colour dummy device 40x30 Calibrating delay loop (skipped), value calculated using timer frequency.. 120.00 BogoMIPS (lpj=600000) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 2048 (order: 2, 16384 bytes) Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes) Hierarchical SRCU implementation. smp: Bringing up secondary CPUs ... CPU0: online CPU2: online CPU3: online smp: Brought up 1 node, 4 CPUs devtmpfs: initialized random: get_random_u32 called from bucket_table_alloc+0x198/0x1d8 with crng_init=0 clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns futex hash table entries: 1024 (order: 4, 65536 bytes) NET: Registered protocol family 16 Advanced Linux Sound Architecture Driver Initialized. clocksource: Switched to clocksource riscv_clocksource NET: Registered protocol family 2 tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes) TCP established hash table entries: 8192 (order: 4, 65536 bytes) TCP bind hash table entries: 8192 (order: 5, 131072 bytes) TCP: Hash tables configured (established 8192 bind 8192) UDP hash table entries: 512 (order: 2, 16384 bytes) UDP-Lite hash table entries: 512 (order: 2, 16384 bytes) NET: Registered protocol family 1 RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. Unpacking initramfs... workingset: timestamp_bits=62 max_order=18 bucket_order=0 NFS: Registering the id_resolver key type Key type id_resolver registered Key type id_legacy registered nfs4filelayout_init: NFSv4 File Layout Driver Registering... io scheduler noop registered io scheduler cfq registered (default) io scheduler mq-deadline registered io scheduler kyber registered Console: switching to colour frame buffer device 40x30 Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled console [ttyS0] disabled f0300000.serial: ttyS0 at MMIO 0xf0300020 (irq = 20, base_baud = 1228800) is a 16550A console [ttyS0] enabled console [ttyS0] enabled bootconsole [early0] disabled bootconsole [early0] disabled loop: module loaded tun: Universal TUN/TAP device driver, 1.6 ftmac100: Loading version 0.2 ... ftmac100 e0100000.mac eth0: irq 21, mapped at (ptrval) ftmac100 e0100000.mac eth0: generated random MAC address 4e:fd:bd:f3:04:fc ftsdc010 f0e00000.mmc: mmc0 - using hw SDIO IRQ mmc0: new SDHC card at address d555 ftssp010 card registered! mmcblk0: mmc0:d555 SD04G 3.79 GiB NET: Registered protocol family 10 mmcblk0: p1 Segment Routing with IPv6 sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver NET: Registered protocol family 17 NET: Registered protocol family 15 ALSA device list: #0: ftssp_ac97 controller Freeing unused kernel memory: 13520K This architecture does not have kernel memory protection. Sysinit starting Sat Apr 6 23:33:53 CST 2019 nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering... ~ #