← Firmware research← 韌體研究

The 70 sensor modes70 個感光元件模式

Every way the fp knows how to read its sensor, as a table in ROM. The subject of this page is the settings themselves: the 161 values the fp writes to the IMX410, 150 of them now decoded, plus the eight ROM tables those values live in and the 70 modes they combine into.

fp 知道的所有「讀取感光元件的方式」,全部存在 ROM 的表裡。
這一頁講的是設定值本身:fp 會寫進 IMX410 的那 161 個值(已經解出 150 個)、 它們存放的八張 ROM 表,以及它們組合出來的 70 種模式。

Where it is表在哪
Eight separate tables describe a mode, all 70 entries, all indexed by the same row number. The one this page documents field by field is the metadata table at 0xC0B59DC0: 70 records of 0x64 bytes, 25 words each.
一個模式是由八張分開的表描述的,每張都是 70 筆、都用同一個列號索引。這頁逐欄解釋的是其中的 metadata 表,在 0xC0B59DC0:70 筆,每筆 0x64 bytes、25 個字。
On “70 parameters”關於「70 個參數」
70 is the number of modes, not of parameters. A mode is described by 252 words across eight tables, of which 203 vary between modes — and eight of those 203 are just the mode id repeated once per table, so 195 are real settings. The 70 is what gets picked from, not what is in each one.
70 是模式的數量,不是參數的數量。一個模式是由八張表裡的 252 個字描述的,其中 203 個會隨模式改變 —— 而那 203 個裡有 8 個只是八張表各自重複一次的 mode id,所以真正的設定值是 195 個。70 是「可以挑的東西有幾個」,不是「每個裡面有幾項」。
What is not solved還沒解的
Four of the 25 metadata fields are always zero, two are read from a single mode's investigation rather than proven across the table, and 11 of the 161 sensor registers have no explanation yet. Timing is solved, so rolling shutter and exact frame rate are computed for all 70.
25 個 metadata 欄位裡有四個永遠是 0;兩個的名字是從單一模式的調查來的,沒有在整張表上驗證過;而 161 個感光元件暫存器裡還有 11 個不知道在管什麼。時序表已經解開了,所以 70 個模式的捲簾和精確格率都算得出來。

Eight tables, one mode八張表,一個模式

The eight tables that together describe one sensor mode timing 0xC0B59500 8 u32 metadata 0xC0B59DC0 25 u32 table C 0xC0B5B918 2 u32 table D 0xC0B5BB48 10 u32 table E 0xC0B5C638 14 u32 table F 0xC0B5D588 5 u32 table G 0xC0B5DB00 26 u32 register 0xC0B5FDAC 162 u32 one readout mode 一個讀出模式 every table carries the mode id 每張表都帶著 mode id Highlighted: understood. The other five are read but not explained. 亮起來的三張是懂的。另外五張讀得出來,但不知道在講什麼。
All eight are 70 entries, all eight carry the mode id (word 0, except table C where it is word 1), and all eight are indexed by the same row number — not looked up by id. Each stride falls out of the gap to the next table, which is how the sizes were fixed without guessing.
八張都是 70 筆、八張都帶 mode id(在第 0 個字,只有 table C 在第 1 個),而且八張都用同一個列號索引 ——不是拿 id 去查。每張的 stride 都是從「到下一張表的間距」算出來的,所以尺寸不用猜。

How many parameters does a sensor mode have? 252 words, of which 203 actually differ between modes — 195 once you drop the eight copies of the mode id, which are an index rather than a setting. Three tables are understood and five are not:

一個感測器模式有多少參數?252 個字,其中203 個真的會隨模式改變 —— 扣掉八份 mode id 副本(那是索引不是設定),真正的設定是 195 個。 八張表裡三張懂、五張不懂:

