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