iMac Late 2013 で 4K ディスプレイ P2815Q を無理やり使えるようにする。

ハードウェアレポート

DELL の 4K ディスプレイ P2815Q を iMac に普通に繋いだだけでは Retina ディスプレイとして利用できませんでしたが、ディスプレイの設定ファイルを書き換えて、無理やり Retina ディスプレイとして認識させることができました。


以前にこちら で、iMac Late 2013 ではDELL の4K ディスプレイDELL P2815Q をUltra HD で使えなかった話をしましたが、諦めきれなかったので、無理やりUltra HD 出力できるようにしてみました。

それと本来の美しさは出し切れていない様子ながら、Retina モードでFull HD 解像度を表示させることにも成功です。

まず、何もせずに DELL P2815Q を接続した場合…

iMac ではFull HD 止まり

DELL P2815Q というディスプレイは、30Hz 出力に限られるものの、3840x2160 サイズの映像を出力できる4K ディスプレイです。

ただ、これをiMac Late 2013 に普通に接続すると、なぜか1920x1080 までしか認識されませんでした。OS はOS X 10.10 Yosemite です。

OS X ではoption キーを押しながら変更 ボタンを押すと選択できる解像度のリストが増えたりするんですけど、それでもUltra HD を選択できる様子はありませんでした。

MacBook Pro with Retina に限りUltra HD 出力が可能

ただ、以前にこちら でも紹介しましたが、これをMacBook Pro with Retina Late 2013 に接続すると、何事もなかったかのように30Hz のUltra HD ディスプレイとして認識してくれます。

設定を調整すればFull HD のRetina モードでも映ります。OS はYosemite です。

ちなみにMac mini Early 2009 では、iMac Late 2013 と同じようにFull HD 止まりな様子でした。OS はこちらも Yosemite です。

P2815Q を4K ディスプレイとして認識させるための下準備

DELL P2815Q で4K の解像度を扱えないのはとても無念だったので、なんとかDELL P2815Q を4K ディスプレイとして認識させられないか、調べてみることにしました。

OS X Yosemite の画面設定に関するファイル

まず、OS X Yosemite の画面設定に関するファイルは、次のあたりに収められているようです。

これの多くがどうやら画面 の設定に関する項目のようで、中身をみるとそれらしい内容があるのですけど、項目数が非常に多いのと専門的な内容ばかりで、これをいろいろ触ってみるにも自分の知識では骨が折れるところでした。

ディスプレイの認識に関する設定ファイル

そんな中、次のフォルダーに、ディスプレイの認識を調整できるファイルが存在していることがわかりました。

自動的に認識される情報を上書きするためのファイルみたいです。設定自体は高度な様子なのですが、必要な分さえ記述すれば済むので、これならなんとかなりそうです。

このフォルダーにはDisplayVendorID-* というフォルダーがあって、さらにその中にDisplayProductID-* というファイルが保存されています。

このファイルはプロパティリスト 形式になっていて、ここにディスプレイの上書き設定が記載されている様子でした。

DisplayVendorID とDisplayProductID

ここではDisplayVendorIDDisplayProductID という二つの識別子が重要になってきます。これらの識別子を使ってディスプレイを特定し、対応するディスプレイの設定を上書きすることになるようです。

これらの識別子はioreg コマンドを使って、次のようにして調べられます。

ioreg -lw0 | grep IODisplayPrefsKey

このようにすることで、接続されているディスプレイのIODisplayPrefsKey 情報が表示されます。

たとえば、標準ディスプレイの他に2つのディスプレイを接続した自分のiMac Late 2013 では、次のような内容が出力されました。

    | | | | | |       "IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@0/display0/AppleDisplay-15c3-2140"
    | | | | | |       "IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-10ac-f05a"
    | | | | | |       "IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@2/display0/AppleBacklightDisplay-610-a012"

各行の末尾に登場するAppleDisplay-AppleBacklightDisplay- に続く、ハイフンで区分けされた最初がDisplayVendorID で、最後がDisplayProductID になります。

ここの2番目に表示されたAppleDisplay-10ac-f05a が、DisplayPort で接続したDELL P2815Q に当たる様子でした。見るだけではどれがどれだか分からないので、ディスプレイを繋いだり外したりして確かめました。

