0x0 — введение
0x1 — разбираем 🙂
0x2 — знакомимся с программной частью
0x3 — формат прошивки
0x4 — модифицируем файловую систему
0x5 — пишем первую программу
0x6 — последовательный порт
Вернёмся немного назад — к нашему исследованию внутренностей модема. И попробуем получить в свои руки такой замечательный инструмент, как последовательный интерфейс!
Как мы помним, мы обнаружили на плате модема 4-пиновый разъём J5 — выведенный последовательный порт!
И даже нашли распиновку этого разъёма:
Распиновка J5
1-GND
2-TX
3-RX
4-Vcc
Так что, нам ничего не мешает попробовать к нему подключиться 🙂
На эти четыре пина выведен UART-интерфейс. Самое время вспомнить, что это такое 🙂
UART (Universal Asynchronous Receiver/Transmitter — универсальный асинхронный приёмопередатчик, который почти всегда присутствует на микроконтроллерах)
RS-232 (Recommended Standard 232) — это стандартный электрический интерфейс последовательной синхронной и асинхронной передачи двоичных данных между терминалом (DTE (Data Terminal Equipment)) и коммуникационным устройством (DCE (Data Communications Equipment)).
В асинхронном режиме работы UART отличается от RS-232 только логическими уровнями:
у UART логические уровни соответствуют КМОП или ТТЛ уровням,
у RS-232 логические уровни равны: +12В для логического нуля и -12В для логической единицы.
(RS-232 встречается с тремя различными особенностями (A, B, и C) каждая из которых объявляет различный диапазон напряжений для уровней on и off.)
Вариантов подключения может быть несколько:
1. если у вас на компьютере есть COM-порт:
для соединения UART-а с RS-232, необходимо преобразовать уровни напряжений. Самый популярный вариант — это использовать специальный RS232-TTL преобразователь — микросхему MAX232.
схема подключения приводится в datasheet-е:
2. если использовать USB-порт:
можно использовать USB-шнурки для старых телефонов (фактически они — это преобразователь USB-UART)
или же, нас выручит наша любимая Arduino/CraftDuino! 🙂
Так как на ней уже работает свой USB-UART конвертор FT232RL фирмы FTDI.
Я использовал CraftDuino, потому что на ней очень удобно выведены все пины UART-а:
место под разъём — 13 — для подключения последовательного порта (UART) (со всеми сигнальными линиями и на стандартном разъёме)
— это действительно очень удобно, а так как выводы соответствуют стандартному разъёму (как на компьютерных материнских платах): за счёт этого CraftDuino можно использовать как переходник USB2UART (или как «bit bang»-программатор).
Обычную Arduino тоже можно использовать — достаточно подсоединиться к соответсвующим пинам (GND, Rx, Tx)
На всякий случай аккуратно вытащим микроконтроллер и подключим к нашему разъёму переходник от компьютера:
Распиновка 9-контактного разъёма (DE-9):
проверить используемую схему очень просто — достаточно замкнуть контакты Rx и Tx (пины 2 и 3) между собой — т.е. соединить свои приёмник и передатчик 🙂 Затем открыть любую терминальную программу, например, тот же teraterm. И попробовать набить какое-нибудь сообщение (просто нажать какую-нибудь клавишу).
Если всё работает верно, то ваше же сообщение должно вернуться обратно в терминал.
Далее я взял 4-пиновый разъёмчик, подключил его к модему и подпаял к 9-контактному разъёму DE-9 типа мама.
Нам нужны всего 3 пина из четырёх — Rx, Tx, GND.
! При соединении, важно не забыть, что приёмник модема нужно соединить с передатчиком и наоборот — т.е. получить обычный нульмодемный кабель 🙂
в сборе 🙂
Запускаем терминальную программу, выбираем тип подключения Serial и указываем COM-порт, на котором висит наша CraftDuino.
В teraterm-е я столкнулся с небольшим препятствием — он не давал выбрать порты свыше COM12. Это решается редактированием ini-файла программы.
Открываем teraterm.ini и находим строчку:MaxComPort=12Заменяем на нужное нам число и запускаем программу заново 🙂
Барабанная дробь… включаем модем и видим, что в порт льются какие-то кракозябры 🙂
Ах да! Мы же забыли установить нужную скорость работы! А как мы помним по настройкам модема — там было указано:
root=31:0 ro noinitrd console=ttyS0,115200
идём в меню Setup-Serial Port и выставляем нужную скорость — 115200
перезапускаем модем и получаем прекрасный лог загрузки:
CFE version 1.0.37-10.1 for BCM96338 (32bit,SP,BE) Build Date: Fri Nov 16 23:17:17 HKT 2007 (root@lijian) Copyright (C) 2000-2006 Broadcom Corporation. Boot Address 0xbfc00000 Initializing Arena. Initializing Devices. Parallel flash device: name AM29LV160B, id 0x2249, size 2048KB Auto-negotiation timed-out 10 MB Half-Duplex (assumed) CPU type 0x29010: 240MHz Total memory: 8388608 bytes (8MB) Total memory used by CFE: 0x80401000 - 0x80528630 (1209904) Initialized Data: 0x8041DE90 - 0x8041FE60 (8144) BSS Area: 0x8041FE60 - 0x80426630 (26576) Local Heap: 0x80426630 - 0x80526630 (1048576) Stack Area: 0x80526630 - 0x80528630 (8192) Text (code) segment: 0x80401000 - 0x8041DE8C (118412) Boot area (physical): 0x00529000 - 0x00569000 Relocation Factor: I:00000000 - D:00000000 Board IP address : 192.168.1.1:ffffff00 Host IP address : 192.168.1.100 Gateway IP address : Run from flash/host (f/h) : f Default host run file name : vmlinux Default host flash file name : bcm963xx_fs_kernel Boot delay (0-9 seconds) : 1 Board Id (0-8) : 96338L-2M-8M Number of MAC Addresses (1-32) : 11 Base MAC Address : 00:d0:d0:86:86:b5 PSI Size (1-64) KBytes : 24 *** Press any key to stop auto run (1 seconds) *** Auto run second count down: 110 Booting from only image (0xbfc10000) ... Code Address: 0x80010000, Entry Address: 0x801ac018 Decompression OK! Entry at 0x801ac018 Closing network. Starting program at 0x801ac018 Linux version 2.6.8.1 (root@Mr-zhang) (gcc version 3.4.2) #1 Thu Jan 31 20:16:30 CST 2008 Parallel flash device: name AM29LV160B, id 0x2249, size 2048KB 96338L-2M-8M prom init CPU revision is: 00029010 Determined physical RAM map: memory: 007a0000 @ 00000000 (usable) On node 0 totalpages: 1952 DMA zone: 1952 pages, LIFO batch:1 Normal zone: 0 pages, LIFO batch:1 HighMem zone: 0 pages, LIFO batch:1 Built 1 zonelists Kernel command line: root=31:0 ro noinitrd console=ttyS0,115200 brcm mips: enabling icache and dcache... Primary instruction cache 16kB, physically tagged, 2-way, linesize 16 bytes. Primary data cache 8kB 2-way, linesize 16 bytes. PID hash table entries: 32 (order 5: 256 bytes) Using 120.000 MHz high precision timer. Dentry cache hash table entries: 2048 (order: 1, 8192 bytes) Inode-cache hash table entries: 1024 (order: 0, 4096 bytes) Memory: 5800k/7808k available (1438k kernel code, 1988k reserved, 205k data, 68k init, 0k highmem) Calibrating delay loop... 239.20 BogoMIPS Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Checking for 'wait' instruction... unavailable. NET: Registered protocol family 16 Total Flash size: 2048K with 35 sectors File system address: 0xbfc10100 Can't analyze prologue code at 801760a4 PPP generic driver version 2.4.2 NET: Registered protocol family 24 Using noop io scheduler bcm963xx_mtd driver v1.0 brcmboard: brcm_board_init entry Serial: BCM63XX driver $Revision: 3.00 $ ttyS0 at MMIO 0xfffe0300 (irq = 10) is a BCM63XX blaadd: blaa_detect entry adsl: adsl_init entry Broadcom BCMPROCFS v1.0 initialized NET: Registered protocol family 2 IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 512 bind 1024) NET: Registered protocol family 1 NET: Registered protocol family 17 Ebtables v2.0 registered NET: Registered protocol family 8 NET: Registered protocol family 20 802.1Q VLAN Support v1.8 Ben GreearAll bugs added by David S. Miller VFS: Mounted root (squashfs filesystem) readonly. Freeing unused kernel memory: 68k freed init started: BusyBox v1.00 (2008.01.31-12:18+0000) multi-call binary Algorithmics/MIPS FPU Emulator v1.5 BusyBox v1.00 (2008.01.31-12:18+0000) Built-in shell (msh) Enter 'help' for a list of built-in commands. Loading drivers and kernel modules... bcm_enet: module license 'Proprietary' taints kernel. Broadcom BCM6338A2 Ethernet Network Device v0.3 Jan 31 2008 20:15:18 Config Internal PHY Through MDIO BCM63xx_ENET: Auto-negotiation timed-out BCM63xx_ENET: 10 MB Half-Duplex (assumed) eth0: MAC Address: 00:D0:D0:86:86:B5 Broadcom BCM6338A2 USB Network Device v0.4 Jan 31 2008 20:15:20 usb0: MAC Address: 00 D0 D0 86 86 B6 usb0: Host MAC Address: 00 D0 D0 86 86 B7 BcmAdsl_Initialize=0x800EDB88, g_pFnNotifyCallback=0x801A48C4 AnnexCParam=0x7FFF7EB8 AnnexAParam=0x00000980 adsl2=0x00000000 pSdramPHY=0xA07FFFF8, 0x2753D 0xDEADBEEF AdslCoreHwReset: AdslOemDataAddr = 0xA07F8054 AnnexCParam=0x7FFF7EB8 AnnexAParam=0x00000980 adsl2=0x00000000 dgasp: kerSysRegisterDyingGaspHandler: dsl0 registered ATM proc init !!! ip_tables: (C) 2000-2002 Netfilter core team ip_conntrack version 2.1 (61 buckets, 0 max) - 376 bytes per conntrack ip_conntrack_pptp version 2.1 loaded ip_nat_pptp version 2.0 loaded ip_conntrack_rtsp v0.01 loading ip_ct_h323: init success ip_nat_h323: init success insmod: cannot open module `/lib/modules/2.6.8.1/kernel/net/ipv4/netfilter/ip_co nntrack_tftp.ko': No such file or directory insmod: cannot open module `/lib/modules/2.6.8.1/kernel/net/ipv4/netfilter/ip_na t_tftp.ko': No such file or directory ip_nat_irc: Unknown symbol needs_ip_conntrack_irc insmod: cannot insert `/lib/modules/2.6.8.1/kernel/net/ipv4/netfilter/ip_nat_irc .ko': Success (2): Success ip_nat_rtsp v0.01 loading ==> Bcm963xx Software Version: ZXDSL 831AIIV4.1.0a_E09_RU <== device usb0 entered promiscuous mode br0: port 1(usb0) entering learning state br0: topology change detected, propagating br0: port 1(usb0) entering forwarding state device eth0 entered promiscuous mode br0: port 2(eth0) entering learning state br0: topology change detected, propagating br0: port 2(eth0) entering forwarding state BcmRfc2684_init interface is not up nas_0_1_50! pvc2684ctl -a -v 0.1.50 & pvc2684d: Interface "nas_0_1_50" created sucessfully pvc2684d: Communicating over ATM 0.1.50, encapsulation: LLC device nas_0_1_50 entered promiscuous mode br0: port 3(nas_0_1_50) entering learning state br0: topology change detected, propagating br0: port 3(nas_0_1_50) entering forwarding state BcmRfc2684_init interface is not up nas_0_1_91! pvc2684ctl -a -v 0.1.91 & pvc2684d: Interface "nas_0_1_91" created sucessfully pvc2684d: Communicating over ATM 0.1.91, encapsulation: LLC device nas_0_1_91 entered promiscuous mode br0: port 4(nas_0_1_91) entering learning state br0: topology change detected, propagating br0: port 4(nas_0_1_91) entering forwarding state BcmRfc2684_init interface is not up nas_0_1_92! pvc2684ctl -a -v 0.1.92 & pvc2684d: Interface "nas_0_1_92" created sucessfully pvc2684d: Communicating over ATM 0.1.92, encapsulation: LLC device nas_0_1_92 entered promiscuous mode br0: port 5(nas_0_1_92) entering learning state br0: topology change detected, propagating br0: port 5(nas_0_1_92) entering forwarding state device usb0 left promiscuous mode br0: port 1(usb0) entering disabled state device eth0 left promiscuous mode br0: port 2(eth0) entering disabled state device nas_0_1_50 left promiscuous mode br0: port 3(nas_0_1_50) entering disabled state device nas_0_1_91 left promiscuous mode br0: port 4(nas_0_1_91) entering disabled state device nas_0_1_92 left promiscuous mode br0: port 5(nas_0_1_92) entering disabled state device usb0 entered promiscuous mode br1: port 1(usb0) entering learning state br1: topology change detected, propagating br1: port 1(usb0) entering forwarding state device eth0 entered promiscuous mode br0: port 1(eth0) entering learning state br0: topology change detected, propagating br0: port 1(eth0) entering forwarding state device nas_0_1_50 entered promiscuous mode br1: port 2(nas_0_1_50) entering learning state br1: topology change detected, propagating br1: port 2(nas_0_1_50) entering forwarding state device nas_0_1_91 entered promiscuous mode br0: port 2(nas_0_1_91) entering learning state br0: topology change detected, propagating br0: port 2(nas_0_1_91) entering forwarding state device nas_0_1_92 entered promiscuous mode br0: port 3(nas_0_1_92) entering learning state br0: topology change detected, propagating br0: port 3(nas_0_1_92) entering forwarding state br0: port 1(eth0) entering disabled state br1: port 1(usb0) entering disabled state CONSOLED launched Login name: admin Password: > sh BusyBox v1.00 (2008.01.31-12:18+0000) Built-in shell (msh) Enter 'help' for a list of built-in commands. # cd /usr/bin # mytest RoboCraft is cool! # hello [i] Start... [i] End. #
Вот мы и получили консольный кабель!
Отмечу, что это характерно для встраиваемых систем. Работа с тем же BeagleBoard по-умолчанию идёт через тот же консольный кабель и терминальную программу.
Запустим второй экземпляр teraterm и подключися к модему через telnet.
Заходим в sh и посылаем строчки в Serial:
# echo "AAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBB" > /dev/ttyS0 # /usr/bin/hello > /dev/ttyS0
наш терминал на COM-порту успешно выдаёт:
AAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBB [i] Start... [i] End.
супер — вот и общение через последовательный порт :)))
а можно и наоборот, в телнете набираем считывание порта:
# cat /dev/ttyS0 test ttttttt
а эти строчки были набраны в терминале последовательного порта и успешно прочитаны модемом 🙂
остановить считывание можно по Ctrl+C 😉
Согласитесь — здорово!
Какой простор для фантазии и идей! Например, написать программу, которая будет крутиться на модеме и перенаправлять команды из сети на последовательный порт, где их будет слушать наша Arduino/CraftDuino! А можно и наоборот! Просто красота — тут и Ethernet-шилд не нужен 🙂
UPD: Превращаем ADSL-модем в Ethernet-шилд для Arduino/CraftDuino
далее: 0x7 — заключение
Ссылки
http://ru.wikipedia.org/wiki/UART
http://ru.wikipedia.org/wiki/RS-232
Связь микроконтроллера с компьютером через RS232
Serial Programming Guide for POSIX Operating Systems
Программы:
teraterm
0 комментариев на «“Новогоднее исследование ADSL-роутера на базе Linux — 0x6 — последовательный порт”»
А если прицепить такую штукуhttp://www.serasidis.gr/circuits/TV_terminal/Small_TV_terminal.htm то моно и моник с клавой прдклюить… Супер!
спасибо за статью!
попробовал на своем zxdsl831AII посмотреть лог загрузки, но с сериала идет только мусор.
Прошивка та же:
ZXDSL_831AIIV4.1.0a_E09_RU
Скорость та же:
root=31:0 ro noinitrd console=ttyS0,115200
Пробую через Arduino nano, принимаю на SoftwareSerial и перекидываю в hardware serial (так же например с роутера лог загрузки принимается отлично). На всяк. случ. попробовал все скорости, все равно один мусор.
Подскажите, что еще можно проверить?
Кстати, у меня модель та же, но плата несколько отличается, например разъем uart’а у меня не в углу, а в центре рядом с процессором.
попробуй через Putty, через teraterm у меня была такая же проблема
Можно ли прошить модем ТОЛЬКО через UART!!!???
И если можно, то как?(ну не пингуется ни по LAN, ни по USB, ни по WiFi