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

147 lines
20 KiB
Plaintext
Raw Normal View History

2026-04-24 15:24:27 +01:00
<EFBFBD>
<00>u<EFBFBD>ioE<00> <00>D<00>dZddlZddlZddlZddlmZddlZee<08>jdz Z
dZ dZ dZ dZe ed zze zZd
Zd
ZeezezZd Zd Zd
Zd ZdZdefd<10>Zdedefd<13>Zd"d<14>Zd#d<15>Zd<16>Zd<17>Zd<18>Zd<19>Z d$dedede!fd<1B>Z"d%dedededefd<1F>Z#d <20>Z$e%d!k(re$<24>yy)&aN
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)
<EFBFBD>N)<01>Path<74>dataii <00><00><00><00><00>><00>!<00><><00><00>pathc<00>T<00>tj|d<01><02>}|dd<00>df|dd<00>dffS)N<>,)<01> delimiterrr)<02>np<6E>
genfromtxt)r rs <20>2/home/david-rice/Python/MiPi_Test/proto_decoder.py<70>load_csvr:s-<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>04dz_clk.csvz_dat.csvz No proto CLK file found for cap z in z No proto DAT file found for cap <20><><EFBFBD><EFBFBD><EFBFBD>)<05>str<74>sorted<65>glob<6F>FileNotFoundErrorr)rr<00> pattern_clk<6C> pattern_dat<61> clk_files<65> dat_filess r<00>find_proto_filesr#?s<><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><><00>ttjtj|<00><00><00>dz}t dt d|z <00><00>}tj tj||kDjt
<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.
<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)
<EFBFBD>t_clk<6C>v_clk<6C> threshold<6C>dt_ns<6E>min_gap<61> crossings<67>keep<65>level<65>rising<6E>fallings
r<00>find_clock_edgesr>Os<00><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>
<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>}d}t dt d|z <00><00>}|dz}d} d}
t||<05>D]} || |kr| dz } <09>| |k\r| }
nd} <09>|
<EFBFBD>*t dt d |z <00><00>} t|
| z|dz
<00>St dt d
|z <00><00>} t d t d |z <00><00>}tjt|<05>D<00> cgc]%} |t d| | z
<00>| dzj<00><00><02>'c} <0B>}d }d}t d t d |z <00><00>}d}d}t|<0F>D]\} }||kr|dz }||k\s<01>| }<13>d}<14>|<13>yd}d}t|t |<0F><00>D]!} || |k\r|<16>| }|dz }||k\s<01>|cSd}d}<14>#ycc} w)u<>
Find the start of the post-LP HS burst in the DAT trace.
For LP-triggered captures (trigger = DAT D+ falling at LP-11→LP-01 transition):
- CLK is in continuous HS mode throughout (215 MHz running)
- DAT shows LP-01 (diff ≈ -1 V) near t=0, preceded by HS data from the
previous line and possibly an earlier LP-01 at the start of the capture
- LP-00 follows LP-01 briefly (~50-200 ns), then the new HS burst begins
- To avoid the LP-01 from the previous line (at capture start), search
from N//4 onwards — the trigger LP-01 is at the capture midpoint (t=0)
Returns index into t_dat just past LP-00, ready for CLK-edge sampling.
Falls back to original std-based method for HS-triggered captures.
r%g<00><>r'g4@rrNrgi@r&<00>g@g{<14>G<EFBFBD>z<EFBFBD>?g{<14>G<EFBFBD>z<EFBFBD>?) r*rr+r,r1r-r.<00>range<67>minr2<00>std<74> enumerate)<17>t_dat<61>v_datr4<00> window_nsr7<00>N<> LP01_THRESH<53>min_lp01<30> search_from<6F>run<75>lp01_end<6E>i<>skip<69>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_startrZis <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><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>*F?c
<00><00>||}t||<03>\}}tjtj||g<02><00>}|||k\} || }
t |
<EFBFBD>dk(rgSt tj tj|<00><00><00>dz} g} |
D]o} || }tt||dz
| dzz <00><00>}tdt|t |<01>dz
<00><00>}||tkDrdnd}| j|dz|f<02><00>q| S)zk
Sample DAT on every CLK edge (DDR) after hs_start_idx.
Returns list of (time_ns, bit) tuples.
rr%g<><67>&<26> .>r)r>r<00>sortr3r1r*r+r,r.<00>roundr-rB<00> DAT_THRESH_V<5F>append)rErFr4r5<00> hs_start_idx<64>t_hsr<r=<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_bitsrk<00>s <00><00>
<11><1C> <1E>D<EFBFBD>&<26>u<EFBFBD>e<EFBFBD>4<>O<EFBFBD>F<EFBFBD>G<EFBFBD><12><07><07><02><0E><0E><06><07>'8<>9<>:<3A>I<EFBFBD><16>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>L<EFBFBD>0<>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
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).
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><3E>s<00><><00><><00>6<><01>)<29>A<EFBFBD>,<2C>!<21>#<23>6<>s<00>)rAr1<00>sumr_)rf<00>resultrN<00>_<>b<>valrrs @r<00> bits_to_bytesry<00>s<><00><><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.
N)rD<00> HS_SYNC_BYTE)<04> raw_bytesrNrv<00>byte_vals r<00>find_sync_byter~<00>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
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
<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><00>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
<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|||||
<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> }}}|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>|| | t|<0E>t|<0F>|||d><3E>Scc}}wcc}}w)?zE
Full decode of a proto capture. Returns dict with results.
<20>
z<============================================================zCap r<00>: r%z
Window: rg<00><>.Az.2fz..ru µs (z
samples, i<><00>.0fz ps/sample)Nz& ERROR: Could not find HS burst startg@<40>@z HS burst start: z ns (z.1fu% µs available of ~18 µs full burst)z
Decoded z bits (rz bytes)<29>z ERROR: Too few bits decodedz WARNING: HS sync byte (0xr<78>u1) not found in any bit phase — using raw byte 0z HS sync byte found at byte z (t=z ns, bit phase=r<>rz
DSI Header (lane 0):z DI = 0xr<78>u
→ VC=r<>z DT=0xr<78>z (r<>z
Lane 0 payload: u bytes decoded (≈ first z pixels' components)<29> c3<00>$K<00>|]}|d<00><04><01><00>
y<01>w)r<>Nro)rprws rrsz!decode_capture.<locals>.<genexpr>zs<00><00><><00>F<>a<EFBFBD>!<21>C<EFBFBD><17>z<EFBFBD>F<>s<00><01>@z First 64 payload bytes: z ...c3<00>2K<00>|]\}}|dk7s<01> |<01><01><00>y<01>w)rNro)rprNrws rrsz!decode_capture.<locals>.<genexpr><3E>s<00><00><><00>P<>$<24>!<21>Q<EFBFBD>a<EFBFBD>4<EFBFBD>i<EFBFBD>A<EFBFBD>P<>s<00> <01>z
All z/ payload bytes are 0x00 (blank / border region)z)
First non-zero byte at payload offset z (0xu" → Corresponds to pixel group ~)r<00> hs_start_ns<6E>hs_duration_us<75>n_bits<74>n_bytes<65>sync_idx<64>header<65> lane0_payload)r#<00>print<6E>namerr*rr+r,r1rZrkrAryr~r{r<><00>N_LANES<45>BPP<50>join<69>nextrD) rrr<><00>clk_path<74>dat_pathr4r5rErFr7r`<00> t_hs_start_ns<6E> t_hs_end_nsr<73>rfr|r<><00>
best_phase<EFBFBD> best_sync<6E>phase<73>rb<72>si<73>t_sync<6E>
data_bytesrvrwr<>r<><00> n_payload<61>n_pixels_partial<61>hex_str<74> nonzero_idxs r<00>decode_capturer<65>s9<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>
<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>
$.<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>$<24>)<29>*<2A><1F><04>I<EFBFBD><1F> <09>N<EFBFBD>$<24>"<22>)<29> <06> <06><>='E<01><>3s <00> M#
<EFBFBD>$ M)<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
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
Comparing cap rz vs cap z (first z payload bytes on lane 0)F<>r<>Nz. ERROR: Could not decode one or both capturesr<73>z Cap r<>z bytes available, DI=0xr<78>r<>r<>z HS_start=r<>r<><00>nsz
No differences in first u bytes — data content matches.z
z byte differences in first z bytes:z <20>Offsetz>8<>Cap_Az>6<>Cap_B<5F>(rz 0xz 0xu (pixel group ≈ r<>z ... (z more)r(<00>full)<01>moderrr'z!
Cross-correlation peak at lag=u" bytes → data may be shifted by z bytes between capturesz bytes (0 = no shift))r<>r<>rBr1rAr<>r<>rr2<00>uint8<74> correlater0r*<00>meanr.<00>argmax<61>abs)r<>r<>rr<><00>res_a<5F>res_b<5F>pa<70>pb<70> n_comparerN<00>diffs<66>offset<65>ba<62>bb<62> pixel_group<75>pa_arr<72>pb_arr<72>xcorr<72>lags r<00>compare_capturesr<73><00>sI<00><00>
<EFBFBD> <1C>U<EFBFBD>3<EFBFBD>K<EFBFBD>x<EFBFBD><05>c<EFBFBD>{<7B>(<28>7<EFBFBD>)<29>Kd<4B>
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><># Ls <00>K#<04> K#c
<00><><00>tjd<01><02>}|jdtdd<05><06>|jdtt t
<00>d<08><06>|jd tdd
d <0B> <0C>|jd dd<0F><10>|j <00>}t|j<00>}|jrgt|jd<11><00>}t|D<00>chc])}t|jjd<12>d<00><00><02>+c}<04>}td|<05><00><02>y|j<00>"t!|j"|j|<02>yt%|j"|d<15><16>ycc}w)Nz-Decode DSI packet content from proto 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--list<73>
store_truezList available proto captures)<02>actionr<6E>z*_proto_*_dat.csvrv<00><><EFBFBD><EFBFBD><EFBFBD>zAvailable proto captures: Tr<54>)<13>argparse<73>ArgumentParser<65> add_argumentr.r<00>DATA_DIR<49>
parse_argsr<00>dir<69>listrr<00>stem<65>splitr<74><00>comparer<65><00>capr<70>)<06>parser<65>argsr<00>files<65>f<>capss r<00>mainr<6E><00>s(<00><00> <15> $<24> $<24>1`<60> a<>F<EFBFBD>
<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>
<EFBFBD><17><17> <0B>#<23>t<EFBFBD> '<27>G<><18>I<01> <0B><17><17><08>L<EFBFBD>?^<5E><17>_<> <11> <1C> <1C> <1E>D<EFBFBD><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>~<7E>H<EFBFBD> <0B>y<EFBFBD>y<EFBFBD><16>x<EFBFBD>}<7D>}<7D>%8<>9<>:<3A><05><16>E<EFBFBD>B<>q<EFBFBD><03>A<EFBFBD>F<EFBFBD>F<EFBFBD>L<EFBFBD>L<EFBFBD><13>-<2D>b<EFBFBD>1<>2<>B<>C<><04> <0A>*<2A>4<EFBFBD>&<26>1<>2<><0E> <0B>|<7C>|<7C><1F><18><14><18><18>4<EFBFBD><<3C><<3C><18>:<3A><16>t<EFBFBD>x<EFBFBD>x<EFBFBD><18>4<EFBFBD>8<><38>Cs<00>.E#<08>__main__)r )Ng@@)T)<01><>)&<26>__doc__r<5F>r<00>sys<79>pathlibr<00>numpyr<00>__file__<5F>parentr<74><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_BYTES<45> DSI_DT_RGB888<38> DSI_DT_HSYNC<4E> DSI_DT_VSYNCr{r^rr.r#r>rZrkryr~r<><00>boolr<6C>r<>r<><00>__name__rorr<00><module>r s6<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>"<22>4<EFBFBD>"<22>
4<>c<EFBFBD> 4<>T<EFBFBD> 4<> <1B>4I<10>`<10>F
<12>" <10><06>Lq<06>C<EFBFBD>q<06>4<EFBFBD>q<06>$<24>q<06>p+S<01>C<EFBFBD>+S<01><03>+S<01>t<EFBFBD>+S<01>c<EFBFBD>+S<01>d9<>0 <0C>z<EFBFBD><19><08>F<EFBFBD>r