Еще раз про WOL

в 7:01, , рубрики: diy или сделай сам, vhdl, wake-on-lan, конструирование, макетирование, марсоход, ПЛИС, прототипирование, Сетевое оборудование, Электроника для начинающих, метки: , , , , , ,

Нужно включать комп по сети. А Wake-on-LAN не работает.
Предлагаемый метод универсален, но нестандартен и подразумевает наличие творческого оптимизма «во что бы то ни стало».

Когда-то у меня был FTP-сервер. По факту это был обычный комп образца 2004 года. Вот тут в п.7 я писал что есть такое WOL и тонкость в настройке ARP таблицы маршрутизатора, что бы оный не забывал по какому порту у него висит этот комп (после того как питание компа выключится). И так уж получилось, что проблем у меня со всем этим делом не было — в BIOS была включена соответствующая опция и сервер бодро включался в любое время дня и ночи в независимости отключали от него когда-то питание или нет.
Но все хорошее всегда имеет свойство заканчиваться: или ты к нему привыкаешь, или оно пропадает. Комп у меня отобрали…
Однако недавно опять возникла потребность в своем FTP. А так как в перспективе еще хочется на него кое-что повесить, то я решил собрать под эти цели новый относительно производительный комп. И вот, платформа «ASUS P8H77-M + Intel® Core™ i3-2105 + 2 х 4Gb Corsair Vengeance CMZ4GX3M1A1600C9B» в корпусе «Thermaltake VK72721N2E SD200» появилась у меня дома. После диких восторгов домочадцев по стильному виду корпуса комп был засунут под телевизор вместо уволенного комбайна VHS+DVD, который там бессменно находился с 2004 года. В порядке эксперимента я решил усложнить себе жизнь и поставил на этот сервер винду, а в винде устроилась VMWare со своими тремя виртуальными компами. Одним из виртуальных компов и стал новый FTP-сервер. После проброса портов на роутере и в виртуальной сетевой среде VMWare FTP-сервер стал отзываться и исправно работать.
Еще раз про WOL

Тут я, конечно же, вспомнил про WOL, поправил проброс портов на роутере, скачал под андроид программку «Wake On LAN» (раньше я пользовался сервисом wakeonlan.ru). Помните про все хорошее? И вот, в один прекрасный день я не смог удаленно включить этот комп. 130Гб я унести с собой не мог ну никак и поэтому был крайне опечален. Нехорошими словами досталось проектантам реализации WOL в целом и инженерам фирмы ASUS в частности. Я извиняюсь, если в тот день кто-то сильно икал, но я был реально опечален. После разбора полетов, оказалось, что эта материнка должна хоть раз включиться, что бы потом будиться по WOL. А если меня дома нет, а свет электричество отключали (свет обещали к концу декабря 2012 отключить)? То есть, удаленно я комп включить никак не смогу. В BIOS есть функция восстановление питания, т.е. если комп был включен когда произошел сбой питания, то после появления питания комп сам запустится. А если он был выключен? Да, в обозримой перспективе другая виртуалка будет под торрентом и комп будет работать круглосуточно, но все это какой-то форменный непорядок.
Данным вопросом я интересовался в интернетах и у знающих людей. Знающие люди обычно работают с более серьезным сетевым оборудованием и как выворачиваться в этой ситуации сказать толком не могут. Мало того! Многие говорили мне, что это нормально, т.е. компу надо знать на какое устройство подавать питание для ожидания команды на включение. И достаточно многие меня уверяли, что комп будет пробуждаться нормально, только если его включать через «Пуск» (???). Что говорили в интернете пересказывать не буду, но меставми я откровенно веселился.

