CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Новогоднее исследование 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 <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
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
  • 6 января 2011, 17:38
  • noonv

Комментарии (4)

RSS свернуть / развернуть
+
0
А если прицепить такую штуку www.serasidis.gr/circuits/TV_terminal/Small_TV_terminal.htm то моно и моник с клавой прдклюить… Супер!
avatar

rammires

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

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

r0m

  • 28 октября 2012, 18:06
+
0
попробуй через Putty, через teraterm у меня была такая же проблема
avatar

Goodwinka

  • 11 сентября 2013, 21:40
+
0
Можно ли прошить модем ТОЛЬКО через UART!!!???
И если можно, то как?(ну не пингуется ни по LAN, ни по USB, ни по WiFi
avatar

olbush

  • 24 октября 2013, 17:04

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.