Unit PlatformARM - Ultibo.org

Return to Unit Reference

Description


Ultibo Platform Interface unit for ARM

Constants


ARM mode ARM_MODE_*

Bits 4..0 in the ARM program status register
See: A2.2 Processor Modes of the ARM Architecture Reference Manual and also A2.5.7 The mode bits
See also: B1.3.1 ARM processor modes of the ARM Architecture Reference Manual (ARMv7-A and ARMv7-R edition)
 
ARM_MODE_USR = $10; Normal User Mode
ARM_MODE_FIQ = $11; FIQ Processing Fast Interrupts Mode
ARM_MODE_IRQ = $12; IRQ Processing Standard Interrupts Mode
ARM_MODE_SVC = $13; Supervisor Processing Software Interrupts Mode
ARM_MODE_MON = $16; Secure Monitor Mode (For Secure/Non Secure Switching)
ARM_MODE_MON = $16; Secure Monitor Mode (For Secure/Non Secure Switching)
ARM_MODE_ABT = $17; Abort Processing memory Faults Mode
ARM_MODE_HYP = $1A; Hypervisor Mode
ARM_MODE_UND = $1B; Undefined Processing Undefined Instructions Mode
ARM_MODE_SYS = $1F; System Running Priviledged Operating System Tasks Mode
 
ARM_MODE_BITS = $0000001F; Mask of the mode bits in the program status register

ARM interrupt disable ARM_I_*

Bits 7 and 6 in the ARM program status register
See: A2.5.6 "The interrupt disable bits" of the ARM Architecture Reference Manual
 
ARM_I_BIT = $00000080; IRQs disabled when set to 1
ARM_F_BIT = $00000040; FIQs disabled when set to 1

ARM thumb and jazelle ARM_*_BIT

Bits 24 and 5 in the ARM program status register
See: A2.5.8 "The T and J bits" of the ARM Architecture Reference Manual
 
ARM_T_BIT = $00000020; Thumb mode enabled when set to 1
ARM_J_BIT = $01000000; Jazelle mode enabled when set to 1

ARM abort ARM_A_*

Bit 8 in the ARM program status register
 
ARM_A_BIT = $00000100; Data Abort masked when set to 1

ARM boot tag ATAG_*

ATAG_NONE = $00000000;  
ATAG_CORE = $54410001;  
ATAG_MEM = $54410002;  
ATAG_VIDEOTEXT = $54410003;  
ATAG_RAMDISK = $54410004;  
ATAG_INITRD = $54410005; Deprecated
ATAG_INITRD2 = $54420005;  
ATAG_SERIAL = $54410006;  
ATAG_REVISION = $54410007;  
ATAG_VIDEOLFB = $54410008;  
ATAG_CMDLINE = $54410009;  
 
ARMTAGS_INITIAL = $FFFFFFFF;  

ARM machine type ARM_MACHINE_*

ARM_MACHINE_VERSATILE_PB = $00000183;  
ARM_MACHINE_BCM2708 = $00000C42;  
ARM_MACHINE_BCM2709 = $00000C42; BCM2709 uses the same Machine Type as BCM2708
ARM_MACHINE_BCM2710 = $00000C42; BCM2710 uses the same Machine Type as BCM2708
ARM_MACHINE_BCM2711 = $00000C42; BCM2711 uses the same Machine Type as BCM2708

Type definitions



ARM boot tag header

PARMTagHeader = ^TARMTagHeader;

TARMTagHeader = record

Note: ARM Boot Tag Structure Definitions
Size:LongWord; Size of tag, in words (32bit), including the header
Tag:LongWord; One of the ATAG_* values from above

ARM tag core

PARMTagCore = ^TARMTagCore;

TARMTagCore = record

Note: Core parameters (ATAG_CORE)
Flags:LongWord; Bit 0 = read-only
PageSize:LongWord; Systems page size (usually 4k)
RootDev:LongWord; Root device number

ARM tag memory

PARMTagMemory = ^TARMTagMemory;

TARMTagMemory = record

