220 вольт, Luci, OpenWRT и сильно кастомная хардваря
Собственно, приспичило сделать себе на даче сделать для небольшой нагрузки розетки, которые можно включать/выключать/ребутить с компа. Покопавшись в хламе откопал релешки, тайни2313, и старенький wl520gu, куда вполне себе можно залить OpenWRT. Все это я укомплектовал парой самодельных печаток, щедро покрытых полиуретаном, и запихнул в пластиковый короб, который на аллюминиевых уголках уходит под полку, и становится вообще невидим. От него до розеток все идет в коробах. Итого, в коробе присутствуют: Блок реле, винтовая колодка для разводки 220 вольт, плата с attiny2313, 9-вольтовый блок питания (кишки оного). Пятивольтового не оказалось под рукой. зато валялся самопальный ненужный dc-dc настраиваемый на LM2596, его я туда и воткнул. Так же там сидит роутер. USB гнездо я отпаял, и поставил туда хаб. С боку я влепил гнездо под плавкий предохранитель (рыжее, советское).
У чипа brcm47xx, который стоит в wl520gU есть неприятный баг в кремнии, из-за которого нельзя работать с 1.1 usb девайсами - все повисает после пары транзакций. Говорят, проблема из-за того, что какой-то там клок неправильный идет на 1.1. Потому я поставил 2.0 хаб (под рукой оказался только самопальный брейкаут хаба Fe1.1s, который собирал для тестов этой микросхемы, сильно привередливая, как оказалось, работоспособность очень здорово зависит от положения развязки по питанию). Хаб делает TT (transaction translation) и бага успешно обходится.
Собственно, внутрь 2313 зашивается vusb стек и три строчки кастомного кода, уложился в 1700 байт из 2кб, а на хосте начинается шаманство. Так как писать под каждый проект заново комманд-лайн утилиту на С задалбывает, я заюзал lualibusb, и написал вот такой костыль: https://github.com/nekromant/lunartool он берет на себя рутину типа матчинга по vid/pid, разруливания случаев нескольких устройств, парсинг комманд-лайн опций и прочую рутину. А сам же код добавляется в виде аплетов вот такого содержания: https://github.com/nekromant/lunartool/blob/master/applets/pw-ctl.lua и это превращается в простую утилиту командной строки. Так как в самом OpenWRT активно юзается lua для LuCi, оверхед был минимальным, и я уместился в 3300 кбайт из 4х мегабайт флеша. Заниматься любовью с extroot совершенно не хочется, ибо гемор при обновлениях. Достаточно залогиниться по ссх, и вуоля:
pw-ctl --on=1
pw-ctl --off=4
pw-ctl --reboot=1
Ну и в виде последнего изыска, я наваял небольшой апликейшн для LuCi чтобы можно было щелкать питанием через веб гуй. Собственно он, и страшненький код его и представлены на скриншоте. LuCi с его cbi штукой оказался очень приятной и удобной. Жалко только документирован сам cbi не особенно хорошо, приходится в сырцы подглядывать.
В планах заменить хаб на более цивильный, выпилить dc-dc и блок 220-->9 вольт и заменить на один блок 220-->5.
Вот и все, осталось только смонтировать до конца.
>>> Просмотр (3000x1080, 495 Kb)