Встал вопрос: что делать?
Идей была куча. От идеи выдвигающегося сидирома какого-нибудь «нормально-пробуждающегося» древнего компа до идеи вывести сигнал WOL сетевого чипа через какую-то логику на разъем кнопки питания компа. Проблема работы на уровне элементной базы в том, что дома отсутствует осциллограф (С1-112А не считается). Но потом я поумерил аппетиты и решил сделать решение независимое от компьютерного железа. В закромах была найдена сетевая карта D-Link DGE-528T. На ней размещается замечательный белый разъемчик WOL. Если посмотреть распиновку, то разъем содержит три сигнала: +5VSB, GND, Ring. На многих старых материнка тоже существовал такой же разъем, сейчас от этой тенденции уходят. Очевидно, питание к сетевой карте подводится автономно. Сам комп включатлся или при нажатии кнопки питания или после поступления сигнала Ring. На ASUS P8H77-M такого разъема нет!
И тут очень кстати пришлась освободившаяся плата Марсоход с ПЛИС на борту. Я решил сделать пожизненное универсальное решение для любого компьютера (этот тоже могут отобрать):
1) вставляем любую сетевую карту с разъемом WOL на борту в комп;
2) в комп куда-нибудь прикручиваем плату с ПЛИСом;
3) к плате ПЛИС подключаем интерфейсную плату для WOL;
4) изготовленными спецкабелями соединяем разъемы WOL на сетевой карте и интерфейсной плате, подключаем к интерфейсной плате кнопку питания и разъемчик PWR_BUT материнской платы, а так же заводим на эту плату питание +5VSB.
Таким образом очерчиваем круг поставленных задач:
1) для ПЛИСа нужна прошивка, которая бы опрашивала сигналы с кнопки питания на компе и сигнал Ring с сетевой карты и в случае их обнаружения выдавала бы сигнал на разъем PWR_BUT материнской платы;
2) интерфейсная плата должна осуществлять питание платы с ПЛИС (ставим стабилизатор на +3,3В), а так же неплохо было бы иметь развязку для WOL и PWR_BUT на всякий случай (ставим парочку оптронов);
3) нужно изготовить кабели: 3хпроводной для WOL (причем разъем со стороны ПЛИС с шагом 2,54, а со стороны сетевой карты 2мм), 2хпроводной для подключения PWR_BUT (2 разъема с шагом 2,54), 2хпроводной для питания (1 разъем с шагом 2,54, а другой конец присобачить как-то к разъему питания материнской платы — к проводам GND и +5VSB).

Засучили рукова.
Прошивку я написал за полчаса. Прошивка банальна: опрашивать два порта и выводить, например, полусекундный импульс на третий порт. Я учел дребезг кнопки питания, детектировал только фронт сигнала Ring, сделал точный генератор времени с диапазонам до суток и прочие мелочи — развлекался как мог) Прошивка получилась в результате гораздо тяжелее самого первого варианта, но все же половина ПЛИСа еще осталось свободной. Много места пожрал универсальный генератор времени, который подключался к проекту как модуль.
Кабели я сделал тоже за полчаса. Но у меня все было под рукой — повезло с разъемами.
С интерфейсной платой я страдал весь следующий вечер. Саму плату я выпилил из куска двухсторонней макетной печатной платы. Плата одевается на плату Марсохода «мостиком» на разъемы «Rigth Motor» и «Left Motor». «Rigth Motor» был отдан под WOL, а второй разъем я пробросил на интерфейсную плату — как это ни парадоксально, но отсутствие женщины в личной жизни способствует не менее интересному времяпрепровождению и неизвестно что еще захочется прикрутить к этой плате. Так как паять проводками мне было лень, а припоя у меня много, то я просто «выращивал» нужные дорожки. Получилось неказисто и, в принципе, делать так не советую. DC-DC стабилизатор дома тоже нашелся, а вот оптронов не было. Вместо них запаял колодки и на неделю все было заброшено. Через две недели я поставил оптроны и решил проверить как это все будет работать.
Еще раз про WOL
Еще раз про WOL
Еще раз про WOL
Еще раз про WOL
Самое сложное было разделать разъем питания ATX. В интернете есть куча советов как подпихнуть скрепку от степлера (ну нет у меня экстрактора) в разъем, что бы отогнуть фиксаторы. Я даже видео смотрел на каком-то сайте. Но у меня никак контакт не хотел вылазить из разъема. Призывая на помощь всем известные слова я провел почти два часа сломав иголку и перепортив несколько скрепок. Но зато получилось цивилизованно)
Еще раз про WOL
Еще раз про WOL
Решение работоспособно и позволяет включать/отключать комп с кнопки питания на корпусе и включать комп по сети путем подачи команды WOL. К сожалению, выкючать комп по сети не получается — после включения питания сетевая карта перестает выдавать сигнал Ring. Кроме того, имеется задел для дальнейшего творчества! Например, можно переделать прошивку ПЛИС так, что бы после получения в течение 20 секунд восьми команд WOL подавалось бы питание на USB контроллер. Вставленная флешка в USB контроллер монтировалась бы автоматом в виртульную машину и по ФТП под спецлогином и спецпаролем становилась бы доступна папочка, содержащая, например, документ с паролем на хабре)
Еще раз про WOL
Осталось аккуратно закрепить полученноу устройство в системном блоке и поставить оный на дежурство. Что и будет сделано, когда приедет заказанная плата. А нынешняя вернется обратно для контроля автосигнализации машины — когда купаешься удобно запереть все вещи в машине и поставить таймер на открытие через заданное время)))

