digic6:registers
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
digic6:registers [2025/05/05 19:06] – [LV peaking (Highlights / zebra)] kitor | digic6:registers [2025/05/06 10:12] (current) – [Setting palette for Indexed RGB layers] kitor | ||
---|---|---|---|
Line 3: | Line 3: | ||
===== Display layers and effects (HDMI, LCD, peaking/ | ===== Display layers and effects (HDMI, LCD, peaking/ | ||
- | Digic 6 and 7 allow to define up to 8 hardware display layers. Each of layers | + | Digic 6 and 7 allow to define up to 8 hardware display layers. Each layer has independent |
=== Note on directly writing the display registers === | === Note on directly writing the display registers === | ||
Line 9: | Line 9: | ||
Depending on generation and model, Canon code will overwrite some (but not all) of the register values based on data structures stored in RAM. This applies also to layers code doesn' | Depending on generation and model, Canon code will overwrite some (but not all) of the register values based on data structures stored in RAM. This applies also to layers code doesn' | ||
- | Output has to be active when MMIO is being written, otherwise changes will be ignored. | + | Output has to be active when corresponding |
==== Hardware compositor / layers ==== | ==== Hardware compositor / layers ==== | ||
- | There should be 3rd set of registers | + | Please note that Digic 6 and up have two separate concepts |
- | ^ Base address | + | For more details on Ximr/XCM and GUI, see this forum post: |
- | | '' | + | [[https:// |
- | | '' | + | |
- | | '' | + | |
- | + | ||
- | Each address consists of **8** sets (layers), each consisting of eight 32 bit values representing each hardware layer. MMIO order starts from bottom layer (0) to topmost (7) in Z axis. | + | |
- | + | ||
- | ^ Offset ^ Summary | + | |
- | | +0 | Flags | Configures data type, transformations (flip, upscale), zebras, etc | | + | |
- | | +0x4 | Vram index ? | Assignment to a peviously registered Vram buffer ID | + | |
- | | +0x8 | Input offsets | + | |
- | | +0xC | Vram resolution | + | |
- | | +0x10 | Output offsets | + | |
- | | +0x14 | scaling flag ? | In HDMI mode it has to be set to 1 so vertical doubling works. | + | |
- | | +0x18 | ? | | + | |
- | | +0x1C | ? | | + | |
- | + | ||
- | === Vram index === | + | |
- | Wildly enough, MMIO doesn' | + | This section describes hardware layer / compositor supported |
- | + | ||
- | Vram index register seems to also take two 16 bit values instead of one, possibly for layers that use separate image and alpha buffers (eg UYVY+AA, unconfirmed). | + | |
- | + | ||
- | === Resolution, offsets === | + | |
- | + | ||
- | * Vram resolution is the resolution of entire buffer, in pixels. | + | |
- | * Input offsets will " | + | |
- | * Output offsets will move rendered image on screen by X,Y pixels. | + | |
- | + | ||
- | === Flags === | + | |
- | + | ||
- | So far we observed following flags by doing some empirical tests: | + | |
- | + | ||
- | < | + | |
- | #define HWLAYER_ENABLE | + | |
- | #define HWLAYER_ALWAYS_SET | + | |
- | #define HWLAYER_FLIP_H | + | |
- | #define HWLAYER_FLIP_V | + | |
- | #define HWLAYER_DOUBLE_H | + | |
- | #define HWLAYER_DOUBLE_V | + | |
- | #define HWLAYER_ZEBRAS | + | |
- | + | ||
- | // Going through lowest byte (except LSB which is ENABLE bit) | + | |
- | // reveals multiple combinations that work for some YUV and indexed formats. | + | |
- | #define HWLAYER_TYPE_OSD | + | |
- | #define HWLAYER_TYPE_LV | + | |
- | #define HWLAYER_TYPE_INDEXED 0x48 | + | |
- | + | ||
- | // No idea, Canon uses HWLAYER_UNK on LCD, HWLAYER_ZEBRAS on HDMI | + | |
- | // Seems to have no effect at leat on indexed RGB | + | |
- | #define HWLAYER_UNK | + | |
- | </ | + | |
- | + | ||
- | Combining those flags is required to get desired effects. For example, `0x10000341` is YUV/no transparency | + | |
- | + | ||
- | Please note than for unknown reasons HWLAYER_DOUBLE_V doesn' | + | |
- | + | ||
- | Canon code will also forcefully overwrite some of the flags (zebras, upscaling register) from RAM data structures so values may need to be updated there instead of MMIO directly. | + | |
- | + | ||
- | === How original firmware utilizes HW layers? === | + | |
- | + | ||
- | In default configuration, | + | |
- | EOS codebase seems to use layer 0 to display active preview | + | |
- | + | ||
- | The notes below are from 80D, but 77D (DIGIC 7) has the same setup: | + | |
- | + | ||
- | < | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | </ | + | |
==== VRAM registration ==== | ==== VRAM registration ==== | ||
- | Before VRAM can be used by a hardware layer, it has to be registered and assigned an ID. | + | Before VRAM buffer |
- | ^ Base address | + | ^ Base address |
- | | '' | + | | '' |
- | | '' | + | | '' |
MMIO structure is as below: | MMIO structure is as below: | ||
- | ^ Offset ^ Summary | + | ^ Offset ^ Summary |
- | | +0x0 | index | Numerical ID, 8 bits - used for assignment in HW layer registers. | + | | +0x0 | index | Numerical ID, 8 bits - used for assignment in HW layer registers. |
- | | +0x4 | pitch ? | Derivative of image width. Computed as '' | + | | +0x4 | pitch ? | Derivative of image width. Computed as '' |
- | | +0x8 | pointer-ish | Vram address bit shifted 8 to the right. Possibly to enforce alignment. | + | | +0x8 | pointer-ish | Vram address bit shifted 8 to the right. Possibly to enforce alignment. |
- | MMIO as to be written in order, be aware of any compiler optimizations (best to set data structures as volatile). | + | MMIO has to be written in order, be aware of any compiler optimizations (best to set data structures as volatile). |
Example code: | Example code: | ||
Line 133: | Line 63: | ||
==== Setting palette for Indexed RGB layers ==== | ==== Setting palette for Indexed RGB layers ==== | ||
- | This works differently than Digic 5 and below. There' | + | This works differently than Digic 5 and below. There' |
- | ^ Address | + | Address didn't change between Digic 6 and 7. |
- | | '' | + | |
- | | '' | + | ^ Address |
- | | ''?'' | + | | '' |
+ | | '' | ||
+ | | ''?'' | ||
MMIO structure is as below: | MMIO structure is as below: | ||
- | ^ Offset ^ Summary | + | ^ Offset ^ Summary |
- | | +0x0 | apply | Write 0x1 to apply selected palette | + | | +0x0 | apply | Write 0x1 to apply selected palette |
- | | +0x4 | flag maybe | Unknown, Canon BL writes 0xFF | + | | +0x4 | flag maybe | Unknown, Canon BL writes 0xFF | |
- | | +0x8 | pointer-ish | Palette address, bit shifted 4 to the right. Possibly to enforce alignment. | + | | +0x8 | pointer-ish | Palette address, bit shifted 4 to the right. Possibly to enforce alignment. |
- | Please note that fields | + | Please note that fields |
Example code: | Example code: | ||
Line 166: | Line 98: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==== Layers setup ==== | ||
+ | |||
+ | There should be 3rd set of registers used for analog output similar to ones below. Address didn't change between Digic 6 and 7. | ||
+ | |||
+ | ^ Base address | ||
+ | | '' | ||
+ | | '' | ||
+ | | ''??'' | ||
+ | |||
+ | Each layer config consists of eight 32 bit configuration words (registers). There are 8 total layers (8 sets of 8 registers) starting from Base address. MMIO is Z ordered starting from bottom layer (0) to topmost one (7). | ||
+ | |||
+ | |||
+ | ^ Offset ^ Summary | ||
+ | | +0 | Flags | Configures data type, transformations (flip, upscale), zebras, etc | | ||
+ | | +0x4 | Vram index ? | Assignment to a previously registered Vram buffer ID | | ||
+ | | +0x8 | Input offsets | ||
+ | | +0xC | Vram resolution | ||
+ | | +0x10 | Output offsets | ||
+ | | +0x14 | scaling flag ? | In HDMI mode it has to be set to 1 so vertical doubling works. | | ||
+ | | +0x18 | ? | | | ||
+ | | +0x1C | ? | | | ||
+ | |||
+ | === Vram index === | ||
+ | |||
+ | Strangely enough, MMIO doesn' | ||
+ | |||
+ | Vram index register seems to also take two 16 bit values instead of one, possibly for layers that use separate image and alpha buffers (eg UYVY+AA, unconfirmed). | ||
+ | |||
+ | === Resolution, offsets === | ||
+ | |||
+ | * Vram resolution is the resolution of entire buffer, in pixels. | ||
+ | * Input offsets will " | ||
+ | * Output offsets will move rendered image on screen by X,Y pixels. | ||
+ | |||
+ | === Flags === | ||
+ | |||
+ | So far we observed following flags by doing some empirical tests: | ||
+ | |||
+ | < | ||
+ | #define HWLAYER_ENABLE | ||
+ | #define HWLAYER_ALWAYS_SET | ||
+ | #define HWLAYER_FLIP_H | ||
+ | #define HWLAYER_FLIP_V | ||
+ | #define HWLAYER_DOUBLE_H | ||
+ | #define HWLAYER_DOUBLE_V | ||
+ | #define HWLAYER_ZEBRAS | ||
+ | |||
+ | // Going through lowest byte (except LSB which is ENABLE bit) | ||
+ | // reveals multiple combinations that work for some YUV and indexed formats. | ||
+ | #define HWLAYER_TYPE_UYVY_AA | ||
+ | #define HWLAYER_TYPE_UYVY | ||
+ | #define HWLAYER_TYPE_INDEXED_RGB 0x48 // Indexed RGB - eg. bootloader | ||
+ | |||
+ | // No idea, Canon uses HWLAYER_UNK on LCD, HWLAYER_ZEBRAS on HDMI | ||
+ | // Seems to have no effect, at least on indexed RGB | ||
+ | #define HWLAYER_UNK | ||
+ | </ | ||
+ | |||
+ | Combining those flags is required to get desired effects. For example, '' | ||
+ | |||
+ | Please note than for unknown reasons '' | ||
+ | |||
+ | Canon code will also forcefully overwrite some of the flags (zebras, upscaling register) from RAM data structures so values may need to be updated there instead of MMIO directly. | ||
+ | |||
+ | === How does original firmware utilize HW layers? === | ||
+ | |||
+ | In default configuration, | ||
+ | EOS codebase seems to use layer 0 to display active preview (LV, photo) image and layer 5 for GUI (referred as internally as OSD). Other layers are inactive. | ||
+ | |||
+ | The notes below are from 80D, but 77D (DIGIC 7) has the same setup: | ||
+ | |||
+ | |||
+ | ^ Flags ^ Kind ^ Output ^ Output type ^ Output layer ID (80D) ^ | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
==== Display effects (zebras, etc) ==== | ==== Display effects (zebras, etc) ==== | ||
Line 207: | Line 220: | ||
| speed | 0-1 | lines/dots are moving slower -> faster | | speed | 0-1 | lines/dots are moving slower -> faster | ||
| style | 0-3 | 0: light dots, 1: thin lines, 2: thick lines, 3 = 0 | | | style | 0-3 | 0: light dots, 1: thin lines, 2: thick lines, 3 = 0 | | ||
- | | opacity | + | | opacity |
| underexpo_th | 0-255 | Threshold on undexexpo register, ignored on overexpo | | underexpo_th | 0-255 | Threshold on undexexpo register, ignored on overexpo | ||
| overexpo_th | | overexpo_th |
digic6/registers.1746464770.txt.gz · Last modified: 2025/05/05 19:06 by kitor