目次
きっかけ
偶然Sonyのデジタルフォトフレームを手に入れたので使い道を探るべく分解しました。デジタルフォトフレームって一時期流行りましたよね。その後スマホの普及で一気に廃れましたが
分解する目的ですが、色々やってESP32などと連携させて在室表示板みたいなものを作れたらいいなって思ってます。
仕様
どちらも古く10年以上前の機種です。
DPF-HD800
2013年1月発売
8インチ
2GB
動画再生可能
DPF-D92
2009年11月発売
9インチ
1GB
動画再生不可
ベゼルが異常に太いです。
分解
サクサク行きますよ
どちらもネジと爪ではまっているので適当にやれば取れます。
DPF-HD800
フロントパネルを取り外したところです。バックライトの黒と白の線のコネクタが異常に固くて抜くのが大変でした。
基板がバックパネルにネジで止まっているので、スピーカーとリモコン用赤外線センサを外して基板を取り出せます。
ざっと見た感じ
SoC・・・Amlogic AML6236-VH-B
RAM・・・EtronTech EM6A8160TSD 64MB(データシート)
ROM・・・winbond W25Q80BV 1MB(データシート)、TOSHIBAのNAND 2GB
液晶パネル・・・HannStar HSD080IDW1
でした。SoCに関しての情報がほとんどインターネットなくてよくわかりませんでした。一応ロシアや中国な感じのサイトにログインしたり課金すればデータシート的なものをゲットできそうでしたが、そこまでのリスクを犯す価値は無いのでやってないです。フラッシュが2つ乗っていました。SPIの方は後でROMライタで吸い上げます。
DPF-D92
さっと見た感じ
SoC・・・ASmedia Technology ASM3161
RAM・・・ESMT M12L2561616A-6T 32MB(データシート)
ROM・・・PCM Pm25LV010 128KB(データシート)、TOSHIBAのNAND 1GB
液晶パネル・・・HannStar HSD090IDW1
でした。またまたSoCに関しての情報がほとんどありませんでした。後で判明しますが、CPUアーキテクチャはMIPSELでした。構成としてはHD800と似た感じで2009年当時のスペックに落とした感じです。動画再生が無いにもかかわらずこんなにスペックいるんですかね?アニメーションに必要なのかな?
UART
UARTでコンソールに入るべく基板上のテストパッドをオシロスコープを使って調べます。
DPF-HD800
基板の表面に1つの未実装コネクタと12個のテストパッドがあります。未実装のコネクタは右(1番ピン)からVcc(3.3V)、GND、?、?、?といった感じでした。調べましたがプルアップはされていますが信号が全く出力されていませんでした。SWDな気がします。他のテストパッドも観察しましたが、信号が来ているものがあるものの、周波数が全く違ったりしてUARTらしきものは見つかりませんでした。
DPF-D92
基板の表面に2つの未実装コネクタと多数のテストパッドがありました。特に基板の下部にある未実装のコネクタの横に書かれているパッドには、TP_TX、TP_RXと書かれており、これは確定でUARTです。コネクタもそのパッドとつながっていました。オシロスコープでボーレートを計測してみるとだいたい115200でした。接続してみると無事にブートログがみれ、コンソールにも入れました。ブートログとhelpは最下部にまとめて示しておきます。
起動ログからOSはeCos、CPUの周波数は192MHz、NANDからの起動であることがわかります。eCosは、組み込み向けのRTOS(リアルタイムOS)らしく、カーネルもオプション扱いらしいです。POSIX互換やμITRON互換があるようです。MONOist「μITRON/POSIX互換のRTOS「eCos」はカーネルもオプション!?」が詳しくて良いです。
コンソールのhelpからは、ls、cdがあることがわかるのですが、/に何もファイル・ディレクトリがなく何もできませんでした。各種画像処理系のコマンド、USB関係のコマンドが使えそうですが、それと言って面白そうなのはありませんでした。ただ、UARTでコマンドを送ってあげれば画像の切り替えができる気がするので、在室表示板は作成できますね。データシートが存在すれば、レジスタを直接打っていろいろできるんですけどね。
SPIフラッシュのダンプ
どちらの機種にもSPIフラッシュとNANDフラッシュの両方が乗っています。ということでSPIフラッシュをROMライタを使用してダンプしてみました。
DPF-HD800
そのままROMライタでダンプしようとしたところ、電源が吸いつくされて動作しなかったので、一度Vddのピンをペンチで切断しました。吸い取ったバイナリデータをぱっと見た感じはじめの方にブートローダらしきものが入っており、途中に少しconfigファイルのようなものがありました。9割以上はすべてFFでした。ただ、実はカーネルって場合もあり得るのでよくわかりません。aml bootや1h_6236vh_spi_inandなどの文字列があったので、ブートローダーかなーって感じです。binwalkにかけてもLZMAファイルが1つ出てくるだけでそれらしいファイルは出てきませんでした。
DPF-D92
HD800とは違ってそのままダンプできました。こちらはフラシュの容量がDPF-HD800よりもかなり少なくて、一瞬で吸い終わりました。binwalkで見たところ、eCosのカーネルが含まれているようです。また、CPUのアーキテクチャはMIPSELのようです。
アップデートファイルの解析
DPF-HD800
アップデートが見つかりませんでした。
全くアップデートに関する記述が無いので、ファームウェアアップデートが無かった感じがします。
DPF-D92
めちゃ古い機種ですけど公式サイトにファームウェアアップデートが残っていました。
SONY「DPF-D92ファームウェアアップグレードのご案内」
最後のアップデートでver2.05だそうです。一応、自鯖ミラー(D92_V205.zip)もおいておきます。
binwalkで解析したところ色々ファイルが出てきました。実行ファイルっぽいもの(demo.bin)と、jpeg、TIFFファイルっぽいものが見えます。なんか、うまく展開できなかった上に、そこまでおもしろそうじゃないので、これ以上深追いはしません。
在室表示板の作成方法の考案
何種類かあります。
・リモコン信号を使って画像を切り替える
事前に写真を本体に入れ、それをリモコンの信号(ESP32発信)を使って画像を切り替える方法。
・UARTから画像を切り替える
事前に写真を本体に入れ、それをUARTのコンソール(ESP32が操作)を使って画像を切り替える方法。
・入っている写真を切り替える
現在開発中のUSBSDカードリーダーとして振る舞いつつWiFiでブラウザからも読み書きできるものを使用して写真自体を差し替える方法。
今のところ、本体への改造が最小限ですみ、新規の開発がほとんどいらない3つ目の選択肢にしようと思っています。完成したらまた記事にしようと思います。
おわりに
途中で面白いQittaを見つけました。
Qitta @yamori813(もり や) 「[失敗]フォトフレームHack」
SoCのデーターシートが何にもかかわらず色々試してみたり改造ソフトを作成したりしていてすごいです。
ちょっと分解するものが古すぎて面白みに欠けました。
起動ログ
%$3456S1.18B#@ZAJ1n%InitPMU()
pmu: RTCIntSt 0x00000004
mem_capacity 0x001dd800 sectors
eNand_DrvInit OK!
gpBootTempAddr 0x81000000
real code at 0x1d20600,
resource at 0x20000,
config table at 0x1d20000
private space 0x4100000
CheckSum 0xe8
startAddr : 0x39720400
SW size 1312444, sizeof(PkgHeader
Load firmware from sector 0x39720400
Uncompressing...Done.
Starting from 8000050c
+FATFS v0.5c 2005/06/22
MemoryStick_driver v0.9 2005/09/20 Yuwen
SD_Card_Reader v1.0 2006/01/05 Kevin
Ata_driver v1.1 2005/06/22 Yuwen
xdcard_driver v1.0 2007/01/24 Coree
xdcard_disk v1.00 2007/01/31
GPIO v0.3 2007/03/22 Released
eNand v1.0 2006/01/05 Kevin
USB_DEVICE v1.02 2005/06/10Yuwen,add flash rom manager
USB_HOST v1.2 2005/07/01
APMP_Hal v1.01 2005/05/23
OSAL v1.01 2005/05/31
vout v0.6 2006/07/11 Eric62
SystemExplorer v0.9 2005/04/22
I2C_MASTER v1.0 2005/06/01
NLS_Unicode v1.01 2005/06/06
spiee v0.3 2005/09/21 Release
IMAGEBASE v1.1 2005/08/16 Andrew
JPEG v1.01 2005/07/14 Andrew
BMP v1.1 2009/01/06
TIFF v1.00 2008/05/13 Diesel
RTC v2 2008/01/31
BACK_LIGHT_CONTROLLER v1.00 2007/12/19 Eric Chang
LRADC_v2 v1.0 2008/02/13 Eric62
VOCOLORLCD v1.0 2005/08/19
rscmgr v1.0 2006/11/7 Jonas; Support miniRAM version
gdi v0.7 2005/05/31 Release
Gdi_Components v0.81 2005/06/27 Release
tiltsensor v0.1 2007/11/06
pwm v0.2 2007/02/14
eCosShell> Shell Init -
free chunk 0x814d34a8, size 11717472 bytes
free chunk 0x80336858, size 272 bytes
summary: freeblocks: 2, allocated: 18467920, free: 11717724, base:0x80336740, arenasize: 30185664
============== checkHardwareModelVersion begin ===============
--------- V7
============== checkHardwareModelVersion end ===============
INFO/ecos-d/LiteonIT_branch/Sony/packages/devs/vp/v1_0/src/vp.c: VP initialized
WAIT PICSTART COUNT (11,11) 1
InitPMU()
pmu: RTCIntSt 0x00000000
Init PMU: Create IdeSem:6
PLL set to job:0x9
index:12
PMU: CPU clk: 192 MHz, Mem clk: 144 MHz)
PMU Jumps to SRAM
change CPU freq ok
Change VO divider wait ok!
nPLL: 112a8800
nFreq: 288
nDiv: 14
enand_max_tran: 20
nDiv increase: 15
nDiv increase: 16
nDiv 10
PMU Set default Job OK!(HYPER_JOB)
PWM_Init PWM0 divider 0
Global Spiee Obj = 0x802B3DBC
Enable Write Protect...
Enable Power Save Mode...
ATA_Init();
ASYNSEM: 8
Create FLAG OK
Create Interrupt..
OK
enand_spec_vers = 4
enand_bus_width: 0
enand_hs_timing: 1
enand_card_type: 3
max tran = 26
enand_bus_width: 1
enand_hs_timing: 1
enand_card_type: 3
Mem = 001dd800
nPLL: 112a8800
nFreq: 288
nDiv: 11
enand_max_tran: 26
nDiv increase: 12
Vector table checksum:e8->etorTable() 1, m_StorType 3
Private space size 0x04100000 bytes
Config Addr1d20000
Resource Addr20000
RealCode Addr1d20600
RingTone Addr1f20600
NandInfo Addr147f0
Global Spiee Obj = 0x802B3DBC
Enable Write Protect...
Enable Power Save Mode...
Init Software Timer ok
: starting CPE EHCI USB Controller
ehci_hcd (CPE_AMBA) at 0x0xc2000000, irq 40
DeviceClass 0x09, idVendor 0x0000, idProduct 0x0000, USB spec:0x0200
Product: CPE_AMBA EHCI
Manufacturer: Non-OS 1.0 ehci_hcd
SerialNumber: cpe_ehci
bInterfaceClass 0x09
registered new driver hubFOTG200 OTGD Initialization
fotg200_driver (CPE_AMBA) at 0x0xc2000080, irq 40
Usb2 init
ext_ehci_cpe_dev_init
ext_ehci_cpe_hcd_init Enter
ext_ehci_hcd_cpe_ehci_drv_probe Enter
ext_cpe_ehci_hcd_init Enter
ext_usb_hcd_cpe_ehci_probe Enter
: starting CPE EHCI USB Controller
Add Ext CPE_AMBA at reg: 0x1000010DeviceClass 0x09, idVendor 0x0000, idProduct 0x0000, USB spec:0x0200
Product: EXT_CPE_AMBA EHCI
Manufacturer: Non-OS 1.0 ext_ehci_hcd
SerialNumber: ext_cpe_ehci
bInterfaceClass 0x09
DmaFlag ID:7
CfgTableSize: 96Config table checksum:51->51
VID:54c
PID:3d1
Vendor String:Sony DPF-D92 0100
S
Product String:DPF-D92 0100
S
Revision String:0100
SSearching the dev: /dev/hda/
Find the dev: /dev/hda/, Share: 0
Searching the dev:
InitLUNDevList Exit, 1 valid devices, 1 LUNs
KERN_INFO Initializing USB Mass Storage driver...
registered new driver usb-storageKERN_INFO USB Mass Storage support registered.
registered new driver csr-usbusb_hest_load...
registered new driver usb-vendorg_UEHStopHostMode: 1
g_UsbStopDeviceMode: 0
SysDispatcher::initLoitDriver
CLRADCDev Init OK.
CDC ******** status ---- 5
****RTC** HW Version is 5 ******
CDC ******** status ---- 5
########## RTC time : 2009/01/01 01:38:16 #########
DeviceManager boot up USB mode = 1 .................................
PWM_Init PWM1 divider 0
SysDispatcher::run53595344495350415443484552
XDC DricommonDeviceControl->getButtonPressStatus53595344495350415443484552
commonDeviceControl->getButtonPressStatus53797344697370617463686572
SysDispatcher::getMessage53797344697370617463686572
ver : Load configure settings. Ok
SysMonitor & AsmMsgTask inited ..................
switchUsbMode mode to:0(current:1) ,g_bIsUSBInDevMode=0, g_ExtUsbTskMode=0
JPEG DecodeAndScale 800x480
g_UsbStopDeviceMode: 1
g_UEHStopHostMode: 0
switchUsbMode switch to 0 end
Scale 750x480
After PostScale 750x480
IMGEFT_Main(ENTER: mode:0)
IMGEFT_Main(Leave: mode:0)
switchUsbMode mode to:0(current:0) ,g_bIsUSBInDevMode=0, g_ExtUsbTskMode=2
switchUsbMode mode to:0(current:0) ,g_bIsUSBInDevMode=0, g_ExtUsbTskMode=2
Do_Type_B_Device Func_Exit
switchUsbMode mode to:0(current:0) ,g_bIsUSBInDevMode=0, g_ExtUsbTskMode=2
JPEG DecodeAndScale 800x480
Scale 750x480
After PostScale 750x480
IMGEFT_Main(ENTER: mode:0)
IMGEFT_Main(Leave: mode:0)
help
eCosShell> help
Commands Descriptions Usage
-------- ------------ -----
reset Reset the system
cd Move to the specific diremory dump
osd_del2
osd_try2 2 layer OSD test [0 (OSD0 Palette)|1 (OSD0 ARGB)], [0 (OSD1 Palette)|1 (OSD1 ARGB)]
osd_try3
osd_try4 fade-in
osd_try5 fade-in
panel
scale
set_palette
showpic_off
vp_osd_add
vp_fps set VP frame rate
vp_gm Gamma test [gain percentage]
vp_gm_gain Gamma test [gain percentage]
vp_gm_tbl Gamma test
vp_gm_update Gamma test
vp_ib_update ib test
vp_ib_update_i ib test
vp_osd OSD test [width] [height] [top] [left] [0 (ARGB)|1 (RGB)]
vp_osd_alpha OSD alpha blending test [0 ~ 15]
vp_osd_reg test osd register
vp_osdlist
vp_osd_rm
sc_mem_test
vp_tcon_hv set TCON direction
six_h six_h [h1][h2][h3][h4][h5][h6]
six_s six_s [s1][s2][s3][s4][s5][s6]
six_y six_y [y1][y2][y3][y4][y5][y6]
color
cpu Show CPU usage
memory Print out the current memory info
rr Read register
rr8 Read register in byte
wr Write register
wr8 Write register in byte
gdb Trigger GDB breakpoint
gif Decode and show gif file [file]
help Displays a list of commands
? Displays a list of commands
ib_style ib_style [style]
image_close close current image [PicNum]
image_decode image decode unit test
image_fade set image fade [PicNum]
image_mirror mirror current image with a specific angle
image_move move current image to the specific direction
image_play image playback shell command
image_rotate rotate current image to specific angle
image_thumb get thumbnail-image-buffer
image_zoom zoom current image to specific size [PicNum][Zoom-Size]
ls List file information of directory
memory2 list Liteon memory status list Liteon memory status
memory3eCosShell command execution priority
ps Shows a list of threads
pwd show current directory
sleep sleep for specific mini-seconds [mini-seconds]
showpic show default picture
stop_dev Stop USB Device [0/1]
stop_ueh Stop UEH host mode [0/1]
stress_pwm show default picture
sctest sctest [inw inh outw outh]
test_fs test fs mount/unmount test_fs deviceId
test_usbmode test usb mode switch test_usbmode testInterval_ms testCount
tiff decode and show tiff file [file]
tiff_info show tiff file info [file]
usb_bt USB BT testcase by Get_Description [0/1]
usbmass enable/disable USB mass storage function usbmass
vc_test Vc development tool
vp_demo demo VP usage for VOUT module
vp VP development tool