Цена вопроса:
— сетевая карта D-Link DGE-528T = 300р.
— плата Марсоход + программатор к ней (если нужен) + доставка по почте россии = 1000р. + 600р. + 150р.

Ниже привожу текст прошивки для ПЛИС и, схематично, интерфейсную плату. Для новичков в VHDL, думаю, текст будет полезен. Генератор времени написать нетрудно — сосчитали счетчиком до CLOCK — вот вам и секунда. При припиновке не забываем для портов F0 и F1 установить «Sсhmitt Trigger Input» и включить pull-up резистор. На интерфейсной плате резисторами эти входы тоже подтянуты, но для других целей — защита от статики.

----------------------------------------------------------------------------------------------------------
-- Company: House
-- Engineer: AlexanderS
-- 
-- Create Date: 13/06/2012
-- Modification Date: --/--/----
-- Module Name: manag_pc
-- Project Name: - 
-- Version: v.1.1
-- Description: обработка сигналов с кнопки PWR ПК, команды WOL с сетевой карты 
-- и выдача сигнала вкл/откл на PWR SW на матплате ПК
----------------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.STD_LOGIC_SIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
--use IEEE.MATH_REAL.ALL;
--library UNISIM;
--use UNISIM.VComponents.ALL;

entity project is
	GENERIC (
				---------- установка параметров ----------
				CLOCK : integer := 100000000 -- частота тактирования модуля, [Гц; кратно 1000]
				);
	
	Port (
		---------- интерфейс ----------
		led: out std_logic_vector(7 downto 0) :=(others=>'0');
		f0: in std_logic_vector(9 downto 0) :=(others=>'1');
		f1: in std_logic_vector(9 downto 0) :=(others=>'1');
		f2: out std_logic_vector(9 downto 0) :=(others=>'0');
		---------- контроль и телеметрия ----------
		CLK: in std_logic :='0' -- частота тактирования модуля (параметр CLOCK)
	);
end project;

architecture Behavioral of project is

signal df : std_logic_vector(5 downto 0) :=(others=>'0');
signal sw_lock : std_logic :='0';
signal hl : std_logic_vector(7 downto 0) :=(others=>'0');

signal PWR_BUT1, WOL1, PWRB_on, WOL, lock : std_logic :='0';
signal PWR_BUT2, WOL2 : std_logic :='1';
signal st : integer range 3 downto 0 :=0;

signal sec0125, sec025, sec05, sec, sec2, min, hour, day, res_time : std_logic :='0';
signal time_s, time_m : std_logic_vector(5 downto 0) :=(others=>'0');
signal time_h : std_logic_vector(4 downto 0) :=(others=>'0');

