= LEON3/4 = {{{ #!comment Infobox BSP |BSP_name = LEON3 |Manufacturer = Aeroflex Inc. |image = Leon3CPU.jpg |caption = |Board_URL = http://www.hitechglobal.com/ipcores/leon3.htm |Architecture = SPARC V8 |CPU_model = LEON3/4 |Monitor = |Simulator = TSIM, Modelsim, Ncsim and GHDL |Aliases = erc32 |RAM = Varies |NVMEM = Varies |Serial = Varies |Video = |Other = Also features a built-in disassembler for debug purposes. }}} This BSP is for the [http://gaisler.com/index.php/products/processors LEON3/4 SPARC V8 processor] developed by [http://www.gaisler.com Cobham Gaisler]. LEON3/4 is available as a synthesizable VHDL model, allowing custom implementations on FPGA and/or ASIC. The LEON3/4 BSP probes AMBA Plug&Play information for basic peripherals such as interrupt controller, timer, and UART. Probing the Plug&Play makes it possible for the BSP to supports many LEON3/4 based controllers and boards. The BSP supports both SMP and AMP configurations. The basic peripherals supported: * IRQMP, IRQAMP * GPTIMER * APBUART The BSP supports three network interfaces: the [http://gaisler.com/index.php/products/ipcores/ethernet/grethgbit GRETH 10/100/1000], the [http://www.google.se/url?sa=t&ct=res&cd=1&url=http%3A//www.opencores.org/projects/ethmac/&ei=DPonQ6y_NceciALjsMC_Bw Opencores Ethernet MAC] and the [http://www.google.se/url?sa=t&ct=res&cd=1&url=http%3A//www.smsc.com/main/catalog/lan91c111.html&ei=2PknQ5KaE4miiAKA7-HKBw LAN91C111] i/f. * Ethernet (GRETH 10/100/1000) * PCI, GRPCI * CAN, GRCAN * CAN, OC_CAN (Opencores CAN GRLIB wrapper) * 1553, 1553BRM * !SpaceWire, GRSPW * PCI drivers to RASTA, Companion Chip = System Console = The LEON3/4 BSP has support for the RTEMS console interface and the debug UART interface (`printk`). The first UART found is by default selected as debug and system console. However, it is possible to override the default settings by declaring an integer named `debug_uart_index` and/or `syscon_uart_index`. Setting the variable to N will select the Nth UART for either debug UART or system console. Note that on a AMP system (RTEMS MP) the default is to use `APBUART[0]` for CPU0, `APBUART[1]` for CPU1 and so on. `/dev/console_a` is by default renamed `/dev/console` and assigned minor=0, but the user can select `/dev/console_['a'+N]` to be renamed to `/dev/console` by setting `syscon_uart_index=N`. See table below. ||= MINOR =||= DEVICE FILE SYSTEM NAME =||= UART =|| ||0 ||/dev/console ||Default `APBUART[0]`, user selectable through `syscon_uart_index` || ||1 ||/dev/console_a ||`APBUART[0]` (missing by default)|| ||2 ||/dev/console_b ||`APBUART[1]` || ||... || || || On a MP system the console renamed to `/dev/console` is selected by CPU index (`LEON3_Cpu_Index`). `/dev/console_['a' + LEON3_Cpu_Index]` is renamed unless overridden. Resource sharing is performed by the user, one should not open/access a console that another OS instance uses. The console driver can operate in polling mode or interrupt mode. Which mode is used is selected at compile time using the `CONSOLE_USE_INTERRUPT` configuration option. All UARTs operate in the same mode. = SMP Support = The interrupt controller, timer, and UART drivers are all SMP safe. For other drivers one need to ensure that all communication with the driver is done on the same CPU that handles interrupts for the driver. Any driver helper task need to have its affinity set to the same CPU. For the network driver tasks this can be done by setting the default network task CPU affinity in the `rtems_bsdnet_config` struct. == Static Interrupt Affinity == CPU affinity can be assigned to individual interrupts. By default interrupts are processed by the boot CPU, but this can be changed by defining the weakly linked table `const unsigned char LEON3_irq_to_cpu[32]` in the user program. This makes it possible to specify which CPU a specific interrupt should be routed to. The array index is the interrupt to be rerouted and the `array[INTERRUPT]` content is the CPU number relative to the boot CPU index that will be servicing the interrupts from the IRQ source. == Selecting IRQ for Inter-processor Interrupts == Inter-processor interrupts are used in the communication between CPUs. By default IRQ 14 is used, but on some systems this can conflict with an IP core using the same IRQ. Defining the weakly linked variable `const unsigned char LEON3_mp_irq` in the user program makes it possible to decide which IRQ should be used instead, allowing the conflict to be avoided. The GR712 uses IRQ 14 for the GRETH Ethernet controller and needs the inter-processor IRQ to be changed for the network driver to work properly. = GRMON = [http://www.gaisler.com/index.php/products/debug-tools/grmon2 GRMON] is a general debug monitor for the LEON processor. It is used to download, execute, and debug applications for LEON-based systems. This section gives a quick overview of some basic operations. For more information, see the [http://www.gaisler.com/doc/grmon2.pdf GRMON manual]. == Loading an RTEMS Application == Start GRMON with the flag corresponding to debug link you want to use (for example `-usb`). To tunnel console output (see below), use the `-u` flag. {{{ GRMON2 LEON debug monitor Copyright (C) Aeroflex Gaisler - All rights reserved. For latest updates, go to http://www.gaisler.com/ Comments or bug-reports to support@gaisler.com Parsing -usb Parsing -u Device ID: 0x281 GRLIB build version: 4114 Detected system: NGMP FP Detected frequency: 150 MHz Component Vendor JTAG Debug Link Aeroflex Gaisler GRSPW2 SpaceWire Serial Link Aeroflex Gaisler EDCL master interface Aeroflex Gaisler EDCL master interface Aeroflex Gaisler USB Debug Communication Link Aeroflex Gaisler LEON4 SPARC V8 Processor Aeroflex Gaisler LEON4 SPARC V8 Processor Aeroflex Gaisler LEON4 SPARC V8 Processor Aeroflex Gaisler LEON4 SPARC V8 Processor Aeroflex Gaisler ... General Purpose Register Bank Aeroflex Gaisler Use command 'info sys' to print a detailed report of attached cores grmon2> }}} The application can then be loaded onto the LEON system by using the `load` command. {{{ grmon2> load testsuites/smptests/smp01/smp01.exe 00000000 .text 132.8kB / 132.8kB [===============>] 100% 00021320 .data 1.5kB / 1.5kB [===============>] 100% Total size: 134.25kB (24.99Mbit/s) Entry point 0x0 Image testsuites/smptests/smp01/smp01.exe loaded }}} Execute the application with the `run` command. {{{ grmon2> run *** BEGIN OF TEST SMP 1 *** CPU 3 start task TA0 CPU 2 running Task TA0 CPU 3 start task TA1 CPU 1 running Task TA1 CPU 3 start task TA2 CPU 0 running Task TA2 *** END OF TEST SMP 1 *** CPU 0: Power down mode CPU 1: Power down mode CPU 2: Power down mode CPU 3: Program exited normally. grmon2> }}} Information about available RTEMS tasks can be listed using the `thread info` command. {{{ grmon2> thread info NAME TYPE ID CPU PRIO TIME (h:m:s) ENTRY POINT PC STATE IDLE internal 0x09010001 - 255 0:0:0.000000000 pwdloop 0x0000197c READY IDLE internal 0x09010002 - 255 0:0:0.000000000 pwdloop 0x0000197c READY IDLE internal 0x09010003 - 255 0:0:0.000000000 pwdloop 0x0000197c READY IDLE internal 0x09010004 - 255 0:0:0.000000000 pwdloop 0x0000197c READY UI1 classic 0x0a010001 3 1 0:0:0.000000000 Init 0x00002ca0 READY TA0 classic 0x0a010002 2 1 0:0:0.000000000 Test_task 0x0000197c READY TA1 classic 0x0a010003 1 1 0:0:0.000000000 Test_task 0x0000197c READY * TA2 classic 0x0a010004 0 1 0:0:0.000000000 Test_task 0x0000197c READY grmon2> }}} == Connecting GDB to GRMON == GRMON can act as a remote target for GDB. To enable the GDB support, start GRMON with the `-gdb` flag or use the `gdb start` command inside GRMON. {{{ grmon2> gdb start Started GDB service on port 2222. }}} Connect to the GDB service of GRMON by entering the following commands in GDB: {{{ (gdb) target extended-remote :2222 (gdb) symbol-file testsuites/smptests/smp01/smp01.exe (gdb) set remote exec-file testsuites/smptests/smp01/smp01.exe }}} GRMON commands can be entered in GDB by prepending them with `monitor`. For example: {{{ (gdb) monitor info reg greth0 GR Ethernet MAC 0xff940000 Control register 0x9e000000 0xff940004 Status register 0x00000000 0xff940008 MAC address MSB 0x00006010 0xff94000c MAC address LSB 0x00000081 0xff940010 MDIO register 0x7949084a 0xff940014 Tx descriptor register 0x4de06000 0xff940018 Rx descriptor register 0x00000000 0xff94001c EDCL IP register 0xc0a8001f }}} == Console forwarding to GRMON == Starting GRMON with the `-u` flag will set one UART in "debug-mode" or loop-back (older hardware) mode. UART output/input is then tunneled over the debug-link to the PC, instead of at the physical UART connector of the PCB, and presented in GRMON. Note that it is not possible to use the interrupt mode of the driver together with the "old" APBUART and `-u` to GRMON. However the new APBUART core (from GRLIB 1.0.17-b2710) has the GRMON debug bit and can handle interrupts. Please see the [http://www.gaisler.com/doc/grmon2.pdf GRMON manual]. = Boards = * [http://gaisler.com/index.php/products/boards LEON3/4 Development boards] from Cobham Gaisler * [http://www.pender.ch/products_ax2000.shtml GR-CPCI-AX2000 Compact PCI board] from Pender Electronic Design * [http://www.pender.ch/products.shtml LEON3 Development boards] from Pender Electronic Design = Emulators = * [https://lists.rtems.org/pipermail/users/2014-October/028257.html patched Qemu] is able to run LEON3 BSP. If you build Qemu with RSB it should just work. Use `qemu-system-sparc -no-reboot -nographic -M leon3_generic -m 64M -kernel app.exe` * [https://www.mail-archive.com/devel%40rtems.org/msg01946.html RTEMS Tools GDB] is also able to run LEON2/3 BSP The startup procedure for LEON BSPs is explained in [wiki:TBR/UserManual/SparcBSPStartup SparcBSPStartup]. = Test Reports = 4.6.4: Jiri reports that it runs fine on the [http://www.gaisler.com/products/tsim/tsim.html TSIM] simulator, and boards from Pender 4.6.99.2: Jiri reports that it runs fine on the [http://www.gaisler.com/products/tsim/tsim.html ] simulator, and on boards from Pender 4.6.99.3: runs on GR-XC3S-1500 board - tested with networking (greth) 4.7.99.2: Daniel Sep 5 2007, Tested GRETH 10/100, B1553BRM(on RASTA over PCI, on Companion Chip over PCI, direct), GRCAN(on RASTA over PCI), OC_CAN(on Companion Chip over PCI, direct) 4.10.99.0: Tested on GR712RC and GR-CPCI-LEON4-N2X