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

267 lines
37 KiB
Plaintext
Raw Normal View History

2026-04-24 15:24:27 +01:00
<EFBFBD>
2026-05-07 09:01:32 +01:00
<00>,<2C>i<EFBFBD><69><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-05-07 09:01:32 +01:00
Zhd <0A>ZdZdZdZdZdZdZdefd<14>Zdedefd<17>Zdedefd<18>Z d/d<19>Z!d0d<1A>Z" d1d<1B>Z#d<1C>Z$d<1D>Z%d<1E>Z&d2dedede'fd <20>Z(d2dedede'fd!<21>Z)d3d"ed#eded$efd%<25>Z*d3d"ed#eded$efd&<26>Z+d4d'e,d(ed)e-fd*<2A>Z.d+e-dzd)e-fd,<2C>Z/d-<2D>Z0e1d.k(re0<65>yy)5aN
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-05-07 09:01:32 +01:00
<EFBFBD>N)<01>Path<74>dataii <00><00><00><00><00>><00>!>
rr<00> <00><00>r
<00>)<00>1<00>9r <00><><00>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><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_csvrMs-<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>r r!<00> pattern_clk<6C> pattern_dat<61> clk_files<65> dat_filess r<00>find_proto_filesr2Rs<><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_r#r$r%zNo LP CLK file found for cap r&zNo LP DAT file found for cap r'r(r-s r<00> find_lp_filesr4^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-05-07 09:01:32 +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-05-07 09:01:32 +01:00
r<00>find_clock_edgesrOns<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-05-07 09:01:32 +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><><00>ttjtj|<00><00><00>dz}t |<01>}|<04>r<>d}d}d} d}
d} t dt d|z <00><00>} d d
lm} tj|<06>}| || <0C>}|jd <0B> <0C>|| d z
| d z
t |<0F>zd}d}t|<06>D]}|||kDrd}<12>|s<01>|}n|<11>yt|t d|z <00>z|<06>}t dt |
|z <00><00>}d}d }t||<13>D])}|||kr||| kr|d z }||k\s<01>||z
d z}nd }<16>+|<15>(t|t d t d|z <00><00>z|d z
<00>Sd}t||<13>D]}||| kDs<01> |}n|<17>(t|t d t d|z <00><00>z|d z
<00>St d t | |z <00><00>}t |||z
<00>Sd}t dt d|z <00><00>}|dz}d }d}t||<06>D]}|||kr|d z }<16>||k\r|}nd }<16>|<1C>*t d t d|z <00><00>}t||z|d z
<00>St d t d|z <00><00>}t dt d|z <00><00>}tjt|<06>D<00>cgc]%}|t d ||z
<00>|d zj<00><00><02>'c}<10>}d} d}!t dt d|z <00><00>}"d}#d }$t|<0E>D]\}}%|%|!kr|$d z }$|$|"k\s<01>|}#<23>d }$<24>|#<23>yd}&d }$t|#t |<0E><00>D]!}||| k\r|&<26>|}&|$d z }$|$|k\s<01>|&cSd}&d }$<24>#y#t$rWtjt|<06>D<00>cgc]%}|t d || z
<00>|d zj<00><00><02>'ncc}wc}<10>}Y<00><03>wxYwcc}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).
2026-05-07 09:01:32 +01:00
r6g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rg
ףp=
<EFBFBD>?g@g9@<40>
r7r)<01>sliding_window_viewr')<01>axisrNFTg@<40>@<40>gI@g<00><>r8g4@r<00>i@g{<14>G<EFBFBD>z<EFBFBD>?g{<14>G<EFBFBD>z<EFBFBD>?)r;rr<r=rBr>r?<00>numpy.lib.stride_tricksrR<00>zeros<6F>std<74> ExceptionrC<00>range<67>min<69> enumerate)'<27>t_dat<61>v_datrE<00> window_ns<6E> single_endedrH<00>N<>LP11_THRESH_SE<53> LP_LOW_V_SE<53> HS_STD_V_SE<53> LP_LOW_MIN_NS<4E> LP_MARGIN_NS<4E> win_samplesrR<00>rstd<74>wins<6E>i<> lp11_end_idx<64>in_lp11<31>
search_end<EFBFBD>
min_lp_run<EFBFBD> lp_low_start<72>run<75>
lp_low_end<EFBFBD>margin<69> LP01_THRESH<53>min_lp01<30> search_from<6F>lp01_end<6E>skip<69>win<69>min_run<75>
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_startr<74><00>sh<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><1C><0E><1D> <0B><1E> <0B><1C> <0A><1D> <0C><19>"<22>c<EFBFBD>#<23><05>+<2B>.<2E>/<2F> <0B> \<01> C<><15>8<EFBFBD>8<EFBFBD>A<EFBFBD>;<3B>D<EFBFBD>&<26>u<EFBFBD>k<EFBFBD>:<3A>D<EFBFBD>@D<><08><08>b<EFBFBD><08>@Q<>D<EFBFBD><1B>q<EFBFBD><1F><1B>q<EFBFBD><1F>3<EFBFBD>t<EFBFBD>9<EFBFBD>!<<3C> =<3D>
<1C> <0C><17><07><16>q<EFBFBD><18> <16>A<EFBFBD><14>Q<EFBFBD>x<EFBFBD>.<2E>(<28><1E><07><18> <20> <0C><15>  <16> <18> <1F><17><18><1C><03>F<EFBFBD>U<EFBFBD>N<EFBFBD>(;<3B>;<3B>Q<EFBFBD>?<3F>
<EFBFBD><19><11>C<EFBFBD> <0A><05> 5<>6<>7<>
<EFBFBD><1B> <0C><0F><03><16>|<7C>Z<EFBFBD>0<> <18>A<EFBFBD><14>Q<EFBFBD>x<EFBFBD>+<2B>%<25>$<24>q<EFBFBD>'<27>K<EFBFBD>*?<3F><13>q<EFBFBD><08><03><16>*<2A>$<24>#$<24>s<EFBFBD>7<EFBFBD>Q<EFBFBD>;<3B>L<EFBFBD><19><17><03> <18> <18> <1F><16>|<7C>c<EFBFBD>!<21>S<EFBFBD><14><05><1C>-><3E>&?<3F>?<3F><11>Q<EFBFBD><15>G<> G<><1A>
<EFBFBD><16>|<7C>Z<EFBFBD>0<> <16>A<EFBFBD><13>A<EFBFBD>w<EFBFBD><1B>$<24><1E>
<EFBFBD><15> <16> <16> <1D><16>|<7C>c<EFBFBD>!<21>S<EFBFBD><14><05><1C>-><3E>&?<3F>?<3F><11>Q<EFBFBD><15>G<> G<><15>Q<EFBFBD><03>L<EFBFBD>5<EFBFBD>0<>1<>2<><06><12><<3C><1A>f<EFBFBD>!4<>5<>5<><18>K<EFBFBD><16>q<EFBFBD>#<23>d<EFBFBD>U<EFBFBD>l<EFBFBD>+<2B>,<2C>H<EFBFBD><14><01>6<EFBFBD>K<EFBFBD>
2026-04-27 13:58:09 +01:00
<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>
2026-05-07 09:01:32 +01:00
<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><>M<19> \<01><15>8<EFBFBD>8<EFBFBD>QV<51>WX<57>QY<51>Z<>A<EFBFBD>U<EFBFBD>3<EFBFBD>q<EFBFBD>!<21>k<EFBFBD>/<2F>#:<3A>1<EFBFBD>q<EFBFBD>5<EFBFBD>A<>E<>E<>G<>Z<><5A>Z<>[<5B>D<EFBFBD> \<01><>PNs%<00>&A M!<00>'*O<08>!%O<03>*N1
<EFBFBD>0 O<03>Oc
2026-04-27 13:58:09 +01:00
<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-05-07 09:01:32 +01:00
r)rGrr6g<><67>&<26> .>r)<0E> DAT_THRESH_VrOr<00>sortrDrBr;r<r=r?<00>roundr>r[<00>append)r]r^rErF<00> hs_start_idx<64>
2026-04-27 13:58:09 +01:00
dat_thresh<EFBFBD>
2026-05-07 09:01:32 +01:00
clk_thresh<EFBFBD>t_hsrMrN<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_bitsr<73>s#<00><00><12><19>!<21>
2026-04-27 13:58:09 +01:00
<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>
2026-05-07 09:01:32 +01:00
<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-05-07 09:01:32 +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>Ks<00><><00><><00>6<><01>)<29>A<EFBFBD>,<2C>!<21>#<23>6<>s<00>)rZrB<00>sumr<6D>)r<><00>resultrj<00>_<>b<>valr<6C>s @r<00> bits_to_bytesr<73>Cs<><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-05-07 09:01:32 +01:00
N)r\<00> HS_SYNC_BYTE)<04> raw_bytesrjr<><00>byte_vals r<00>find_sync_byter<65>Ts3<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.
2026-05-07 09:01:32 +01:00
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)rr r
rrrr rz 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-05-07 09:01:32 +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>}d}td<1B>D]l}t||d<00>}tt|<15>d z
<00>D]B}||d tk(s<01>||d zd }|d!z dk(s<01>'|d"ztvs<01>3||kr
|}|}|}|}d#}<00>l<00>n|s:td<1B>D],}t||d<00>}t|<15>}|<18><01>||ks<01>%|}|}|}|}<10>.|<0F> t|<0E>}|<10>|rtd$td%<25>d&<26><03>d}n)|r'||d}|rd'nd(}td)|<10>d*|d<10>d+|<11>d,|<1A>d-<2D> <09>||d zd}t!|ddD<00><1C>cgc]\}}|<1D><02> c}}<1C>}|r3|r1td.<2E>td/|d0d%<25>d1|d2<00>d3|d4d%<25>d5|d6<00>d-<2D> <09>|d dD<00><1C>cgc]\}}|<1D><02> }}}|<02>r"t|<1F>} | t"zt$dzz}!td7| <20>d8|!<21>d9<64><05>| dk\r9d:j'd;<3B>|dd<D<00><00>}"td=|"<22><00><02>| d<kDr td><3E>t)d?<3F>t+|<1F>D<00>d<12>}#|#<23>td@| <20>dA<64><03>n5tdB|#<23>dC||#d%<25>d-<2D><05>tdD|#t"zt$dzz<00><00><02>| dEk\rLt-|<1F>}$|$dFd<10>dG|$dH<00>dI<64>}%|$dJr|$dJ}&|%dK|&d<00>dL|&dMd%<25>dN|&d d%<25>d-<2D>z }%tdO|%<25><00><02>t|<1F>dEk\r t-|<1F>nd}'|| | t|<0E>t|<0F>||||'dP<64> Scc}}wcc}}w)QzE
2026-04-24 15:24:27 +01:00
Full decode of a proto capture. Returns dict with results.
<20>
2026-05-07 09:01:32 +01:00
<EFBFBD><============================================================<3D>Cap r#<00>: r6<00>
Window: r<00><00><>.A<>.2f<EFBFBD>..r'<00> µs (<28>
2026-04-27 13:58:09 +01:00
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>
2026-05-07 09:01:32 +01:00
Decoded <20> bits (r<00> bytes)<29><00> ERROR: Too few bits decodedFrr<>r<>T<> WARNING: HS sync byte (0xr<78><00>1) not found in any bit phase — using raw byte 0<> validated<65>bare<72> HS sync byte found at byte <20> (t=<3D> ns, bit phase=<3D>, r<><00>
DSI Header (lane 0):<3A> DI = 0xr<78><00>
→ VC=r<><00> DT=0xr<78><00> (r<><00>
2026-04-27 13:58:09 +01:00
Lane 0 payload: <20> bytes decoded (≈ first <20> pixels' components)<29> c3<00>$K<00>|]}|d<00><04><01><00>
2026-05-07 09:01:32 +01:00
y<01>w<01>r<>Nr<4E><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<4E><00>r<>rjr<>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>
2026-04-27 13:58:09 +01:00
All <20>/ payload bytes are 0x00 (blank / border region)<29>)
2026-05-07 09:01:32 +01:00
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 0xr8<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)r2<00>print<6E>namerr;rr<r=rBr<>r<>rZr<>r<><00> VALID_DSI_DTr<54>r<><00>N_LANES<45>BPP<50>join<69>nextr\<00>check_pixel_content)(r r!r<><00>clk_path<74>dat_pathrErFr]r^rHr<><00> t_hs_start_ns<6E> t_hs_end_nsrr<>r<>r<00>
best_phase<EFBFBD> best_syncr<63><00>phase<73>rbrj<00> next_byte<74>si<73>t_sync<6E>qual<61>
data_bytesr<EFBFBD>r<>rr<00> n_payload<61>n_pixels_partial<61>hex_str<74> nonzero_idx<64>cc<63> match_str<74>mmrs( r<00>decode_capturer%<00>s<><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<>
2026-05-07 09:01:32 +01:00
<EFBFBD>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E> <12> <11>1<> 2<><13><16>I<EFBFBD><15>H<EFBFBD><12>J<EFBFBD><14>T<EFBFBD><19>I<EFBFBD><16>I<EFBFBD><16>q<EFBFBD><18> <1A><05> <1A>4<EFBFBD><05><06><<3C> (<28><02><16>s<EFBFBD>2<EFBFBD>w<EFBFBD><11>{<7B>#<23>
<1A>A<EFBFBD><11>!<21>u<EFBFBD>Q<EFBFBD>x<EFBFBD><<3C>'<27><1E>q<EFBFBD>1<EFBFBD>u<EFBFBD>I<EFBFBD>a<EFBFBD>L<EFBFBD> <09><1D><11>N<EFBFBD>q<EFBFBD>(<28>i<EFBFBD>$<24>.><3E><<3C>-O<><18>9<EFBFBD>}<7D>%&<26> <09>%*<2A>
<EFBFBD>%'<27> <09>%&<26><08>%)<29> <09><19>
<1A> <1A> <15><1A>1<EFBFBD>X<EFBFBD> <20>E<EFBFBD><1E>t<EFBFBD>E<EFBFBD>F<EFBFBD>|<7C>,<2C>B<EFBFBD><1F><02>#<23>B<EFBFBD><11>~<7E>"<22>y<EFBFBD>.<2E><1F> <09>"<22>
<EFBFBD><1F> <09><1F><08> <20><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>"+<2B>;<3B><16>D<EFBFBD> <11>1<>(<28><1A>4<EFBFBD><06>s<EFBFBD>|<7C>?<3F>[e<>Zf<5A>fh<66>im<69>hn<68>no<6E>p<> q<><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>
2026-05-07 09:01:32 +01:00
<06><>U'E<01><>3s <00> Q
<EFBFBD>+ Qc <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
2026-04-27 13:58:09 +01:00
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
2026-05-07 09:01:32 +01:00
dz } |rtd| d<11>d| d<1A>d<1B><05>t|
tdtd| z <00><00>zt|<08><00>}t t j ||
|<00><00>}tdtd|<0F><00>}|rtd |dzd<11>d!<21><03>t|||||
|t<00>"<22>}|r'td#t|<10><00>d$t|<10>d%z<00>d&<26><05>t|<10>d'kr|r td(<28>yd}d}d }t|<10>}d)}td%<25>D]l}t!||d<00>}tt|<17>dz
<00>D]B}||dt"k(s<01>||dzd}|d*z d k(s<01>'|d+zt$vs<01>3||kr
|}|}|}|}d}<00>l<00>n|s:td%<25>D],}t!||d<00>}t'|<17>}|<1A><01>||ks<01>%|}|}|}|}<12>.|<11> t!|<10>}|<12>|rtd,t"d-<2D>d.<2E><03>d }n)|r'||d }|rd/nd0}td1|<12>d2|d<11>d3|<13>d4|<1C>d5<64> <09>||dzd}t)|dd%D<00><1E>cgc]\}}|<1F><02> c}}<1E>} |r3| r1td6<64>td7| d8d-<2D>d9| d:<00>d;| d<d-<2D>d=| d><00>d5<64> <09>|ddD<00><1E>cgc]\}}|<1F><02> }!}}|<02>r"t|!<21>}"|"t*zt,d%zz}#td?|"<22>d@|#<23>dA<64><05>|"d'k\r9dBj/dC<64>|!ddDD<00><00>}$tdE|$<24><00><02>|"dDkDr tdF<64>t1dG<64>t3|!<21>D<00>d<15>}%|%<25>tdH|"<22>dI<64><03>n5tdJ|%<25>dK|!|%d-<2D>d5<64><05>tdL|%t*zt,d%zz<00><00><02>|"dMk\rLt5|!<21>}&|&dNd<11>dO|&dP<00>dQ<64>}'|&dRr|&dR}(|'dS|(d <00>dT|(dUd-<2D>dV|(dd-<2D>d5<64>z }'tdW|'<27><00><02>t|!<21>dMk\r t5|!<21>nd})|| | t|<10>t|<11>|| |!|)dX<64> Scc}}wcc}}w)YuH
2026-04-27 13:58:09 +01:00
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().
2026-05-07 09:01:32 +01:00
r<>r<>r<>r#r<>z [LP single-ended]r6r<>rr<>r<>r<>r'r<>r<>r<>r<>r<>T)r`Nr<4E>r<>r<>r<>r<>r<>rrUg<><1E><>Q<EFBFBD><51>?rz DAT+ HS common mode: z+ mV (auto-detected, used as bit threshold))r<>r<>r<>r<>rr<>r<>r<>Fr<46>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>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><3E>r<>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><3E>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r8r<>r<>r)r4r r
rr;rr<r=rBr<>r[r>r?r<><00>LP_SE_CLK_THRESH_VrZr<>r<>r r<>r<>r r rrr\r)*r r!r<>rrrErFr]r^rHr<>rrr<00> hs_probe_end<6E>dat_common_moder<65>r<>rrrr<>rrrjrrrrrr<>r<>rrrrr r!r"r#r$rs* r<00>decode_lp_capturer,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>
2026-04-27 13:58:09 +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<>B<12><15>e<EFBFBD>*<2A><1C>Z<EFBFBD><05>d<EFBFBD>
2026-05-07 09:01:32 +01:00
<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>|<7C>c<EFBFBD>!<21>S<EFBFBD><15><15><1D>-?<3F>&@<40>@<40>#<23>e<EFBFBD>*<2A>M<>L<EFBFBD><1B>B<EFBFBD>I<EFBFBD>I<EFBFBD>e<EFBFBD>L<EFBFBD><1C>&F<>G<>H<>O<EFBFBD><19>%<25><13>U<EFBFBD>O<EFBFBD>!<<3C>=<3D>O<EFBFBD><0E> <0A>'<27><0F><04>(<<3C>S<EFBFBD>'A<>Al<41>m<>n<> <16>u<EFBFBD>e<EFBFBD>U<EFBFBD>E<EFBFBD><<3C>"1<>>P<> R<01>D<EFBFBD><0F> <0A>
2026-04-27 13:58:09 +01:00
<EFBFBD>3<EFBFBD>t<EFBFBD>9<EFBFBD>+<2B>X<EFBFBD>c<EFBFBD>$<24>i<EFBFBD><11>l<EFBFBD>^<5E>7<EFBFBD>C<>D<>
2026-05-07 09:01:32 +01:00
<EFBFBD>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E> <12> <11>1<> 2<><13><15>I<EFBFBD><15>H<EFBFBD><12>J<EFBFBD><14>T<EFBFBD><19>I<EFBFBD><16>I<EFBFBD><16>q<EFBFBD><18> <1A><05> <1A>4<EFBFBD><05><06><<3C> (<28><02><16>s<EFBFBD>2<EFBFBD>w<EFBFBD><11>{<7B>#<23>
<1A>A<EFBFBD><11>!<21>u<EFBFBD>Q<EFBFBD>x<EFBFBD><<3C>'<27><1E>q<EFBFBD>1<EFBFBD>u<EFBFBD>I<EFBFBD>a<EFBFBD>L<EFBFBD> <09><1D><11>N<EFBFBD>q<EFBFBD>(<28>i<EFBFBD>$<24>.><3E><<3C>-O<><18>9<EFBFBD>}<7D>%&<26> <09>%*<2A>
<EFBFBD>%'<27> <09>%&<26><08>%)<29> <09><19>
<1A> <1A> <15><1A>1<EFBFBD>X<EFBFBD> <20>E<EFBFBD><1E>t<EFBFBD>E<EFBFBD>F<EFBFBD>|<7C>,<2C>B<EFBFBD><1F><02>#<23>B<EFBFBD><11>~<7E>"<22>y<EFBFBD>.<2E><1F> <09>"<22>
<EFBFBD><1F> <09><1F><08> <20><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>"+<2B>;<3B><16>D<EFBFBD> <11>1<>(<28><1A>4<EFBFBD><06>s<EFBFBD>|<7C>?<3F>[e<>Zf<5A>fh<66>im<69>hn<68>no<6E>p<> q<><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>
2026-04-27 13:58:09 +01:00
<06>
2026-05-07 09:01:32 +01:00
<06><>K'E<01><> 3s <00> S
<EFBFBD>0 S#<06>cap_a<5F>cap_brc <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-05-07 09:01:32 +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<00> Cap r<><00> bytes available, DI=0xrr<>r<><00> HS_start=rr<><00>ns<6E>
2026-04-27 13:58:09 +01:00
No differences in first <20> bytes — data content matches.<2E>
2026-05-07 09:01:32 +01:00
<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)r9<00>full<6C><01>moderrr8<00>!
Cross-correlation peak at lag=<3D>" bytes → data may be shifted by <20> bytes between captures<65> bytes (0 = no shift))r r%r[rBrZr r rrC<00>uint8<74> correlaterAr;<00>meanr?<00>argmax<61>abs<62>r-r.r!r<00>res_a<5F>res_b<5F>pa<70>pb<70> n_comparerj<00>diffs<66>offset<65>ba<62>bb<62> pixel_group<75>pa_arr<72>pb_arr<72>xcorr<72>lags r<00>compare_capturesrd<00>sI<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
2026-05-07 09:01:32 +01:00
Comparing LP cap r#r0r1r2Fr3Nz1 ERROR: Could not decode one or both LP capturesrr4r<>r5rr<>r<>r6rr<>r7r8r9r:r;r<r=r>r?r@rArBrCrrDrErFr<>rGrHr9rIrJrrr8rLrMrNrO)r r,r[rBrZr r rrCrPrQrAr;rRr?rSrTrUs r<00>compare_lp_capturesrg<00>sG<00><00>
2026-04-27 13:58:09 +01: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<>
2026-05-07 09:01:32 +01:00
<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><>! Lrer<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
2026-04-27 13:58:09 +01:00
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
2026-05-07 09:01:32 +01:00
Nr)r<><00> n_mismatchesr<73>r<>r<>r<00>d)r\<00>STATIC_PINK_LANE0r<30>rB)rrh<00>checkrj<00>actual<61>
mismatchess rrrs<><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
2026-04-27 13:58:09 +01:00
<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
2026-05-07 09:01:32 +01:00
T<> decode_failed)<02> anomalous<75>flagsru5sync_byte_not_found — HS burst may not have startedrTzsync_byte_late (found at byte u0, expected ≤ 5) — possible byte misalignmentrr<>r'rrr rrr r zunexpected_packet_type DT=0xr<78>rr<>r<>g<00>V@r<>zfirst diff at byte rr<>r8r<>r<00>zpixel_content_mismatch (r<>r<>r<>z bytes match; r<>)r<>r<><00> DSI_DT_RGB888<38> DSI_DT_HSYNC<4E> DSI_DT_VSYNCrBr<00>bool)
r<EFBFBD>rtrrr<><00>known<77>payloadr"r$<00>details
r<00>analyse_for_anomaliesr}2s<><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>
2026-04-27 13:58:09 +01:00
<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>
2026-05-07 09:01:32 +01:00
<1E>e<EFBFBD><1B>u<EFBFBD> 5<>5rc
2026-04-27 13:58:09 +01:00
<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-05-07 09:01:32 +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)r<>r<><00>metavarr<72>z--lp<6C>
store_truezEDecode from LP single-ended files instead of proto differential files)<02>actionr<6E>z--listzList available capturesz*_proto_*_dat.csvr<76><00><><EFBFBD><EFBFBD><EFBFBD>z*_lp_*_dat.csvzAvailable proto captures: zAvailable LP captures: Tr3rsz
*** BIT-LEVEL ANOMALIES: r<>rtz ***zJ
No bit-level anomalies detected (sync, packet type, pixel content all OK))<18>argparse<73>ArgumentParser<65> add_argumentr?r)<00>DATA_DIR<49>
parse_argsr<00>dir<69>listr*r+<00>stem<65>splitr <00>compare<72>lprg<00>caprdr,r%r}r)
<EFBFBD>parser<65>argsr!<00> proto_files<65>f<>
proto_caps<EFBFBD>lp_files<65>lp_capsr<73><00>anomalys
r<00>mainr<6E>js<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<>
2026-05-07 09:01:32 +01:00
<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><)2<>__doc__r<5F>r+<00>sys<79>pathlibr<00>numpyr<00>__file__<5F>parentr<74><00> DISPLAY_W<5F> DISPLAY_Hr r <00>PAYLOAD_BYTES_PER_LANE<4E>HEADER_BYTES_PER_LANE<4E>FOOTER_BYTES_PER_LANE<4E>TOTAL_LANE0_BYTESrvrwrxr r<>r<>r)<00>LP_SE_DAT_THRESH_V<5F>LP_SE_LP01_THRESH_Vrmrr?r2r4rOr<>r<>r<>r<>r<>ryr%r,rdrgr<><00>dictrr}r<><00>__name__r<5F>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>L<01> <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>4J<10>d-1<>#<10>T
<12>" <10><06>LO<06>C<EFBFBD>O<06>4<EFBFBD>O<06>$<24>O<06>lV<06>s<EFBFBD>V<06>d<EFBFBD>V<06>T<EFBFBD>V<06>z+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