Note: Description of memory region (ATAG_MEM)
Size:LongWord;  
Start:LongWord;  

ARM tag video text

PARMTagVideoText = ^TARMTagVideoText;

TARMTagVideoText = record

Note: Description of VGA text type displays (ATAG_VIDEOTEXT)
X:Byte; Width of display
Y:Byte; Height of display
Video_page:Word;  
Video_mode:Byte;  
Video_cols:Byte;  
Video_ega_bx:Word;  
Video_lines:Byte;  
Video_isvga:Byte;  
Video_points:Word;  

ARM tag ramdisk

PARMTagRamdisk = ^TARMTagRamdisk;

TARMTagRamdisk = record

Note: Description of how the ramdisk will be used by the kernel (ATAG_RAMDISK)
Flags:LongWord; Bit 0 = load, Bit 1 = prompt
Size:LongWord; Decompressed ramdisk size in _kilo_ bytes
Start:LongWord; Starting block of floppy-based RAM disk image

Tag initialize RD

TagInitRdCount:LongWord; Number of ARM INITRD Tags found during parse (Deprecated)

Tag initialize RD2

TagInitRd2Count:LongWord; Number of ARM INITRD2 Tags found during parse
TagInitRd2Start:LongWord;

ARM tag serial

PARMTagSerial = ^TARMTagSerial;

TARMTagSerial = record

Note: Board serial number (ATAG_SERIAL)
Low:LongWord;  
High:LongWord;  

ARM tag revision

PARMTagRevision = ^TARMTagRevision;

TARMTagRevision = record

Note: Board revision (ATAG_REVISION)
Revision:LongWord;  

ARM tag video framebuffer

PARMTagVideoFB = ^TARMTagVideoFB;

TARMTagVideoFB = record

Note: Description of the parameters for a linear framebuffer type display (ATAG_VIDEOLFB)
Lfb_width:Word;  
Lfb_height:Word;  
Lfb_depth:Word;  
Lfb_linelength:Word;  
Lfb_base:LongWord;  
Lfb_size:LongWord;  
Red_size:Byte;  
Red_pos:Byte;  
Green_size:Byte;  
Green_pos:Byte;  
Blue_size:Byte;  
Blue_pos:Byte;  
Rsvd_size:Byte;  
Rsvd_pos:Byte;  

ARM tag command

PARMTagCommand = ^TARMTagCommand;

TARMTagCommand = record

Note: Commandline for the kernel (ATAG_CMDLINE)
Cmdline:array[0..0] of AnsiChar; This is the minimum size

ARM boot tag

PARMTag = ^TARMTag;

TARMTag = record

Note: Format of ARM Boot Tag
Header:TARMTagHeader;  
case Integer of  
0:(Core:TARMTagCore);  
1:(Memory:TARMTagMemory);  
2:(VideoText:TARMTagVideoText);  
3:(Ramdisk:TARMTagRamdisk);  
4:(InitRd2:TARMTagInitRd2);  
5:(Serial:TARMTagSerial);  
6:(Revision:TARMTagRevision);  
7:(VideoFB:TARMTagVideoFB);  
8:(Command:TARMTagCommand)  

Device tree blob header

PDTBHeader = ^TDTBHeader;

TDTBHeader = packed record

Magic:LongWord; The value 0xd00dfeed (big-endian)
TotalSize:LongWord; The total size in bytes of the devicetree data structure (big-endian)
StructureOffset:LongWord; The offset in bytes of the structure block from the beginning of the header (big-endian)
StringsOffset:LongWord; The offset in bytes of the strings block from the beginning of the header (big-endian)
ReservationOffset:LongWord; The offset in bytes of the memory reservation block from the beginning of the header (big-endian)
Version:LongWord; The version of the devicetree data structure (big-endian)
CompatibleVersion:LongWord; The lowest version of the devicetree data structure with which the version used is backwards compatible (big-endian)
BootCPUID:LongWord; The physical ID of the system’s boot CPU (big-endian)
StringsSize:LongWord; The length in bytes of the strings block section of the devicetree blob (big-endian)
StructureSize:LongWord; The length in bytes of the structure block section of the devicetree blob (big-endian)