table表address位址 stridestrideu32 vary會變what it holds裝什麼
timing0xC0B595000x2085 hmax, tail, vmax → frame rate and rolling shutterhmax、tail、vmax → 格率與捲簾
metadata0xC0B59DC00x642521 geometry, nominal fps, merge, crop幾何、標稱格率、合併、裁切
C0xC0B5B9180x0822 a class number 2–7, then the mode id一個 2–7 的類別號,然後 mode id
D0xC0B5BB480x28106 four packed u16 pairs and a 20/60/120四組 packed u16,和一個 20/60/120
E0xC0B5C6380x38149 large packed values, unexplained大的 packed 數值,沒解釋
F0xC0B5D5880x1452 one 0x1xxxx-shaped flag一個 0x1xxxx 形狀的旗標
G0xC0B5DB000x682625 a second mode id, and 6064/4042 on some rows另一個 mode id,某些列有 6064/4042
register0xC0B5FDAC0x288162133161 sensor register values; addresses live in FUN_c03258c8161 個感光元件暫存器的值;位址在 FUN_c03258c8 裡
total總計252203

Every stride here was derived the same way: the tables sit back to back, so the gap to the next one divided by 70 gives the record size. Nothing was guessed, and the timing table is the proof — it was called unsolvable while being walked at twice its real stride.

這裡每個 stride 都是同一個方法算出來的:這些表是背靠背排在一起的, 所以「到下一張表的間距 ÷ 70」就是每筆的大小。沒有一個是猜的 —— 而時序表就是證據:它之前被判定「解不開」,只因為當時用了兩倍的 stride 在走。

All 161 sensor settings感光元件上的 161 個設定

This is the main table of this page: every value the fp writes to the IMX410, one row each. The camera issues these as 161 straight-line I²C writes with no branches, so every mode writes all 161 — only the values change. 150 of them are now decoded. Click a row to see what that register holds across all 70 modes.

這是這一頁的主表:fp 會寫進 IMX410 的每一個值,一個暫存器一列。 相機是用 161 筆沒有任何分支的直線 I²C 寫入送出去的,所以每個模式都會寫滿這 161 個, 只有值不一樣。其中 150 個已經解出用途。點任一列可以看這個暫存器在 70 個模式上分別是什麼值。

161
register暫存器 what it controls管什麼 values幾種值 distribution across the 70 modes在 70 個模式上的分布 moves with共變

Every field in the metadata recordmetadata 記錄的每一個欄位

25 words. Confidence is marked per field: read means the meaning is visible in the data or in code, inferred means it comes from one mode's investigation and has not been checked across the table, and unknown is unknown.

25 個字。每個欄位都標了信心等級:read 表示意義在資料或程式碼裡看得見;inferred 表示來自單一模式的調查、沒在整張表上驗證過; unknown 就是不知道。

