====== IT9919 Hacking - part 2 - Hunting for Checksums ====== In this series I will be hacking around with the IT9919 media processor that powers the Lenkeng LKV373 HDMI Extender Device and the EZCAP 283S which were reviewed in previous videos. In this video I will build out a more sophisticated hardware hacking rig, and begin experimenting with the upgrade files. * [[https://odysee.com/@OpenTechLab:f/otl-017-it9919-pt2:c|odysee]] * [[https://youtu.be/YMI6hiksRxE|YouTube]] * [[https://peertube.social/videos/watch/da7eff86-13f8-4879-b509-193dadf1248a|PeerTube]] ===== Tools ===== * [[https://github.com/jhol/otl-lkv373a-tools|Project Git Repository]] ===== Source Information ===== * [[https://blog.danman.eu/new-version-of-lenkeng-hdmi-over-ip-extender-lkv373a/|Danman's Original Blog Post]] * v3l0c1r4pt0r: Reverse Engineering the LKV373A - [[https://re-ws.pl/2017/09/importlkv373a-hdmi-to-ethernet-converter-firmware-image-format/|Firmware image format]] - [[https://re-ws.pl/2017/09/identifying-processor-architecture/|Identifying processor architecture]] - [[https://re-ws.pl/2017/09/lkv373a-reverse-engineering-instruction-set-architecture/|Reverse engineering instruction set architecture]] - [[https://re-ws.pl/2017/11/lkv373a-crafting-elf/|Crafting ELF]] - [[https://re-ws.pl/2017/12/lkv373a-porting-objdump/|Porting objdump]] - [[https://re-ws.pl/2018/01/lkv373a-state-of-the-reverse-engineering/|State of the reverse engineering]] * [[https://github.com/v3l0c1r4pt0r/lkv-wiki/wiki|lkv-wiki]] * [[https://github.com/gyrex/CrystalVideo/tree/master/Docs/Parts/ITE%20IT9910%20(H.264%20Encoder)|Leaked IT9910 Data Sheet]] * [[https://drive.google.com/drive/u/0/folders/0B3mWuDyxrXyKZkxwYi1JNllENXc|Daniel Kucera's Repository]] (includes upgrade files, and other captured information). ===== Mark #2 Rig Design ===== {{:videos:017:201812-rig-photo.jpg?600|}} ==== OpenSCAD PCB Frame Design ==== {{:videos:017:mark-2-pcb-frame.png?500|}} // // Utilities // module mirror_copy(v = [1, 0, 0]) { children(); mirror(v) children(); } // // LKV Board // lkv_hole_dia = 2.8; lkv_pin_dia = 2.8; lkv_pin_height = 4; lkv_board_size = [100, 50]; lkv_hole_spacing = [91.5, 43.0]; module lkv_board() { color([0.75, 0, 0]) difference() { square(lkv_board_size, center=true); mirror_copy([1, 0]) mirror_copy([0, 1]) translate([lkv_hole_spacing[0] / 2, lkv_hole_spacing[1] / 2]) circle(d=lkv_hole_dia); } } // // Pad Board // pad_board_hole_dia = 2.; pad_board_pin_dia = 1.8; pad_board_pin_height = 3; pad_board_size = [60, 40]; pad_board_hole_spacing = [54, 34]; module pad_board() { color([0, 0.75, 0]) difference() { square(pad_board_size, center=true); mirror_copy([1, 0]) mirror_copy([0, 1]) translate([pad_board_hole_spacing[0] / 2, pad_board_hole_spacing[1] / 2]) circle(d=pad_board_hole_dia); } } // // Boards Model // board_spacing = 1.0; module boards() { lkv_board(); mirror_copy([0, 1, 0]) translate([0, lkv_board_size[1] / 2 + pad_board_size[1] / 2 + board_spacing, 0]) pad_board(); } // // Pillars // pillar_dia = 6; pillar_hole_dia = 2.75; pillar_height = 5; module column(d, fn) cylinder(d=d, h=100, $fn=32); module lkv_pillar_cols(d) { translate([0, 0, pillar_height - 100]) mirror_copy([1, 0, 0]) mirror_copy([0, 1, 0]) translate(lkv_hole_spacing/2) column(d=d); } module pad_board_pillar_cols(d) { translate([0, lkv_board_size[1] / 2 + board_spacing + pad_board_size[1] / 2, pillar_height - 100]) mirror_copy([1, 0, 0]) mirror_copy([0, 1, 0]) translate(pad_board_hole_spacing/2) column(d=d); } // // Frame // frame_thickness = 1.5; frame_width = 6; frame_oversize = 8; frame_size = [ lkv_hole_spacing[0], lkv_board_size[1] + pad_board_size[1] + pad_board_hole_spacing[1] + board_spacing * 2 + frame_oversize * 2 ]; frame_reinforcement_height = pillar_height - 2; frame_reinforcement_thickness = 1.5; module frame_border() { color([0, 0, 1]) translate(-frame_size/2) square(frame_size); } module frame_outline(width) { union() { difference() { offset(r=width/2, $fn=32) frame_border(); offset(r=-width/2, $fn=32) frame_border(); } difference() { mirror_copy([0, 1, 0]) translate([0, (lkv_board_size[1] + pad_board_size[1] - pad_board_hole_spacing[1]) / 2 + board_spacing]) square([frame_size[0], width], center=true); square([pad_board_hole_spacing[0], (lkv_board_size[1] + pad_board_size[1] - pad_board_hole_spacing[1]) + 2 * board_spacing + frame_width], center=true); } difference() { mirror_copy([1, 0, 0]) translate([pad_board_hole_spacing[0] / 2, 0]) square([width, frame_size[1]], center=true); square([pad_board_hole_spacing[0] + width, lkv_board_size[1] + 2 * board_spacing + pad_board_size[1] + pad_board_hole_spacing[1]], center=true); } } } // // Main // module ground() { translate([0, 0, -500]) cube([1000, 1000, 1000], center=true); } union() { render(convexity=2) difference() { union() { lkv_pillar_cols(pillar_dia); mirror_copy([0, 1, 0]) pad_board_pillar_cols(pillar_dia); } ground(); } render(convexity=2) difference() { union() { translate([0, 0, lkv_pin_height]) lkv_pillar_cols(lkv_pin_dia); translate([0, 0, pad_board_pin_height]) mirror_copy([0, 1, 0]) pad_board_pillar_cols(pad_board_pin_dia); } ground(); } linear_extrude(frame_thickness) frame_outline(frame_width); linear_extrude(frame_reinforcement_height) frame_outline(frame_reinforcement_thickness); } translate([0, 0, pillar_height]) boards();