同じディスプレイであっても、接続方法によってDisplayProductID の値が若干変わってくるようです。

ディスプレイ設定を上書きするのに必要なファイル

ディスプレイのDisplayVendorIDDisplayProductID が分かれば、ディスプレイの設定を上書きするために必要なファイルが決まります。

DisplayPort で接続したDELL P2815Q であれば、DisplayVendorID10ac に、DisplayProductIDf05a になるようなので、設定ファイルは/System/Library/Displays/Overrides/DisplayVendorID-10ac/DisplayProductID-f05a になります。

ちなみにHDMI で接続した場合は、自分の環境ではDisplayProductIDf05c になるようでした。そのため、HDMI 接続で使う場合の設定ファイルは/System/Library/Displays/Overrides/DisplayVendorID-10ac/DisplayProductID-f05c になります。

設定ファイルの編集方法

これらのファイルはプロパティリスト として用意します。

ファイルの内容はXML で記載しますが、Data型 の値を扱うため、テキストエディタだと自由に編集するのが難しくなります。必要に応じて、拡張子.plist を追加してXcode で開くと編集しやすくなります。

このフォルダー内は直接編集できないため、いったんどこかでファイルを作成してから、このフォルダーに移動することになります。

編集できたらMac を再起動することで、設定内容が反映されます。

ディスプレイは EDID で区別されている様子

ディスプレイの認識で鍵を握るのはIODisplayEDID という値です。この値も先ほどのコマンドを使って、出力をIODisplayEDID で絞り込むことで確認できます。

ioreg -lw0 | grep IODisplayEDID

このようにすることで、たとえばHDMI で接続したDELL P2815Q であれば、次の値を取得できました。

<00ffffffffffff0010ac5cf04d52304109180103803e2278ea0aa5a2574fa2280f5054a54b00714f81008180a940b300d1c0d100010104740030f2705a80b0588a006d552100001e000000ff00574a4a47523432514130524d0a000000fc0044454c4c205032383135510a20000000fd0018551f721e000a202020202020015a02032df152901f0102030716041314051211061520212223091f07830100006d030c001000003c200060030201023a801871382d40582c45006d552100001e011d8018711c1620582c25006d552100009e011d007251d01e206e2855006d552100001e8c0ad08a20e02d10103e96006d55210000180000000000000000000086>

このIODisplayEDID を別の値に書き換えてあげれば、別のディスプレイの構成で認識される様子です。

他のディスプレイの IODisplayEDID

そうなると肝心なのが「どのディスプレイのEDID を使うか」ですが、とりあえず身の回りのIODisplayEDID を調べてみると、次のものがありました。

iMac Late 2013 (21.5 inch) 内蔵ディスプレイ

<00ffffffffffff00061012a0000000001c160104b5301b78226fb1a7554c9e250c5054000000010101010101010101010101010101011a3680a070381f4030203500db0b1100001a8d0ec0a0301c102030203500db0b1100001a000000fc00694d61630a202020202020202000000000000000000000000000000000000001e7020326c1230907078301000070fa100000127a31fc78a3b202908854f568fa1000fffaf9f9f91a3680a070381f4030203500db0b1100001a8d0ec0a0301c102030203500db0b1100001a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083>

MacBook Pro with Retina Late 2013 (13 inch)

<00ffffffffffff00061018a00000000030160104a51d1278026fb1a7554c9e250c505400000001010101010101010101010101010101e26800a0a0402e60302036001eb31000001a000000fc00436f6c6f72204c43440a2020200000001000000000000000000000000000000000001000000000000000000000000000000063>

また、世の中にはSamsung U28D590D というディスプレイがあります。

このディスプレイは 28 インチの3840x2160 の解像度が出せる製品で、DELL P2815Q とかなり似た感じになっています。

このディスプレイは持っていなかったのですが、インターネットでIODisplayEDID を知ることができました。

Samsung U28D590D