+0x00mode idmode idread The key every other table uses. Not an index — ids run 0 to 221 with gaps, and the table is not sorted by them. 其他兩張表都用這個當鍵。它不是索引 —— id 從 0 到 221 中間有缺號,而且這張表也沒有按它排序。 70 distinct · 0 … 221 70 個相異值 · 0 … 221
+0x04 / +0x08raster width / height光柵 寬 / 高read What the sensor actually reads out. This is the number that decides bandwidth and, with the timing table, rolling shutter. 感光元件實際讀出來的尺寸。這個數字決定頻寬,配上時序表就決定捲簾時間。 8 widths · 13 distinct rasters · 2016×672 … 6064×4042 8 種寬度 · 13 種光柵 · 2016×672 … 6064×4042
+0x0C / +0x10——unknown Zero in all 70 records. Position suggests an origin for the pair above, but nothing ever sets it, so that is a guess from layout alone. 70 筆全部是 0。從位置看像是上面那對的原點,但沒有任何東西設過它,所以那純粹是從排版猜的。 always 0 全部是 0
+0x14 / +0x18second width / height第二組 寬 / 高read Identical to +0x04/+0x08 in all 70 records. Why the record carries the same geometry twice is not known. 跟 +0x04/+0x08 70 筆全部相同。為什麼同一份幾何要存兩次,不知道。 identical to +0x04/+0x08, 70/70 跟 +0x04/+0x08 完全相同,70/70
+0x1C / +0x20——unknown Zero in all 70 records, same shape as +0x0C/+0x10. 70 筆全部是 0,形狀跟 +0x0C/+0x10 一樣。 always 0 全部是 0
+0x24 / +0x28third width / height第三組 寬 / 高read Identical to the other two in 69 of 70 records. The exception is mode 100, where the first two say 4176×2174 and this one says 3032×2174 — same height, different width. Whether that is meaningful or a typo in the firmware is not known, and nothing else in the table looks like it. 70 筆裡有 69 筆跟前兩組相同。例外是 mode 100:前兩組寫 4176×2174,這一組寫 3032×2174 —— 高度一樣,寬度不同。是有意義還是韌體的筆誤,不知道,而且表裡沒有第二個長這樣的。 differs only for mode 100 只有 mode 100 不同
+0x2C / +0x30output crop width / height輸出裁切 寬 / 高read The active area inside the raster. Set on only 6 of 70 modes; the other 64 leave it zero, meaning the whole raster is the output. 光柵內的有效區。70 個模式裡只有 6 個有設;其他 64 個留 0,表示整個光柵就是輸出。 0 (×64) · 3000×2000 (×2) · 6000×4000 (×4)
+0x34 / +0x38crop origin x / y裁切原點 x / yread Top-left of that crop. Only set on the same modes as the pair above. 那個裁切的左上角。只有上面那 6 個模式會設。 0 · (16, 6) · (32, 21)
+0x3C14-bit flag14-bit 旗標read 1 on exactly 8 modes, 0 on the rest. Those 8 are the stills-class readouts — mode 0 is independently documented as RAW14, which is what fixes the polarity. 剛好 8 個模式是 1,其餘是 0。那 8 個是拍照等級的讀出 —— mode 0 有獨立文件記載是 RAW14,極性就是這樣定下來的。 1 on modes 0, 6, 95, 100, 122, 129, 141, 144 modes 0, 6, 95, 100, 122, 129, 141, 144 為 1
+0x40nominal frame rate標稱格率read Nominal, not exact, and it goes stale. Mode 3 says 30 and runs 29.97; mode 98 says 78 and runs 77.27; mode 121 says 25 and runs 24.9997. It also becomes an outright lie when a project retimes a donor mode — OG3K drives mode 98 at 29.97 while this field still reads 78. 是標稱值、不精確,而且會過期。mode 3 寫 30、實跑 29.97;mode 98 寫 78、實跑 77.27;mode 121 寫 25、實跑 24.9997。專案把借來的模式改時序之後,它會變成純粹的謊話 —— OG3K 讓 mode 98 跑 29.97,而這個欄位還寫著 78。 17 values · 18 … 240 17 種值 · 18 … 240
+0x44 … +0x50merge tuple (four factors)合併倍率(四個數字)read Four reduction factors. Only four combinations occur across the whole table. The last two are confirmed as effective X/Y geometry scale — but that proves a coordinate ratio and says nothing about whether charge is combined or rows are skipped. The first two are not pinned down at all. 四個縮減倍率。整張表只出現四種組合。後兩個已確認是有效的 X/Y 幾何倍率 —— 但那只證明座標比例,完全沒有說電荷是被合併還是整列被跳過。前兩個則完全沒定。 (1,1,1,1) ×23 · (2,2,2,2) ×36 · (3,2,3,3) ×8 · (3,3,3,6) ×3
+0x54aspect marker比例標記read 2 on every 3:2 raster, 1 on every 16:9 one. Checks out against the geometry in all 70 records. 每個 3:2 光柵都是 2,每個 16:9 都是 1。70 筆全部對得上幾何。 1 (×43, 16:9) · 2 (×27, 3:2) 1(×43,16:9)· 2(×27,3:2)
+0x58full or cropped readout全幅讀出 或 裁切讀出read 0 for a full-width readout, 1 for a cropped one. Independent of the crop fields above, which describe an output window rather than the readout itself. 0 = 全寬讀出,1 = 裁切讀出。跟上面的裁切欄位是兩回事 —— 那組描述的是輸出視窗,這個講的是讀出本身。 0 (×39) · 1 (×31)
+0x5Cvertical blanking垂直消隱inferred Named from the HSW investigation of a single mode. The value range is plausible for vblank lines and it correlates loosely with frame rate, but it has not been checked against the timing table across the other 69 modes. 名字來自 HSW 對單一模式的調查。數值範圍當 vblank 行數是合理的,跟格率也有鬆散的相關性,但沒有拿另外 69 個模式對照時序表驗證過。 14 · 30 · 40 · 50 (×11) · 70 (×44) · 100 (×10)
+0x60analogue fingerprint / readout class類比指紋 / 讀出類別inferred Groups modes that share an analogue signature — the HSW work reads 23 as the “fast 330” MONIT class. Eight values across the table, and modes with the same value do tend to share a raster family, which is consistent. Not proven. 把共用同一個類比特徵的模式分組 —— HSW 那邊把 23 讀成「快速 330」的 MONIT 類。整張表有八個值,而且同值的模式確實傾向共用同一個光柵家族,這點是一致的。但沒有被證明。 16 … 23, eight groups 16 … 23,八組

All 70 modes全部 70 個模式

Sort by any column. Search matches the mode id and the raster. “Rel.” is the raster width against the full 6064, so ×2 means half-width readout. fps and roll ms are computed from the timing table; nom is the metadata field that lies, kept alongside for comparison.

These thirteen columns are metadata — what the mode produces. They are not what gets written to the sensor. Click any row to open the 161 sensor registers that mode actually programs, plus its raw words from the other seven tables. Modes 98 and 117 look almost identical here and differ in 78 of those registers — though not, it turns out, in any of their merge registers. To diff two modes side by side, use Compare two modes below.

點任一欄的標題可以排序。搜尋可以打 mode id 或光柵尺寸。 「Rel.」是光柵寬度相對於全寬 6064 的倍率,所以 ×2 就是半寬讀出。
格率和捲簾是從時序表算出來的真實值;標稱是 metadata 裡那個會騙人的欄位,擺旁邊對照。

這十三欄是 metadata,講的是這個模式「產出什麼」,不是「寫了什麼到感光元件上」。 點任何一列就會展開,裡面是這個模式實際寫進感光元件的 161 個暫存器, 以及它在另外七張表裡的原始字。
mode 98 跟 117 在這張表上幾乎一模一樣,但它們有 78 個暫存器不同 —— 不過那 78 個沒有一個是合併暫存器。要並排比較兩個模式,用下面的比較兩個模式。

70 of 70
modemode raster光柵 rel.相對 aspect比例 merge合併 bits位深 fps格率 roll ms捲簾 ms nom標稱 output crop輸出裁切 readout讀出 vblankvblank fp指紋

Compare two modes比較兩個模式

The table above shows what a mode produces. It says almost nothing about what gets written to the sensor — that is the other six tables, and the table above shows none of them. Modes 98 and 117 make the point: same raster, same merge tuple, same aspect, same bit depth, and 110 of the 195 varying parameters differ. (203 words vary, but eight of those are just the mode id repeated once per table — an index, not a setting, so they are excluded here.)

上面那張表講的是一個模式產出什麼。至於寫進感光元件的是什麼, 它幾乎沒講 —— 那在另外六張表裡,而上面那張一個都沒顯示。
mode 98 跟 117 就是最好的例子:同光柵、同合併倍率、同比例、同位深, 但 195 個會變的參數裡有 110 個不同。
(會變的字其實有 203 個,但其中 8 個只是八張表各自重複一次的 mode id —— 那是索引不是設定值,所以扣掉。)

compare比較 with和
—
table表offset偏移 AB

Only the 203 words that vary somewhere across the 70 modes are listed; the 29 always-zero and 20 constant ones cannot differ and are left out.

只列那 203 個「在 70 個模式之間會變」的字; 另外 29 個恆為 0、20 個是常數,不可能有差,所以不列。

The register record is 161 sensor registersregister record 是 161 個感光元件暫存器

The biggest of the eight, and it is not a list of parameters — it is one 8-bit value per sensor register. FUN_c03258c8 walks a record and makes 161 calls to a write helper, and the register addresses are hardcoded in that function, not stored in the table:

八張裡最大的一張,而且它不是一串參數 —— 它是每個感光元件暫存器一個 8-bit 值。FUN_c03258c8 走過一筆記錄, 呼叫 161 次寫入函式,而暫存器位址是寫死在那個函式裡的,不在表裡:

record[mode]   word 0        mode id
               word 1..161   one 8-bit value each

FUN_c03258c8(mode):
    FUN_c0322c70(0x01, record[1])      // register address is a literal
    FUN_c0322c70(0x03, record[2])
    FUN_c0322c70(0x05, record[3])
    ... 161 of them ...
    FUN_c0322c70(0xCE, 0)              // one constant write

FUN_c0322cb0(buf, reg, val):
    buf[0] = reg >> 8 ;  buf[1] = reg ;  buf[2] = val
    // I2C: 16-bit register address, 8-bit valuerecord[mode]   word 0        mode id
               word 1..161   各一個 8-bit 值

FUN_c03258c8(mode):
    FUN_c0322c70(0x01, record[1])      // 暫存器位址是寫死的常數
    FUN_c0322c70(0x03, record[2])
    FUN_c0322c70(0x05, record[3])
    ... 共 161 次 ...
    FUN_c0322c70(0xCE, 0)              // 一次常數寫入

FUN_c0322cb0(buf, reg, val):
    buf[0] = reg >> 8 ;  buf[1] = reg ;  buf[2] = val
    // I2C:16-bit 暫存器位址,8-bit 值
registers暫存器count數量 note說明
0x0001–0x08B7161 every word 1..161 maps to exactly one register, none repeatword 1..161 每一個都對到剛好一個暫存器,沒有重複
high byte 0 / 2 / 4 / 5 / 6 / 7 / 8高位元組 0 / 2 / 4 / 5 / 6 / 7 / 8 34/6/38/42/4/35/2 seven pages of the sensor register space感光元件暫存器空間的七個頁

Most of the varying fields take only two or three distinct values across all 70 modes, which is the signature of a mode class selector rather than a tuned number — the same value repeats for every mode in a raster family. A handful have wider ranges and look more like real timing or gain values.

大部分會變的欄位,在 70 個模式裡只有兩三種值 —— 那是「模式類別選擇器」的特徵,不是調校過的數值:同一個光柵家族的模式共用同一個值。 少數幾個值域比較寬,那些看起來才像真的時序或增益。

150 of the 161 are now decoded. No datasheet was needed. 161 registers × 70 modes is a small enough matrix to attack directly: test every 1/2/3-byte field against every known quantity accepting only relations exact across all 70 modes, then group registers by which modes share a value. The 161 collapse to just 24 distinct patterns, 29 of them constant — so there is far less freedom here than the raw count suggests.
161 個裡已經解出 150 個。沒有用到任何 datasheet。 161 個暫存器 × 70 個模式是一個夠小的矩陣,可以直接硬解:把每一個 1/2/3 位元組的欄位 拿去對每一個已知量,只接受在 70 個模式上全部成立的關係;再依「哪些模式共用同一個值」 把暫存器分群。161 個最後只剩 24 種不同的分群樣式,其中 29 個還是常數 —— 所以這裡的自由度,比「161 個」這個數字看起來小得多。

Frame geometry and timing are not in these registers at all. The search found no encoding of hmax, tail, vmax, width or height, in any byte order, at any width. These 161 are analogue and readout configuration; the geometry is programmed somewhere else.

幀幾何與時序根本不在這 161 個暫存器裡。不管用哪種位元組序、幾個位元組去湊, 都找不到 hmax、tail、vmax、寬、高的編碼。這 161 個是類比與讀出的組態,幾何是別的路徑寫的。

register(s)暫存器 n個 what it does做什麼
0x001C1merge select: 5=1×, 3=2×, 2=3×合併選擇:5=1×、3=2×、2=3×
0x0717 group群92 × merge factor — literally 2/4/62 × 合併倍率 —— 就是 2/4/6
0x00581merged or not: 32=no, 112=yes有沒有合併:32=沒有、112=有
0x00161vblank ÷ 2, exactly — 7→14, 15→30, 25→50, 35→70, 50→100正好是 vblank 的一半 —— 7→14、15→30、25→50、35→70、50→100
0x00011mode class = merge × depth: 41=1×/14-bit, 42=1×/12-bit, 57=2×/12-bit, 47/48=3×/12-bit模式類別 = 合併 × 位深:41=1×/14-bit、42=1×/12-bit、57=2×/12-bit、47/48=3×/12-bit
0x0042 … 0x06D910bit depth, 12 vs 14 — e.g. 0x0525=16/17, 0x0575=18/16位深,12 對 14 —— 例如 0x0525=16/17、0x0575=18/16
0x0062 group群50fast-readout switch: 16 when hmax ≤ 395, 0 when hmax ≥ 445 — a clean threshold with no overlap高速讀出開關:hmax ≤ 395 時是 16,≥ 445 時是 0 —— 乾淨的門檻,兩邊完全不重疊
0x007E group群21readout speed tier: 60 (hmax 330–395), 70 (445–450), 96 (911, all 1× and 14-bit)讀出速度檔位:60(hmax 330–395)、70(445–450)、96(911,全是 1× 且 14-bit)
0x0085 group群5follows the same speed split跟著同一組速度分檔
0x0005 0x0716 0x0722 0x072421track the frame-height tier跟著畫面高度的檔位
0x00891covaries with the metadata fingerprint與 metadata 的指紋欄位共變
29 registers29 個暫存器29identical in all 70 modes70 個模式完全相同
Still open (11): 0x0003 0x0022 0x0023 0x0024 0x0025 0x0056 0x0057 0x008A 0x0726 0x0790 0x079C. 0x0003 is a flag on exactly 9 modes and 0x0022–0x0025 are zero on the other 61, so those five are one feature switched on together.還沒解的 11 個:0x0003 0x0022 0x0023 0x0024 0x0025 0x0056 0x0057 0x008A 0x0726 0x0790 0x079C。0x0003 只有 9 個模式是 1,而其餘 61 個模式的 0x0022–0x0025 全是 0,所以這五個是同一個功能、一起開關的。
This corrects what this page said before: 98 and 117 do not differ in their merge settings. All 78 differing registers sit in readout-speed groups — 50 in the fast-readout group, 21 in the speed tier, 5 in the third speed group, plus vblank and the fingerprint. Every merge register — 0x001C, the 0x0717 group, 0x0058 — is identical between them. Same raster, same merge tuple, same bit depth; what differs is hmax 445 → 330, so 98 reads out at normal speed and 117 in the fast tier.

And for Open Gate, CRCT is ruled out. CRCT is not one chain — it is a static eight-branch selector (FUN_c0325228), and across the 306 PARAM profiles only three branches are ever taken:
So an Open Gate frame really is the sensor output untouched, and whatever differs between 98 and 117 on an Open Gate clip comes from the sensor — but that is a statement about p43's branch, not about CRCT as a whole.
這裡要更正這一頁先前寫的東西:98 跟 117 的差別不在合併設定。 那 78 個不同的暫存器全部落在讀出速度相關的群裡 —— 50 個在高速讀出群、21 個在速度檔位群、5 個在第三個速度群,再加上 vblank 和指紋。 而所有合併暫存器(0x001C、0x0717 群、0x0058) 兩者完全一樣。
同光柵、同合併倍率、同位深,差的是 hmax 從 445 變成 330 —— 98 用常速讀出,117 用高速檔。

而且就 Open Gate 而言,CRCT 可以排除。 CRCT 不是一條鏈,而是一個靜態的八分支選擇器(FUN_c0325228); 306 個 PARAM profile 裡只走得到三條:
所以 Open Gate 的畫面確實就是感光元件輸出的原樣, 在 Open Gate 下 98 跟 117 的差異也只可能來自感光元件 —— 但這句話講的是 p43 走的那一支,不是整個 CRCT。
This also closes an open question in the pixel-merge measurement. Shot noise gave measured merge counts: stock FHD averages 8.53 sensor photosites per output pixel, the OG2K build only 4.10. That note could not say at which stage the merging happened. It can now: stock FHD is mode 106 (2× sensor merge, 4 photosites) followed by RWZM ÷1.5625 in p133–136, which multiplies the per-axis count by 1.5625 → (2 × 1.5625)² = 9.77, against 8.53 measured. OG2K is mode 139 at RWZM unity, so it keeps only what the sensor gives: 4, against 4.10 measured. The merging is sensor + RWZM, in two stages, with CRCT contributing nothing.
這順便解掉了像素合併量測那份筆記裡的一個未決。 散粒雜訊量出來的合併數是:原廠 FHD 每個輸出像素平均了 8.53 個感光點, OG2K build 只有 4.10。那份筆記當時說不出合併是在哪一級發生的。
現在可以了:原廠 FHD 是 mode 106(感光元件 2× 合併 = 4 個點)之後再走 p133–136 的 RWZM ÷1.5625,每軸再乘 1.5625 ⇒ (2 × 1.5625)² = 9.77,實測 8.53。
OG2K 是 mode 139 且 RWZM 是 unity,所以感光元件給多少就是多少: 4,實測 4.10。
所以合併是感光元件 + RWZM 兩級做的,CRCT 完全沒有參與。
A guess that was tested and failed. The 9 modes with 0x0003=1 all run at exact broadcast rates (29.97, 25, 23.98, 119.88, 100, 59.93), which looked like a “precise frame rate” flag. It is not: 45 of the 61 modes with 0x0003=0 are also within 0.2 % of a broadcast rate. Recorded so it is not re-guessed.
一個試過、但不成立的猜測。0x0003=1 的那 9 個模式, 真實格率全都是標準廣播格率(29.97、25、23.98、119.88、100、59.93),看起來很像 「精確格率」旗標。但它不是:0x0003=0 的 61 個模式裡, 有 45 個也落在標準格率的 0.2 % 以內。寫下來,免得以後又猜一次。

