GitLab has been upgraded to 13.7.4 If you encounter any issues mail

Commit 0125023e authored by Ben Avison's avatar Ben Avison

Support for Raspberry Pi / BCM2835

  Falls into two main areas: graphics support and ARM11 core support.
  A work in progress - in many cases the code changes need to be replaced
  with an alternative mechanism which will permit the kernel to still function
  on other platforms. Adrian marked these with "!!!" comments - I have added
  ! directives as well so that they don't get forgotten about.
  Changes received from Adrian Lees. This revision represents the code largely
  as delivered, and is placed on its own branch (forked off from the version
  from which he worked). It is intended for reference. It doesn't build against
  current headers - this is likely to require a merge with the other changes
  to the kernel since that time.

Version 5.35, Tagged as 'Kernel-5_35-4_79_2_98_2_52_2_1'
parent af172483
Things remaining to be tidied:
- The starting in a non-numbered video mode; in s.vdu. Code deliberately
bodged (and flagged with !!!) to force starting in 1920x1080x32bpp.
I guess any HAL_VideoFeatures call that returns inability to handle a
<= 8bpp mode might be a way to activate it? Then I guess the HAL needs to
suggest a suitable default resolution.
Alternatively, with later start.elf images perhaps we will be able to run
in lower resolutions when booting.
- There's code surrounding ARM_Analyse and particularly EvaluateCache
where it didn't determine the correct cachetype and cachelinelen
for this ARM. I've not tidied this properly yet; it should be obvious
what's required.
ARM ID reg &410FB767
MRC 15,1,R0,C0,C0,1
cache info = &1D152152
ARMv6 format...ok
I'm not sure who's best-placed to sort this cleanly; my knowledge of
ARMs from that era is not extensive...I'd have to study the ARM ARM
to ascertain the 'correct' way to determine cache properties.
- The code in vdudriver that reads the framestore properties requires
a GraphicsV claimant if an external framestore is required. I can
knock up a simple asm module to do this, or we can switch to an
internal framestore if that can be made to work. I like the latter
idea because it gives us 'hardware scrolling' and possibly the
screen cacheing (SA), both of which would benefit us with the
currently unaccelerated display.
- the centisecond timer interrupt currently needs to
be a 'pretend Vsync' handler too at the moment. I'm unsure how you'd
like to go about having this workaround used for R-Pi only
......@@ -13,11 +13,11 @@
GBLS Module_ComponentPath
Module_MajorVersion SETS "5.35"
Module_Version SETA 535
Module_MinorVersion SETS ""
Module_Date SETS "15 Sep 2011"
Module_ApplicationDate SETS "15-Sep-11"
Module_MinorVersion SETS ""
Module_Date SETS "10 May 2012"
Module_ApplicationDate SETS "10-May-12"
Module_ComponentName SETS "Kernel"
Module_ComponentPath SETS "castle/RiscOS/Sources/Kernel"
Module_FullVersion SETS "5.35 ("
Module_HelpVersion SETS "5.35 (15 Sep 2011)"
Module_FullVersion SETS "5.35 ("
Module_HelpVersion SETS "5.35 (10 May 2012)"
......@@ -5,19 +5,19 @@
#define Module_MajorVersion_CMHG 5.35
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 15 Sep 2011
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 10 May 2012
#define Module_MajorVersion "5.35"
#define Module_Version 535
#define Module_MinorVersion ""
#define Module_Date "15 Sep 2011"
#define Module_MinorVersion ""
#define Module_Date "10 May 2012"
#define Module_ApplicationDate "15-Sep-11"
#define Module_ApplicationDate "10-May-12"
#define Module_ComponentName "Kernel"
#define Module_ComponentPath "castle/RiscOS/Sources/Kernel"
#define Module_FullVersion "5.35 ("
#define Module_HelpVersion "5.35 (15 Sep 2011)"
#define Module_FullVersion "5.35 ("
#define Module_HelpVersion "5.35 (10 May 2012)"
#define Module_LibraryVersionInfo "5:35"
......@@ -302,13 +302,13 @@ RMTidyDoesNowt SETL {TRUE} ; should really be "machine has
RogerEXEY SETL {FALSE} ; Marketing don't like it!
GBLL DebugROMPostInit ; Displays when the PostInit service call is sent to each ROM module (currently works on vanilla service call handling only)
DebugROMPostInit SETL (:LNOT: ChocolateService) :LAND: {FALSE}
GBLL DebugROMErrors
DebugROMErrors SETL {TRUE}
GBLL DebugTerminal ; default WRCH and RDCH through HAL
DebugTerminal SETL {FALSE}
......@@ -221,6 +221,12 @@ FindARMloop
; others ...
! 0, "FIXME: temporary code"
MOV ip,#&C0
STR a1,[ip,#&40]
STMIA ip,{a1-ip}
B WeirdARMPanic ; stiff :)
......@@ -566,6 +572,10 @@ Analyse_WB_CR7_Lx
CMP a3, #14 ; Stop after level 7 (even though an 8th level might exist on some CPUs?)
ADD a2, a2, #4
! 0, "FIXME: temporary code"
MOV a4,#32
MOV v2,#32
STRB a4, [v6, #ICache_LineLen] ; Store log2(line size)-2
STRB v2, [v6, #DCache_LineLen] ; log2(line size)-2
......@@ -839,6 +849,12 @@ ARM_Analyse_Fancy
MOV a1, v2, LSR #CT_Dsize_pos
ADD a2, v6, #DCache_Info
BL EvaluateCache
;EvaluateCache isn't doing our job for us....assuming these flags are true! ;)
! 0, "FIXME: temporary code"
ORR v5, v5, #CPUFlag_SynchroniseCodeAreas+CPUFlag_SplitCache
B %FT27
......@@ -832,6 +832,12 @@ MMUon_nol1ptoverlap
MOV v3, #0 ; "MMU is on" signal
BL ARM_Analyse
! 0, "FIXME: temporary code"
MOV a1,#0
MOV a2,#32
STRB a2,[a1,#DCache_LineLen]
STRB a2,[a1,#ICache_LineLen]
ChangedProcVecs a1
......@@ -42,9 +42,13 @@
DebugTX $str
[ DebugHALTX
! 0, "FIXME: temporary code"
STR lr,[sp,#-4]!
BL DebugHALPrint
= "$str", 0
LDR lr,[sp],#4
......@@ -1455,6 +1455,17 @@ TickOne ROUT
STRB R0, [R3, #IOCIRQCLRA] ; clear timer 0 interrupt
! 0, "FIXME: temporary code"
STMFD sp!,{r0-r12}
ADR r0,ret_from_vs
Push r0
B VsyncIRQ_ExtEntry
LDMFD sp!,{r0-r12}
LDR R1, =ZeroPage
LDR R0, [R1, #MetroGnome]
ADD R0, R0, #1
......@@ -1562,6 +1562,7 @@ WallopDuffOnes
MOV r1, #AP_UndStackSoftCam
BL AddCamEntries
DebugTX "InitDynamicAreas"
; let's boogie with the CMOS for a bit
; read info and move as much memory as we can
......@@ -1709,6 +1710,7 @@ WallopDuffOnes
STR R1, [R0, #AplWorkSize]
STR R1, [R0, #MemLimit]
DebugTX "InitVectors"
BL InitVectors ; ready for OsByte to read mode
LDR R1, =ZeroPage+ModuleSWI_HashTab
......@@ -1773,6 +1775,7 @@ ResetPart1Done ; R0 is reset type
Push "R0, R1" ; save until after MOSInit
DebugTX "InitIRQ1"
BL InitialiseIRQ1Vtable
LDR R3, =ZeroPage
......@@ -1823,6 +1826,7 @@ ResetPart1Done ; R0 is reset type
MOV R4, #0
STMIA R2!, {R3,R4}
STMIA R2!, {R3,R4}
DebugTX "IMB_Full"
;we need to do an IMB type thing for modifying code in vector area,
;and for copying irq handler code
......@@ -1911,7 +1915,8 @@ ResetPart1Done ; R0 is reset type
STR R0, [R1, #DeviceTable]
CallHAL HAL_InitDevices ; get HAL to register any devices it has
BL LookForHALRTC ; Check if an RTC was just added. This is currently the only place where HAL RTCs are checked for; if we wanted to check anywhere else (e.g. after ROM module initialisation) then we'd have to listen for Service_Hardware so we can cope with device removal
! 0, "FIXME: we're going to need this back at some point"
; BL LookForHALRTC ; Check if an RTC was just added. This is currently the only place where HAL RTCs are checked for; if we wanted to check anywhere else (e.g. after ROM module initialisation) then we'd have to listen for Service_Hardware so we can cope with device removal
BL L1L2PTenhancements ; little tricks on cacheability etc for performance
......@@ -1090,6 +1090,23 @@ RedirectBadExit ; got an error from BGET
; in: R1 = input buffer id (0 => keyboard, 1 => RS423)
STMFD sp!,{R1-R12,R14}
MOV a1, #0
AddressHAL a1
SUB sp,sp,#4
MOV a2,sp
CallHAL HAL_UARTReceiveByte
LDR a2,[sp],#4
TST a2,#1
LDMFD sp!,{R1-R12,PC}
LDMFD sp!,{R1-R12,PC}
Push R14
; insert check here for ECONET interception of RDCH
......@@ -100,6 +100,12 @@ PreWrchCursor
; state in top bit
STR R0, [WsPtr, #CursorStack]
MOV R2,R14
LDR R14, [WsPtr, #HALVideoFeatures]
TST R14, #2
BLEQ RemovePointer
MOV R14,R2
[ No26bitCode
MSR CPSR_c, R3 ; restore old I bit
MOVCS PC, R14 ; already off, so exit
......@@ -271,7 +277,21 @@ Cursor32loop
; out: R6 = new CursorFlags, R5,R7 preserved, all others undefined
PostWrchCursor ROUT
MOV R6,R14
LDR R14,[WsPtr, #HALVideoFeatures]
TST R14,#2
ORR R3,R4,#I32_bit
BL RestorePointer
MOV R14,R6
LDR R6, [WsPtr, #CursorFlags]
LDR R0, [WsPtr, #CursorStack]
MOVS R0, R0, LSL #1
......@@ -362,7 +362,12 @@ InitialiseMode Entry
MOV r0, #1 ; no need to check for soft reset,
SWI XOS_ReadSysInfo ; always use configured value
MOV r1, r0
! 0, "FIXME: temporary code"
ADR r1,mode_defn
; MOV r1, r0
MOV r0, #ScreenModeReason_SelectMode
SWI XOS_ScreenMode
......@@ -374,6 +379,14 @@ InitialiseMode Entry
SWIVC XOS_WriteI+0 ; and if we can't get mode 0, we're really fooked!!!
! 0, "FIXME: temporary code"
mode_defn DCD 1
DCD 1920
DCD 1080
DCD -1
DCD -1
......@@ -729,6 +742,10 @@ VduBadExit ; jumped to if an error in VDU code
ModeChangeSub ROUT
Push lr
! 0, "FIXME: temporary code"
; !!!
ADRL R2,mode_defn
;If its a common mode number (0..49) consider a possible mode number
;substitution, if hardware does not support given bits per pixel.
;We are vaguely assuming h/w supports at least 8 bpp, otherwise we may
......@@ -794,6 +811,7 @@ mchsub_3
TEQ R0, R1 ; if substitute mode
MOVNE R2, #0 ; then don't use shadow
DebugTX "FindOKMode reached"
CMP r1, #&100
BICCC r10, r1, #&80
......@@ -801,6 +819,7 @@ mchsub_3
MOV R11, R10
BL PushModeInfo
BVS %FT07 ; [probably duff mode selector]
DebugTX "PushModeInfo done"
LDR R11, [R13, #wkScreenSize] ; get screen size for this mode
LDR R9, [WsPtr, #TotalScreenSize] ; maximum allowed amount
......@@ -828,7 +847,9 @@ mchsub_3
[ International
BL TranslateError
DebugTX "Can't grow framestore"
DebugTX "Mode fail"
SETV ; indicate error
Pull PC
......@@ -911,10 +932,20 @@ TV_Mode_string
[ UseGraphicsV
Push "r0-r4"
! 0, "FIXME: temporary code"
MOV r4, #GraphicsV_FramestoreAddress
BL CallGraphicsV
TEQ r4, #0
BNE %FT581
;hardcoded values for R-Pi alpha. external framestore requires a GraphicsV client,
; but still debating the merits of external vs internal
MOV r0,#&2000000
MOV r1,#&0800000
MOV r4,#0
MOV r1, r1, LSR #20 ; round size down to 1MB
MOV r2, r1, LSL #20
ADD r0, r0, #1:SHL:20 ; round addr up to 1MB
......@@ -1199,8 +1230,13 @@ PushModeInfo ROUT
BL ReadMonitorType
MOV r2, r10 ; r2 = original mode
BL OfferModeExtension
BEQ %FT30 ; [service claimed]
! 0, "FIXME: temporary code"
; BL OfferModeExtension
; BEQ %FT30 ; [service claimed]
MOV r3,#0
MOV r4,#0
B %FT30
CMP r2, #&100 ; service not claimed - check if mode selector
MOVCC r10, r11 ; unrecognised mode number, so use substitute
......@@ -1399,9 +1435,11 @@ GenerateModeSelectorVars Entry "r0,r1,r3-r8,r10-r12"
TST r2, #1 ; is it a new format sprite mode word?
BNE %FT50 ; [yes, so skip]
MOV r0, r2
; DebugTX "ValModeSel"
BL ValidateModeSelector
BVS %FT95 ; invalid - return error
LDMIB r2, {r4-r6} ; r4 = xres; r5 = yres; r6 = pixdepth
; DebugTX "Passed"
STR r6, [r9, #wkLog2BPC] ; log2bpc = log2bpp = pixdepth
STR r6, [r9, #wkLog2BPP]
......@@ -604,4 +604,60 @@ FlushMouse ROUT
; *****************************************************************************
; RemovePointer - Remove soft mouse pointer from screen
RemovePointer ROUT
STMFD R13!,{R0-R6,R14}
LDRB R3, [WsPtr, #PointerShapeNumber]
TST R3, #&7F
MOVNE R0, #0
MOVNE R4, #GraphicsV_UpdatePointer
BLNE CallGraphicsV
LDMFD R13!,{R0-R6,PC}
; *****************************************************************************
; RestorePointer - Restore soft mouse pointer to previous state
RestorePointer ROUT
STMFD R13!,{R0-R6,R14}
LDRB R6, [WsPtr, #PointerShapeNumber]
ANDS R6, R6, #&7F
ADD R3, WsPtr, #PointerShapes-4
LDR R3, [R3, R6, LSL #2] ; R3 -> current shape block (R6 = shape 1..4)
MOV R0, #1 ; R0 = flags, set pointer on (bit 0 = 1)
LDR R1, [WsPtr, #PointerShapeLA] ; last shape buffer given to HAL
LDR R4, [R3, #PointerBuffLA] ; shape buffer we're about to give
TEQ R1, R4 ; same as last time?
STRNE R4, [WsPtr, #PointerShapeLA] ; update
ORRNE R0, R0, #2 ; flag new shape (bit 1 = 1)
LDR R1, [WsPtr, #PointerX]
LDR R4, [WsPtr, #PointerXEigFactor]
MOV R1, R1, ASR R4 ; R1 = pointer x, pixels
LDRB R4, [R3, #PointerActiveX]
SUB R1, R1, R4 ; R1 = pointer x, adjusted for active point
LDR R2, [WsPtr, #PointerY]
LDR R4, [WsPtr, #DisplayYEigFactor]
LDR R5, [WsPtr, #DisplayYWindLimit] ; R5 = display height -1
SUB R2, R5, R2, ASR R4 ; R2 = pointer y, pixels, inverted
LDRB R4, [R3, #PointerActiveY]
SUB R2, R2, R4 ; R2 = pointer y, adjusted for active point
; and it's up to the HAL to handle clipping according to h/w capabilities
MOV R4, #GraphicsV_UpdatePointer
BL CallGraphicsV
LDMFD R13!,{R0-R6,PC}
......@@ -698,6 +698,7 @@ NSM_yshftfactor
SWICheckModeValid ROUT
DebugTX "CheckModeValid"
Push "r1,r9,lr"
BL FindOKMode ; out: r1 = substitute mode
......@@ -772,6 +773,11 @@ SWICheckModeValid ROUT
! 0, "FIXME: temporary code"
ADDS R1,R0,#0
MOV pc,lr
Push "r0,r2-r4,r10,r11,lr"
BL ReadMonitorType
CMP r0, #&100 ; if it's a mode number
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment