Zyxel p-330w ee и UART
Добавлено: Сб ноя 03, 2012 4:14 pm
Когда в заначке найдется старое устройство, то хочется его использовать. У меня нашелся роутер от Zyxel, который я решил использовать для удаленного доступа к одному из планируемых мной устройств на микроконтроллерах AVR. Для использования пользователем интерфейс UART понадобится среда, под которой можно использовать свое ПО, а именно linux. В нашем случае в Zyxel установлен чип rtl8186, а на данном чипе нашлась только одна прошивка с linux - это Wive-ng. После всех моих изысканий, я могу утверждать, что Wive-ng - Это полноценное ядро linux с минимально необходимым набором утилит для работы роутера.
1. Устанавливаем Wive-ng на роутер. Тут примеров полно в сети, но отталкиваться необходимо вот от сюда http://wive-ng.sourceforge.net/. Заметим, что Wive-ng собрана именно под rtl8186, а под другие чипы идет другая версия Wive.
2. Пробуем подключиться к UART роутера. Зайдя под ssh необходимо дать команду например "microcom -s 9600 /dev/ttyS0" - открываем консоль UART на скорости 9600. Если физически к UART подключить микроконтроллер на той же скорости (обязательное условие) с простейшей прошивкой "повторять все что принимает", т.е. эхо, то мы получим ... А непонятно что получим, т.к. по умолчанию по UART работает консоль супер пользователя root, который даже разлогинется не сможет. Запуск терминала "microcom" не позволит перехватить управление UART`ом, он будет работать параллельно, т.е. кто первый прочтет буфер, тот и получил данные. Причем консоль Wive-ng работает на скорости 38400, поэтому можно получать вообще что-то непонятное в результате. Более того, в обычной консоле присутсвует "эхо", из-за чего может пойти зацикленный мусор "данных". Я этот момент упустил и неделю потерял, думая "почему работает, но не стабильно?".
3. Подключаем Serial port к UART чтобы понять, а работает ли хоть что-нибудь? Я для этого взял Arduino, а в моем случае это ее разновидность seeeduino, у которой уже есть нужный мне интерфейс USB->UART, правда гребеночку соответствующую пришлось припаять собственноручно. Подходящих проводков с разъемами я меня не было, поэтому я использовал джамперы. На Arduino необходимо записать любую прошивку, которая ничего не должна писать в Serial. Запускаем Putty в режиме Serial на com5 (в моем случае Arduino сидит на com5) со скоростью 38400. Запускаем роутер (подаем питание) и о чудо: видим всю процедуру загрузки роутера, а в конце появляется командная строка. Соединение стабильное мусора нет, т.е. все работает, а Микроконтроллер я как запускал? на скорости 9600? Подключил МК параллельно и увидел всю ерезь с двух сторон, что отправилось и что пришло, как его увидел МК ... В общем на разных скоростях и при наличии более чем рабочей консоли получим много неясностей...
4. Отключаем консоль роутера через UART, а именно отключаем SERIAL CONSOLE. Тут не очень все просто оказалось. SERIAL CONSOLE зашита в ядро. Если внимательно почитать "http://wive-ng.sourceforge.net/?WIVE-NG_8186_%28revA%2FB%29:Dokumentaciya:Istoriya_izmeneniy", то можно понять, что чтобы отключить, то что нам мешает надо, или самим извернуться и перекомпилировать ядро, или заплатить деньги и получить ... Далее будем решать именно эту проблему. Довольно долго искал с чего же начать? Как перекомпилировать ядро? Начнем с того, что проще всего это очевидно сделать из под linux, но какой версии? Дело в том, что в исходниках присутствуют и бинарные файлы программ, что не будут работать под др. версией Linux и придется искать каждую утилиту отдельно. Нашел вот такую ветку обсуждений "http://sfstudio.livejournal.com/11298.html?thread=135970".
Что можно теперь сказать? Автор sfstudio боится тролей, но походу сам является тролем почище. sfstudio предоставляет нам минимум информации и нехочет поделиться практически ни чем, объясняя это тем, что неохото писать документацию, что неумеет, зато развивать данный топик ему не лениво.
Автор говорит "Mandriva cooker. И собираю и вообще я под мандривой скоро как десятилетие работаю =)", но интереснее фраза "Кто хочет - разберётся, кто не хочет - использует бинарные сборки." - вот тут и зарыта главная подстава, но об этом позже.
Итак нам нужна Mandriva 2009. Еще 2 дня пришлось потратить на Mandriva, не потому, что сложно, а просто пока нашел аппаратные ресурсы, чтобы поднять его. Соорудил виртуалку с 1Г оперативкой и 30Гб жесткого диска, а далее дело техники.
Я частично все делал под Kde, используя графические аксессуары, дабы не тратить время на изучение самой Mandriva. Нам необходима менеджер настроек системы, в которой нашелся пункт установки и поиска пакетов ПО, чем удобно я и воспользовался. Сперва нам точно необходимо найти и установить от туда GIT и Make (почему его нет штатно, незнаю).
Открываем консоль и жмем там "git clone git://wive-ng.git.sourceforge.net/gitroot/wive-ng/wive-ng". По умолчанию мы находимся в пользовательской папке, а команда "git" создает скачиваемый пакет в текущей директории, значит у нас появится папка что-то вроде "/home/myuser/wive-ng". У меня первый запуск окончился ошибкой соединения, я запусти повторно и спустя некоторое время все залилось на комп. Теперь у нас есть исходники wive-ng, и мы ими воспользуемся.
На первый взгляд у нас есть теперь все. Но нет, надо вспомнить фразу от sfstudio, что я заметил выше. Можно добавить еще его фразу "Открою страшную тайну - в лоб врятли выйдет... По крайней мере никому ещё в лоб не удалось, ну зато хороший пинок почмотреть что вутри скриптов и разобраться в системе сборки".
Пишу сразу что реально надо сделать, т.к. sfstudio рекомендует для компиляции сделать только "cd /opt/Wive/toolchain && ./make_links.sh && cd .. && ./compile", но в скрипте make_links.sh присутствует только команда "ln -s /opt/Wive/toolchain/* /usr/local". Знаете что делает последняя команда? Просто создаст ссылку в папке "/usr/local" на файл "*", т.е. "ln" не умеет работать с шаблонами. Но данный набор команд нам все же поможет немного пояснит в каком направлении двигаться.
Мы теперь знаем, что все скачанные исходники должны лежать в папке "/opt/Wive" и не рекомендую эту папку менять, т.к. она прописана местами в скриптах. заметим, также что папка "Wive" обязательно должна быть с заглавной буквы.
Копируем все исходники в папку "/opt/Wive" или создаем ссылку, но далее будем работать именно в ней.
Что дальше? Надо все-таки что-то кинуть в папку"/usr/local". Я просто взял и реально скопировал все что было почти во всех папках "/opt/Wive/toolchain/", а именно папки "bin, include, lib, man, sbin, usr" (папку "usr" обязательно не забываем, хотя вроде чтобы она там забыла? Но надо!!!).
И теперь не все готово? Компиляция еще даже не начата! Рано еще жать "./compile". Надо сперва собрать все что в папке "/opt/Wive/toolchain/nonmips-tcb". Заходим в данную папку и жмем команду "make" (Вот зачем ее надо было выше установить). За что люблю "make", что в случае ошибок их можно устранить и, набрав снова "make", продолжить с того места где остановились. У меня сперва вывалились несколько ошибок, что мне нужны еще несколько пакетов или библиотек. В общем читаем внимательно ошибки и если там написано, что не найдено "xxx", то ищем эту библиотеку в репозитории и жмем "Установить". Но это еще не все ошибки. Некоторые нужные библиотеки прям сразу скачиваются из сети, распаковываются и собираются автоматом, но скачиваются с сайта sfstudio. Будем надеяться, что он не специально залил кривой архивчик "gcc-3.3.3.tar.bz2". Почему-то вывалился с ошибкой, что архив битый. Я нашел то что надо в GNU архиве "http://ftp.gnu.org/gnu/gcc/gcc-3.3.3/gcc-3.3.3.tar.bz2", который весил не 14 как у sfstudio, а 22Mb. В одной из под папок "/opt/Wive/toolchain/nonmips-tcb" можно легко найти битый архив и заменить его на правильный. Возвращаемся в папку "/opt/Wive/toolchain/nonmips-tcb" и снова жмем "make", процедура начнется с распаковки данного архива и пойдет далее успешно. Или нет? У меня вывалился с ошибкой на "Makefile" в папке "/opt/Wive/toolchain/nonmips-tcb/linux", а вернее на его отсутсвие, хотя все вроде было. Решается просто: Удаляем нафиг папку "/opt/Wive/toolchain/nonmips-tcb/linux" и снова запускаем "make", вот тут уже все идет до конца.
Все? А вот нет! Надо еще откомпилировать все что находится в папке "/opt/Wive/tools" т.е. заходим в каждую папку/подпапку и жмем там "make", в одном случе нам будет сказано что нужна еще "zlib", идем ее устанавливать и выясняем, что она уже есть. Ой, есть "zlib", а нужно нам "header files", а этого-то и нет, т.е. ставим!
Все!!! Теперь можно идти в папку "/opt/Wive/" и даем там 2 команды "./config" и "./compile". Ждем около 15 минут, идем в появившуюся папку "/opt/Wive/images" и находим там 3 прошивочки. Нам нужна "wive.bin". У меня это файл полностью совпал с файлом, что взял уже готовый у автора, что было признаком, что все сделано правильно.
Теперь избавимся от SERIAL CONSOLE. Для этого нам понадобиться отредактировать пару файлов.
1. Файл "/opt/Wive/config". Ищем и отключаем там опцию "SERIAL_CONSOLE=YES". Делаем так "SERIAL_CONSOLE=NO". Мне это не помогло, поэтому идем в п.2.
2. Файл "/opt/Wive/kernel/config.8186". Находим и просто комментируем строчку "CONFIG_SERIAL_CONSOLE=y". Наверное можно пойти дальше и закомментировать "CONFIG_SERIAL=y", но мне итак хватило.
Жмем "./compile" и получаем через 15 минут уже новую прошивочку. Устанавливаем новую прошивку и тестируем. Подключенный USB->UART нам по прежнему возвращает отладочную информацию, но командной строки уже нету!!! Ставим Микроконтроллер, запускаем под ssh на роутере "microcom -s 9600 /dev/ttyS0" и видим, что все пашет четко, все что отсылаем, возвращается от МК. В USB->UART параллельно валится мусор, но оно и понятно, скорость-то иная.
БОНУС! Прикладываю фото испытательного "стенда" и саму прошивку откомпилированную по алгоритму выше с отключенной "SERIAL CONSOLE", версия "wive-ng-0.3.18".
На фото:
1. UART на роутере. Сверху вниз: gnd, Tx, Rx, Vcc 3,3V.
2. Seeeduino, с припаянной гребенкой UART. Данная гребенка соединяет непосредственно напрямую с чипом "ft232rl", т.е. мы получаем преобразователь USB->UART. Но надо учесть что питание тут 5V.
3. Обеспечивает согласование уровней (на транзисторе) в обе стороны: http://we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.html
4. ATTiny2313a с простейшей прошивкой, для тестирования работы UART.
1. Устанавливаем Wive-ng на роутер. Тут примеров полно в сети, но отталкиваться необходимо вот от сюда http://wive-ng.sourceforge.net/. Заметим, что Wive-ng собрана именно под rtl8186, а под другие чипы идет другая версия Wive.
2. Пробуем подключиться к UART роутера. Зайдя под ssh необходимо дать команду например "microcom -s 9600 /dev/ttyS0" - открываем консоль UART на скорости 9600. Если физически к UART подключить микроконтроллер на той же скорости (обязательное условие) с простейшей прошивкой "повторять все что принимает", т.е. эхо, то мы получим ... А непонятно что получим, т.к. по умолчанию по UART работает консоль супер пользователя root, который даже разлогинется не сможет. Запуск терминала "microcom" не позволит перехватить управление UART`ом, он будет работать параллельно, т.е. кто первый прочтет буфер, тот и получил данные. Причем консоль Wive-ng работает на скорости 38400, поэтому можно получать вообще что-то непонятное в результате. Более того, в обычной консоле присутсвует "эхо", из-за чего может пойти зацикленный мусор "данных". Я этот момент упустил и неделю потерял, думая "почему работает, но не стабильно?".
3. Подключаем Serial port к UART чтобы понять, а работает ли хоть что-нибудь? Я для этого взял Arduino, а в моем случае это ее разновидность seeeduino, у которой уже есть нужный мне интерфейс USB->UART, правда гребеночку соответствующую пришлось припаять собственноручно. Подходящих проводков с разъемами я меня не было, поэтому я использовал джамперы. На Arduino необходимо записать любую прошивку, которая ничего не должна писать в Serial. Запускаем Putty в режиме Serial на com5 (в моем случае Arduino сидит на com5) со скоростью 38400. Запускаем роутер (подаем питание) и о чудо: видим всю процедуру загрузки роутера, а в конце появляется командная строка. Соединение стабильное мусора нет, т.е. все работает, а Микроконтроллер я как запускал? на скорости 9600? Подключил МК параллельно и увидел всю ерезь с двух сторон, что отправилось и что пришло, как его увидел МК ... В общем на разных скоростях и при наличии более чем рабочей консоли получим много неясностей...
4. Отключаем консоль роутера через UART, а именно отключаем SERIAL CONSOLE. Тут не очень все просто оказалось. SERIAL CONSOLE зашита в ядро. Если внимательно почитать "http://wive-ng.sourceforge.net/?WIVE-NG_8186_%28revA%2FB%29:Dokumentaciya:Istoriya_izmeneniy", то можно понять, что чтобы отключить, то что нам мешает надо, или самим извернуться и перекомпилировать ядро, или заплатить деньги и получить ... Далее будем решать именно эту проблему. Довольно долго искал с чего же начать? Как перекомпилировать ядро? Начнем с того, что проще всего это очевидно сделать из под linux, но какой версии? Дело в том, что в исходниках присутствуют и бинарные файлы программ, что не будут работать под др. версией Linux и придется искать каждую утилиту отдельно. Нашел вот такую ветку обсуждений "http://sfstudio.livejournal.com/11298.html?thread=135970".
Что можно теперь сказать? Автор sfstudio боится тролей, но походу сам является тролем почище. sfstudio предоставляет нам минимум информации и нехочет поделиться практически ни чем, объясняя это тем, что неохото писать документацию, что неумеет, зато развивать данный топик ему не лениво.
Автор говорит "Mandriva cooker. И собираю и вообще я под мандривой скоро как десятилетие работаю =)", но интереснее фраза "Кто хочет - разберётся, кто не хочет - использует бинарные сборки." - вот тут и зарыта главная подстава, но об этом позже.
Итак нам нужна Mandriva 2009. Еще 2 дня пришлось потратить на Mandriva, не потому, что сложно, а просто пока нашел аппаратные ресурсы, чтобы поднять его. Соорудил виртуалку с 1Г оперативкой и 30Гб жесткого диска, а далее дело техники.
Я частично все делал под Kde, используя графические аксессуары, дабы не тратить время на изучение самой Mandriva. Нам необходима менеджер настроек системы, в которой нашелся пункт установки и поиска пакетов ПО, чем удобно я и воспользовался. Сперва нам точно необходимо найти и установить от туда GIT и Make (почему его нет штатно, незнаю).
Открываем консоль и жмем там "git clone git://wive-ng.git.sourceforge.net/gitroot/wive-ng/wive-ng". По умолчанию мы находимся в пользовательской папке, а команда "git" создает скачиваемый пакет в текущей директории, значит у нас появится папка что-то вроде "/home/myuser/wive-ng". У меня первый запуск окончился ошибкой соединения, я запусти повторно и спустя некоторое время все залилось на комп. Теперь у нас есть исходники wive-ng, и мы ими воспользуемся.
На первый взгляд у нас есть теперь все. Но нет, надо вспомнить фразу от sfstudio, что я заметил выше. Можно добавить еще его фразу "Открою страшную тайну - в лоб врятли выйдет... По крайней мере никому ещё в лоб не удалось, ну зато хороший пинок почмотреть что вутри скриптов и разобраться в системе сборки".
Пишу сразу что реально надо сделать, т.к. sfstudio рекомендует для компиляции сделать только "cd /opt/Wive/toolchain && ./make_links.sh && cd .. && ./compile", но в скрипте make_links.sh присутствует только команда "ln -s /opt/Wive/toolchain/* /usr/local". Знаете что делает последняя команда? Просто создаст ссылку в папке "/usr/local" на файл "*", т.е. "ln" не умеет работать с шаблонами. Но данный набор команд нам все же поможет немного пояснит в каком направлении двигаться.
Мы теперь знаем, что все скачанные исходники должны лежать в папке "/opt/Wive" и не рекомендую эту папку менять, т.к. она прописана местами в скриптах. заметим, также что папка "Wive" обязательно должна быть с заглавной буквы.
Копируем все исходники в папку "/opt/Wive" или создаем ссылку, но далее будем работать именно в ней.
Что дальше? Надо все-таки что-то кинуть в папку"/usr/local". Я просто взял и реально скопировал все что было почти во всех папках "/opt/Wive/toolchain/", а именно папки "bin, include, lib, man, sbin, usr" (папку "usr" обязательно не забываем, хотя вроде чтобы она там забыла? Но надо!!!).
И теперь не все готово? Компиляция еще даже не начата! Рано еще жать "./compile". Надо сперва собрать все что в папке "/opt/Wive/toolchain/nonmips-tcb". Заходим в данную папку и жмем команду "make" (Вот зачем ее надо было выше установить). За что люблю "make", что в случае ошибок их можно устранить и, набрав снова "make", продолжить с того места где остановились. У меня сперва вывалились несколько ошибок, что мне нужны еще несколько пакетов или библиотек. В общем читаем внимательно ошибки и если там написано, что не найдено "xxx", то ищем эту библиотеку в репозитории и жмем "Установить". Но это еще не все ошибки. Некоторые нужные библиотеки прям сразу скачиваются из сети, распаковываются и собираются автоматом, но скачиваются с сайта sfstudio. Будем надеяться, что он не специально залил кривой архивчик "gcc-3.3.3.tar.bz2". Почему-то вывалился с ошибкой, что архив битый. Я нашел то что надо в GNU архиве "http://ftp.gnu.org/gnu/gcc/gcc-3.3.3/gcc-3.3.3.tar.bz2", который весил не 14 как у sfstudio, а 22Mb. В одной из под папок "/opt/Wive/toolchain/nonmips-tcb" можно легко найти битый архив и заменить его на правильный. Возвращаемся в папку "/opt/Wive/toolchain/nonmips-tcb" и снова жмем "make", процедура начнется с распаковки данного архива и пойдет далее успешно. Или нет? У меня вывалился с ошибкой на "Makefile" в папке "/opt/Wive/toolchain/nonmips-tcb/linux", а вернее на его отсутсвие, хотя все вроде было. Решается просто: Удаляем нафиг папку "/opt/Wive/toolchain/nonmips-tcb/linux" и снова запускаем "make", вот тут уже все идет до конца.
Все? А вот нет! Надо еще откомпилировать все что находится в папке "/opt/Wive/tools" т.е. заходим в каждую папку/подпапку и жмем там "make", в одном случе нам будет сказано что нужна еще "zlib", идем ее устанавливать и выясняем, что она уже есть. Ой, есть "zlib", а нужно нам "header files", а этого-то и нет, т.е. ставим!
Все!!! Теперь можно идти в папку "/opt/Wive/" и даем там 2 команды "./config" и "./compile". Ждем около 15 минут, идем в появившуюся папку "/opt/Wive/images" и находим там 3 прошивочки. Нам нужна "wive.bin". У меня это файл полностью совпал с файлом, что взял уже готовый у автора, что было признаком, что все сделано правильно.
Теперь избавимся от SERIAL CONSOLE. Для этого нам понадобиться отредактировать пару файлов.
1. Файл "/opt/Wive/config". Ищем и отключаем там опцию "SERIAL_CONSOLE=YES". Делаем так "SERIAL_CONSOLE=NO". Мне это не помогло, поэтому идем в п.2.
2. Файл "/opt/Wive/kernel/config.8186". Находим и просто комментируем строчку "CONFIG_SERIAL_CONSOLE=y". Наверное можно пойти дальше и закомментировать "CONFIG_SERIAL=y", но мне итак хватило.
Жмем "./compile" и получаем через 15 минут уже новую прошивочку. Устанавливаем новую прошивку и тестируем. Подключенный USB->UART нам по прежнему возвращает отладочную информацию, но командной строки уже нету!!! Ставим Микроконтроллер, запускаем под ssh на роутере "microcom -s 9600 /dev/ttyS0" и видим, что все пашет четко, все что отсылаем, возвращается от МК. В USB->UART параллельно валится мусор, но оно и понятно, скорость-то иная.
БОНУС! Прикладываю фото испытательного "стенда" и саму прошивку откомпилированную по алгоритму выше с отключенной "SERIAL CONSOLE", версия "wive-ng-0.3.18".
На фото:
1. UART на роутере. Сверху вниз: gnd, Tx, Rx, Vcc 3,3V.
2. Seeeduino, с припаянной гребенкой UART. Данная гребенка соединяет непосредственно напрямую с чипом "ft232rl", т.е. мы получаем преобразователь USB->UART. Но надо учесть что питание тут 5V.
3. Обеспечивает согласование уровней (на транзисторе) в обе стороны: http://we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.html
4. ATTiny2313a с простейшей прошивкой, для тестирования работы UART.