Timing — solved時序 — 解開了

Frame rate and rolling shutter come from hmax, vmax and a tail value, not from the metadata field. The timing table is the descriptor's first pointer: 0xC0B59500, 70 records of 0x20 bytes, indexed by the same row number as metadata — all 70 rows carry a matching mode id.

格率和捲簾時間來自 hmax、vmax 跟一個 tail 值, 不是來自 metadata 那個欄位。時序表是描述子的第一個指標: 0xC0B59500,70 筆,每筆 0x20 bytes, 用跟 metadata 相同的列號索引 —— 70 筆的 mode id 全部對得上。

+0x00   mode id
+0x04   hmax, tail          two u16
+0x08   vmax, ?             two u16

frame period   hmax x (vmax-1) + tail   cycles @ 72 MHz
rolling        hmax x height / 72 MHz+0x00   mode id
+0x04   hmax, tail          兩個 u16
+0x08   vmax, ?             兩個 u16

每幀週期  hmax x (vmax-1) + tail   個時脈 @ 72 MHz
捲簾      hmax x 高度 / 72 MHz

Checked against every rolling-shutter and frame-rate figure the project had recorded independently — nine of them, across six modes:

拿專案裡所有獨立記錄過的捲簾與格率數字來對 —— 九個,橫跨六個模式:

modecomputed here這裡算出來 recorded elsewhere別處記錄的
123.080 ms · 239.7602 fps3.08 ms · 239.760240 fps
86.160 ms6.16 ms
1398.307 ms8.31 ms
9812.435 ms12.44 ms
324.982 ms · 29.9736 fps24.98 ms · 29.97 fps
12124.9997 fps24.9997 fps
9739.1572 fps39.16 fps
019.1273 fps19.13 fps
10610.556 ms10.556 ms
What went wrong the first time. This table was written up as unsolvable a day earlier. The stride was taken as 0x40 — exactly two records — which made a walk outward skip every other entry, produce an id list that covered only half the modes, and run past the end into the metadata table. The descriptor settles it without guessing: its first two {pointer, count} pairs are {0xC0B59500, 70} and {0xC0B59DC0, 70}, and the gap between them is exactly 70 × 0x20.
前一天為什麼弄錯。這張表在一天前被寫成「解不開」。 當時把 stride 當成 0x40 —— 剛好是兩筆的長度 —— 於是往外走時每次都跳過一筆,湊出來的 id 只涵蓋一半的模式,而且還會走過頭撞進 metadata 表。
描述子不用猜就能定案:它前兩個 {指標, 筆數} 是 {0xC0B59500, 70} 和 {0xC0B59DC0, 70}, 而兩者的間距剛好是 70 × 0x20。

What is still open還沒解的部分

Sources出處

Every number on this page is read directly out of the Ver.5.02 image at the addresses given. The field names for +0x5C and +0x60, and the mode-12 timing decode, come from the HSW investigation; the RAW14 identification that fixes the polarity of +0x3C comes from the sensor-mode work. Where this page says a field is unknown, that is the current state and not a summary of someone else's conclusion.

這頁的每一個數字,都是在上面給的位址直接從 Ver.5.02 映像讀出來的。 +0x5C 與 +0x60 的欄位名稱、以及 mode 12 的時序解讀,來自 HSW 的調查; 把 +0x3C 極性定下來的 RAW14 判定,來自感光元件模式的研究。
這頁說某個欄位「不知道」的地方,就是目前真的不知道,不是在轉述別人的結論。