<00ffffff ffffff00 4c2d800b 00000000 34170104 b53d2378 3a5fb1a2 574fa228 0f5054bf ef80714f 810081c0 8180a9c0 b3009500 d1000bc2 00a0f070 3e803020 35005f59 2100001a 565e00a0 a0a02950 30203500 5f592100 001a0000 00fd0032 4b1e8636 000a2020 20202020 000000fc 00553238 44353930 0a202020 202001f5 02030cf0 23090707 83010000 023a8018 71382d40 582c4500 5f592100 001e0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000097>

DELL P2815Q を4K ディスプレイとして認識させる

さて、設定を書き込むファイルが分かったところで、では何を書き込むとDELL P2815Q を4K ディスプレイとして認識してくれるでしょう。

このファイル内ではscale-resolutions キーで、設定できる解像度のリストを指定できるようになっているのですが、細かい設定はフラグ値で調整しないといけないらしく、また、そもそもここで出力周波数を指定できるのか、わからないところがたくさんあります。

そこで今回は不足な情報を揃えて行くのは諦めて、DELL P2815Q をそもそも別の4K ディスプレイとして認識させてみることにしました。

強制的にSamsung U28D590D として認識させる

それでは、設定ファイル/System/Library/Displays/Overrides/DisplayVendorID-10ac/DisplayProductID-f05a を調整して、DELL P2815Q の設定項目を上書きます。

そのためには最低限、設定ファイルにData型IODisplayEDID を用意します。そしてここでSamsung U28D590D のIODisplayEDID を指定します。

ソースコードで書くと次のようになりますが、データの部分をどう書けば良いか分からないので、いったん拡張子をつけてXcode で書くようにすると簡単です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IODisplayEDID</key>
	<data>AP///////wBMLYALAAAAADQXAQS1PSN4Ol+xoldPoigPUFS/74BxT4EAgcCBgKnAswCVANEAC8IAoPBwPoAwIDUAX1khAAAaVl4AoKCgKVAwIDUAX1khAAAaAAAA/QAySx6GNgAKICAgICAgAAAA/ABVMjhENTkwCiAgICAgAfUCAwzwIwkHB4MBAAACOoAYcTgtQFgsRQBfWSEAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlw==</data>
</dict>
</plist>

このように設定してMac を再起動してあげるだけで、Ultra HD には至らないものの、とりあえずFull HD を超える2560x1440 という解像度を選択できるようになりました。

ディスプレイ名も、ちゃっかりU28D590 になっています。

Ultra HD 出力とFull HD +Retina 出力を可能にする

このようにSamsung U28D590D として認識させた状態で、さらに設定に解像度3840x2160 を扱えることを追記してあげると、いよいよ4K 出力が可能になります。


そのためにはArray型scale-resolutions キーを作成して、その中に「対応させたい解像度」を用意します。

解像度は、最初の8桁で横幅を、次の8桁で縦幅を、それぞれ16進数で記載します。このとき、今回の場合はRetina を加味せず、期待する最大のピクセル数で指定すると上手く行く様子でした。つまり横幅が1920 のRetina を期待している場合は、その倍の3840 を16進数で指定します。

そして最後の8桁でフラグを指定するようです。こに何を指定するとどうなるかは分からないのですが、とりあえず00000001 を指定すると上手く行く様子です。

ここで指定した解像度が無条件に選べるわけではないようですが、適切なものを記載してあげると、画面設定で(少なくとも option キーを押しながら変更 をクリックすれば)選べるようになるようでした。

ついでに、実際のディスプレイがDELL P2815Q なのに、画面設定でU28D590 と表示されていると混乱するので、String型 のキーDisplayProductName を追加して、表示名を変更しておくことにしました。

そうして、次の設定ファイルが出来上がりました。

ソースコードでは次のようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>IODisplayEDID</key>
     <data>AP///////wBMLYALAAAAADQXAQS1PSN4Ol+xoldPoigPUFS/74BxT4EAgcCBgKnAswCVANEAC8IAoPBwPoAwIDUAX1khAAAaVl4AoKCgKVAwIDUAX1khAAAaAAAA/QAySx6GNgAKICAgICAgAAAA/ABVMjhENTkwCiAgICAgAfUCAwzwIwkHB4MBAAACOoAYcTgtQFgsRQBfWSEAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlw==</data>
     <key>DisplayProductName</key>
     <string>DELL P2815Q (EZ-NET, DP)</string>
     <key>scale-resolutions</key>
     <array>
          <data>AAAPAAAACHAAAAAB</data>
     </array>
