Новогоднее исследование ADSL-роутера на базе Linux — 0x6 — последовательный порт



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 Greear 
All 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 — последовательный порт”»

  1. спасибо за статью!
    попробовал на своем zxdsl831AII посмотреть лог загрузки, но с сериала идет только мусор.
    Прошивка та же:
    ZXDSL_831AIIV4.1.0a_E09_RU
    Скорость та же:
    root=31:0 ro noinitrd console=ttyS0,115200
    Пробую через Arduino nano, принимаю на SoftwareSerial и перекидываю в hardware serial (так же например с роутера лог загрузки принимается отлично). На всяк. случ. попробовал все скорости, все равно один мусор.
    Подскажите, что еще можно проверить?

    Кстати, у меня модель та же, но плата несколько отличается, например разъем uart’а у меня не в углу, а в центре рядом с процессором.

    • попробуй через Putty, через teraterm у меня была такая же проблема

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение