وقتی Valve از Steam Machine رونمایی کرد، بسیاری از قیمت آن ناخشنود شدند ــ و حق هم داشتند ــ زیرا میشد با تقریباً همان بودجه، رایانهای حتی قدرتمندتر سرهم کرد. اما مشخصات فنی فقط نیمی از داستان را بازگو میکنند.
Steam Machine ترفندهای دیگری هم در آستین دارد؛ قابلیتهایی که پیادهسازیشان برای بسیاری گران تمام میشود یا در بعضی موارد، اساساً شدنی نیست. چه فرمعامل اختصاصی و کوچک Mini-ITX باشد و چه قطعات کممصرف و فوقالعاده بیصدای درون آن، Steam Machine همچنان در چند زمینه برتری دارد.
یکی از این زمینهها پشتیبانی از HDMI-CEC است؛ قابلیتی که بهطور کامل در SteamOS تعبیه و یکپارچه شده است. از آنجا که SteamOS روی سختافزار x86 اجرا میشود، لابد پیادهسازی این قابلیت باید آسان باشد، درست است؟ کاش به همین سادگی بود. هفتهها در این هزارتو فرو رفتم تا آن را به کار بیندازم و فکر میکنم راهحلی جایگزین و تقریباً بینقص پیدا کردهام.
برای راهاندازی HDMI-CEC به سه چیز نیاز دارید
یک مبدل مشخص، یک برنامه و یک هوک خواب

بیشتر سختافزارهای رایانهای مصرفی از HDMI-CEC پشتیبانی نمیکنند. در واقع، این درگاههای HDMI اغلب حتی پین CEC را ندارند و استفاده از HDMI-CEC را ناممکن میکنند. این وضعیت در پردازندههای گرافیکی Nvidia، AMD و Intel یکسان است.
جالب آنکه تقریباً همه رایانههای مبتنی بر ARM از همان ابتدا پشتیبانی CEC دارند؛ موضوعی که دردسری آزاردهنده ایجاد میکند و پرسش بدیهی را پیش میکشد: پس چطور باید این قابلیت را به کار بیندازیم؟
پاسخ در DisplayPort نهفته است؛ فناوریای که بار دیگر به یاری ما میآید. DisplayPort ۱.۳ و نسخههای بالاتر از تونلسازی CEC پشتیبانی میکنند؛ یعنی میتوانید سیگنالهای CEC را به نمایشگری سازگار بفرستید.
این روش روی نصب استاندارد Arch Linux و یک لپتاپ تماماً AMD آزمایش شده است. Intel هم احتمالاً عملکرد خوبی خواهد داشت، اما از کارتهای Nvidia انتظار بهترین نتیجه را ندارم. این راهحل جایگزین مستعد از کار افتادن است؛ هشدار داده شد!
البته نمیتوانید تلویزیون را صرفاً با یک کابل معمولی HDMI به DisplayPort وصل کنید. نه، این کار قرار نیست آنقدر آسان باشد! برای کار کردن این روش، به یک مبدل مشخص DP به HDMI نیاز دارید. این مبدل سیگنال DisplayPort را به HDMI تبدیل میکند و در عین حال پین کنترل CEC را متصل نگه میدارد.
در این مورد، مبدل یکطرفه فعال UGREEN 8K@60Hz 2k@240Hz Active DP to HDMI بود. نام بلندبالایی دارد، اما دستکم چندان گران نیست. من آن را حدود ۱۴ دلار خریدم و ظاهرش هم چیز ویژهای را نشان نمیدهد. بااینحال، ظاهر میتواند فریبنده باشد و تقریباً همهجا از این مبدل بهعنوان جام مقدس مرموز کنترل CEC یاد شده است.
با این همه، مبدل فقط رابط CEC را در دسترس قرار میدهد و آن را خودکار نمیکند. بدتر از آن، به نظر میرسد SteamOS تواناییهای مبدل را تشخیص نمیدهد و تقریباً مطمئنم که فقط با درگاههای واقعیِ دارای پشتیبانی HDMI-CEC کار میکند.
تشخیص دستگاه CEC هنگام اتصال زنجیرهای مبدلها اغلب ناموفق است. از دانگل استفاده نکنید و مبدل را مستقیماً به پردازنده گرافیکی وصل کنید.
یعنی برای پیش بردن کار، ناچاریم به برنامههای بیشتری تکیه کنیم. بخش دوم این معما برنامهای به نام cecdaemon است که ــ همانطور که نامش نشان میدهد ــ یک دیمن برای cec-ctl، فرمانی که بار اصلی کار را بر دوش میکشد، به شمار میرود.
Cecdaemon از راه AUR هم در دسترس است، اما برای داشتن بهروزترین نسخه، دانلود و کامپایل آن از کد منبع را پیشنهاد میکنم. این برنامه چند قابلیت خوشایند هم دارد؛ از جمله تغییر نام ورودی تلویزیون و امکان تعیین رویدادهای سفارشی برای هر بار فشردن کلید کنترل از راه دور.
بااینحال، همهچیز کامل نیست و همچنان به سرویسهایی نیاز دارید که هنگام به خواب رفتن یا بیدار شدن سیستم، فرمانهای ویژه cec-ctl را اجرا کنند. به نظر نمیرسد Cecdaemon از عهده این کار بهخوبی برآید؛ بنابراین با راهنمایی دقیق Claude، به ساخت یک هوک سرویس خواب روی آوردم.
اسکریپتنویسی: چه چیزهایی کار میکنند و چه چیزهایی نه
بیشتر بخشها کار میکنند؛ با چند قابلیت غافلگیرکننده در کنارشان