ARM wait

ARM long wait

TARMLongWait = procedure;

ARM short wait

TARMShortWait = procedure;

ARM slow blink

TARMSlowBlink = procedure;

ARM fast blink

TARMFastBlink = procedure;

Public variables



ARM specific variables

ARMBootMode:LongWord = 0; The ARM Mode that the processor was in at boot time (Set by Startup)
ARMBootVectors:LongWord = 0; The Vector Base Address that was current at boot time (Set by Startup)
ARMTagsAddress:PtrUInt = ARMTAGS_INITIAL; Pointer to the ARM TAGS provided by the bootloader at startup (Set by Startup)
ARMMachineType:LongWord = 0; ARM Machine Type provided by the bootloader at startup (Set by Startup)
ARMSecureBoot:LongWord = 1; If 1 then startup will attempt to switch back to secure world during boot process (If supported by the ARM boot stub)
ARMEmulatorMode:LongWord = 0; If 1 then startup detected that the machine is running in an emulator (If applicable)

Note: These variables must be initialized to remain in .data or else they are rewritten to zero with .bss

ARM tags

ARMTagsCount:LongWord; Number of ARM Tags found during parse

Tag none variables

TagNoneCount:LongWord; Number of ARM NONE Tags found during parse

Tag core

TagCoreCount:LongWord; Number of ARM CORE Tags found during parse
TagCorePageSize:LongWord;
TagCoreRootDevice:LongWord;

Tag memory

TagMemoryCount:LongWord; Number of ARM MEM Tags found during parse
TagMemorySize:LongWord; Size of the last block reported by ARM Tags
TagMemoryStart:PtrUInt; Start of the last block reported by ARM Tags
TagMemoryLength:LongWord; Adjusted Size of the last block reported by ARM Tags
TagMemoryAddress:PtrUInt; Adjusted Address of the last block reported by ARM Tags

Tag video text

TagVideoTextCount:LongWord; Number of ARM VIDEOTEXT Tags found during parse

Tag ramdisk

TagRamdiskCount:LongWord; Number of ARM RAMDISK Tags found during parse

Tag initialize RD2

TagInitRd2Count:LongWord; Number of ARM INITRD2 Tags found during parse

Tag serial

TagSerialCount:LongWord; Number of ARM SERIAL Tags found during parse
TagSerialNoHigh:LongWord;

Tag revision

TagRevisionCount:LongWord; Number of ARM REVISION Tags found during parse

Tag video framebuffer

TagVideoFBCount:LongWord; Number of ARM VIDEOLFB Tags found during parse

Tag command

TagCmdCount:LongWord; Number of ARM CMDLINE Tags found during parse
TagCommandSize:LongWord; Length of the command line in characters (Including null terminator)
TagCommandCount:LongInt; Count of parameters (space delimited) in the command line
TagCommandAddress:PAnsiChar; Pointer to the start of the command line

Wait handlers

ARMLongWaitHandler:TARMLongWait;
ARMShortWaitHandler:TARMShortWait;

Blink handlers

ARMSlowBlinkHandler:TARMSlowBlink;
ARMFastBlinkHandler:TARMFastBlink;

Function declarations



Initialization functions

procedure ARMInit;

Description: To be documented

ARM platform functions

procedure ARMParseBootTags;

Description: Extract some information from the ARM boot tag list and use it to load the memory manager, some other information is stored in variables for future use

function ExtractCommandLine(Value:PAnsiChar):Boolean;

Description: To be documented

function ExtractMemoryBlock(Address,Size:LongWord):Boolean;

Description: To be documented

function ExtractInitialRamdisk(Address,Size:LongWord):Boolean;

Description: To be documented

procedure ARMParseCommandLine;

Description: Setup argc, argv and cmdline and process known command line options

procedure ARMParseEnvironment;

Description: Setup envp and process known environment options

function ARMGetSP:PtrUInt; assembler; nostackframe;

Description: Get the current stack pointer (SP)

function ARMGetPC:PtrUInt; assembler; nostackframe;

Description: Get the current program counter (PC)

function ARMGetIRQ:Boolean; assembler; nostackframe;

Description: Get Interrupts (IRQ) state

Return True is enabled, False if disabled (Returned in R0).
procedure ARMEnableIRQ; assembler; nostackframe;

Description: Enable Interrupts (IRQ) unconditionally

procedure ARMDisableIRQ; assembler; nostackframe;

Description: Disable Interrupts (IRQ) unconditionally

function ARMSaveIRQ:TIRQMask; assembler; nostackframe;

Description: Disable Interrupts (IRQ) and return the previous state

Return IRQ state when called (Returned in R0)
function ARMRestoreIRQ(IRQMask:TIRQMask):TIRQMask; assembler; nostackframe;

Description: Restore Interrupts (IRQ) to a previous state

IRQMask IRQ state to restore (Passed in R0)
Return IRQ state when called (Returned in R0)
function ARMGetFIQ:Boolean; assembler; nostackframe;

Description: Get Fast Interrupts (FIQ) state

Return True is enabled, False if disabled (Returned in R0).
procedure ARMEnableFIQ; assembler; nostackframe;

Description: Enable Fast Interrupts (FIQ) unconditionally

procedure ARMDisableFIQ; assembler; nostackframe;

Description: Disable Fast Interrupts (FIQ) unconditionally

function ARMSaveFIQ:TFIQMask; assembler; nostackframe;

Description: Disable Fast Interrupts (FIQ) and return the previous state

Return FIQ state when called (Returned in R0)
function ARMRestoreFIQ(FIQMask:TFIQMask):TFIQMask; assembler; nostackframe;

Description: Restore Fast Interrupts (FIQ) to a previous state

FIQMask FIQ state to restore (Passed in R0)
Return FIQ state when called (Returned in R0)
procedure ARMEnableIRQFIQ; assembler; nostackframe;

Description: Enable Interrupts and Fast Interrupts (IRQ/FIQ) unconditionally

procedure ARMDisableIRQFIQ; assembler; nostackframe;

Description: Disable Interrupts and Fast Interrupts (IRQ/FIQ) unconditionally

function ARMSaveIRQFIQ:TIRQFIQMask; assembler; nostackframe;

Description: Disable Interrupts and Fast Interrupts (IRQ/FIQ) and return the previous state

Return IRQ/FIQ state when called (Returned in R0)
function ARMRestoreIRQFIQ(IRQFIQMask:TIRQFIQMask):TIRQFIQMask; assembler; nostackframe;

Description: Restore Interrupts and Fast Interrupts (IRQ/FIQ) to a previous state

IRQFIQMask IRQ/FIQ state to restore (Passed in R0)
Return IRQ/FIQ state when called (Returned in R0)
function ARMGetAbort:Boolean; assembler; nostackframe;

Description: Get Abort state

Return True is enabled, False if disabled (Returned in R0).
procedure ARMEnableAbort; assembler; nostackframe;

Description: Enable Aborts unconditionally

procedure ARMDisableAbort; assembler; nostackframe;

Description: Disable Aborts unconditionally

function ARMSaveAbort:TAbortMask; assembler; nostackframe;

Description: Disable Aborts and return the previous state

Return Abort state when called (Returned in R0)
function ARMRestoreAbort(AbortMask:TAbortMask):TAbortMask; assembler; nostackframe;

Description: Restore Aborts to a previous state

AbortMask Abort state to restore (Passed in R0)
Return Abort state when called (Returned in R0)

ARM helper functions

procedure ARMWait; inline;

Description: To be documented

procedure ARMLongWait; inline;

Description: To be documented

procedure ARMShortWait; inline;

Description: To be documented

procedure ARMSlowBlink; inline;

Description: To be documented

procedure ARMFastBlink; inline;

Description: To be documented

function ARMModeToString(ARMMode:LongWord):String;

Description: To be documented

Return to Unit Reference