COMPONENT gen_time is -- формирователь времени
	GENERIC (
			CLOCK : integer := 100000000
			);
	Port (
		---------- интерфейс ----------
		sec0125: out std_logic :='0';
		sec025: out std_logic :='0';
		sec05: out std_logic :='0';
		sec2: out std_logic :='0';
		sec: out std_logic :='0';
		time_s : out std_logic_vector(5 downto 0) :=(others=>'0');
		min: out std_logic :='0';
		time_m : out std_logic_vector(5 downto 0) :=(others=>'0');
		hour: out std_logic :='0';
		time_h : out std_logic_vector(4 downto 0) :=(others=>'0');
		day: out std_logic :='0';
		---------- контроль и телеметрия ----------
		RES: in std_logic :='0';
		CLK: in std_logic :='0'
	);
end COMPONENT;

begin

Inst_gen_time: gen_time  -- формирователь времени
	GENERIC MAP(
				CLOCK => 100000000
				)
	Port MAP (
		sec0125 => sec0125,
		sec025 => sec025,
		sec05 => sec05,
		sec => sec,
		sec2 => sec2,
		time_s => time_s,
		min => min,
		time_m => time_m,
		hour => hour,
		time_h => time_h,
		day => day,
		RES => res_time,
		CLK => CLK
	);
res_time <= '0';
	
---- BEGIN блок ввода-вывода
Process(CLK) begin if (CLK'Event) and (CLK='1') then
	if (sw_lock = '0') then
		if (f0(0) = '0') or (f1(0) = '0') then sw_lock <= '1'; end if;
		df(0) <= not f0(0); hl(6) <= f0(0);
		df(1) <= not f1(0); hl(7) <= f1(0);
	elsif (sec0125 = '1') then sw_lock <= '0'; end if;
	end if;

	if (df(2) = '1') then f2 <= (others=>'1'); else f2 <= (others=>'0'); end if;
	
	led <= hl;
end if; end process;
----- END блок ввода-вывода


--- BEGIN 
process(CLK) begin if (CLK'event and CLK = '1') then
	PWR_BUT1 <= df(0); PWR_BUT2 <= not PWR_BUT1;
	WOL1 <= df(1); WOL2 <= not WOL1;
	if ((PWR_BUT1 = '1') and (PWR_BUT2 = '1')) then -- передний фронт сигнала нажатия кнопки
		PWRB_on <= '1';
	elsif ((PWR_BUT1 = '0') and (PWR_BUT2 = '0')) then -- задний фронт сигнала нажатия кнопки
		PWRB_on <= '0';
	elsif ((WOL1 = '1') and (WOL2 = '1')) then WOL <= '1'; else WOL <= '0'; end if; -- передний фронт сигнала WOL
	
	if (PWRB_on = '1') and (lock = '0') then -- обработка нажатой кнопки
		df(2) <= '1';
		hl(0) <= not hl(0);
		lock <= '1';
	elsif (PWRB_on = '0') and (lock = '1') then -- обработка отжатой кнопки
		df(2) <= '0';
		lock <= '0';
	else -- обработка команды WOL
		case st is
			when 0 => if (WOL = '1') then st <= st + 1; end if; -- рееагирования только если комп выключен
			when 1 => df(2) <= '1'; if (sec025 = '1') then st <= st + 1; end if;
			when 2 => if (sec025 = '1') then st <= st + 1; end if;
			when 3 => hl(0) <= not hl(0); df(2) <= '0'; st <= 0;
			when others => null;
		end case;
	end if;
	
end if; end process;
--- END 

end Behavioral;

Еще раз про WOL

К плате с ПЛИСом еще можно управление ИБП прикрутить. И этот дежруный комп своим сетевым запуском будет еще разблокировать возможность сетевого включения другого оборудования)))

P.S.
Один товарищ сказал что при отсутствии поддержки производителей оборудования сделать все это (WOL) будет очень сложно и смысла браться нет и т.д. и т.п. Поспорили с ним на «просто так»…
Ну и кто сказал что мы что-то не смогем? :)

Автор: AlexanderS

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js