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 種模式。
0xC0B59DC0: 70 records of 0x64 bytes, 25 words each.0xC0B59DC0:70 筆,每筆 0x64 bytes、25 個字。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位址 | stridestride | u32 | vary會變 | what it holds裝什麼 |
|---|---|---|---|---|---|
| timing | 0xC0B59500 | 0x20 | 8 | 5 | hmax, tail, vmax → frame rate and rolling shutterhmax、tail、vmax → 格率與捲簾 |
| metadata | 0xC0B59DC0 | 0x64 | 25 | 21 | geometry, nominal fps, merge, crop幾何、標稱格率、合併、裁切 |
| C | 0xC0B5B918 | 0x08 | 2 | 2 | a class number 2–7, then the mode id一個 2–7 的類別號,然後 mode id |
| D | 0xC0B5BB48 | 0x28 | 10 | 6 | four packed u16 pairs and a 20/60/120四組 packed u16,和一個 20/60/120 |
| E | 0xC0B5C638 | 0x38 | 14 | 9 | large packed values, unexplained大的 packed 數值,沒解釋 |
| F | 0xC0B5D588 | 0x14 | 5 | 2 | one 0x1xxxx-shaped flag一個 0x1xxxx 形狀的旗標 |
| G | 0xC0B5DB00 | 0x68 | 26 | 25 | a second mode id, and 6064/4042 on some rows另一個 mode id,某些列有 6064/4042 |
| register | 0xC0B5FDAC | 0x288 | 162 | 133 | 161 sensor register values; addresses live in FUN_c03258c8161 個感光元件暫存器的值;位址在 FUN_c03258c8 裡 |
| total總計 | 252 | 203 |
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 在走。
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 個模式上分別是什麼值。
| register暫存器 | what it controls管什麼 | values幾種值 | distribution across the 70 modes在 70 個模式上的分布 | moves with共變 |
|---|
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 就是不知道。
+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+0x0C/+0x10.
70 筆全部是 0,形狀跟 +0x0C/+0x10 一樣。
always 0
全部是 0Sort 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 個沒有一個是合併暫存器。要並排比較兩個模式,用下面的比較兩個模式。
| modemode | raster光柵 | rel.相對 | aspect比例 | merge合併 | bits位深 | fps格率 | roll ms捲簾 ms | nom標稱 | output crop輸出裁切 | readout讀出 | vblankvblank | fp指紋 |
|---|
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 ——
那是索引不是設定值,所以扣掉。)
| table表 | offset偏移 | A | B |
|---|
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 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–0x08B7 | 161 | 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 個模式裡只有兩三種值 —— 那是「模式類別選擇器」的特徵,不是調校過的數值:同一個光柵家族的模式共用同一個值。 少數幾個值域比較寬,那些看起來才像真的時序或增益。
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做什麼 |
|---|---|---|
0x001C | 1 | merge select: 5=1×, 3=2×, 2=3×合併選擇:5=1×、3=2×、2=3× |
0x0717 group群 | 9 | 2 × merge factor — literally 2/4/62 × 合併倍率 —— 就是 2/4/6 |
0x0058 | 1 | merged or not: 32=no, 112=yes有沒有合併:32=沒有、112=有 |
0x0016 | 1 | vblank ÷ 2, exactly — 7→14, 15→30, 25→50, 35→70, 50→100正好是 vblank 的一半 —— 7→14、15→30、25→50、35→70、50→100 |
0x0001 | 1 | mode 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 … 0x06D9 | 10 | bit depth, 12 vs 14 — e.g. 0x0525=16/17, 0x0575=18/16位深,12 對 14 —— 例如 0x0525=16/17、0x0575=18/16 |
0x0062 group群 | 50 | fast-readout switch: 16 when hmax ≤ 395, 0 when hmax ≥ 445 — a clean threshold with no overlap高速讀出開關:hmax ≤ 395 時是 16,≥ 445 時是 0 —— 乾淨的門檻,兩邊完全不重疊 |
0x007E group群 | 21 | readout 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群 | 5 | follows the same speed split跟著同一組速度分檔 |
0x0005 0x0716 0x0722 0x0724 | 21 | track the frame-height tier跟著畫面高度的檔位 |
0x0089 | 1 | covaries with the metadata fingerprint與 metadata 的指紋欄位共變 |
| 29 registers29 個暫存器 | 29 | identical 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,所以這五個是同一個功能、一起開關的。 | ||
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.
FUN_c0325228), and across the
306 PARAM profiles only three branches are ever taken:
CrctHbin2ToBufA, the second horizontal binning
stage.0x001C、0x0717 群、0x0058)
兩者完全一樣。FUN_c0325228);
306 個 PARAM profile 裡只走得到三條:
CrctHbin2ToBufA,也就是第二級水平 binning。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 % 以內。寫下來,免得以後又猜一次。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:
拿專案裡所有獨立記錄過的捲簾與格率數字來對 —— 九個,橫跨六個模式:
| mode | computed here這裡算出來 | recorded elsewhere別處記錄的 |
|---|---|---|
| 12 | 3.080 ms · 239.7602 fps | 3.08 ms · 239.760240 fps |
| 8 | 6.160 ms | 6.16 ms |
| 139 | 8.307 ms | 8.31 ms |
| 98 | 12.435 ms | 12.44 ms |
| 3 | 24.982 ms · 29.9736 fps | 24.98 ms · 29.97 fps |
| 121 | 24.9997 fps | 24.9997 fps |
| 97 | 39.1572 fps | 39.16 fps |
| 0 | 19.1273 fps | 19.13 fps |
| 106 | 10.556 ms | 10.556 ms |
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.0x40 —— 剛好是兩筆的長度 ——
於是往外走時每次都跳過一筆,湊出來的 id 只涵蓋一半的模式,而且還會走過頭撞進 metadata 表。{指標, 筆數} 是
{0xC0B59500, 70} 和 {0xC0B59DC0, 70},
而兩者的間距剛好是 70 × 0x20。+0x0C/+0x10 and +0x1C/+0x20 are for. They are
zero in every record, so nothing can be inferred from the data alone.+0x0C/+0x10 和 +0x1C/+0x20 是做什麼的。它們在每一筆裡都是 0,所以光看資料推不出任何東西。+0x5C and +0x60 are named from one mode's
investigation and have not been verified across the table.+0x5C 跟 +0x60 的名字來自單一模式的調查,沒有在整張表上驗證過。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 判定,來自感光元件模式的研究。
這頁說某個欄位「不知道」的地方,就是目前真的不知道,不是在轉述別人的結論。