IT9919 Hacking - part 2 - Hunting for Checksums
Summary
Aug 23, 2019In 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.
Tools
Source Information
- v3l0c1r4pt0r: Reverse Engineering the LKV373A
- Daniel Kucera's Repository (includes upgrade files, and other captured information).
Mark #2 Rig Design
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();