تا اینجا همه چیزهای لازم را در اختیار داریم. کنترل CEC از طریق ترمینال کار میکند ــ حتی بیدار کردن از خواب ــ اما برای خودکار کردن همه فرایند، باید هم cecdaemon را پیکربندی کنیم و هم هوک خواب را بسازیم.
برای کار کردن این روش، باید هم رایانه و هم تلویزیون را در حالت آمادهبهکار بگذارید. خاموش و روشن کردن کامل دستگاهها همهچیز را به هم میریزد. همچنین نمیتوانید دستگاهها را از حالت خاموشی کامل بیدار کنید؛ هر دو باید در حالت آمادهبهکار باشند.
Cecdaemon یک پروندهٔ پیکربندی خوشساخت در پوشهٔ /etc دارد. بهتر است فرمانهای آمادهبهکار و بیدارباش را جایگزین کنید و نام دستگاه را به چیزی که میپسندید تغییر دهید؛ وگرنه نام پیشفرض آن CECDAEMON خواهد بود. کنترلهای راه دور را دستنخورده گذاشتم و به پیکربندی بیشتری هم نیازی نبود.
sudo nano /etc/cecdaemon.conf
[triggers]
standby = /usr/bin/cec-ctl -d /dev/cec0 --to 0 --standby
wake = /usr/bin/cec-ctl -d /dev/cec0 --to 0 --image-view-on --active-source phys-addr=1.0.0.0
[tv]
# Truncated to 14 character max; swap to whatever you need
name = Z13
sudo systemctl daemon-reload
sudo systemctl enable --now cecdaemon.service
راهاندازی دوباره و فعال کردن cecdaemon باعث میشود برنامه هنگام بوت شدن خودکار اجرا شود، اما شاید برای راه افتادن درست همهچیز لازم باشد پروندهٔ سرویس آن را کمی دستکاری کنید. برای نمونه، پروندهٔ خودم را میگذارم؛ ساده است، اما کار میکند.
sudo nano /etc/systemd/system/cecdaemon.service
[Unit]
Description=Starts the custom CEC daemon
After=systemd-modules-load.service
#StartLimitIntervalSec=300
#StartLimitBurst=10
[Service]
Type=simple
ExecStart=/usr/bin/cecdaemon --config /etc/cecdaemon.conf
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
تا اینجا باید هم کنترل از راه دور و هم شناسایی دستگاه CEC را راه انداخته باشیم. میتوانید سراسر رابط کاربری SteamOS را با کنترل تلویزیون بگردید، هرچند کارهایی مانند بازگشت و گزینههای بیشتر به نگاشت دستی کلیدها نیاز دارند.
با این همه، مسئلهٔ مهمی هنوز باقی مانده که راهحل سرراستی برایش پیدا نشده است: خواب و بیداری. راه انداختن درست چرخهٔ خواب/بیداری بدنامانه دشوار است و رابط کاربری SteamOS نمیداند چگونه آداپتور را به کار بیندازد، حتی اگر رابط CEC آن در دسترس باشد.
بنابراین باید سراغ هوکهای خواب برویم و راهحلی موقتی و تا حدی وصلهپینهای بسازیم. افزودن یک اسکریپت فرمان خواب سفارشی کافی بود تا سیستم مجموعهای کاملاً مشخص از فرمانها را برای بیدار کردن یا معلق کردن رایانه اجرا کند.
sudo nano /usr/lib/systemd/system-sleep/00-mysleep
#!/bin/bash
case "$1" in
pre)
logger -t mysleep "going down ($2)"
# commands before sleep
/usr/bin/cec-ctl -d /dev/cec0 --to 0 --standby
;;
post)
logger -t mysleep "coming back ($2)"
# commands after wake
/usr/bin/cec-ctl -d /dev/cec0 --to 0 --image-view-on --active-source phys-addr=1.0.0.0
;;
esac
exit 0
sudo chmod +x /usr/lib/systemd/system-sleep/00-mysleep
بهویژه فرمان بیدارباش کمی عجیبوغریب است. برای شروع، –image-view-on از نظر فنی میتواند تلویزیون را بیدار کند، اما راهی برای سوییچ کردن دستگاه به ورودی فعالِ رایانه ندارد. به همین دلیل، active-source و phys-addr در یک فرمان ترکیب شدهاند تا بهترتیب به HDMI فعال جابهجا شوند و نشانی درست آداپتور DP-to-HDMI را نگاشت کنند.
همهٔ تلویزیونها یکسان نیستند. بعضی از آنها بهجای –image-view-on نیاز دارند –text-view-on را در انتهای فرمان اضافه کنید. آزمونوخطا کنید تا ببینید چه چیزی جواب میدهد.
اسکریپت خواب هر بار که رویداد خواب در سراسر سیستم اجرا شود، فعال میشود. این اسکریپت خودکار تشخیص میدهد که سیستم در حال بیدار شدن است یا به خواب میرود و بر همان اساس فرمانهای cec-ctl را اجرا میکند تا کنترل واقعی CEC را «شبیهسازی» کند.
وقتی همهچیز نهایی شد و از کار کردنش مطمئن شدم، فقط کافی بود سیستم را دوباره راهاندازی کنم و ببینم آیا همهچیز درست عمل میکند یا نه. یک راهاندازی مجدد بعد، موفقیت! همهچیز کار کرد و سرانجام قابلیت SteamOS را که همه میخواهند، این بار برای رایانههای سفارشی هم در اختیار داریم؛ بیآنکه به سراغ گزینههای بسیار گرانتری مانند آداپتور Pulse-Eight برویم.
شاید در آینده نیازی به گذر از این فرایند بهطرز مضحکی پیچیده نداشته باشید
نمیتوان انکار کرد که این راهاندازی نسبتاً پیچیده است؛ بسیار دشوارتر از آنکه صرفاً کابلی وصل کنید و انتظار داشته باشید همهچیز «خودبهخود کار کند». چرخهٔ خواب/بیداری نیز کاملاً بر یک راهحل وصلهپینهای تکیه دارد و این موضوع برایم خوشایند نیست.
خیلی ترجیح میدهم راهحلی تمیزتر داشته باشم و شاید لازم نباشد تا ابد این دردسر را تحمل کنیم. SteamOS مرتب بهروزرسانی و قابلیتهای تازه میگیرد و فقط میتوانم امیدوار باشم Valve روزی پشتیبانی از کنترل CEC از راه آداپتورهای DisplayPort-to-HDMI را اضافه کند. در غیر این صورت، باید به هوکها بسنده کنیم که کمی ناراحتم میکند. به هر حال، این راهحل برای توزیعهای بازیِ غیر از SteamOS هم کار میکند؛ پس با خیال راحت آزمایش کنید!
منبع: این مطلب ترجمه و بومیسازی مقالهای از MakeUseOf به قلم Dipan Saha است. مشاهده مقاله اصلی