Changes

Add framebuffer registers
Line 2: Line 2:     
{{Infobox MMIO
 
{{Infobox MMIO
| arm = ??
+
| arm = Full
| ppc = ??
+
| ppc = Full
 
| base = 0x0C000000
 
| base = 0x0C000000
 
| len = 0x400000
 
| len = 0x400000
Line 14: Line 14:  
{{reglist|Espresso Registers}}
 
{{reglist|Espresso Registers}}
 
{{rld|0x0C206084|32|FB0_STATE|Controls TV framebuffer state.|drs=1}}
 
{{rld|0x0C206084|32|FB0_STATE|Controls TV framebuffer state.|drs=1}}
{{rld|0x0C206100|32|FB0_MODE_UPDATE|Update flag for TV framebuffer mode register.|drs=1}}
+
{{rld|0x0C206100|32|FB0_MODE_UPDATE|Update flag for TV framebuffer mode register.{{check}}|drs=1}}
 
{{rld|0x0C206104|32|FB0_MODE|Controls TV framebuffer mode.|drs=1}}
 
{{rld|0x0C206104|32|FB0_MODE|Controls TV framebuffer mode.|drs=1}}
 
{{rld|0x0C206110|32|FB0_ADDR|Physical memory location of TV framebuffer.|drs=1}}
 
{{rld|0x0C206110|32|FB0_ADDR|Physical memory location of TV framebuffer.|drs=1}}
 
{{rld|0x0C206120|32|FB0_WIDTH1|Width of TV framebuffer.|drs=2}}
 
{{rld|0x0C206120|32|FB0_WIDTH1|Width of TV framebuffer.|drs=2}}
 
{{rld|0x0C206198|32|FB0_WIDTH2}}
 
{{rld|0x0C206198|32|FB0_WIDTH2}}
{{rld|0x0C206914|32|FB0_ADDR_UPDATE|Update flag for TV framebuffer (contested)|drs=1}}
+
{{rld|0x0C206914|32|FB0_ADDR_UPDATE|Update flag for TV framebuffer.{{check}}|drs=1}}
 +
{{rld|0x0C207084|32|FB1_STATE|Controls TV framebuffer state.|drs=1}}
 +
{{rld|0x0C207100|32|FB1_MODE_UPDATE|Update flag for TV framebuffer mode register.{{check}}|drs=1}}
 +
{{rld|0x0C207104|32|FB1_MODE|Controls TV framebuffer mode.|drs=1}}
 +
{{rld|0x0C207110|32|FB1_ADDR|Physical memory location of TV framebuffer.|drs=1}}
 +
{{rld|0x0C207120|32|FB1_WIDTH1|Width of TV framebuffer.|drs=2}}
 +
{{rld|0x0C207198|32|FB1_WIDTH2}}
 +
{{rld|0x0C207914|32|FB1_ADDR_UPDATE|Update flag for TV framebuffer.{{check}}|drs=1}}
 
|}
 
|}
 +
 +
==Framebuffer Registers==
 +
{{reg32|FB''x''_STATE|addr=0x0C206084/0x0C207084|hifields=1|lofields=3|
 +
|16      |
 +
|U      |
 +
|        ||
 +
|7|1  |8|
 +
|U|RW  |U|
 +
| |DSBL| |
 +
}}
 +
{{regdesc
 +
|DSBL|Set to ''disable'' the buffer, and clear to ''enable'' it.
 +
}}
 +
 +
{{reg32|FB''x''_MODE_UPDATE|addr=0x0C206100/0x0C207100|hifields=1|lofields=2|
 +
|16    |
 +
|U    |
 +
|      ||
 +
|15|1  |
 +
|U |W  |
 +
|  |UPD|
 +
}}
 +
{{regdesc
 +
|UPD|Must be set directly after '''FB''x''_MODE''' changes.{{check}}
 +
}}
 +
This register is assumed to be an update flag{{check}} due to its proximity to '''FB''x''_MODE''' writes.
 +
 +
 +
{{reg32|FB''x''_MODE|addr=0x0C206104/0x0C207104|hifields=3|lofields=4|
 +
|8  |4    |4  |
 +
|U  |RW  |U  |
 +
|  |UNK1 |  ||
 +
|5|3  |6|2  |
 +
|U|RW  |U|RW  |
 +
| |UNK2| |UNK3|
 +
}}
 +
{{regdesc
 +
|UNK1|Unknown. Bit 20 (0x100000) set during OSScreen initialisation.
 +
|UNK2|Unknown. All bits cleared during OSScreen initialisation.
 +
|UNK3|Unknown. Bit 1 (0x2) set during OSScreen initialisation.
 +
}}
 +
A simplified view of how OSScreen sets up this register is as follows:
 +
<syntaxhighlight lang="c">
 +
*FBx_MODE = (*FBx_MODE & 0xFF0FF8FC) | 0x100002;
 +
</syntaxhighlight>
 +
 +
 +
{{reg32|FB''x''_ADDR|addr=0x0C206110/0x0C207110|hifields=1|lofields=3|
 +
|16        |
 +
|W        |
 +
|ADDR      ||
 +
|8  |7|1  |
 +
|W  |U|W  |
 +
|ADDR| |UNK|
 +
}}
 +
{{regdesc
 +
|ADDR|High 24 bits of physical address for displayed framebuffer.
 +
|UNK |Unknown. Set during OSScreen initialisation.
 +
}}
 +
 +
{{reg32|FB''x''_WIDTH''x''|addr=0x0C206120/0x0C206198/0x0C207120/0x0C207198|hifields=1|lofields=2|
 +
|16  |
 +
|U  |
 +
|    ||
 +
|2|14|
 +
|U|W |
 +
| |PX|
 +
}}
 +
{{regdesc
 +
|PX|Target width of framebuffer in pixels.
 +
}}
 +
It's not known why there appears to be two of these registers for each framebuffer. OSScreen writes an identical value to each.
 +
 +
 +
{{reg32|FB''x''_ADDR_UPDATE|addr=0x0C206914/0x0C207914|hifields=1|lofields=1|
 +
|16    |
 +
|U    |
 +
|      ||
 +
|16    |
 +
|U    |
 +
|      |
 +
}}
 +
{{regdesc
 +
|FB''x''_ADDR_UPDATE|All bits cleared during OSScreen initialisation.
 +
}}
 +
This register is assumed to be an update flag{{check}} due to its proximity to '''FB''x''_ADDR''' writes.