文章(WHO)为原作者进行恶作剧和创作后,有一定的参考价值,欢迎交流学习。全文共2193字,配图共25张,预计阅读需要5-10分钟左右!

北京大柳树鬼市买的7英寸DVD导航车机器,20元。接到电源后打开电源,在logo上发现了不动的奥迪Q5。(威廉莎士比亚、奥迪、奥迪、奥迪、奥迪、奥迪、奥迪Q5)估计是第三方机器。

我翻了网络,没有找到关于这台机器的资料,当时以为有Android系统、视频等输入,发现是wince系统,视频输入是LVDS数字。

想起来了,颠覆!拆开一看,比较复杂,托管红色核心板,其他IC成堆。

内部情况

大致梳理了机器的IC和结构。令人惊讶的是,TFT屏幕驱动芯片tw8816支持模拟信号输入。模拟信号支持复合视频、色差和RGB,但没有出来。

检查芯片的pdf,进行适当的设置,就可以转换为av输入信号。

大致分析了电路结构。这台机器分为两块电路板,下面是SOC核心板和tft驱动器(B板),上面是各种电源、音频、单片机、接口(A板)等。

Lvds串行数字信号从A板输入,通过max9218接收B板,将LVDS转换为并行DTV数据,然后连接到tw8816的DTV数字电视并行接口。Tw8816被重新处理为tft液晶屏的驱动信号。

A板

=1696035043&x-signature=DVnzGrM5wUJe4meOYYjQFuSOIco%3D&index=7" width="640" height="853"/>

B板

其中核心板的wince系统直接可以驱动lcd,tw8816的lcd驱动和核心板的lcd驱动通过两片fst16233进行切换。也就是用户选择是显示lvds的视频还是wince的视频。

为了让屏幕显示tw8816的内容,直接短接fst16233信号切换引脚到地,强制选择从tw8816的信号作为lcd驱动

接下来结合芯片资料,摸索着焊接了i2c接口线和av复合视频输入线,并在视频输入上串上了75欧姆阻抗电阻和耦合电容,接上了莲花头,找了台红白机作为视频信号源

引出的单片机和莲花头:

由于tw8816中有大量关于tft lcd屏幕参数的设定,然而我并不想详细了解。既然机器能开启并显示奥迪logo,就说明tw8816中的各种设置是OK的。要做的就是读出来就行了

TW8816大概有几百个寄存器,分成256两页:

通过跑线路,tw8816的i2c总线来自于A板上的一颗STM8单片机,它对tw8816进行了寄存器的设置工作

用接口神器“Bus Pirate”接在tw8816的i2c接口上,然后进入i2c的嗅探模式。上电的一瞬间,所有i2c上的写入寄存器的操作全部拿下

bus pirate界面:

嗅探到的i2c通讯内容:

用“Bus Pirate”尝试了一下操作I2C向tw8816的寄存器写入内容,读取内容都没问题。于是开始参照手册设置一些寄存器的内容,以便能支持模拟信号输入

通过不懈的努力,最终需要对输入选择,输入信号格式,各种缩放,边距等寄存器的设置。最终让接入的av信号,正常的显示在了屏幕正中

这个时候,A板的唯一的用途就是上面的stm8单片机向B板的tw8816做寄存器设置,以及一些12v转5v。如果去掉A板,用一片单片机取代,然后直接在B板输入5V应该就可以做到的

为了验证这个想法,需要自己先用脱离A板的单片机,手动设置几百个寄存器的值。看看是否可行

手动设置的工作量太大,这个时候也不可能直接就上单片机编程。于是就用神器“Bus Pirate”的python库来实现

下图是python环境jupyter-nb的界面:

大概就是用电脑操作“Bus Pirate”,写入所有寄存器的值。python很方便易用,是俺的主要编程工具之一。几下就完成了验证工作。验证的结果就是,脱离了A板单片机,直接通过“Bus Pirate”的i2c向tw8816设置寄存器后,画面可以正确显示。

但过程中有一些插曲,去掉A板后发现背光不亮,结果发现是还有屏幕12V的背光供电控制,直接接地即可亮屏。另外就是设置完所有寄存器后还是白屏,折腾一天发现是VGH VGL电压没出来进屏幕。这个也是受控于A板的,直接找到这部分电压驱动,飞线强行启动。

脱离A板和B板的排线:

脱离A板后,拆下B板上的核心板和蓝牙模块用不上了:

下一步就是单片机编程了。程序功能简单,就是写一堆数据到i2c就行了

随便找了一片8脚的pic单片机pic12f675,网上找了一个gpio模拟i2c的程序

把从“Bus Pirate”嗅探到的数据,改成C语言的格式,编程二维数组。tw8816的寄存器几百个, 分成两个page。写到变量page00和page01中。其中二维数组第一个元素表示寄存器号,第二个是值。比如const char page00[][2]={ {0x00,0x22},{0x01,0x83},

表示0号寄存器内容0x22,1号寄存器内容0x83

为了让程序美观(主要是显摆俺的C语言功底),用指向二维数组的指针的数组const char (*page_buff[])[2]={page01,page00};来进行两页数据循环写入。这样写可以方便的进行page和额外数据组的添加。

程序主要部分(因为二维数组指针数组的数据定义很好,所以程序简洁美观):

一阵调试,烧写,测试,改程序的漫长过程之后。这片pic单片机开机上电就对tw8816进行设置。一阵操作猛如虎,画面完美呈现!

所有电路和软件方面的验证工作都OK了,下一步就是装回和改外壳等常规操作了,估计一两天后再进行!本文完!


谢谢观看!

浏览更多精彩内容请登录数码之家网站

技术交流请联系原作者

作者:orsonzou

本文来源:数码之家

相关推荐