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

Support for Raspberry Pi / BCM2835

Detail:
  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.
Admin:
  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, 4.79.2.98.2.52.2.1. 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 "4.79.2.98.2.52"
Module_Date SETS "15 Sep 2011"
Module_ApplicationDate SETS "15-Sep-11"
Module_MinorVersion SETS "4.79.2.98.2.52.2.1"
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 (4.79.2.98.2.52)"
Module_HelpVersion SETS "5.35 (15 Sep 2011) 4.79.2.98.2.52"
Module_FullVersion SETS "5.35 (4.79.2.98.2.52.2.1)"
Module_HelpVersion SETS "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
END
......@@ -5,19 +5,19 @@
*
*/
#define Module_MajorVersion_CMHG 5.35
#define Module_MinorVersion_CMHG 4.79.2.98.2.52
#define Module_Date_CMHG 15 Sep 2011
#define Module_MinorVersion_CMHG 4.79.2.98.2.52.2.1
#define Module_Date_CMHG 10 May 2012
#define Module_MajorVersion "5.35"
#define Module_Version 535
#define Module_MinorVersion "4.79.2.98.2.52"
#define Module_Date "15 Sep 2011"
#define Module_MinorVersion "4.79.2.98.2.52.2.1"
#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 (4.79.2.98.2.52)"
#define Module_HelpVersion "5.35 (15 Sep 2011) 4.79.2.98.2.52"
#define Module_FullVersion "5.35 (4.79.2.98.2.52.2.1)"
#define Module_HelpVersion "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
#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 DebugROMInit
DebugROMInit SETL {TRUE}
DebugROMInit SETL {FALSE}
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}
DebugROMErrors SETL {FALSE}
GBLL DebugTerminal ; default WRCH and RDCH through HAL
DebugTerminal SETL {FALSE}
......
......@@ -221,6 +221,12 @@ FindARMloop
; others ...
WeirdARMPanic
! 0, "FIXME: temporary code"
;!!!
MOV ip,#&C0
STR a1,[ip,#&40]
STMIA ip,{a1-ip}
B WeirdARMPanic ; stiff :)
Analyse_ARMv3
......@@ -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
BLT %BT10
! 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
25
......
......@@ -832,6 +832,12 @@ MMUon_nol1ptoverlap
MOV v3, #0 ; "MMU is on" signal
BL ARM_Analyse
! 0, "FIXME: temporary code"
;!!! STILL DON'T KNOW WHY THE BODGE IN ARM_ANALYSE ITSELF DOESN'T WORK!
MOV a1,#0
MOV a2,#32
STRB a2,[a1,#DCache_LineLen]
STRB a2,[a1,#ICache_LineLen]
ChangedProcVecs a1
......
......@@ -42,9 +42,13 @@
MACRO
DebugTX $str
[ DebugHALTX
! 0, "FIXME: temporary code"
;!!!
STR lr,[sp,#-4]!
BL DebugHALPrint
= "$str", 0
ALIGN
LDR lr,[sp],#4
]
MEND
|
......
......@@ -1455,6 +1455,17 @@ TickOne ROUT
STRB R0, [R3, #IOCIRQCLRA] ; clear timer 0 interrupt
]
! 0, "FIXME: temporary code"
;!!! HAPPY HACK
STMFD sp!,{r0-r12}
ADR r0,ret_from_vs
Push r0
B VsyncIRQ_ExtEntry
ret_from_vs
LDMFD sp!,{r0-r12}
;!!! HAPPY HACK
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)
RDCHG ROUT
[ {FALSE}
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
BNE %FT00
SEC
LDMFD sp!,{R1-R12,PC}
00
CLC
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
PostWrchCursor ROUT
MOV R6,R14
LDR R14,[WsPtr, #HALVideoFeatures]
TST R14,#2
BNE %FT10
MRS R4,CPSR
ORR R3,R4,#I32_bit
MSR CPSR_c,R3
BL RestorePointer
MSR CPSR_c,R4
10
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
EXIT VC
......@@ -374,6 +379,14 @@ InitialiseMode Entry
SWIVC XOS_WriteI+0 ; and if we can't get mode 0, we're really fooked!!!
EXIT
! 0, "FIXME: temporary code"
mode_defn DCD 1
DCD 1920
DCD 1080
DCD 5
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"
07
DebugTX "Mode fail"
SETV ; indicate error
Pull PC
......@@ -911,10 +932,20 @@ TV_Mode_string
[ UseGraphicsV
Push "r0-r4"
! 0, "FIXME: temporary code"
;!!!
[ {FALSE}
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
PushModeInfoCommon
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
LTORG
; *****************************************************************************
;
; 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
BEQ %FT10
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
10
LDMFD R13!,{R0-R6,PC}
END
......@@ -698,6 +698,7 @@ NSM_yshftfactor
;
SWICheckModeValid ROUT
DebugTX "CheckModeValid"
VDWS WsPtr
Push "r1,r9,lr"
BL FindOKMode ; out: r1 = substitute mode
......@@ -772,6 +773,11 @@ SWICheckModeValid ROUT
;
FindOKMode 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