Difference between revisions of "Unit PlatformARM"
(23 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
---- | ---- | ||
− | '' | + | '''Ultibo Platform Interface unit for ARM''' |
=== Constants === | === Constants === | ||
---- | ---- | ||
− | '' | + | |
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM mode''' <code> ARM_MODE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Bits 4..0 in the ARM program status register | ||
+ | |- | ||
+ | |colspan="2"|See: A2.2 Processor Modes of the ARM Architecture Reference Manual and also A2.5.7 The mode bits | ||
+ | |- | ||
+ | |colspan="2"|See also: B1.3.1 ARM processor modes of the ARM Architecture Reference Manual (ARMv7-A and ARMv7-R edition) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARM_MODE_USR = $10;</code> | ||
+ | | Normal User Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_FIQ = $11;</code> | ||
+ | | FIQ Processing Fast Interrupts Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_IRQ = $12;</code> | ||
+ | | IRQ Processing Standard Interrupts Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_SVC = $13;</code> | ||
+ | | Supervisor Processing Software Interrupts Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_MON = $16;</code> | ||
+ | | Secure Monitor Mode (For Secure/Non Secure Switching) | ||
+ | |- | ||
+ | | <code>ARM_MODE_MON = $16;</code> | ||
+ | | Secure Monitor Mode (For Secure/Non Secure Switching) | ||
+ | |- | ||
+ | | <code>ARM_MODE_ABT = $17;</code> | ||
+ | | Abort Processing memory Faults Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_HYP = $1A;</code> | ||
+ | | Hypervisor Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_UND = $1B;</code> | ||
+ | | Undefined Processing Undefined Instructions Mode | ||
+ | |- | ||
+ | | <code>ARM_MODE_SYS = $1F;</code> | ||
+ | | System Running Priviledged Operating System Tasks Mode | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARM_MODE_BITS = $0000001F;</code> | ||
+ | | Mask of the mode bits in the program status register | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM interrupt disable''' <code> ARM_I_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Bits 7 and 6 in the ARM program status register | ||
+ | |- | ||
+ | |colspan="2"|See: A2.5.6 "The interrupt disable bits" of the ARM Architecture Reference Manual | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARM_I_BIT = $00000080;</code> | ||
+ | | IRQs disabled when set to 1 | ||
+ | |- | ||
+ | | <code>ARM_F_BIT = $00000040;</code> | ||
+ | | FIQs disabled when set to 1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM thumb and jazelle''' <code> ARM_*_BIT </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Bits 24 and 5 in the ARM program status register | ||
+ | |- | ||
+ | |colspan="2"|See: A2.5.8 "The T and J bits" of the ARM Architecture Reference Manual | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARM_T_BIT = $00000020;</code> | ||
+ | | Thumb mode enabled when set to 1 | ||
+ | |- | ||
+ | | <code>ARM_J_BIT = $01000000;</code> | ||
+ | | Jazelle mode enabled when set to 1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM abort''' <code> ARM_A_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Bit 8 in the ARM program status register | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARM_A_BIT = $00000100;</code> | ||
+ | | Data Abort masked when set to 1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM boot tag''' <code> ATAG_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>ATAG_NONE = $00000000;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>ATAG_CORE = $54410001;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_MEM = $54410002;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_VIDEOTEXT = $54410003;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_RAMDISK = $54410004;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_INITRD = $54410005;</code> | ||
+ | | Deprecated | ||
+ | |- | ||
+ | | <code>ATAG_INITRD2 = $54420005;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_SERIAL = $54410006;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_REVISION = $54410007;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_VIDEOLFB = $54410008;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ATAG_CMDLINE = $54410009;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ARMTAGS_INITIAL = $FFFFFFFF;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Device tree blob''' <code> DTB_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>DTB_SIGNATURE = $d00dfeed;</code> | ||
+ | | style="width: 50%;"|See: https://github.com/devicetree-org/devicetree-specification/releases/download/v0.3/devicetree-specification-v0.3.pdf | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ARM machine type''' <code> ARM_MACHINE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>ARM_MACHINE_VERSATILE_PB = $00000183;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ARM_MACHINE_BCM2708 = $00000C42;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ARM_MACHINE_BCM2709 = $00000C42;</code> | ||
+ | | BCM2709 uses the same Machine Type as BCM2708 | ||
+ | |- | ||
+ | | <code>ARM_MACHINE_BCM2710 = $00000C42;</code> | ||
+ | | BCM2710 uses the same Machine Type as BCM2708 | ||
+ | |- | ||
+ | | <code>ARM_MACHINE_BCM2711 = $00000C42;</code> | ||
+ | | BCM2711 uses the same Machine Type as BCM2708 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Type definitions === | === Type definitions === | ||
---- | ---- | ||
− | '' | + | |
+ | '''ARM boot tag header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagHeader = ^TARMTagHeader;</code> | ||
+ | |||
+ | <code>TARMTagHeader = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ARM Boot Tag Structure Definitions | ||
+ | |- | ||
+ | | <code>Size:LongWord;</code> | ||
+ | | Size of tag, in words (32bit), including the header | ||
+ | |- | ||
+ | | <code>Tag:LongWord;</code> | ||
+ | | One of the ATAG_* values from above | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag core''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagCore = ^TARMTagCore;</code> | ||
+ | |||
+ | <code>TARMTagCore = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Core parameters (ATAG_CORE) | ||
+ | |- | ||
+ | | <code>Flags:LongWord;</code> | ||
+ | | Bit 0 = read-only | ||
+ | |- | ||
+ | | <code>PageSize:LongWord;</code> | ||
+ | | Systems page size (usually 4k) | ||
+ | |- | ||
+ | | <code>RootDev:LongWord;</code> | ||
+ | | Root device number | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag memory''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagMemory = ^TARMTagMemory;</code> | ||
+ | |||
+ | <code>TARMTagMemory = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Description of memory region (ATAG_MEM) | ||
+ | |- | ||
+ | | <code>Size:LongWord;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag video text''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagVideoText = ^TARMTagVideoText;</code> | ||
+ | |||
+ | <code>TARMTagVideoText = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Description of VGA text type displays (ATAG_VIDEOTEXT) | ||
+ | |- | ||
+ | | <code>X:Byte;</code> | ||
+ | | Width of display | ||
+ | |- | ||
+ | | <code>Y:Byte;</code> | ||
+ | | Height of display | ||
+ | |- | ||
+ | | <code>Video_page:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_mode:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_cols:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_ega_bx:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_lines:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_isvga:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Video_points:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag ramdisk''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagRamdisk = ^TARMTagRamdisk;</code> | ||
+ | |||
+ | <code>TARMTagRamdisk = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Description of how the ramdisk will be used by the kernel (ATAG_RAMDISK) | ||
+ | |- | ||
+ | | <code>Flags:LongWord;</code> | ||
+ | | Bit 0 = load, Bit 1 = prompt | ||
+ | |- | ||
+ | | <code>Size:LongWord;</code> | ||
+ | | Decompressed ramdisk size in _kilo_ bytes | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | Starting block of floppy-based RAM disk image | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Tag initialize RD''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagInitRdCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM INITRD Tags found during parse (Deprecated) | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag initialize RD2''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagInitRd2Count:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM INITRD2 Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagInitRd2Start:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagInitRd2Size:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''ARM tag serial''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagSerial = ^TARMTagSerial;</code> | ||
+ | |||
+ | <code>TARMTagSerial = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Board serial number (ATAG_SERIAL) | ||
+ | |- | ||
+ | | <code>Low:LongWord;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>High:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag revision''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagRevision = ^TARMTagRevision;</code> | ||
+ | |||
+ | <code>TARMTagRevision = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Board revision (ATAG_REVISION) | ||
+ | |- | ||
+ | | <code>Revision:LongWord;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag video framebuffer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagVideoFB = ^TARMTagVideoFB;</code> | ||
+ | |||
+ | <code>TARMTagVideoFB = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Description of the parameters for a linear framebuffer type display (ATAG_VIDEOLFB) | ||
+ | |- | ||
+ | | <code>Lfb_width:Word;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>Lfb_height:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Lfb_depth:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Lfb_linelength:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Lfb_base:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Lfb_size:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Red_size:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Red_pos:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Green_size:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Green_pos:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Blue_size:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Blue_pos:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Rsvd_size:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>Rsvd_pos:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM tag command''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTagCommand = ^TARMTagCommand;</code> | ||
+ | |||
+ | <code>TARMTagCommand = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Commandline for the kernel (ATAG_CMDLINE) | ||
+ | |- | ||
+ | | <code>Cmdline:array[0..0] of AnsiChar;</code> | ||
+ | | This is the minimum size | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM boot tag''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PARMTag = ^TARMTag;</code> | ||
+ | |||
+ | <code>TARMTag = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Format of ARM Boot Tag | ||
+ | |- | ||
+ | | <code>Header:TARMTagHeader;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>case Integer of</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>0:(Core:TARMTagCore);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>1:(Memory:TARMTagMemory);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>2:(VideoText:TARMTagVideoText);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>3:(Ramdisk:TARMTagRamdisk);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>4:(InitRd2:TARMTagInitRd2);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>5:(Serial:TARMTagSerial);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>6:(Revision:TARMTagRevision);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>7:(VideoFB:TARMTagVideoFB);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>8:(Command:TARMTagCommand)</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Device tree blob header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PDTBHeader = ^TDTBHeader;</code> | ||
+ | |||
+ | <code>TDTBHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Magic:LongWord;</code> | ||
+ | | The value 0xd00dfeed (big-endian) | ||
+ | |- | ||
+ | | <code>TotalSize:LongWord;</code> | ||
+ | | The total size in bytes of the devicetree data structure (big-endian) | ||
+ | |- | ||
+ | | <code>StructureOffset:LongWord;</code> | ||
+ | | The offset in bytes of the structure block from the beginning of the header (big-endian) | ||
+ | |- | ||
+ | | <code>StringsOffset:LongWord;</code> | ||
+ | | The offset in bytes of the strings block from the beginning of the header (big-endian) | ||
+ | |- | ||
+ | | <code>ReservationOffset:LongWord;</code> | ||
+ | | The offset in bytes of the memory reservation block from the beginning of the header (big-endian) | ||
+ | |- | ||
+ | | <code>Version:LongWord;</code> | ||
+ | | The version of the devicetree data structure (big-endian) | ||
+ | |- | ||
+ | | <code>CompatibleVersion:LongWord;</code> | ||
+ | | The lowest version of the devicetree data structure with which the version used is backwards compatible (big-endian) | ||
+ | |- | ||
+ | | <code>BootCPUID:LongWord;</code> | ||
+ | | The physical ID of the system’s boot CPU (big-endian) | ||
+ | |- | ||
+ | | <code>StringsSize:LongWord;</code> | ||
+ | | The length in bytes of the strings block section of the devicetree blob (big-endian) | ||
+ | |- | ||
+ | | <code>StructureSize:LongWord;</code> | ||
+ | | The length in bytes of the structure block section of the devicetree blob (big-endian) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ARM wait''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TARMWait = procedure;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''ARM long wait''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TARMLongWait = procedure;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''ARM short wait''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TARMShortWait = procedure;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''ARM slow blink''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TARMSlowBlink = procedure;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''ARM fast blink''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TARMFastBlink = procedure;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | <br /> | ||
=== Public variables === | === Public variables === | ||
---- | ---- | ||
− | '' | + | |
+ | '''ARM specific variables''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMInitialized:Boolean;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMBootMode:LongWord = 0;</code> | ||
+ | | style="width: 40%;"|The ARM Mode that the processor was in at boot time (Set by Startup) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMBootVectors:LongWord = 0;</code> | ||
+ | | style="width: 40%;"|The Vector Base Address that was current at boot time (Set by Startup) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMTagsAddress:PtrUInt = ARMTAGS_INITIAL;</code> | ||
+ | | style="width: 40%;"|Pointer to the ARM TAGS provided by the bootloader at startup (Set by Startup) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMMachineType:LongWord = 0;</code> | ||
+ | | style="width: 40%;"|ARM Machine Type provided by the bootloader at startup (Set by Startup) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMSecureBoot:LongWord = 1;</code> | ||
+ | | style="width: 40%;"|If 1 then startup will attempt to switch back to secure world during boot process (If supported by the ARM boot stub) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMEmulatorMode:LongWord = 0;</code> | ||
+ | | style="width: 40%;"|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''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMTagsCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag none variables''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagNoneCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM NONE Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag core''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCoreCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM CORE Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCoreFlags:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCorePageSize:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCoreRootDevice:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag memory''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagMemoryCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM MEM Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagMemorySize:LongWord;</code> | ||
+ | | style="width: 40%;"|Size of the last block reported by ARM Tags | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagMemoryStart:PtrUInt;</code> | ||
+ | | style="width: 40%;"|Start of the last block reported by ARM Tags | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagMemoryLength:LongWord;</code> | ||
+ | | style="width: 40%;"|Adjusted Size of the last block reported by ARM Tags | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagMemoryAddress:PtrUInt;</code> | ||
+ | | style="width: 40%;"|Adjusted Address of the last block reported by ARM Tags | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag video text''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagVideoTextCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM VIDEOTEXT Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag ramdisk''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagRamdiskCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM RAMDISK Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag initialize RD2''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagInitRd2Count:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM INITRD2 Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag serial''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagSerialCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM SERIAL Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagSerialNoLow:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagSerialNoHigh:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag revision''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagRevisionCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM REVISION Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagRevisionNo:LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag video framebuffer''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagVideoFBCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM VIDEOLFB Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Tag command''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCmdCount:LongWord;</code> | ||
+ | | style="width: 40%;"|Number of ARM CMDLINE Tags found during parse | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCommandSize:LongWord;</code> | ||
+ | | style="width: 40%;"|Length of the command line in characters (Including null terminator) | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCommandCount:LongInt;</code> | ||
+ | | style="width: 40%;"|Count of parameters (space delimited) in the command line | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TagCommandAddress:PAnsiChar;</code> | ||
+ | | style="width: 40%;"|Pointer to the start of the command line | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Wait handlers''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMWaitHandler:TARMWait;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMLongWaitHandler:TARMLongWait;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMShortWaitHandler:TARMShortWait;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Blink handlers''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMSlowBlinkHandler:TARMSlowBlink;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>ARMFastBlinkHandler:TARMFastBlink;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | <br /> | ||
=== Function declarations === | === Function declarations === | ||
Line 34: | Line 880: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 49: | Line 895: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! '''Note''' | + | ! Note |
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ExtractCommandLine(Value:PAnsiChar):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ExtractMemoryBlock(Address,Size:LongWord):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ExtractInitialRamdisk(Address,Size:LongWord):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
| None documented | | None documented | ||
|- | |- | ||
Line 61: | Line 943: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 73: | Line 955: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 85: | Line 967: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 97: | Line 979: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 109: | Line 991: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
− | | True is enabled, False if disabled (Returned in R0) | + | | True is enabled, False if disabled (Returned in R0). |
|- | |- | ||
|} | |} | ||
Line 121: | Line 1,003: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 133: | Line 1,015: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 145: | Line 1,027: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| IRQ state when called (Returned in R0) | | IRQ state when called (Returned in R0) | ||
|- | |- | ||
Line 157: | Line 1,039: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! IRQMask |
| IRQ state to restore (Passed in R0) | | IRQ state to restore (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| IRQ state when called (Returned in R0) | | IRQ state when called (Returned in R0) | ||
|- | |- | ||
Line 172: | Line 1,054: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
− | | True is enabled, False if disabled (Returned in R0) | + | | True is enabled, False if disabled (Returned in R0). |
|- | |- | ||
|} | |} | ||
Line 184: | Line 1,066: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 196: | Line 1,078: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 208: | Line 1,090: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| FIQ state when called (Returned in R0) | | FIQ state when called (Returned in R0) | ||
|- | |- | ||
Line 220: | Line 1,102: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! FIQMask |
| FIQ state to restore (Passed in R0) | | FIQ state to restore (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| FIQ state when called (Returned in R0) | | FIQ state when called (Returned in R0) | ||
|- | |- | ||
Line 235: | Line 1,117: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 247: | Line 1,129: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 259: | Line 1,141: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| IRQ/FIQ state when called (Returned in R0) | | IRQ/FIQ state when called (Returned in R0) | ||
|- | |- | ||
Line 271: | Line 1,153: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! IRQFIQMask |
| IRQ/FIQ state to restore (Passed in R0) | | IRQ/FIQ state to restore (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| IRQ/FIQ state when called (Returned in R0) | | IRQ/FIQ state when called (Returned in R0) | ||
|- | |- | ||
Line 286: | Line 1,168: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
− | | True is enabled, False if disabled (Returned in R0) | + | | True is enabled, False if disabled (Returned in R0). |
|- | |- | ||
|} | |} | ||
Line 298: | Line 1,180: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 310: | Line 1,192: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | None documented |
|- | |- | ||
|} | |} | ||
Line 322: | Line 1,204: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| Abort state when called (Returned in R0) | | Abort state when called (Returned in R0) | ||
|- | |- | ||
Line 334: | Line 1,216: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! AbortMask |
| Abort state to restore (Passed in R0) | | Abort state to restore (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| Abort state when called (Returned in R0) | | Abort state when called (Returned in R0) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''ARM helper functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMWait; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMLongWait; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMShortWait; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMSlowBlink; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMFastBlink; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMModeToString(ARMMode:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
|- | |- | ||
|} | |} |
Latest revision as of 06:17, 6 September 2024
Return to Unit Reference
Description
Ultibo Platform Interface unit for ARM
Constants
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_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_*_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_A_*
Bit 8 in the ARM program status register | |
ARM_A_BIT = $00000100;
|
Data Abort masked when set to 1 |
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;
|
DTB_*
DTB_SIGNATURE = $d00dfeed;
|
See: https://github.com/devicetree-org/devicetree-specification/releases/download/v0.3/devicetree-specification-v0.3.pdf |
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;
|
TagInitRd2Size: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
TARMWait = procedure;
|
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
ARMInitialized:Boolean;
|
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 |
TagCoreFlags:LongWord;
|
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 |
TagSerialNoLow:LongWord;
|
TagSerialNoHigh:LongWord;
|
Tag revision
TagRevisionCount:LongWord;
|
Number of ARM REVISION Tags found during parse |
TagRevisionNo:LongWord;
|
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
ARMWaitHandler:TARMWait;
|
ARMLongWaitHandler:TARMLongWait;
|
ARMShortWaitHandler:TARMShortWait;
|
Blink handlers
ARMSlowBlinkHandler:TARMSlowBlink;
|
ARMFastBlinkHandler:TARMFastBlink;
|
Function declarations
Initialization functions
procedure ARMInit;
Note | None documented |
---|
ARM platform functions
procedure ARMParseBootTags;
Note | None documented |
---|
function ExtractCommandLine(Value:PAnsiChar):Boolean;
Note | None documented |
---|
function ExtractMemoryBlock(Address,Size:LongWord):Boolean;
Note | None documented |
---|
function ExtractInitialRamdisk(Address,Size:LongWord):Boolean;
Note | None documented |
---|
procedure ARMParseCommandLine;
Note | None documented |
---|
procedure ARMParseEnvironment;
Note | None documented |
---|
function ARMGetSP:PtrUInt; assembler; nostackframe;
Note | None documented |
---|
function ARMGetPC:PtrUInt; assembler; nostackframe;
Note | None documented |
---|
function ARMGetIRQ:Boolean; assembler; nostackframe;
Return | True is enabled, False if disabled (Returned in R0). |
---|
procedure ARMEnableIRQ; assembler; nostackframe;
Note | None documented |
---|
procedure ARMDisableIRQ; assembler; nostackframe;
Note | None documented |
---|
function ARMSaveIRQ:TIRQMask; assembler; nostackframe;
Return | IRQ state when called (Returned in R0) |
---|
function ARMRestoreIRQ(IRQMask:TIRQMask):TIRQMask; assembler; nostackframe;
IRQMask | IRQ state to restore (Passed in R0) |
---|---|
Return | IRQ state when called (Returned in R0) |
function ARMGetFIQ:Boolean; assembler; nostackframe;
Return | True is enabled, False if disabled (Returned in R0). |
---|
procedure ARMEnableFIQ; assembler; nostackframe;
Note | None documented |
---|
procedure ARMDisableFIQ; assembler; nostackframe;
Note | None documented |
---|
function ARMSaveFIQ:TFIQMask; assembler; nostackframe;
Return | FIQ state when called (Returned in R0) |
---|
function ARMRestoreFIQ(FIQMask:TFIQMask):TFIQMask; assembler; nostackframe;
FIQMask | FIQ state to restore (Passed in R0) |
---|---|
Return | FIQ state when called (Returned in R0) |
procedure ARMEnableIRQFIQ; assembler; nostackframe;
Note | None documented |
---|
procedure ARMDisableIRQFIQ; assembler; nostackframe;
Note | None documented |
---|
function ARMSaveIRQFIQ:TIRQFIQMask; assembler; nostackframe;
Return | IRQ/FIQ state when called (Returned in R0) |
---|
function ARMRestoreIRQFIQ(IRQFIQMask:TIRQFIQMask):TIRQFIQMask; assembler; nostackframe;
IRQFIQMask | IRQ/FIQ state to restore (Passed in R0) |
---|---|
Return | IRQ/FIQ state when called (Returned in R0) |
function ARMGetAbort:Boolean; assembler; nostackframe;
Return | True is enabled, False if disabled (Returned in R0). |
---|
procedure ARMEnableAbort; assembler; nostackframe;
Note | None documented |
---|
procedure ARMDisableAbort; assembler; nostackframe;
Note | None documented |
---|
function ARMSaveAbort:TAbortMask; assembler; nostackframe;
Return | Abort state when called (Returned in R0) |
---|
function ARMRestoreAbort(AbortMask:TAbortMask):TAbortMask; assembler; nostackframe;
AbortMask | Abort state to restore (Passed in R0) |
---|---|
Return | Abort state when called (Returned in R0) |
ARM helper functions
procedure ARMWait; inline;
Note | None documented |
---|
procedure ARMLongWait; inline;
Note | None documented |
---|
procedure ARMShortWait; inline;
Note | None documented |
---|
procedure ARMSlowBlink; inline;
Note | None documented |
---|
procedure ARMFastBlink; inline;
Note | None documented |
---|
function ARMModeToString(ARMMode:LongWord):String;
Note | None documented |
---|
Return to Unit Reference