</dict>
</plist>

このようにすることで、画面設定のディスプレイ名も指定した通りに変わり、解像度もUltra HD の3840x2160 まで選択できるようになりました。

面白いのが、このとき選択肢の中に低解像度 という表記があって、それが書かれている場合は通常の1x 解像度が、それが書かれていない場合は2x のいわゆるRetina 解像度として画面表示がされるようになっています。

つまり、ここで1920x1080 を選択することで、Retina モードのFull HD を使えるようになります。

実際の映像出力のされ方

ただ、DELL P2815Q は本来、30Hz 出力時に4K を利用できる仕様なのですが、設定上は60Hz になっています。そのせいか、表示される映像になんとなく滲みがあるようにも感じられます。

実際にディスプレイ側の信号状況を見てみると、本来であれば3840x2160 の画像情報を、HDMI だと1920x1080 の60Hz で受信していることが見て取れます。

これがDisplayPort 接続になると、もう少し扱える解像度が高まる様子です。

DisplayPort で接続すると、受信データは2560x1440 の60Hz になるようです。

この感じから、徹底して綺麗な映像を表示したい場合には、DisplayPort 接続で、ひとつ下の選択肢にある1280x720 を選択すると良いようでした。このサイズの出力であれば、DisplayPort 接続に限られるようですが、どうやら60Hz でもしっかり表示される様子でした。

ちなみにHDMI で正真正銘はっきり表示させたいのであれば、おそらく960x540 のRetina 出力ということになりそうです。

ただ、滲むとはいっても見ていられないようなほどでもないので、画面の美しさのために手に入れたのか、それともアプリ開発などでRetina モード欲しさに手に入れたのかで、適切な解像度は違ってくることでしょう。

Full HD より広いWide-UXGA でRetina 出力する

DELL P2815Q をMacBook Pro with Retina 13-inch のディスプレイとして強制認識させることで、16:10 サイズのディスプレイとして認識されることが分かりました。

この場合はDisplayPort 接続に限られますが、最大で3840x2400 の解像度、Retina で1920x1200 の解像度を出力できるようになります。

MacBook Pro with Retina 13-inch ディスプレイとして認識させる場合の注意

まず、DELL P2815Q をMacBook Pro with Retina 13-inch ディスプレイとして認識させるときの注意点として、どうやらDisplayPort での接続でないと、画面に映像が映らなくなったり、OS X がハングアップしてしまったりするようでした。

HDMI 接続の設定の方は、これまで紹介してきたようにSamsung U28D590D として認識させるのが良さそうです。

MacBook Pro with Retina 13-inch ディスプレイとして認識させる

DELL P2815Q をMacBook Pro with Retina 13-inch ディスプレイとして認識させたいときは、これまでと同様に、IODisplayEDID の値をMacBook Pro with Retina 13-inch のものに書き換えます。

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plistversion="1.0">
<dict>
	<key>IODisplayEDID</key>
	<data>AP///////wAGEBigAAAAADAWAQSlHRJ4Am+xp1VMniUMUFQAAAABAQEBAQEBAQEBAQEBAQEB4mgAoKBALmAwIDYAHrMQAAAaAAAA/ABDb2xvciBMQ0QKICAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAGM=</data>
	<key>DisplayProductName</key>
</dict>
</plist>

ただ、MacBook Pro with Retina 13-inch ディスプレイとして見せかけた場合、これだけだとRetina 出力に対応しないので、次のコマンドを実行してRetina モードを有効化します。sudo コマンドを使っているので、実行時に管理者パスワードを尋ねられます。

sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
sudo defaults delete /Library/Preferences/com.apple.windowserver DisplayResolutionDisabled

まだ適切な解像度は揃えていませんが、この時点でMac を再起動すると、Retina 解像度で画面を表示できるようになります。

MacBook Pro with Retina 13-inch ディスプレイとして見せかけた場合はHiDPI と記されたものがRetina 解像度での出力になります。

