Files
MiPi_TEST/__pycache__/proto_decoder.cpython-312.pyc

250 lines
34 KiB
Plaintext
Raw Normal View History

2026-04-24 15:24:27 +01:00
<EFBFBD>
2026-04-27 13:58:09 +01:00
e<><65>i<EFBFBD>|<00> <00><><00>dZddlZddlZddlZddlmZddlZee<08>jdz Z
2026-04-24 15:24:27 +01:00
dZ dZ dZ dZe ed zze zZd
Zd
ZeezezZd Zd Zd
2026-04-27 13:58:09 +01:00
Zd ZdZdZdZdZdZdefd<13>Zdedefd<16>Zdedefd<17>Zd.d<18>Z d/d<19>Z! d0d<1A>Z"d<1B>Z#d<1C>Z$d<1D>Z%d1dedede&fd<1F>Z'd1dedede&fd <20>Z(d2d!ed"eded#efd$<24>Z)d2d!ed"eded#efd%<25>Z*d3d&e+d'ed(e,fd)<29>Z-d*e,dzd(e,fd+<2B>Z.d,<2C>Z/e0d-k(re/<2F>yy)4aN
2026-04-24 15:24:27 +01:00
proto_decoder.py
Decodes DSI packet content from proto (differential) captures.
Usage:
python3 proto_decoder.py [--cap CAP_NUM] [--dir DATA_DIR] [--compare]
The proto_*_clk and proto_*_dat captures are Ch1-Ch2 and Ch3-Ch4 differential
waveforms at ~50-80 ps/sample. CLK runs continuously at ~215 MHz (430 Mbps DDR).
DAT carries MIPI D-PHY HS data, sampled on both CLK edges.
Decodes:
- DSI long packet header: DI (data type / virtual channel), word count, ECC
- First N payload bytes on lane 0
- Compares two captures to spot differing byte positions (data-shift detection)
2026-04-27 13:58:09 +01:00
<EFBFBD>N)<01>Path<74>dataii <00><00><00><00><00>><00>!<00><><00>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g<00>?)<03><><00>3<00><><00>pathc<00>T<00>tj|d<01><02>}|dd<00>df|dd<00>dffS)N<>,)<01> delimiterrr)<02>np<6E>
genfromtxt)rrs <20>2/home/david-rice/Python/MiPi_Test/proto_decoder.py<70>load_csvrJs-<00><00> <0A>=<3D>=<3D><14><13> -<2D>D<EFBFBD> <0F><01>1<EFBFBD><04>:<3A>t<EFBFBD>A<EFBFBD>q<EFBFBD>D<EFBFBD>z<EFBFBD> !<21>!<21><00>cap_num<75>data_dirc<00>N<00>t|d|d<02>d<03>z <00>}t|d|d<02>d<04>z <00>}ttj|<02><00>}ttj|<03><00>}|std|d<02>d|<01><00><04><00>|std|d<02>d|<01><00><04><00>t |d<00>t |d<00>fS) Nz*_proto_<6F>04d<34>_clk.csv<73>_dat.csvz No proto CLK file found for cap <20> in z No proto DAT file found for cap <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><05>str<74>sorted<65>glob<6F>FileNotFoundErrorr<00>rr<00> pattern_clk<6C> pattern_dat<61> clk_files<65> dat_filess r<00>find_proto_filesr+Os<><00><00><15>h<EFBFBD>8<EFBFBD>G<EFBFBD>C<EFBFBD>=<3D><08>!A<>A<>B<>K<EFBFBD><15>h<EFBFBD>8<EFBFBD>G<EFBFBD>C<EFBFBD>=<3D><08>!A<>A<>B<>K<EFBFBD><16>t<EFBFBD>y<EFBFBD>y<EFBFBD><1B>-<2D>.<2E>I<EFBFBD><16>t<EFBFBD>y<EFBFBD>y<EFBFBD><1B>-<2D>.<2E>I<EFBFBD> <14><1F>"B<>7<EFBFBD>3<EFBFBD>-<2D>t<EFBFBD>T\<5C>S]<5D> ^<5E>_<>_<> <14><1F>"B<>7<EFBFBD>3<EFBFBD>-<2D>t<EFBFBD>T\<5C>S]<5D> ^<5E>_<>_<> <0F> <09>"<22> <0A> <1E><04>Y<EFBFBD>r<EFBFBD>]<5D> 3<> 3<>3rc<00>N<00>t|d|d<02>d<03>z <00>}t|d|d<02>d<04>z <00>}ttj|<02><00>}ttj|<03><00>}|std|d<02>d|<01><00><04><00>|std|d<02>d|<01><00><04><00>t |d<00>t |d<00>fS) Nz*_lp_rrrzNo LP CLK file found for cap rzNo LP DAT file found for cap r r!r&s r<00> find_lp_filesr-[s<><00><00><15>h<EFBFBD>5<EFBFBD><17><13> <0A>X<EFBFBD>!><3E>><3E>?<3F>K<EFBFBD><15>h<EFBFBD>5<EFBFBD><17><13> <0A>X<EFBFBD>!><3E>><3E>?<3F>K<EFBFBD><16>t<EFBFBD>y<EFBFBD>y<EFBFBD><1B>-<2D>.<2E>I<EFBFBD><16>t<EFBFBD>y<EFBFBD>y<EFBFBD><1B>-<2D>.<2E>I<EFBFBD> <14><1F>"?<3F><07><03>}<7D>D<EFBFBD>QY<51>PZ<50> [<5B>\<5C>\<5C> <14><1F>"?<3F><07><03>}<7D>D<EFBFBD>QY<51>PZ<50> [<5B>\<5C>\<5C> <0F> <09>"<22> <0A> <1E><04>Y<EFBFBD>r<EFBFBD>]<5D> 3<> 3<>3rc<00><><00>ttjtj|<00><00><00>dz}t dt d|z <00><00>}tj tj||kDjt
2026-04-24 15:24:27 +01:00
<00><00><00>d}t|<05>dkr6tjgt
<00><06>tjgt
<00><06>fStjdgtj|<05>|kDf<02>}||}||kDjt
<00>}|tj|<07>|dkD}|tj|<07>|dk} || fS)z<>
Return arrays of (rising_indices, falling_indices) in the CLK trace.
Filters out glitches: only keeps transitions separated by at least 1 ns.
2026-04-27 13:58:09 +01:00
<20>e<><65>Ar<00><00>?r<00><00><01>dtypeT) <0B>floatr<00>median<61>diff<66>max<61>int<6E>where<72>astype<70>len<65>array<61> concatenate)
2026-04-24 15:24:27 +01:00
<EFBFBD>t_clk<6C>v_clk<6C> threshold<6C>dt_ns<6E>min_gap<61> crossings<67>keep<65>level<65>rising<6E>fallings
2026-04-27 13:58:09 +01:00
r<00>find_clock_edgesrHks<00><00>
2026-04-24 15:24:27 +01:00
<12>"<22>)<29>)<29>B<EFBFBD>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>+<2B> ,<2C>s<EFBFBD> 2<>E<EFBFBD><11>!<21>S<EFBFBD><13>u<EFBFBD><1B>%<25>&<26>G<EFBFBD><12><08><08><12><17><17>%<25>)<29>"3<>!;<3B>!;<3B>C<EFBFBD>!@<40>A<>B<>1<EFBFBD>E<>I<EFBFBD>
2026-04-27 13:58:09 +01:00
<EFBFBD>9<EFBFBD>~<7E><01><19><11>x<EFBFBD>x<EFBFBD><02>#<23>&<26><02><08><08><12>3<EFBFBD>(?<3F>?<3F>?<3F> <0E>><3E>><3E>D<EFBFBD>6<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD>9<EFBFBD>#5<><07>#?<3F>@<40> A<>D<EFBFBD><19>$<24><0F>I<EFBFBD> <12>Y<EFBFBD> <1E> &<26> &<26>s<EFBFBD> +<2B>E<EFBFBD><17><02><07><07><05><0E>y<EFBFBD>1<>A<EFBFBD>5<>6<>F<EFBFBD><17><02><07><07><05><0E>y<EFBFBD>1<>A<EFBFBD>5<>6<>G<EFBFBD> <11>7<EFBFBD>?<3F>rc <00>x<00>ttjtj|<00><00><00>dz}t |<01>}|rvt dt d|z <00><00>}d}d} t|<06>D]}
||
tkr|dz }<08>||k\r|
} nd}<08>!| <09>*t dt d|z <00><00>} t| | z|dz
<00>Syd} t dt d|z <00><00>}|d z} d}d} t| |<06>D]}
||
| kr|dz }<08>||k\r|
} nd}<08>| <09>*t dt d
|z <00><00>} t| | z|dz
<00>St dt d |z <00><00>}t d t d |z <00><00>}tjt|<06>D<00>
cgc]%}
|t d|
|z
<00>|
dzj<00><00><02>'c}
<EFBFBD>}d}d}t d t d
|z <00><00>}d}d}t|<10>D]\}
}||kr|dz }||k\s<01>|
}<14>d}<15>|<14>yd}d}t|t |<10><00>D]!}
||
|k\r|<17>|
}|dz }||k\s<01>|cSd}d}<15>#ycc}
w)u
2026-04-24 15:24:27 +01:00
Find the start of the post-LP HS burst in the DAT trace.
2026-04-27 13:58:09 +01:00
single_ended=True — LP files (CH1=CLK+, CH3=DAT0+): detects LP-01/LP-00
as DAT+ < LP_SE_LP01_THRESH_V for ≥ 20 ns, then returns
index 50 ns after the plateau ends (HS common-mode rise).
Search starts at index 0 — LP-11 pre-trigger (~1.2 V)
is well above the threshold so no false matches.
single_ended=False — Proto files (F2=CH3-CH4 differential): LP-01 detected
as diff < -0.5 V for ≥ 20 ns, search from N//4.
2026-04-24 15:24:27 +01:00
2026-04-27 13:58:09 +01:00
Returns index into t_dat just past the SoT preamble, ready for CLK-edge sampling.
Falls back to rolling-std method for HS-triggered captures (differential only).
r/r1g4@rNrgI@g<00><>rgi@r0<00>g@g{<14>G<EFBFBD>z<EFBFBD>?g{<14>G<EFBFBD>z<EFBFBD>?) r4rr5r6r;r7r8<00>range<67>LP_SE_LP01_THRESH_V<5F>minr<<00>std<74> enumerate)<18>t_dat<61>v_datr><00> window_ns<6E> single_endedrA<00>N<>min_lp01<30>run<75>lp01_end<6E>i<>skip<69> LP01_THRESH<53> search_from<6F>win<69>min_run<75>rstd<74>
OSC_THRESH<EFBFBD> QUIET_THRESH<53> quiet_min_run<75> quiet_end<6E>run_len<65>std_val<61> run_starts r<00> find_hs_startrf<00>s<><00><00> <12>"<22>)<29>)<29>B<EFBFBD>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>+<2B> ,<2C>s<EFBFBD> 2<>E<EFBFBD> <0B>E<EFBFBD>
<EFBFBD>A<EFBFBD><14><16>q<EFBFBD>#<23>d<EFBFBD>U<EFBFBD>l<EFBFBD>+<2B>,<2C><08><0F><03><17><08><16>q<EFBFBD><18> <18>A<EFBFBD><14>Q<EFBFBD>x<EFBFBD>-<2D>-<2D><13>q<EFBFBD><08><03><16>(<28>?<3F> <20>H<EFBFBD><19><17><03> <18> <14> <1F><16>q<EFBFBD>#<23>d<EFBFBD>U<EFBFBD>l<EFBFBD>+<2B>,<2C>D<EFBFBD><16>x<EFBFBD>$<24><EFBFBD><01>A<EFBFBD><05>.<2E> .<2E><13><18>K<EFBFBD><16>q<EFBFBD>#<23>d<EFBFBD>U<EFBFBD>l<EFBFBD>+<2B>,<2C>H<EFBFBD><14><01>6<EFBFBD>K<EFBFBD>
<0B>C<EFBFBD><13>H<EFBFBD> <12>;<3B><01> "<22><14><01> <10><11>8<EFBFBD>k<EFBFBD> !<21> <0F>1<EFBFBD>H<EFBFBD>C<EFBFBD><12>h<EFBFBD><EFBFBD><1C><08><15><13>C<EFBFBD><14><10><1B><12>1<EFBFBD>c<EFBFBD>%<25>%<25>-<2D>(<28>)<29><04><12>8<EFBFBD>d<EFBFBD>?<3F>A<EFBFBD><01>E<EFBFBD>*<2A>*<2A><12>!<21>S<EFBFBD><13>u<EFBFBD><1B>%<25>&<26>C<EFBFBD><11>!<21>S<EFBFBD><13>u<EFBFBD><1B>%<25>&<26>G<EFBFBD><10>h<EFBFBD>h<EFBFBD>E<EFBFBD>!<21>H<EFBFBD>M<>q<EFBFBD><05>c<EFBFBD>!<21>Q<EFBFBD><13>W<EFBFBD>o<EFBFBD>a<EFBFBD>!<21>e<EFBFBD>4<>8<>8<>:<3A>M<>N<>D<EFBFBD><17>J<EFBFBD><17>L<EFBFBD><17><01>3<EFBFBD>u<EFBFBD>u<EFBFBD>}<7D>-<2D>.<2E>M<EFBFBD><14>I<EFBFBD><11>G<EFBFBD><1F><04>o<EFBFBD><18>
<EFBFBD><01>7<EFBFBD> <12>\<5C> !<21> <13>q<EFBFBD>L<EFBFBD>G<EFBFBD><16>-<2D>'<27><1D> <09><17>G<EFBFBD> <18><11><18><13><14>I<EFBFBD><11>G<EFBFBD> <12>9<EFBFBD>c<EFBFBD>$<24>i<EFBFBD> (<28> <1A><01> <0F><01>7<EFBFBD>j<EFBFBD> <20><18> <20><1D> <09> <13>q<EFBFBD>L<EFBFBD>G<EFBFBD><16>'<27>!<21> <20> <20><1C>I<EFBFBD><19>G<EFBFBD> <1A> <10><>=Ns<00>=*H7c
<00>$<00>|<05>t}|<06>d}||}t|||<06><02>\}} tjtj|| g<02><00>}
||
|k\} |
| } t | <0C>dk(rgSt tjtj|<00><00><00>dz} g}| D]k}||}tt||dz
| dzz <00><00>}tdt|t |<01>dz
<00><00>}|||kDrdnd}|j|dz|f<02><00>m|S)a 
2026-04-24 15:24:27 +01:00
Sample DAT on every CLK edge (DDR) after hs_start_idx.
2026-04-27 13:58:09 +01:00
dat_thresh: voltage threshold for bit decisions on DAT (default: DAT_THRESH_V).
clk_thresh: voltage threshold for CLK edge detection (default: 0.0).
2026-04-24 15:24:27 +01:00
Returns list of (time_ns, bit) tuples.
2026-04-27 13:58:09 +01:00
r )r@rr/g<><67>&<26> .>r)<0E> DAT_THRESH_VrHr<00>sortr=r;r4r5r6r8<00>roundr7rM<00>append)rPrQr>r?<00> hs_start_idx<64>
dat_thresh<EFBFBD>
clk_thresh<EFBFBD>t_hsrFrG<00> all_edges<65>hs_mask<73>hs_edges<65>dt_dat<61>bits<74>edge_idx<64>t_edge<67>dat_idx<64>bits r<00> decode_bitsry<00>s#<00><00><12><19>!<21>
<EFBFBD><11><19><18>
<EFBFBD> <10><1C> <1E>D<EFBFBD>&<26>u<EFBFBD>e<EFBFBD>z<EFBFBD>J<>O<EFBFBD>F<EFBFBD>G<EFBFBD><12><07><07><02><0E><0E><06><07>'8<>9<>:<3A>I<EFBFBD><15>i<EFBFBD> <20>D<EFBFBD>(<28>G<EFBFBD><19>'<27>"<22>H<EFBFBD>
<EFBFBD>8<EFBFBD>}<7D><01><19><11> <09> <12>2<EFBFBD>9<EFBFBD>9<EFBFBD>R<EFBFBD>W<EFBFBD>W<EFBFBD>U<EFBFBD>^<5E>,<2C> -<2D><03> 3<>F<EFBFBD> <0A>D<EFBFBD><1C>)<29><08><16>x<EFBFBD><1F><06><15>e<EFBFBD>V<EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD>.<2E>6<EFBFBD>D<EFBFBD>=<3D>A<>B<>C<><07><15>a<EFBFBD><13>W<EFBFBD>c<EFBFBD>%<25>j<EFBFBD>1<EFBFBD>n<EFBFBD>5<>6<><07><18><17>><3E>J<EFBFBD>.<2E>a<EFBFBD>A<EFBFBD><03> <0C> <0B> <0B>V<EFBFBD>c<EFBFBD>\<5C>3<EFBFBD>'<27>(<28> )<29> <10>Krc<00><><00><06>g}tdt|<00>dz
2026-04-24 15:24:27 +01:00
d<03>D]S}|||dzD<00><03>cgc]\}}|<04><02> c}}<03>t<00>fd<04>td<03>D<00><00>}|j||d|f<02><00>U|Scc}}w)z|
Pack bits into bytes (LSB first, as MIPI D-PHY transmits).
Returns list of (time_ns_of_first_bit, byte_value).
2026-04-27 13:58:09 +01:00
r<00>rc3<00>.<00>K<00>|] }<01>||z<00><01><00>y<00>w)N<>)<03>.0<EFBFBD>j<> byte_bitss <20>r<00> <genexpr>z bits_to_bytes.<locals>.<genexpr>s<00><><00><><00>6<><01>)<29>A<EFBFBD>,<2C>!<21>#<23>6<>s<00>)rKr;<00>sumrk)rt<00>resultrX<00>_<>b<>valr<6C>s @r<00> bits_to_bytesr<73>s<><00><><00>
2026-04-24 15:24:27 +01:00
<10>F<EFBFBD> <12>1<EFBFBD>c<EFBFBD>$<24>i<EFBFBD>!<21>m<EFBFBD>Q<EFBFBD> '<27>)<29><01>#'<27><01>!<21>a<EFBFBD>%<25>=<3D>1<>4<EFBFBD>1<EFBFBD>a<EFBFBD>Q<EFBFBD>1<> <09><11>6<>U<EFBFBD>1<EFBFBD>X<EFBFBD>6<>6<><03><0E> <0A> <0A>t<EFBFBD>A<EFBFBD>w<EFBFBD>q<EFBFBD>z<EFBFBD>3<EFBFBD>'<27>(<28>)<29> <12>M<EFBFBD><4D>2s<00> A5c<00>J<00>t|<00>D]\}\}}|tk(s<01>|cSy)z<>
Search for the MIPI D-PHY HS sync byte (0xB8) in the decoded byte stream.
The sync byte precedes all data bytes in each HS burst.
Returns index into raw_bytes of the sync byte, or None.
2026-04-27 13:58:09 +01:00
N)rO<00> HS_SYNC_BYTE)<04> raw_bytesrXr<><00>byte_vals r<00>find_sync_byter<65>"s3<00><00> &<26>i<EFBFBD>0<><15><18><01>=<3D>A<EFBFBD>x<EFBFBD> <13>|<7C> #<23><14>H<EFBFBD><15> rc <00>z<00>|sy|d}|dz dz}|dz}dddd d
2026-04-24 15:24:27 +01:00
d d d d<0E>j|d|d<10>d<11><03>}||||d<12>S)z<>
Parse a DSI long packet header from lane-0 perspective.
Lane 0 carries: [DI, then payload bytes 0, 4, 8, ...]
The WC and ECC bytes are on lanes 1-3 (not captured here).
Returns dict with DI interpretation.
Nr<00><00><00>?zVSS (V-Sync Start)zVSE (V-Sync End)zHSS (H-Sync Start)zHSE (H-Sync End)zEOT (End of Transmission)zRGB888 (long packet, 24bpp)z"Packed RGB888 (long packet, 24bpp)zGeneric long write)r<00>r
2026-04-27 13:58:09 +01:00
<00>1r<00>9r <00>)z unknown (0x<30>02X<32>))<04>DI_raw<61>VC<56>DT<44>DT_name)<01>get)<05> payload_bytes<65>di<64>vc<76>dt<64>dt_names r<00>parse_long_packet_headerr<72>.s<><00><00> <19><13> <16>q<EFBFBD> <19>B<EFBFBD> <0E>!<21>G<EFBFBD>t<EFBFBD> <1B>B<EFBFBD> <0A><04>9<EFBFBD>B<EFBFBD>$<24>!<21>#<23>!<21>*<2A>+<2B>2<>"<22> <06>
<EFBFBD>c<EFBFBD>"<22> <0B>B<EFBFBD>s<EFBFBD>8<EFBFBD>1<EFBFBD>%<25>&<26> <0C><15><14><14><1A>  <06>r<00>verbosec <00><><00>t||<01>\}}|r6tdd<02><00><02>td|d<04>d|j<00><00><04>td<02><00>t|<03>\}}t|<04>\}}t t j t j|<07><00><00>dz} |r3td|dd zd
2026-04-24 15:24:27 +01:00
<EFBFBD>d |d d zd
<EFBFBD>d t|<07><00>d| dzd<10>d<11> <09>t||<08>}
|
<EFBFBD>|r td<13>y||
dz} |d dz} | | z
dz } |rtd| d<10>d| d<17>d<18><05>t|||||
2026-04-27 13:58:09 +01:00
<EFBFBD>}|r'tdt|<0E><00>dt|<0E>dz<00>d<1C><05>t|<0E>dkr|r td<1E>yd}d}d}t|<0E>}td<1B>D],}t||d<00>}t|<14>}|<15><01>||ks<01>%|}|}|}|}<10>.|<0F> t|<0E>}|<10>|rtdtd <20>d!<21><03>d}n |r||d}td"|<10>d#|d<10>d$|<11>d%<25><07>||d&zd}t|ddD<00><18>cgc]\}}|<19><02> c}}<18>}|r3|r1td'<27>td(|d)d <20>d*|d+<00>d,|d-d <20>d.|d/<00>d%<25> <09>|d&dD<00><18>cgc]\}}|<19><02> }}}|<02>r"t|<1B>}|t zt"dzz}td0|<1C>d1|<1D>d2<64><05>|dk\r9d3j%d4<64>|dd5D<00><00>}td6|<1E><00><02>|d5kDr td7<64>t'd8<64>t)|<1B>D<00>d<12>}|<1F>td9|<1C>d:<3A><03>n5td;|<1F>d<||d <20>d%<25><05>td=|t zt"dzz<00><00><02>|d>k\rLt+|<1B>} | d?d<10>d@| dA<00>dB<64>}!| dCr| dC}"|!dD|"d<00>dE|"dFd <20>dG|"d&d <20>d%<25>z }!tdH|!<21><00><02>t|<1B>d>k\r t+|<1B>nd}#|| | t|<0E>t|<0F>||||#dI<64> Scc}}wcc}}w)JzE
2026-04-24 15:24:27 +01:00
Full decode of a proto capture. Returns dict with results.
<20>
2026-04-27 13:58:09 +01:00
<EFBFBD><============================================================<3D>Cap r<00>: r/<00>
Window: r<00><00><>.A<>.2f<EFBFBD>..r <00> µs (<28>
samples, <20><><00>.0f<EFBFBD> ps/sample)N<>& ERROR: Could not find HS burst start<72>@<40>@<40> HS burst start: <20> ns (<28>.1f<EFBFBD>% µs available of ~18 µs full burst)<29>
Decoded <20> bits (r<00> bytes)<29><00> ERROR: Too few bits decoded<65> WARNING: HS sync byte (0xr<78><00>1) not found in any bit phase — using raw byte 0<> HS sync byte found at byte <20> (t=<3D> ns, bit phase=r<>r<00>
DSI Header (lane 0):<3A> DI = 0xr<78><00>
→ VC=r<><00> DT=0xr<78><00> (r<><00>
Lane 0 payload: <20> bytes decoded (≈ first <20> pixels' components)<29> c3<00>$K<00>|]}|d<00><04><01><00>
y<01>w<01>r<>Nr}<00>r~r<>s rr<>z!decode_capture.<locals>.<genexpr><3E><00><00><00><><00>F<>a<EFBFBD>!<21>C<EFBFBD><17>z<EFBFBD>F<><46><00><01>@<00> First 64 payload bytes: <20> ...c3<00>2K<00>|]\}}|dk7s<01> |<01><01><00>y<01>w<01>rNr}<00>r~rXr<>s rr<>z!decode_capture.<locals>.<genexpr><3E><00><00><00><><00>P<>$<24>!<21>Q<EFBFBD>a<EFBFBD>4<EFBFBD>i<EFBFBD>A<EFBFBD>P<><50><00> <01><01>
All <20>/ payload bytes are 0x00 (blank / border region)<29>)
First non-zero byte at payload offset <20> (0x<30>" → Corresponds to pixel group ~<7E> <00> match_pct<63>% of <20> n_checked<65> bytes match static-pink pattern<72>first_mismatch<63> (first diff at offset <20>: got 0xr1<00> expected 0x<30>
Static-pink check : <20> r<00> hs_start_ns<6E>hs_duration_us<75>n_bits<74>n_bytes<65>sync_idx<64>header<65> lane0_payload<61> pixel_check)r+<00>print<6E>namerr4rr5r6r;rfryrKr<>r<>r<>r<><00>N_LANES<45>BPP<50>join<69>nextrO<00>check_pixel_content<6E>$rrr<><00>clk_path<74>dat_pathr>r?rPrQrArl<00> t_hs_start_ns<6E> t_hs_end_nsr<73>rtr<>r<><00>
2026-04-24 15:24:27 +01:00
best_phase<EFBFBD> best_sync<6E>phase<73>rb<72>si<73>t_sync<6E>
2026-04-27 13:58:09 +01:00
data_bytesr<EFBFBD>r<>r<>r<><00> n_payload<61>n_pixels_partial<61>hex_str<74> nonzero_idx<64>cc<63> match_str<74>mmr<6D>s$ r<00>decode_capturer Ts<><00><00>*<2A>'<27>8<EFBFBD><<3C><16>H<EFBFBD>h<EFBFBD><0E> <0A><02>6<EFBFBD>(<28>m<EFBFBD><1C> <0A><04>W<EFBFBD>S<EFBFBD>M<EFBFBD><12>H<EFBFBD>M<EFBFBD>M<EFBFBD>?<3F>3<>4<> <0A><16><08><1A><1B>H<EFBFBD>%<25>L<EFBFBD>E<EFBFBD>5<EFBFBD><1B>H<EFBFBD>%<25>L<EFBFBD>E<EFBFBD>5<EFBFBD> <11>"<22>)<29>)<29>B<EFBFBD>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>+<2B> ,<2C>s<EFBFBD> 2<>E<EFBFBD><0E> <0A>
2026-04-24 15:24:27 +01:00
<EFBFBD>5<EFBFBD><11>8<EFBFBD>C<EFBFBD><<3C><03>,<2C>B<EFBFBD>u<EFBFBD>R<EFBFBD>y<EFBFBD><13>}<7D>S<EFBFBD>.A<><17><13>U<EFBFBD><1A> <0C>T^<5E>_d<5F>ei<65>_i<5F>jm<6A>^n<>ny<6E>z<>{<7B>!<21><15><05>.<2E>L<EFBFBD><13><1B> <12> <11>:<3A> ;<3B><13><19>,<2C>'<27>#<23>-<2D>M<EFBFBD><19>"<22>I<EFBFBD><03>O<EFBFBD>K<EFBFBD>!<21>M<EFBFBD>1<>V<EFBFBD>;<3B>N<EFBFBD><0E> <0A>"<22>=<3D><13>"5<>V<EFBFBD>N<EFBFBD>3<EFBFBD>;O<>Ot<4F>u<>v<> <17>u<EFBFBD>e<EFBFBD>U<EFBFBD>E<EFBFBD><<3C> @<40>D<EFBFBD><0E> <0A>
<EFBFBD>3<EFBFBD>t<EFBFBD>9<EFBFBD>+<2B>X<EFBFBD>c<EFBFBD>$<24>i<EFBFBD><11>l<EFBFBD>^<5E>7<EFBFBD>C<>D<>
<EFBFBD>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E> <12> <11>1<> 2<><13>
<15>I<EFBFBD><14>H<EFBFBD><12>J<EFBFBD><14>T<EFBFBD><19>I<EFBFBD><16>q<EFBFBD><18><1C><05> <1A>4<EFBFBD><05><06><<3C> (<28><02> <1B>B<EFBFBD> <1F><02> <0A>><3E>b<EFBFBD>9<EFBFBD>n<EFBFBD><1B>I<EFBFBD><1E>J<EFBFBD><1B>I<EFBFBD><1B>H<EFBFBD><1C><11><18>!<21>$<24>'<27> <09><0F><17> <12> <11>/<2F> <0C>S<EFBFBD>/A<>Ar<41>s<> t<><14><08> <12><1E>x<EFBFBD>(<28><11>+<2B>F<EFBFBD> <11>1<>(<28><1A>4<EFBFBD><06>s<EFBFBD>|<7C>?<3F>[e<>Zf<5A>fg<66>h<> i<><1B>8<EFBFBD>a<EFBFBD><<3C>=<3D>)<29>J<EFBFBD>&<26>Z<EFBFBD><02><11>^<5E>&D<>T<EFBFBD>Q<EFBFBD><01>q<EFBFBD>&D<> E<>F<EFBFBD><0E>6<EFBFBD> <0A>(<28>*<2A> <0A> <0B>F<EFBFBD>8<EFBFBD>,<2C>S<EFBFBD>1<><1A>F<EFBFBD>4<EFBFBD>L<EFBFBD>><3E><17>QW<51>X\<5C>Q]<5D>^a<>Pb<50>be<62>fl<66>mv<6D>fw<66>ex<65>xy<78>z<>{<7B>
2026-04-27 13:58:09 +01:00
$.<2E>a<EFBFBD>b<EFBFBD>><3E>2<>4<EFBFBD>1<EFBFBD>a<EFBFBD>Q<EFBFBD>2<>M<EFBFBD>2<><0E><17> <0A>&<26> <09>$<24>w<EFBFBD>.<2E>3<EFBFBD>!<21>8<EFBFBD><<3C><18> <0A>$<24>Y<EFBFBD>K<EFBFBD>/J<>K[<5B>J\<5C>\p<>q<>r<> <14><02>?<3F><19>h<EFBFBD>h<EFBFBD>F<>=<3D><13>"<22>3E<33>F<>F<>G<EFBFBD> <11>.<2E>w<EFBFBD>i<EFBFBD>8<> 9<><18>2<EFBFBD>~<7E><15><05><0F><1B>P<>)<29>M<EFBFBD>*B<>P<>RV<52>W<> <0B> <16> <1E> <11>H<EFBFBD>Y<EFBFBD>K<EFBFBD>'V<>W<> X<> <11>><3E>{<7B>m<EFBFBD>4<EFBFBD>P]<5D>^i<>Pj<50>kn<6B>Oo<4F>op<6F>q<> r<> <11>6<>{<7B>W<EFBFBD>7L<37>QT<51>XY<58>QY<51>7Z<37>6[<5B>\<5C> ]<5D> <15><02>?<3F>$<24>]<5D>3<>B<EFBFBD><1E>{<7B>O<EFBFBD>C<EFBFBD>0<><05>b<EFBFBD><1B>o<EFBFBD>5F<35>G5<>6<>I<EFBFBD><11>"<22>#<23><17>(<28>)<29><02><19> 8<><12>A<EFBFBD><15><07>@'<27>')<29>!<21>u<EFBFBD>S<EFBFBD>k<EFBFBD><1C>b<EFBFBD><11>e<EFBFBD>C<EFBFBD>[<5B><01>K<01>L<01> <09> <11>,<2C>Y<EFBFBD>K<EFBFBD>8<> 9<>8;<3B>M<EFBFBD>8J<38>b<EFBFBD>8P<38>%<25>m<EFBFBD>4<>VZ<56>K<EFBFBD>#<23>)<29>*<2A><1F><04>I<EFBFBD><1F> <09>N<EFBFBD>$<24>"<22>)<29>'<27>
<06>
<06><>U'E<01><>3s <00> O
<EFBFBD>$ Oc <00><><00>t||<01>\}}|r7tdd<02><00><02>td|d<04>d|j<00>d<06><05>td<02><00>t|<03>\}}t|<04>\}}t t j t j|<07><00><00>dz} |r3td|d d
zd <0B>d |d d
zd <0B>dt|<07><00>d| dzd<11>d<12> <09>t|||d<13><14>}
|
<EFBFBD>|r td<16>y||
dz} |d dz} | | z
dz } |rtd| d<11>d| d<1A>d<1B><05>t|||||
tt<00><1C>}|r'tdt|<0E><00>dt|<0E>dz<00>d <20><05>t|<0E>d!kr|r td"<22>yd}d}d }t|<0E>}td<1F>D],}t||d<00>}t|<14>}|<15><01>||ks<01>%|}|}|}|}<10>.|<0F> t|<0E>}|<10>|rtd#t d$<24>d%<25><03>d }n |r||d }td&|<10>d'|d<11>d(|<11>d)<29><07>||d*zd}t#|ddD<00><18>cgc]\}}|<19><02> c}}<18>}|r3|r1td+<2B>td,|d-d$<24>d.|d/<00>d0|d1d$<24>d2|d3<00>d)<29> <09>|d*dD<00><18>cgc]\}}|<19><02> }}}|<02>r"t|<1B>}|t$zt&dzz}td4|<1C>d5|<1D>d6<64><05>|d!k\r9d7j)d8<64>|dd9D<00><00>}td:|<1E><00><02>|d9kDr td;<3B>t+d<<3C>t-|<1B>D<00>d<15>}|<1F>td=|<1C>d><3E><03>n5td?|<1F>d@||d$<24>d)<29><05>tdA|t$zt&dzz<00><00><02>|dBk\rLt/|<1B>} | dCd<11>dD| dE<00>dF<64>}!| dGr| dG}"|!dH|"d <00>dI|"dJd$<24>dK|"d*d$<24>d)<29>z }!tdL|!<21><00><02>t|<1B>dBk\r t/|<1B>nd}#|| | t|<0E>t|<0F>||||#dM<64> Scc}}wcc}}w)NuH
Full decode of an LP capture (CH1=CLK+, CH3=DAT0+) using single-ended thresholds.
LP files are captured at 10 GSa/s (100 ps/sample, ~23 samples/bit at 432 Mbps) —
sufficient resolution to decode the HS bit stream without a separate proto pass.
Returns a dict with the same structure as decode_capture().
r<>r<>r<>rr<>z [LP single-ended]r/r<>rr<>r<>r<>r r<>r<>r<>r<>r<>T)rSNr<4E>r<>r<>r<>r<>r<>)rmrnr<>r<>rr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>c3<00>$K<00>|]}|d<00><04><01><00>
y<01>wr<>r}r<>s rr<>z$decode_lp_capture.<locals>.<genexpr>1r<>r<>r<>r<>r<>c3<00>2K<00>|]\}}|dk7s<01> |<01><01><00>y<01>wr<>r}r<>s rr<>z$decode_lp_capture.<locals>.<genexpr>6r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r1r<>r<>r<>)r-r<>r<>rr4rr5r6r;rfry<00>LP_SE_DAT_THRESH_V<5F>LP_SE_CLK_THRESH_VrKr<>r<>r<>r<>r<>r<>r<>r<>rOr<>r<>s$ r<00>decode_lp_capturer<00>s<00><00>'<27>w<EFBFBD><08>9<><16>H<EFBFBD>h<EFBFBD><0E> <0A><02>6<EFBFBD>(<28>m<EFBFBD><1C> <0A><04>W<EFBFBD>S<EFBFBD>M<EFBFBD><12>H<EFBFBD>M<EFBFBD>M<EFBFBD>?<3F>2E<32>F<>G<> <0A><16><08><1A><1B>H<EFBFBD>%<25>L<EFBFBD>E<EFBFBD>5<EFBFBD><1B>H<EFBFBD>%<25>L<EFBFBD>E<EFBFBD>5<EFBFBD> <11>"<22>)<29>)<29>B<EFBFBD>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>+<2B> ,<2C>s<EFBFBD> 2<>E<EFBFBD><0E> <0A>
<EFBFBD>5<EFBFBD><11>8<EFBFBD>C<EFBFBD><<3C><03>,<2C>B<EFBFBD>u<EFBFBD>R<EFBFBD>y<EFBFBD><13>}<7D>S<EFBFBD>.A<>B<12><15>e<EFBFBD>*<2A><1C>Z<EFBFBD><05>d<EFBFBD>
<EFBFBD>3<EFBFBD>'7<>{<7B>D<01> E<01>!<21><15><05>u<EFBFBD>4<EFBFBD>H<>L<EFBFBD><13><1B> <12> <11>:<3A> ;<3B><13><19>,<2C>'<27>#<23>-<2D>M<EFBFBD><19>"<22>I<EFBFBD><03>O<EFBFBD>K<EFBFBD>!<21>M<EFBFBD>1<>V<EFBFBD>;<3B>N<EFBFBD><0E> <0A>"<22>=<3D><13>"5<>6<12> <20><13>%<25>%J<>L<01> M<01> <17>u<EFBFBD>e<EFBFBD>U<EFBFBD>E<EFBFBD><<3C>"4<>AS<41> U<01>D<EFBFBD><0F> <0A>
<EFBFBD>3<EFBFBD>t<EFBFBD>9<EFBFBD>+<2B>X<EFBFBD>c<EFBFBD>$<24>i<EFBFBD><11>l<EFBFBD>^<5E>7<EFBFBD>C<>D<>
<EFBFBD>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E> <12> <11>1<> 2<><13><14>I<EFBFBD><14>H<EFBFBD><12>J<EFBFBD><14>T<EFBFBD><19>I<EFBFBD><16>q<EFBFBD><18><1C><05> <1A>4<EFBFBD><05><06><<3C> (<28><02> <1B>B<EFBFBD> <1F><02> <0A>><3E>b<EFBFBD>9<EFBFBD>n<EFBFBD><1B>I<EFBFBD><1E>J<EFBFBD><1B>I<EFBFBD><1B>H<EFBFBD><1C><11><18>!<21>$<24>'<27> <09><0F><17> <12> <11>/<2F> <0C>S<EFBFBD>/A<>Ar<41>s<> t<><14><08> <12><1E>x<EFBFBD>(<28><11>+<2B>F<EFBFBD> <11>1<>(<28><1A>4<EFBFBD><06>s<EFBFBD>|<7C>?<3F>[e<>Zf<5A>fg<66>h<> i<><1A>8<EFBFBD>a<EFBFBD><<3C>=<3D>)<29>J<EFBFBD> %<25>Z<EFBFBD><02><11>^<5E>&D<>T<EFBFBD>Q<EFBFBD><01>q<EFBFBD>&D<> E<>F<EFBFBD><0E>6<EFBFBD> <0A>(<28>*<2A> <0A> <0B>F<EFBFBD>8<EFBFBD>,<2C>S<EFBFBD>1<><1A>F<EFBFBD>4<EFBFBD>L<EFBFBD>><3E><17>QW<51>X\<5C>Q]<5D>^a<>Pb<50>be<62>fl<66>mv<6D>fw<66>ex<65>xy<78>z<>{<7B>#-<2D>a<EFBFBD>b<EFBFBD>><3E>2<>4<EFBFBD>1<EFBFBD>a<EFBFBD>Q<EFBFBD>2<>M<EFBFBD>2<><0E><17> <0A>&<26> <09>$<24>w<EFBFBD>.<2E>3<EFBFBD>!<21>8<EFBFBD><<3C><18> <0A>$<24>Y<EFBFBD>K<EFBFBD>/J<>K[<5B>J\<5C>\p<>q<>r<> <14><02>?<3F><19>h<EFBFBD>h<EFBFBD>F<>=<3D><13>"<22>3E<33>F<>F<>G<EFBFBD> <11>.<2E>w<EFBFBD>i<EFBFBD>8<> 9<><18>2<EFBFBD>~<7E><15><05><0F><1A>P<>)<29>M<EFBFBD>*B<>P<>RV<52>W<> <0B> <16> <1E> <11>H<EFBFBD>Y<EFBFBD>K<EFBFBD>'V<>W<> X<> <11>><3E>{<7B>m<EFBFBD>4<EFBFBD>P]<5D>^i<>Pj<50>kn<6B>Oo<4F>op<6F>q<> r<> <11>6<>{<7B>W<EFBFBD>7L<37>QT<51>XY<58>QY<51>7Z<37>6[<5B>\<5C> ]<5D> <14><02>?<3F>$<24>]<5D>3<>B<EFBFBD><1E>{<7B>O<EFBFBD>C<EFBFBD>0<><05>b<EFBFBD><1B>o<EFBFBD>5F<35>G5<>6<>I<EFBFBD><11>"<22>#<23><17>(<28>)<29><02><19> 8<><12>A<EFBFBD><15><07>@'<27>')<29>!<21>u<EFBFBD>S<EFBFBD>k<EFBFBD><1C>b<EFBFBD><11>e<EFBFBD>C<EFBFBD>[<5B><01>K<01>L<01> <09> <11>,<2C>Y<EFBFBD>K<EFBFBD>8<> 9<>8;<3B>M<EFBFBD>8J<38>b<EFBFBD>8P<38>%<25>m<EFBFBD>4<>VZ<56>K<EFBFBD>#<23>)<29>*<2A><1F><04>I<EFBFBD><1F> <09>N<EFBFBD>$<24>"<22>)<29>'<27>
<06>
<06><>K'E<01><> 3s <00>" O
<EFBFBD>3 O&<06>cap_a<5F>cap_br<62>c <00><><00>td|d<02>d|d<02>d|<03>d<05><07>t||d<06><07>}t||d<06><07>}|<04>|<05> td <09>y|d
2026-04-24 15:24:27 +01:00
d|}|d
d|}tt|<06>t|<07>|<03>}t |<08>D<00> cgc]} || || k7s<01>| || || f<03><02>}
} td |d<02>d t|<06><00>d |ddd<10>d|dd<13>d<14> <09>td |d<02>d t|<07><00>d |ddd<10>d|dd<13>d<14> <09>|
std|<08>d<16><03>n<>tdt|
<EFBFBD><00>d|<08>d<19><05>tddd<1C>ddd<1E>ddd<1E><04><06>|
dd D]4\} } } | t
zt d!zz}td| d<1C>d"| d<10>d#| d<10>d$|<0E>d%<25> <09><00>6t|
<EFBFBD>d kDrtd&t|
<EFBFBD>d z
<00>d'<27><03>t|<06>d!kD<00>r0t|<07>d!kD<00>r tj|d|tj<00>(<28>}tj|d|tj<00>(<28>}tj|jt<00>|j<00>z
|jt<00>|j<00>z
d)<29>*<2A>}ttjtj |<11><00><00>|d+z
z
}|d,k7r$t!|<12>|d-zkrtd.|<12>d/|<12>d0<64><05>ytd.|<12>d1<64><03>yyycc} w)2zV
Decode both captures and report byte-level differences in the first n_bytes.
z
2026-04-27 13:58:09 +01:00
Comparing cap r<00> vs cap <20> (first <20> payload bytes on lane 0)F<>r<>Nz. ERROR: Could not decode one or both capturesr<73><00> Cap r<><00> bytes available, DI=0xr<78>r<>r<><00> HS_start=r<>r<><00>ns<6E>
No differences in first <20> bytes — data content matches.<2E>
<20> byte differences in first <20> bytes:<3A> <20>Offset<65>>8<>Cap_A<5F>>6<>Cap_B<5F>(r<00> 0x<30> 0x<30> (pixel group ≈ r<><00> ... (<28> more)r2<00>full<6C><01>moderrr1<00>!
Cross-correlation peak at lag=<3D>" bytes → data may be shifted by <20> bytes between captures<65> bytes (0 = no shift))r<>r rMr;rKr<>r<>rr<<00>uint8<74> correlater:r4<00>meanr8<00>argmax<61>abs<62>rrrr<><00>res_a<5F>res_b<5F>pa<70>pb<70> n_comparerX<00>diffs<66>offset<65>ba<62>bb<62> pixel_group<75>pa_arr<72>pb_arr<72>xcorr<72>lags r<00>compare_capturesrGYsI<00><00>
2026-04-24 15:24:27 +01:00
<EFBFBD> <1C>U<EFBFBD>3<EFBFBD>K<EFBFBD>x<EFBFBD><05>c<EFBFBD>{<7B>(<28>7<EFBFBD>)<29>Kd<4B>
2026-04-27 13:58:09 +01:00
e<EFBFBD>f<> <1A>5<EFBFBD>(<28>E<EFBFBD> :<3A>E<EFBFBD> <1A>5<EFBFBD>(<28>E<EFBFBD> :<3A>E<EFBFBD> <0C>}<7D><05> <0A> <0A>><3E>?<3F><0E> <0E><EFBFBD> <1F><08><17> )<29>B<EFBFBD> <0E><EFBFBD> <1F><08><17> )<29>B<EFBFBD><13>C<EFBFBD><02>G<EFBFBD>S<EFBFBD><12>W<EFBFBD>g<EFBFBD>.<2E>I<EFBFBD>(-<2D>i<EFBFBD>(8<> K<>1<EFBFBD>B<EFBFBD>q<EFBFBD>E<EFBFBD>R<EFBFBD><01>U<EFBFBD>N<EFBFBD>a<EFBFBD><12>A<EFBFBD><15><02>1<EFBFBD><05> <1E> K<>E<EFBFBD> K<> <09>F<EFBFBD>5<EFBFBD><13>+<2B>R<EFBFBD><03>B<EFBFBD><07>y<EFBFBD>(@<40><15>x<EFBFBD><1F>QY<51>AZ<41>[^<5E>@_<>_j<5F>kp<6B>q~<7E>k<6B>AD<02>kE<02>EG<02> H<02>I<02> <09>F<EFBFBD>5<EFBFBD><13>+<2B>R<EFBFBD><03>B<EFBFBD><07>y<EFBFBD>(@<40><15>x<EFBFBD><1F>QY<51>AZ<41>[^<5E>@_<>_j<5F>kp<6B>q~<7E>k<6B>AD<02>kE<02>EG<02> H<02>I<02> <10> <0A>,<2C>Y<EFBFBD>K<EFBFBD>7W<37>X<>Y<> <0A><04>S<EFBFBD><15>Z<EFBFBD>L<EFBFBD> ;<3B>I<EFBFBD>;<3B>g<EFBFBD>N<>O<> <0A><02>8<EFBFBD>B<EFBFBD>-<2D>r<EFBFBD>'<27>"<22><1C>R<EFBFBD><07><02>|<7C><<3C>=<3D>#<23>C<EFBFBD>R<EFBFBD>j<EFBFBD> c<01>N<EFBFBD>F<EFBFBD>B<EFBFBD><02> <20>7<EFBFBD>*<2A>s<EFBFBD>a<EFBFBD>x<EFBFBD>8<>K<EFBFBD> <11>B<EFBFBD>v<EFBFBD>b<EFBFBD>k<EFBFBD><14>b<EFBFBD><13>X<EFBFBD>W<EFBFBD>R<EFBFBD><03>H<EFBFBD><R<>S^<5E>R_<52>_`<60>a<> b<> c<01> <0F>u<EFBFBD>:<3A><02>?<3F> <11>G<EFBFBD>C<EFBFBD><05>J<EFBFBD><12>O<EFBFBD>,<2C>F<EFBFBD>3<> 4<> <0B>2<EFBFBD>w<EFBFBD><11>{<7B>s<EFBFBD>2<EFBFBD>w<EFBFBD><11>{<7B><13><18><18>"<22>Z<EFBFBD>i<EFBFBD>.<2E><02><08><08>9<><06><13><18><18>"<22>Z<EFBFBD>i<EFBFBD>.<2E><02><08><08>9<><06><12> <0C> <0C>V<EFBFBD>]<5D>]<5D>5<EFBFBD>1<>F<EFBFBD>K<EFBFBD>K<EFBFBD>M<EFBFBD>A<>$<24>m<EFBFBD>m<EFBFBD>E<EFBFBD>2<>V<EFBFBD>[<5B>[<5B>]<5D>B<><16>Q<01><05><11>"<22>)<29>)<29>B<EFBFBD>F<EFBFBD>F<EFBFBD>5<EFBFBD>M<EFBFBD>*<2A>+<2B>y<EFBFBD>1<EFBFBD>}<7D>=<3D><03> <0E>!<21>8<EFBFBD><03>C<EFBFBD><08>9<EFBFBD><01>><3E>1<> <11>6<>s<EFBFBD>e<EFBFBD>;]<5D>^a<>]b<>by<62>z<> {<7B> <11>6<>s<EFBFBD>e<EFBFBD>;P<>Q<> R<>#<23>{<7B><># L<01> <00>K#<04> K#c <00><><00>td|d<02>d|d<02>d|<03>d<05><07>t||d<06><07>}t||d<06><07>}|<04>|<05> td <09>y|d
d|}|d
d|}tt|<06>t|<07>|<03>}t |<08>D<00> cgc]} || || k7s<01>| || || f<03><02>}
} td |d<02>d t|<06><00>d |ddd<10>d|dd<13>d<14> <09>td |d<02>d t|<07><00>d |ddd<10>d|dd<13>d<14> <09>|
std|<08>d<16><03>n<>tdt|
<EFBFBD><00>d|<08>d<19><05>tddd<1C>ddd<1E>ddd<1E><04><06>|
dd D]4\} } } | t
zt d!zz}td| d<1C>d"| d<10>d#| d<10>d$|<0E>d%<25> <09><00>6t|
<EFBFBD>d kDrtd&t|
<EFBFBD>d z
<00>d'<27><03>t|<06>d!kD<00>r0t|<07>d!kD<00>r tj|d|tj<00>(<28>}tj|d|tj<00>(<28>}tj|jt<00>|j<00>z
|jt<00>|j<00>z
d)<29>*<2A>}ttjtj |<11><00><00>|d+z
z
}|d,k7r$t!|<12>|d-zkrtd.|<12>d/|<12>d0<64><05>ytd.|<12>d1<64><03>yyycc} w)2zY
Decode both LP captures and report byte-level differences in the first n_bytes.
z
Comparing LP cap rrrrFrNz1 ERROR: Could not decode one or both LP capturesr<73>rr<>rr<>r<>r<>rr<>r<>rrrrrrr r!r"r#r$r%r&rr'r(r)r<>r*r+r2r,r-rrr1r/r0r1r2)r<>rrMr;rKr<>r<>rr<r3r4r:r4r5r8r6r7r8s r<00>compare_lp_capturesrJ<00>sG<00><00>
<EFBFBD> <1F><05>c<EFBFBD>{<7B>(<28>5<EFBFBD><13>+<2B>X<EFBFBD>g<EFBFBD>Y<EFBFBD>Ng<4E>
h<EFBFBD>i<> <1D>e<EFBFBD>X<EFBFBD>u<EFBFBD> =<3D>E<EFBFBD> <1D>e<EFBFBD>X<EFBFBD>u<EFBFBD> =<3D>E<EFBFBD> <0C>}<7D><05> <0A> <0A>A<>B<><0E> <0E><EFBFBD> <1F><08><17> )<29>B<EFBFBD> <0E><EFBFBD> <1F><08><17> )<29>B<EFBFBD><13>C<EFBFBD><02>G<EFBFBD>S<EFBFBD><12>W<EFBFBD>g<EFBFBD>.<2E>I<EFBFBD>(-<2D>i<EFBFBD>(8<> K<>1<EFBFBD>B<EFBFBD>q<EFBFBD>E<EFBFBD>R<EFBFBD><01>U<EFBFBD>N<EFBFBD>a<EFBFBD><12>A<EFBFBD><15><02>1<EFBFBD><05> <1E> K<>E<EFBFBD> K<> <09>F<EFBFBD>5<EFBFBD><13>+<2B>R<EFBFBD><03>B<EFBFBD><07>y<EFBFBD>(@<40><15>x<EFBFBD><1F>QY<51>AZ<41>[^<5E>@_<>_j<5F>kp<6B>q~<7E>k<6B>AD<02>kE<02>EG<02> H<02>I<02> <09>F<EFBFBD>5<EFBFBD><13>+<2B>R<EFBFBD><03>B<EFBFBD><07>y<EFBFBD>(@<40><15>x<EFBFBD><1F>QY<51>AZ<41>[^<5E>@_<>_j<5F>kp<6B>q~<7E>k<6B>AD<02>kE<02>EG<02> H<02>I<02> <10> <0A>,<2C>Y<EFBFBD>K<EFBFBD>7W<37>X<>Y<> <0A><04>S<EFBFBD><15>Z<EFBFBD>L<EFBFBD> ;<3B>I<EFBFBD>;<3B>g<EFBFBD>N<>O<> <0A><02>8<EFBFBD>B<EFBFBD>-<2D>r<EFBFBD>'<27>"<22><1C>R<EFBFBD><07><02>|<7C><<3C>=<3D>#<23>C<EFBFBD>R<EFBFBD>j<EFBFBD> c<01>N<EFBFBD>F<EFBFBD>B<EFBFBD><02> <20>7<EFBFBD>*<2A>s<EFBFBD>a<EFBFBD>x<EFBFBD>8<>K<EFBFBD> <11>B<EFBFBD>v<EFBFBD>b<EFBFBD>k<EFBFBD><14>b<EFBFBD><13>X<EFBFBD>W<EFBFBD>R<EFBFBD><03>H<EFBFBD><R<>S^<5E>R_<52>_`<60>a<> b<> c<01> <0F>u<EFBFBD>:<3A><02>?<3F> <11>G<EFBFBD>C<EFBFBD><05>J<EFBFBD><12>O<EFBFBD>,<2C>F<EFBFBD>3<> 4<>
<EFBFBD>2<EFBFBD>w<EFBFBD><11>{<7B>s<EFBFBD>2<EFBFBD>w<EFBFBD><11>{<7B><13><18><18>"<22>Z<EFBFBD>i<EFBFBD>.<2E><02><08><08>9<><06><13><18><18>"<22>Z<EFBFBD>i<EFBFBD>.<2E><02><08><08>9<><06><12> <0C> <0C>V<EFBFBD>]<5D>]<5D>5<EFBFBD>1<>F<EFBFBD>K<EFBFBD>K<EFBFBD>M<EFBFBD>A<>$<24>m<EFBFBD>m<EFBFBD>E<EFBFBD>2<>V<EFBFBD>[<5B>[<5B>]<5D>B<><16>Q<01><05><11>"<22>)<29>)<29>B<EFBFBD>F<EFBFBD>F<EFBFBD>5<EFBFBD>M<EFBFBD>*<2A>+<2B>y<EFBFBD>1<EFBFBD>}<7D>=<3D><03> <0E>!<21>8<EFBFBD><03>C<EFBFBD><08>9<EFBFBD><01>><3E>1<> <11>6<>s<EFBFBD>e<EFBFBD>;]<5D>^a<>]b<>by<62>z<> {<7B> <11>6<>s<EFBFBD>e<EFBFBD>;P<>Q<> R<>#<23>{<7B><>! LrHr<><00>n_check<63>returnc<00>&<00>|d|}|sddddd<03>St|<02>D<00><03>cgc]#\}}|t|dzk7r|t|dz|f<03><02>%}}}tdt|<05>t|<02>z z
dzd<05>t|<05>|r|dndt|<02>d<03>Scc}}w)u<>
Verify the first n_check Lane 0 payload bytes against the expected static-pink
pattern STATIC_PINK_LANE0. Returns a dict:
match_pct — percentage of bytes matching expected pattern
n_mismatches — number of mismatching bytes in the checked window
first_mismatch — (offset, expected_byte, actual_byte) or None
n_checked — number of bytes examined
Nr)r<><00> n_mismatchesr<73>r<>r<>r<00>d)rO<00>STATIC_PINK_LANE0rjr;)r<>rK<00>checkrX<00>actual<61>
mismatchess rr<>r<><00>s<><00><00> <1A>(<28>7<EFBFBD> #<23>E<EFBFBD> <10>!<21>1<EFBFBD>"&<26>Q<EFBFBD>8<> 8<>#<23>5<EFBFBD>)<29><06> <15>A<EFBFBD>v<EFBFBD> <11>&<26>q<EFBFBD>1<EFBFBD>u<EFBFBD>-<2D> -<2D>
<0B> <1D>a<EFBFBD>!<21>e<EFBFBD> $<24>f<EFBFBD>-<2D><06>J<EFBFBD><06>  <20><11>S<EFBFBD><1A>_<EFBFBD>s<EFBFBD>5<EFBFBD>z<EFBFBD>%A<>!A<>S<EFBFBD> H<>!<21>L<><1D>j<EFBFBD>/<2F>+5<>*<2A>Q<EFBFBD>-<2D>4<EFBFBD><1D>e<EFBFBD>*<2A>  <06><06><> s<00>(B r<>c
<00>N<00>|<00>ddgd<03>Sg}|jd<04>}|<02>|jd<05>n|dkDr|jd|<02>d<08><03>|jd <09>}|rC|jd
d <0B>}td ttd dddddh
}||vr|jd|d<14><04><02>|jdg<00>}t |<06>dk\rYt |<06>}|d<00>I|ddkrA|d}|rd|d<00>d|dd<14>d|dd<14><04>nd } |jd!|dd"<22>d#|d$<00>d%| <09>d&<26><07>t|<01>|d<03>S)'uJ
Summarise bit-level anomalies from a decode_capture() result.
Returns {"anomalous": bool, "flags": list[str]}.
Checks:
sync_byte_not_found — 0xB8 not found in any of 8 bit phases →
HS burst may not have started properly
sync_byte_late — 0xB8 found but at byte index > 5 →
garbage precedes sync → possible byte misalignment
unexpected_packet_type — DI data-type not in the expected set
pixel_content_mismatch — Lane 0 payload < 90 % match to static-pink pattern
T<> decode_failed)<02> anomalous<75>flagsr<73>u5sync_byte_not_found — HS burst may not have startedrJzsync_byte_late (found at byte u0, expected ≤ 5) — possible byte misalignmentr<74>r<>r r<>r<>r<>r<>r<00> <00>zunexpected_packet_type DT=0xr<78>r<>r<>r<>g<00>V@r<>zfirst diff at byte rr<>r1r<>r<00>zpixel_content_mismatch (r<>r<>r<>z bytes match; r<>)r<>rk<00> DSI_DT_RGB888<38> DSI_DT_HSYNC<4E> DSI_DT_VSYNCr;r<><00>bool)
r<EFBFBD>rWr<>r<>r<><00>known<77>payloadrr<00>details
r<00>analyse_for_anomaliesrb<00>s<><00><00><0E>~<7E>!<21>_<EFBFBD>,=<3D>><3E>><3E> <0E>E<EFBFBD><15>z<EFBFBD>z<EFBFBD>*<2A>%<25>H<EFBFBD><0F><17> <0A> <0C> <0C>L<>M<> <11>A<EFBFBD><1C> <0A> <0C> <0C>,<2C>X<EFBFBD>J<EFBFBD>7)<29> *<2A>
<EFBFBD>
<14>Z<EFBFBD>Z<EFBFBD><08> !<21>F<EFBFBD> <0A> <13>Z<EFBFBD>Z<EFBFBD><04>b<EFBFBD> !<21><02><1E><04>l<EFBFBD>L<EFBFBD><15>t<EFBFBD>T<EFBFBD>4<EFBFBD><14>t<EFBFBD>5<><05> <0A>U<EFBFBD>?<3F> <11>L<EFBFBD>L<EFBFBD>7<><02>3<EFBFBD>x<EFBFBD>@<40> A<><14>j<EFBFBD>j<EFBFBD><1F>"<22>-<2D>G<EFBFBD>
<EFBFBD>7<EFBFBD>|<7C>r<EFBFBD><19> <20><17> )<29><02> <0A>k<EFBFBD>?<3F> &<26>2<EFBFBD>k<EFBFBD>?<3F>T<EFBFBD>+A<><13>$<24>%<25>B<EFBFBD><16>&<26>b<EFBFBD><11>e<EFBFBD>W<EFBFBD>H<EFBFBD>R<EFBFBD><01>U<EFBFBD>3<EFBFBD>K<EFBFBD>|<7C>B<EFBFBD>q<EFBFBD>E<EFBFBD>RU<52>;<3B>W<><1D> <13> <12>L<EFBFBD>L<EFBFBD><14><16>{<7B>O<EFBFBD>C<EFBFBD>(<28><05>b<EFBFBD><1B>o<EFBFBD>-><3E>n<EFBFBD>V<EFBFBD>H<EFBFBD>TU<54>W<01> <0E>
<1E>e<EFBFBD><1B>u<EFBFBD> 5<>5rc
<00><><00>tjd<01><02>}|jdtdd<05><06>|jdtt t
2026-04-24 15:24:27 +01:00
<00>d<08><06>|jd tdd
2026-04-27 13:58:09 +01:00
d <0B> <0C>|jd dd<0F><10>|jddd<12><10>|j <00>}t|j<00>}|jr<>t|jd<13><00>}t|D<00>chc])}t|jjd<14>d<00><00><02>+c}<04>}t|jd<16><00>}t|D<00>chc])}t|jjd<14>d<00><00><02>+c}<04>}td|<05><00><02>td|<07><00><02>y|j<00>P|j r"t#|j$|j|<02>yt'|j$|j|<02>y|j rt)|j$|d<19><1A>}nt+|j$|d<19><1A>}t-|<08>} | dr"tddj/| d<00><00>d<1F><03>ytd <20>ycc}wcc}w)!Nz3Decode DSI packet content from proto or LP captures)<01> descriptionz--cap<61><70>z'Capture number to decode (default: 214))<03>type<70>default<6C>helpz--dirzData directoryz --compare<72>CAP_Bz(Compare --cap against CAP_B byte-by-byte)rfrg<00>metavarrhz--lp<6C>
store_truezEDecode from LP single-ended files instead of proto differential files)<02>actionrhz--listzList available capturesz*_proto_*_dat.csvr<76><00><><EFBFBD><EFBFBD><EFBFBD>z*_lp_*_dat.csvzAvailable proto captures: zAvailable LP captures: TrrVz
*** BIT-LEVEL ANOMALIES: z, rWz ***zJ
No bit-level anomalies detected (sync, packet type, pixel content all OK))<18>argparse<73>ArgumentParser<65> add_argumentr8r"<00>DATA_DIR<49>
parse_argsr<00>dir<69>listr#r$<00>stem<65>splitr<74><00>compare<72>lprJ<00>caprGrr rbr<>)
<EFBFBD>parser<65>argsr<00> proto_files<65>f<>
proto_caps<EFBFBD>lp_files<65>lp_capsr<73><00>anomalys
r<00>mainr<6E>
s<00><00> <15> $<24> $<24>1f<31> g<>F<EFBFBD>
2026-04-24 15:24:27 +01:00
<EFBFBD><17><17><07>#<23>s<EFBFBD>Aj<41><17>k<>
<EFBFBD><17><17><07>#<23>s<EFBFBD>8<EFBFBD>}<7D>K[<5B><17>\<5C>
2026-04-27 13:58:09 +01:00
<EFBFBD><17><17> <0B>#<23>t<EFBFBD> '<27>G<><18>I<01> <0B><17><17><06>L<EFBFBD>d<><18>f<01>
<EFBFBD><17><17><08>L<EFBFBD>?X<><17>Y<> <11> <1C> <1C> <1E>D<EFBFBD><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>~<7E>H<EFBFBD> <0B>y<EFBFBD>y<EFBFBD><1C>X<EFBFBD>]<5D>]<5D>+><3E>?<3F>@<40> <0B><1C>+<2B>N<>Q<EFBFBD>c<EFBFBD>!<21>&<26>&<26>,<2C>,<2C>s<EFBFBD>"3<>B<EFBFBD>"7<>8<>N<>O<>
<EFBFBD><1C>X<EFBFBD>]<5D>]<5D>+;<3B><<3C>=<3D><08><1C>(<28>K<>Q<EFBFBD>c<EFBFBD>!<21>&<26>&<26>,<2C>,<2C>s<EFBFBD>"3<>B<EFBFBD>"7<>8<>K<>L<><07> <0A>*<2A>:<3A>,<2C>7<>8<> <0A>*<2A>7<EFBFBD>)<29>4<>5<><0E> <0B>|<7C>|<7C><1F> <0F>7<EFBFBD>7<EFBFBD> <1F><04><08><08>$<24>,<2C>,<2C><08> A<> <1C>T<EFBFBD>X<EFBFBD>X<EFBFBD>t<EFBFBD>|<7C>|<7C>X<EFBFBD> ><3E> <0F>7<EFBFBD>7<EFBFBD>&<26>t<EFBFBD>x<EFBFBD>x<EFBFBD><18>4<EFBFBD>H<>F<EFBFBD>#<23>D<EFBFBD>H<EFBFBD>H<EFBFBD>h<EFBFBD><04>E<>F<EFBFBD>'<27><06>/<2F><07> <12>;<3B> <1F> <11>/<2F><04> <09> <09>'<27>'<27>:J<>0K<30>/L<>D<EFBFBD>Q<> R<> <11>_<> a<><61>+O<01><>Ks <00>,.I-<08>.I2<08>__main__)r )Ng@@F)NN)T)<01><>)<01><)1<>__doc__rnr$<00>sys<79>pathlibr<00>numpyr<00>__file__<5F>parentrq<00> DISPLAY_W<5F> DISPLAY_Hr<48>r<><00>PAYLOAD_BYTES_PER_LANE<4E>HEADER_BYTES_PER_LANE<4E>FOOTER_BYTES_PER_LANE<4E>TOTAL_LANE0_BYTESr[r\r]r<>rhrr rLrPrr8r+r-rHrfryr<>r<>r<>r^r rrGrJrt<00>dictr<74>rbr<><00>__name__r}rr<00><module>r<>s<><00><01><04>$<10> <0B>
<EFBFBD><18><12> <11>(<28>^<5E> "<22> "<22>V<EFBFBD> +<2B><08> <11> <09> <10> <09> <0E><07> <0F><03> $<24>s<EFBFBD>a<EFBFBD>x<EFBFBD>0<>W<EFBFBD><<3C><16><1A><15><1A><15>.<2E>1G<31>G<>J_<4A>_<><11><16> <0A><15> <0C><15> <0C><14> <0C><13> <0C><1B><12><1A><12><1A><13>'<27><11>"<22>4<EFBFBD>"<22>
4<>c<EFBFBD> 4<>T<EFBFBD> 4<> 4<>3<EFBFBD> 4<>$<24> 4<> <1B>4[<10>F-1<>#<10>T
<12>" <10><06>L~<06>C<EFBFBD>~<06>4<EFBFBD>~<06>$<24>~<06>Jy<06>s<EFBFBD>y<06>d<EFBFBD>y<06>T<EFBFBD>y<06>@+S<01>C<EFBFBD>+S<01><03>+S<01>t<EFBFBD>+S<01>c<EFBFBD>+S<01>\*S<01>s<EFBFBD>*S<01>3<EFBFBD>*S<01>$<24>*S<01><13>*S<01>b<06>t<EFBFBD><06>c<EFBFBD><06>4<EFBFBD><06>416<>$<24><14>+<2B>16<>$<24>16<>p%b<01>P <0C>z<EFBFBD><19><08>F<EFBFBD>r