IT9919 Hacking - part 2 - Hunting for Checksums

Summary

Aug 23, 2019
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.

OpenSCAD PCB Frame Design

//
// 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();