16:10 のRetina ディスプレイとして使用する

あとはSamsung U28D590D のときと同じように選択できる解像度を登録してあげれば良いのですが、今回は3840x2160 のような16:9 の解像度を指定してしまうと、余白として上下に黒い帯が入ってしまいます。

それで大きな支障がある訳ではないのですが、表示できない領域があるのはもったいないです。そこで、画面サイズを16:10 で指定することで、全画面を余すことなく使えるようにします。

今回は16:10 を設定するついでに16:9 も設定して、両方を選択できるようにしておくことにしました。

解像度 名称 比率
3840x2160 4K, FHD(Retina) 16:9
2732x1536 HD(Retina) 16:9
3200x1800 QHD+, HD+(Retina) 16:9
3840x2400 WQUXGA, WUXGA(Retina) 16:10
3360x2100 WSXGA+(Retina) 16:10
2880x1800 QWXGA+, WXGA+(Retina) 16:10

これをプロパティリストで用意すると、次のようになります。

ソースコードでは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IODisplayEDID</key>
	<data>AP///////wAGEBigAAAAADAWAQSlHRJ4Am+xp1VMniUMUFQAAAABAQEBAQEBAQEBAQEBAQEB4mgAoKBALmAwIDYAHrMQAAAaAAAA/ABDb2xvciBMQ0QKICAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAGM=</data>
	<key>DisplayProductName</key>
	<string>DELL P2815Q (EZ-NET, DP)</string>
	<key>scale-resolutions</key>
	<array>
		<data>AAAPAAAACHAAAAAB</data>
		<data>AAAKrAAABgAAAAAB</data>
		<data>AAAMgAAABwgAAAAB</data>
		<data>AAAPAAAACWAAAAAB</data>
		<data>AAANIAAACDQAAAAB</data>
		<data>AAALQAAABwgAAAAB</data>
	</array>
</dict>
</plist>

このように設定してMac を再起動すると、16:10 で設定した解像度でRetina 出力 (HiDPI) できるようになりました。

Retina 出力で1920x1200 が選択できるのは嬉しいですね。

また、プロパティリストにいくつか登録したおかげで解像度の微調整も効いて良い感じです。指定しておいた16:9 の出力も option キーを押しながら変更 を押せば選択できる様子です。

実際の出力状況

このとき、ディスプレイが実際に受信している信号情報を見てみると、2560x1600 の60Hz になっていました。

Samsung U28D590D として認識させたときと比べて、横方向は同じですが、縦方向は1440 から1600 に増加しています。

つまり1280x800 のRetina までならきっちり綺麗に出力できるということでしょうか。実際にこの解像度を設定してみるとかなり綺麗に出力されます。

Samsung U28D590D のときにいちばん綺麗に出る感じなのが1280x720 だったので、それより縦方向に80pt 広くなるのが嬉しいところです。特にこだわりがなければMacBook Pro with Retina 13-inch ディスプレイとして認識させるのが良さそうですね。

何故か登場したRetina 設定画面

ところで余談になるのですが、DELL P2815Q をMacBook Pro with Retina 13-inch ディスプレイとして良い具合に認識させることができた後、検証したいことがあってEDID だけをSamsung U28D590D のものに書き換えて再起動しました。

そうしたところ、MacBook Pro with Retina ではお馴染みのRetina 対応の設定画面が表示されました。

MacBook Pro with Retina 13-inch ディスプレイとして認識させるときにした設定といえば、追加で16:10 の画面解像度をいくつか登録したくらいですが、もしかしてそれが上手く揃うとRetina 設定画面が登場したりするのでしょうか。

検証を終え、設定を元のMacBook Pro with Retina 13-inch ディスプレイ用に戻すときに、試しに実際のMacBook Pro with Retina 13-inch で設定できる解像度を漏れなく登録してみたのですけど、それだけではRetina 設定画面は登場してくれませんでした。


どういうときにこの画面が表示されるようになるのでしょうね。

もっとも、普通な感じの設定画面でも問題なくRetina 解像度を設定できるので、これ以上は追求しないでおくことにします。