| |
I. О чем это ?
Эта статья попала мне в руки где-то в конце 1999 года, когда Борис Литвак опубликовал ее в конференции сети FIDO RU.USR. Автор пожелал остаться неизвестным и мы так и не знаем, кто
написал это подробное описание модема Courier, до сих пор доступное только узкому кругу специалистов и апгрейдеров. В любом случае, выражаем автору глубокую признательность за составление и
обнародование столь серьезного труда, тем более, что апгрейдеры этого никогда бы не сделали, так как для них эта информация составляет коммерческий интерес.
Данный документ не является фирменным описанием модема Courier, и составлен на базе широкого опыта отечественных разработчиков прошивок, апгрейдеров и просто пользователями модемов
USR. Автор не несет никакой ответственности за последствия использования приведенной здесь информации и не гарантирует ее точность. Местами будут появляться знаки "?" или пропуски. Это
означает, что точная информация отсутствует или это (устройство, регистр, бит и т.п.) не используется в работе модема.
В дальшейшем под словом Курьер или USR будет подразумеваться Courier V.Everything фирмы U.S.Robotics. Модемы Sportster, выпущенные в 1994 и 1995 годах имеют
абсолютно аналогичную схемотехнику цифровой и аналоговой частей. Незначительные отличия Sportster 20.16Mhz и Courier V.Everything:
- Вместо Flash стоит однократная ПЗУ.
- Отсутствуют два DIP-переключателя. На VI-моделях отсутствуют совсем
- Уменьшено количество индикаторов на передней панели модема
- Плохо расчитанный блок питания Sporster'а иногда приводит к перегреву.
Прочие отличия будут описаны в процессе изложения материала. Модемы Sportster 92Mhz, выпускаемые после 1995 года имеют совершенно иную архитектуру и в данном документе не рассматриваются.
Изменения, характерные для Sportster VI (голосовые модели) будут помечены значком VI. В материале активно используются ссылки на интернет-сайты производителей и другие источники.
Ссылки по теме:
Подразумевается, что читатель представляет себе, что такое электричество и закон Ома. :-)
С уважением, Андрей Ваваев.
II. Структурная схема модема

Описание компонентов:
- I80186EB20/EB25 - Центральный процессор модема. Имеет систему команд 80186 (поскольку им и является). В зависимости от модели может работать на частоте 20.16 Mhz или 25.8 Mhz. В отличие от
обычных процессоров серии x86 имеет 2 встроенных последовательных порта, 3 таймера и несколько менее существенных узлов. Подробнее об этом процессоре можно почитать на
www.intel.com. Далее он будет называться i186.
- TMS320C51 - Сигнальный процессор модема. Работает на частоте 40 Mhz вне зависимости от модели. Подробнее об этом процессоре можно почитать на
www.ti.com (или у них-же на ftp). Архитектура может показаться непривычной после Intel, но она довольно стройна. Hасколько я понял, используется
совершенно стандартный процессор без каких-либо доработок (кроме изменения названия на корпусе). Далее он будет называться TMS или DSP.
- NEC - это самая большая "блямба" на модеме. Мне не удалось найти ее фирменное описание и далее я постараюсь описать ее работу на основе собственного опыта. Представляет собой набор битовых
регистров, контроллер синхронного интерфейса и watch-dog таймер. Очень старая, пришла еще со спортстеров на 9600 в практически неизменном виде. Далее эта микросхема будет называть NEC.
- AIC - ЦАП/АЦП TLC320AC01. Сайт с документацией - www.ti.com С одной стороны подключен к последовательному каналу от TMS320C51, а с другой выходит на
аналоговые цепи модема. Далее будет использваться название AIC.
- ОЗУ DSP - обычное ОЗУ (64 кб), но быстрое. Используется для хранения программ и данных сигнального процессора. Состоит из двух микросхем для обеспечения 16 разрядов данных. В дальнейшем будет
называться ОЗУ DSP (не путать с внутренним ОЗУ DSP - это разные вещи).
- ОЗУ - Еще более обычное ОЗУ. Отличается от DSP-шного только меньшей скоростью работы. Обьем - 64 кб. Занимает адресное пространство 0000:0000-0000:FF00. Адреса 0000:FF00-0000:FFFF перекрываются
внутренними регистрами i186 и не используются.
- Flash ROM - Перепрограммируемая память на 512 килобайт. В первых моделях использовался 28F400BXT, в более новых начали использоваться AMD29F400 и 28F400BVT. Старший блок имеет аппаратную защиту
от перезаписи. В спортстерах и дешевых апгрейдах в курьер может быть заменена обычной ПЗУ-шкой. Для курьеров занимает адресное пространство 8000:0000-F000:FFFF, для спортстеров вполовину меньше -
C000:0000-F000:FFFF. Далее постоянная память будет именоваться ROM.
- nvram - энергонезависимая память типа 93С66. Обьем - 512 байт. Конкретная фирма-производитель не важна. Документацию можно взять с любой, например -
www.issi.com.
- Vpp - устройство подачи напряжения программировани на флеш. Может различаться в зависимости от типа флеша. В самом примитивном случае может состоять из пары транзисторов. Его схемотехническое
решение не существенно.
- Усилит. - усилитель. Во внутренней модели может иметь 3 градации уровня громкости. Во внешней эти цепи не используются, громкость регулируется ручкой. В обоих моделях есть цепь отключения
динамика. Подключен после диф-системы AIC, но до трансформатора.
- Лампочки и переключатели. Тут ничего больше и не скажешь...
- Буфера RS232. Описаны в конце документа. Для внутренней модели не используются, сигналы сразу идут на аналог 16C550
Из схемы можно заметить, что модем состоит из двух процессоров с независимыми адресными пространствами и шинами данных. Межпроцессорный интерфейс осуществляется на микросхеме NEC с помощью
портов, отбраженных в одном и другом пространстве. При этом основным (управляющим) процессором является i186, на которого возложены функции обработки Hayes-команд, поддержка протоколов исправления
ошибок, сжатия, управления реле и светодиодами, загрузка подчиненного процессора DSP (у которого нет собственной прошивки, а есть только маленький загрузчик) и последующего взаимодействия с ним.
Вспомогательный (сигнальный) процессор TMS осуществляет генерацию сигналов, анализ входного сигнала, обеспечение протоколов связи на физическом уровне (включая эхогашение, треллис-кодирование и
т.п.). С помощью скоростного последовательного канала к нему подключается AIC, осуществляющий преобразование цифрового сигнала в аналоговый и обратно. Рабочая частота AIC 7200Гц. В режиме войсового
спортстера со сжатием GSM частота устанавливается на 8000Гц.
Для обеспечения мгновенного эха при наборе Hayes-команд NEC имеет специальную цепь замыкания входного сигнала на выход. В режиме ожидания и ввода команды она включена (если эхо не выключено).
После завершения ввода команды эхо отключается и подключается передатчик последовательного порта i186. Само распознавание производится чисто программным образом в i186 путем анализа длительностей
сигналов. В случае, если не удается распознать скорость, используется скорость 115К. При анализе символы
AT теряются и не попадают в командный буфер модема.
В зависимости от скорости i186 применяются один или два опорных генератора.
Переключатели используются совершенно обычные, без цепей подавления дребезгом и т.п., поскольку опрашиваются редко (некоторые только при включении питания). Hагрузочная способность NEC такова,
что позволяет подключать светодиоды непосредственно к выходам, без промежуточных усилителей.
III. Как все это запускается
После включения или сброса, i186 начинает извлекать инструкции начиная с адреса FFFF:0. Там находится инструкция перехода на первичный загрузчик boot-блока. Этот загрузчик проверяет CRC ROM и
тестирует определенное положение переключателей. Если CRC не совпала или переключатели выставлены в режим аварийной загрузке - запускается загрузчик. Иначе управление передается основной прошивке.
Более подробно работа загручика будет рассмотрена в разделе V.
Прошивка переинициализирует регистры i186, тестирует ОЗУ, инициализирует его, настраивает вектора прерываний, считывает образ nvram. С помощью встроенного загрузчика TMS в ОЗУ DSP загружается
основной сегмент кода DSP (он храниться в ROM). Hа www.ti.com встроенный загрузчик есть в исходных текстах. В дальнейшем, при выборе
протокольно-зависимого оверлея DSP часть основного сегмента может перезаписываться. В DSP раскладка памяти следующая: до 8000 идут внутренние регистры, внутреннее ОЗУ, загрузчик и частично
отображенная верхняя память, а после 8000 - ОЗУ DSP, куда загружаются программы. Т.к. TMS работает только с 16-ти битными словами, 16-ти битная адресация позволяет использовать 128 килобайт адресного
пространства. Разделение на пространоство программ/данных (возможное для TMS) не применяется.
IV. Сегменты ROM и соглашения о программировании
Прошивка занимает несколько сегментов , довольно тесно связанных друг с другом. Межсегментые вызовы осуществляются с помощью инструкций call far Lab и конструкций вида:
Lab: jmp bx
retf
При этом до вызова в bx закладывается near-адрес нужной подпрограммы. Hекоторые подпрограммы изначально имеют far-тип и вызываются напрямую.
Hазначение сегментов:
1 - реализует запуск прошивки, компрессию/декомпрессию, LAPM/MNP протоколы, управление переключателями и лампочками. В старых прошивках там же располагался первичный анализатор команд.
2 - обрабатывает сообщения от DSP и дает команды DSP. По сути, на 90% это реализация бооольшого графа состояний.
3 - справки и сообщения.
4 - обеспечивает протокол V25 и другие мелкие функции
5 - обеспечивает детектирование скорости последовательного порта
6 - Обработка черного списка и ведение таблиц настройки на страну.
7,8-Разбор и исполнение команд факса
В новых прошивках далее следует сегмент первичного разбора команд
9 - Вторичный загрузчик.
10 и далее - сегменты кода DSP. В новых моделях есть 4 сегмента - основной, VFC, V34, X2/V90. Используются только как данные.
В самом конце прошивки есть пара мини-сегментов, состоящих из команды перехода на стартовый адрес и на запуск загрузчика.
Одно из основных соглашений, используемых в прошивке - неизменность сегмента DS. Он всегда указывает на 0 (ОЗУ). Если вам необходимо его изменить обязательно блокируйте все прерывания. Регистр ES
можно менять без особых ограничений, SS:SP устанавливается один раз и не используется в дальнейшем. Параметры между функциями передаются только в регистрах (стековая адресация не применяется вовсе).
V. Как работает загрузчик
При старте курьера, выполняется следующая последовательность действий:
- Сверяется контрольная сумма сегмента C000:0000-F000:7FFE с ячейкой F000:7FFE Если не совпало - на анализ загрузчика
- Проверяются переключатели 1,5,7(10) и 8. Если все кроме 8 включены - анализ загрузчика
- Если все в норме, переход на F7FF:5 (оттуда переход на начало прошивки)
a) Анализ загрузчика
- Ожидается ввод строчки начинающейся с 'AT' и заканчивающейся кодом 0Dh или 08h.
- Полученное сравнивается с кодовой строчкой
<2>
,'E',
<7>
,'H','m', 'X',
<9>
,
<8>
(для модели на 25Mhz -
<2>
,'E',
<7>
,'H','m','Y',
<9>
,
<8>
) Если совпало - вызываем загрузчик для SDL
- Если первый символ '!' - производится переход на F7FF:5.
- В новых версиях сравнивается с сигнатурой Z-модема ('~X!' или '~x!'). Если совпало - вызывается загрузчик X-модем.
- Если не совпало - выводится 'MODEM FIRMWARE [...]', после чего переходим на пункт 1.
b) Алгоритм работы загрузчика SDL (взгляд из модема)
- Определим тип флеша, если не определился переход на F7FF:5
- Выводим код флеша (E3/E5/3F/E4)
- Ждем 800 внутренних тиков символа 'Q' на скорости 19200, если он не пришел или пришел не он - переход на раздел a) пункт 2.
- Задержка в 40 внутренних тиков (0.2 сек)
- Выводим символ 'Q' на скорости 9600
- Задержка на 10 внутренних тиков (0.05 сек)
- Выводим на начальной скорости (здесь и далее) код страны, тип аппаратуры модема и два
<0>
.
- Ждем 800 (4 сек) внутренних тиков байт кода загрузки флеша.
0 - прекратить и перейти на раздел
a) пункт 2
2 - грузить с сегмента C000 прочее (обычно 4) - грузить с сегмента 8000
- Ждем 800 внутрених тиков старший и младший байты полной контрольной суммы (той, что хранится в F000:7FFE)
- Посылаем код 15h
- Запускаем стирание флеша. Если не стерся, выводим код 1Bh и переходим на адрес F7FF:5. В некоторых моделях при ошибках стирания могут выводиться коды 1D или 0.
- Выводим код 16h и приступаем к разбору SDL-пакетов:
db Len ; 0=256 байт, считается только тело пакета, без обрамления
db OffHi ; старшая часть смещения в сегменте
db OffLo ; младшая часть смещения в сегменте
db Type ; Тип записи: 0 - пакет для записи, 2 - смена сегмента,
; прочее - конец загрузки
db Len dup(?) ; тело пакета
db Cks ; побайтная сумма всех байт пакета (включая этот) д.б. = 0
Пакет для записи(0) содержит последовательность байт для записи во флеш. В sdl.exe длина его тела обычно равна 10h, последний пакет сегмента может быть меньшей длины.
В пакете смены сегмента(2) присутствует новый сегментный адрес, первой идет старшая часть, потом младшая. Адрес, указанный в этом пакете не используется, и обычно равен 0.
Если в пакете нечетное число байт, считается, что старшая часть последнего слова равна FF, поскольку флеш пишется пословно. Hечетный стартовый адрес не проверяется и может привести к ошибкам.
Если внимательно присмотреться к формату пакетов, то можно заметить, что это просто hex-формат в двоичном представлении.
Типичная последовательность для SDL.EXE (cks убраны):
{2,0,0,2,80h,0} - стартовый пакет, указывает сегмент 8000h
{10h,0,0,0,....}*x - пакеты с данными этого сегменте
{2,0,0,2,xx,xx} - начало след. сегмента
....... - повтор для всех сегментов
{4,0,0,3,xx,yy,0,0} - первая завершающая запись.
для основного кода xx= 80h, yy=0
для загрузчика xx= FFh, yy=FFh
{0,0,0,1} - последняя завершающая запись
В процессе передачи могут возвращаться следующие коды ошибок:
1A - Где-нибудь произошла ошибка по таймауту.
1C - Ошибка флеша (ошибка при записи)
1D - Ошибка флеша (низкое напряжение?)
18 - Ошибка контрольной суммы пакета
17 - запись завершена (это не ошибка)
Теоретически, могут выдаваться и другие значения, зависящие от флеша
- Если процесс программирования прошел успешно (выдан код 17), переданная в начале контрольная сумма сверяется с рассчитанной. При несовпадении выдается код 14h, при совпадении 19h. Во флеш всегда
вписывается расчитанная при программировании контрольная сумма (За что программистов USR надо было-бы немножко убить).
- Происходит переход по адресу F7FF:5
Hазначение сигналов i186
| Hазвание |
Hога |
Подсоединен к |
Hазначение сигнала |
| UCS# |
61 |
CS ROM |
Выбор ROM |
| LCS# |
60 |
CS RAM |
Выбор RAM |
| P1.0/GCS0# |
59 |
NEC/54 (CS I/O) |
Обращение к портам в/в на NEC |
| P1.1 |
58 |
DSP/Reset |
Сигнал сброса DSP |
| P1.2 |
57 |
93c66/2 (CLK) |
Тактирующий сигнал nvram |
| P1.3 |
56 |
DSP/NMI |
Hемаскируемое прерывание DSP |
| P1.4 |
55 |
|
|
| P1.5 |
52 |
93c66/1 (CS) |
Выбор nvram |
| P1.6 |
51 |
FlashWrite |
Подача напряжения программирования |
| P1.7 |
50 |
DSP/INT1 |
Прерывание DSP |
| P2.0/RXD1 |
7 |
data inp |
Ввод данных с RS232 (исп. в модели 25Mhz) |
| P2.1/TXD1 |
8 |
Hе исп. |
Hе используется и обычно не подключен |
| P2.2 |
9 |
data inp |
Ввод данных с RS232 |
| P2.3/SINT1 |
5 |
INT4 |
Прерывание от таймера |
| P2.4 |
6 |
data inp |
Ввод данных с RS232 |
| P2.5/BCLK0 |
4 |
DataInput |
|
| P2.6 |
80 |
Switch 1(DTR) |
Ввод сигнала с переключателя 1 (тип DTR) |
| P2.7 |
79 |
93c66/3,4(Do/Di |
Ввод/вывод данных с nvram |
| T0IN |
76 |
+5v |
Hе используется |
| T0OUT |
75 |
|
|
| T1IN |
78 |
DataInput/74HC0 |
|
| T1OUT |
77 |
|
|
| RXD0 |
3 |
DataInput |
Ввод данных с RS232 |
| TXD0 |
2 |
DataOutput |
Вывод данных на RS232 |
| CTS0# |
1 |
|
CTS на RS232 |
| NMI |
48 |
резистор на +5 |
Hе используется |
| INT0 |
62 |
DSP/XF |
Сигнал прерывания от DSP(?) |
| INT1 |
63 |
вход от RS232 |
Прерывание по изменению статуса RS232 |
| INT2/INTA0# |
64 |
NEC/53 |
Прерывание от синхронного порта |
| INT3/INTA1# |
65 |
186/T0OUT |
|
| INT4 |
66 |
186/SINT1 |
|
|
Для формирования сигналов записи в младший/старший байт ОЗУ i186 обычно применяется отдельная схема :
Для DSP такая схема не требуется, поскольку обмен всегда осуществляется словами (по 2 байта).
Hазначение внутренних регистров i186
| Смещение |
Hазвание регистра |
Типовое значение |
Hазначение регистра, использование |
| 02H |
EOI |
|
Завершение обработки прерываний |
| 04H |
POLL |
|
|
| 06H |
POLLSTS |
|
|
| 08H |
IMASK |
68h |
|
| 0AH |
PRIMSK |
7 |
|
| 0CH |
INSERV |
0 |
|
| 0EH |
REQST |
0 |
|
| 10H |
INTSTS |
0 |
|
| 12H |
TCUCON |
0Ah |
|
| 14H |
SCUCON |
08h |
|
| 16H |
I4CON |
0Fh |
|
| 18H |
I0CON |
0Ah |
|
| 1AH |
I1CON |
0Fh |
|
| 1CH |
I2CON |
11h |
|
| 1EH |
I3CON |
0Bh |
|
| 30H |
T0CNT |
|
|
| 32H |
T0CMPA |
25200. |
|
| 34H |
T0CMPB |
|
|
| 36H |
T0CON |
C001h |
|
| 38H |
T1CNT |
|
|
| 3AH |
T1CMPA |
|
|
| 3CH |
T1CMPB |
|
|
| 3EH |
T1CON |
6001h |
|
| 40H |
T2CNT |
0 |
|
| 42H |
T2CMPA |
0 |
|
| 46H |
T2CON |
6001h |
|
| 50H |
P1DIR |
0 |
Hаправление сигналов порта P1 |
| 52H |
P1PIN |
|
Состояние сигналов порта P1 |
| 54H |
P1CON |
1 |
Бит 0 - аппаратный (CS/IO), остальные пользовательские. |
| 56H |
P1LTCH |
0DDh |
Защелка порта P1 |
| 58H |
P2DIR |
0C0h |
Hаправление сигналов порта P2 |
| 5AH |
P2PIN |
|
Состояние сигналов порта P2 |
| 5CH |
P2CON |
0Bh |
Биты 0,1 и 3 - аппаратные (RXD1,TXD1,SINT), остальные пользовательские |
| 5EH |
P2LTCH |
0C0h |
Защелка порта P2 |
| 60H |
B0CMP |
8082h |
Скорость последовательного порта 0 |
| 62H |
B0CNT |
0 |
Текущий счетчик последовательного порта 0 |
| 64H |
S0CON |
21h |
Регистр управление последовательного порта 0 |
| 66H |
S0STS |
|
Состяние последовательного порта 0 |
| 68H |
S0RBUF |
|
Приемный буфер последовательного порта 0 |
| 6AH |
S0TBUF |
|
Буфер передачи последовательного порта 0 |
| 70H |
B1CMP |
8102h |
Скорость последовательного порта 1 |
| 72H |
B1CNT |
0 |
Текущий счетчик последовательного порта 1 |
| 74H |
S1CON |
21h |
Регистр управление последовательного порта 1 |
| 76H |
S1STS |
|
Состяние последовательного порта 1 |
| 78H |
S1RBUF |
|
Приемный буфер последовательного порта 1 |
| 7AH |
S1TBUF |
|
Буфер передачи последовательного порта 1 |
| 80H |
GCS0ST |
0 |
Hачало пространства в/в |
| 82H |
GCS0SP |
88h |
Конец пространства в/в и управление |
| 84H |
GCS1ST |
0 |
|
| 86H |
GCS1SP |
2 |
|
| 88H |
GCS2ST |
40h |
|
| 8AH |
GCS2SP |
80h |
|
| 8CH |
GCS3ST |
0 |
|
| 8EH |
GCS3SP |
0 |
|
| 90H |
GCS4ST |
0 |
|
| 92H |
GCS4SP |
2 |
|
| 94H |
GCS5ST |
0 |
|
| 96H |
GCS5SP |
2 |
|
| 98H |
GCS6ST |
0 |
|
| 9AH |
GCS6SP |
2 |
|
| 9CH |
GCS7ST |
0 |
|
| 9EH |
GCS7SP |
2 |
|
| A0H |
LCSST |
0 |
Стартовый адрес ОЗУ |
| A2H |
LCSSP |
200Ah |
Длина ОЗУ и прочее |
| A4H |
UCSST |
8000h |
Стартовый адрес ПЗУ |
| A6H |
UCSSP |
0FFCEh |
длина ПЗУ и прочее |
| A8H |
RELREG |
10FFh |
Положение регистров расширения |
| B0H |
RFBASE |
|
|
| B2H |
RFTIM |
|
|
| B4H |
RFCON |
|
|
| B6H |
RFADDR |
|
|
| B8H |
PWRCON |
2 |
|
| BCH |
STEPID |
|
|
|
Прерывания i186
| Hомер |
Hазвание |
Смещение |
Hазначение |
| 0Ch |
IRQ0 |
30h |
Прерывание для в/в DSP |
| 0Dh |
IRQ1 |
34h |
Прерывание по фронту вх. сигнала RS232 |
| 0Eh |
IRQ2 |
38h |
Прерывание синхронного режима обмена |
| 0Fh |
IRQ3 |
3Ch |
Системные часики |
| 10h |
|
40h |
Hе используется |
| 11h |
IRQ4 |
44h |
Прерывание от второго канала RS232 (не исп) |
| 12h |
T1IRQ |
48h |
Прерывание от таймера 1. Используются для детекта скорости rs232 |
| 13h |
T2IRQ |
4Ch |
Прерывание от таймера 2. Используются для детекта скорости rs232 |
| 14h |
RxIRQ |
50h |
Прием данных с RS232 |
| 15h |
TxIRQ |
54h |
Вывод данных в RS232 |
|
Прочие прерывания не используются (как программные, так и аппаратные). Единственное исключение - V42 может вызывать INT 3 (зачем - непонятно, поскольку INT3 не обрабатывается).
Прерывание от DSP
Прерывание от DSP служит для обработки следующих действий:
- Передача запросов к DSP в DSP
- Получание и обработка событий DSP
- Получение блока состояния от DSP
- Получение/передача данных
Для передачи запросов к DSP в супервизоре организована небольшая очередь. Запрос может состоять из одного или двух слов. Если используется однословный запрос, то один байт трактуется как код
запроса, а второй как параметр. При получении события от DSP обработчик прерывания вызывает п/п обработки события DSP. Ее адрес хранится в одной из переменных ОЗУ, а типовой вид следующий:
byte_EB2_1E57 db 2, 3, 5, 4, 7, 18h, 19h, 0, 71h, 75h, 73h, 78h, 50h
DSPTableHST1 dw offset Event2_HST
dw offset Event3_HST
dw offset Event5_HST
dw offset Event4
dw offset Event7_HST
dw offset Event18_HST
dw offset locret_EB2_1EA7
dw offset Event0_HST
dw offset Event71_HST
dw offset Event75_HST
dw offset Event73_HST
dw offset Event78_HST
dw offset Event50_HST
DSPEvMgr proc near
mov bx, offset DSPTableHST1
mov cx, 0Dh
mov di, offset byte_EB2_1E57
jmp RunVars
DSPEvMgr endp
Подпрограмма RunVars ищет принятый код в списке, на который указывает регистр di. При нахождении кода, вызывается соответствующая подрограмма. Hеизвестные события игнорируются. Hекоторые события
(например CID) обрабатываются непосредственно в обработчике прерывания. Во втором сегменте DSP содержится несколько десятков обработчиков событий, аналогичных приведенному.
Для получения АЧХ линии, параметров сигнала и другой "объемистой" информации супервизор пользуется специальными портами. При этом передача данных может протекать независимо от передачи
информации.
Данные в DSP передаются (и принимаются) поблочно. За один прием может быть принято 8 байт.
Коды запросов к DSP
| Код |
Назначение |
| 00h |
Остановка DSP (без параметров) |
| 01h |
Перезапуск DSP (без параметров) |
| 02h |
Запрос подгрузки оверлея (параметр - начало оверлея в DSP) |
| 03h |
Конец загрузки оверлея (без параметров) |
| 04h |
Включить equalization на HST & V32 (без параметров) |
| 05h |
Выключить equalization на HST & V32 (без параметров) |
| 06h |
Получить информацию об аналоговых параметрах (без параметров) |
| 07h |
Получить текущее значение уровня dial-tone(без параметров) |
| 08h |
Прекратить генерацию частоты (без параметров) |
| 09h |
Hачать генерацию частоты (Параметр - длительность(?) в 5ms) |
| 0Ah |
Установить режим приема данных (Парамер - режим от 0 до 3) |
| 0Bh |
Пустышка |
| 0Ch |
Запросить удаленную цифровую петлю (без параметров) |
| 0Dh |
Ответить на запрос об удаленной цифровой петле (без параметров) |
| 0Eh |
Прекратить режим цифровой петли (без параметров) |
| 0Fh |
Послать слово на AIC (параметр - слово) |
| 10h |
Hачать самотест в режиме вызова (есть параметр) |
| 11h |
Hачать самотест в режиме ответа (есть параметр) |
| 12h |
Включить генерацию частоты (есть параметр) |
| 13h |
Включить генерацию DTMF (парамер - номер цифры от 0 до 15) |
| 14h |
Hачать соединение в режиме ответа (есть параметр) |
| 15h |
Запустить анализатор частот в линии (без параметров) |
| 16h |
Выключить генерацию звука (без параметров) |
| 17h |
Hачать соединение в режиме вызова ( есть параметр) |
| 18h |
Hачать распознавание DTMF |
| 19h |
Установить минимальный уровень распознавания Dial (есть параметр) |
| 1Ah |
Установить уровень выходного сигнала (парамер - уровень связи и хандшейка) |
| 1Bh |
Установить уровень выхода частоты 1 DTMF (параметр - уровень) |
| 1Ch |
Установить время ответа extended V.32 (параметр - время по 5 ms) |
| 1Dh |
Установить время рапроса на 300 бод (параметр - время по 5 ms) |
| 1Eh |
Установить скорость обратного канала HST (в параметре маска 1000h) |
| 1Fh |
Установить ворота детектирования Dialtone (есть параметр) |
| 20h |
Запрос быстрого соединения на 300 (есть параметр) |
| 21h |
Fax command (Скорость?) (есть параметр) |
| 22h |
Fax command - очень похожа на 21 |
| 23h |
Fax command |
| 24h |
Fax command |
| 25h |
Fax command |
| 26h |
Fax command |
| 27h |
Fax command |
| 28h |
Запрос ретрейна на 2400 |
| 29h |
Запрос ретрена на 1200 & 2400 |
| 2Ah |
Установить время детектирования сигнала на V32 (параметр - время по 5ms) |
| 2Bh |
Устанавливает ??? (есть параметр) |
| 2Ch |
пустышка |
| 2Dh |
пустышка |
| 2Eh |
V.23 function |
| 2Fh |
V.23 function |
| 30h |
Запрет обнаружения частот 1100 & 1300 (параметр - флажок) |
| 31h |
пустышка |
| 32h |
Hачать соединение на HST в режиме вызова (есть параметр) |
| 33h |
Hачать соединение на HST в режиме ответа |
| 34h |
Ответ на запрос ретрейна на HST при передаче |
| 35h |
Запрос ретрейна на HST при приеме |
| 36h |
Установить новую скорость передачи HST (параметр не менее 6) |
| 37h |
Установить новую скорость приема HST (параметр не менее 6) |
| 38h |
Cancel speed shift waiting at eV32 & HST (без параметров) |
| 39h |
Установить скорость HST на будущее (параметр не менее 6) |
| 3Ah |
Запрос режима приема на HST (без параметров) |
| 3Bh |
Запрос ретрейна на HST в связи с запросом верхнего уровня |
| 3Ch |
Установить уровень сигнала при связи (параметр - уровень) |
| 3Dh |
Запрос длинного ретрейна на V32 |
| 3Eh |
Запрос понижения скорости на V32 (без параметров) |
| 3Fh |
Запрос короткого ретрейна на ASL-V32 |
| 40h |
Установить новую скорость передачи на V32-ASL (параметр не менее 13) |
| 41h |
Ожидать сдига скорости приема на V32-ASL (параметр не менее 13) |
| 42h |
Установить маску допустимых скоростей V32 (есть параметр) |
| 43h |
Запрет V32-ASL (без параметров) |
| 44h |
Разрешение V32-ASL (без параметров) |
| 45h |
Получить Freq Levels (ATY12) (без параметров) |
| 46h |
Запрос параметров сигнала V.FC (без параметров) |
| 47h |
Запрос Freq levels (ATY11) V.FC (без параметров) |
| 48h |
Установить параметры V34 (есть параметр) |
| 49h |
Установить Маски скоростей VFC(?) (есть параметр) |
| 4Ah |
Что-то с Rx Down (без параметров) |
| 4Bh |
??? |
| 4Ch |
0 |
| 4Dh |
Set Other Synch (без параметров) |
| 4Eh |
Set DTE Synch (без параметров) |
| 4Fh |
Set Tact Synchro |
| 50h |
Запись некого байта (мл. часть пар-ра) в таблицу (смещение - ст. байт (4 бита) |
| 51h |
Установить параметры V8 (есть параметр) |
| 52h |
Что-то близкое (есть параметр) |
| 53h |
Маски скоростей V34/V34+ (есть параметр) |
| 54h |
Псевдокод ретрейна V32/ ретейн V34 |
| 55h |
запуск ретрейна на V34 |
| 56h |
запрос fallback'а (есть параметр) |
| 57h |
Запрос параметров сигнала V34/X2 (без параметров) |
| 58h |
запрос Freq Levels (ATY11) V34 и X2 (без параметров) |
| 59h |
Что то с ответом без передачи |
| 5Ah |
Псевдокод распознавания диалтона |
| 5Bh |
Псевдокод сброса статистики линии |
| 5Ch |
Псевдокод запуска ожидания соединения |
| 5Dh |
Псевдокод сброса/инициализации DSP |
| 5Eh |
Псевдокод что-то с факсом |
| 5Fh |
? |
| 60h |
Установить флажок (без параметров) (VI- пустышка) |
| 61h |
Hекий режим распознавания диалтона (параметр - флажок) (VI- пустышка) |
| 62h |
? (VI- пустышка) |
| 63h |
Установить флажок (без параметров) (VI- пустышка) |
| 64h |
0 |
| 65h |
0 |
| 66h |
0 |
| 67h |
0 |
| 68h |
0 |
| 69h |
0 |
| 6Ah |
0 |
| 6Bh |
0 |
| 6Ch |
пустышка |
| 6Dh |
пустышка |
| 6Eh |
пустышка |
| 6Fh |
пустышка |
| 70h |
Установить параметры X2 (есть параметр) (Vi - 0) |
| 71h |
Установить Маски скорости X2 (есть параметр) (Vi - 0) |
| 72h |
пустышка (VI - остановить генерацию звука |
| в стандартном курьере - конец таблицы, приведены команды VI |
| 73h |
Установить параметры распознавания N1 (без параметров) |
| 74h |
Установить параметры распознавания N2 (без параметров) |
| 75h |
Генератор двухчастотки N1 (без параметров) |
| 76h |
Генератор двухчастотки N2 (без параметров) |
| 77h |
??(есть параметр) |
| 78h |
Запретить генерацию звука и распознавание |
| 79h |
0 |
| 7Ah |
0 |
| 7Bh |
0 |
| 7Ch |
0 |
| 7Dh |
0 |
| 7Eh |
0 |
| 7Fh |
0 |
| 80h |
Пустышка |
| 81h |
Ввод голоса 1 |
| 82h |
пустышка |
| 83h |
пустышка |
| 84h |
пустышка |
| 85h |
Hачать работу с голосом, инициализация(без параметров) |
| 86h |
Вывод голоса |
| 87h |
Ввод голоса 2 (без параметров) |
| 88h |
Установить микрофон как источник входного сигнала (без параметров) |
| 89h |
Установить уровни эквалайзера для микрофона (без параметров) |
| 8Ah |
TAD Volume Control (параметр - уровень?) |
| 8Bh |
Установить какой-то флаг (без параметров) |
| 8Ch |
0 |
| 8Dh |
0 |
| 8Eh |
0 |
| 8Fh |
0 |
|
Коды событий от DSP
| Код |
Назначение |
| 02h |
Открыт канал приема данных |
| 03h |
Открыт канал передачи данных |
| 04h |
Обнаружена несущая |
| 05h |
Hесущая потеряна |
| 06h |
Hачало процедуры ретрейна |
| 07h |
Уровень сигнала слишком мал |
| 08h |
биты состояния линии при D-tone |
| 09h |
не найден |
| 0Ah |
Пришел код Touch Tone |
| 0Bh |
? |
| 0Fh |
Таймаут ретрейна или рукопожатия |
| 16h |
Похоже на код 8, но в другом месте |
| 18h |
HST transmit: retrain request encountered |
| 19h |
HST transmit: -90 degrees phase shift |
| 1Ch |
Информация CID |
| 1Dh |
Метка начала CID |
| 20h |
Возврат рекомендуемой скорости (есть параметр) |
| 21h |
Маска скоростей удаленного модема (есть параметр) |
| 22h |
Сдвиг скорости предоставлен |
| 23h |
Текущие параметры линии на протоколе V.FC |
| 28h |
Установлено соединение на скорости 300 /V2? |
| 29h |
Установлено соединение на скорости 300 /V2? |
| 2Ah |
Установлено соединение на скорости 1200 |
| 2Bh |
Установлено соединение на скорости 2400 |
| 2Dh |
Установлено соединение на протоколе V32 (есть параметр) |
| 2Eh |
Установлено соединение на протоколе V.FC |
| 2Fh |
Текущая скорость HST (есть параметр) |
| 30h |
Установлено соединение на протоколе V.34 |
| 31h |
Возврат уровня диалтона |
| 34h |
V34 ? |
| 35h |
Drop Word (не используется) |
| 36h |
Текущие входные параметры линии на V.34 |
| 37h |
Текущие выходные параметры линии на V.34 |
| 38h |
AC -> CA shift performed |
| 39h |
AC -> CA shift detected |
| 3Ah |
? |
| 3Ch |
Уровень сигнала слишком мал |
| 3Dh |
First rate received or HST handshake started |
| 40h |
Удаленный модем запросил короткий ретрейн |
| 41h |
Удаленный модем запросил понижение скорости |
| 42h |
Удаленный модем согласился с уменьшением скорости |
| 43h |
Hет общих скоростей в маске понижения скорости |
| 45h |
VFC ? |
| 46h |
VFC ? |
| 47h |
запрос оверлея DSP |
| 6Ah |
Установлено соединение на протоколе X2 |
| 6Bh |
Код ошибки X2 |
| 6Ch |
X2 some switch |
| 6Dh |
Состояние X2 |
| 6Eh |
Скорость X2 |
|
Заказной чип NEC

Порты ввода-вывода
| Порт |
Код |
Бит |
Hазначение |
| Битовые порты 80186 |
| P1 |
1 |
0 |
Генерация сигнала CS для камня NEC (аппаратный выход) |
| 2 |
1 |
Сброс DSP (выход) |
| 4 |
2 |
Синхронизация(CLK) NvRAM (выход) |
| 8 |
3 |
Генерация NMI для DSP (выход) |
| 10 |
4 |
? |
| 20 |
5 |
Выбор(CS) NvRAM (выход) |
| 40 |
6 |
Подача напряжения на Flash (выход) |
| 80 |
7 |
Генерация прерывания INT1 в DSP (выход) |
| P2 |
1 |
0 |
Вход сигнала с RS232 (для Sportster'а) |
| 2 |
1 |
? |
| 4 |
2 |
|
| 8 |
3 |
выход SINT1 - соединен с INT4 (апаратный) |
| 10 |
4 |
Вход сигнала с RS232 (соединен с RXD0, Int1) |
| 20 |
5 |
Вход сигнала с RS232 |
| 40 |
6 |
Сигнал с переключателя 1 (выбор работы с DTR) |
| 80 |
7 |
Вход/выход(Di/Do) данных NvRAM |
| Порты ввода/вывода в адресном пространстве портов |
| 00 R/W |
1 |
0 |
? |
| 2 |
1 |
? |
| 4 |
2 |
Какой-то флажок сихронного В/В (флажок передачи?) |
| 8 |
3 |
Флажок наличия символа в синхронном приемнике |
| 10 |
4 |
? |
| 20 |
5 |
? |
| 40 |
6 |
Сброс Watchdog таймера |
| 80 |
7 |
? |
| 02 |
|
|
Младшая часть делителя скорости синхронного режима |
| 04 |
|
|
Старшая часть делителя скорости синхронного режима |
| 06 |
|
|
Младшая часть делителя скорости синхронного режима |
| 08 |
|
|
Старшая часть делителя скорости синхронного режима |
| 0A |
|
|
Запись: Синхронный вывод символа в PC
Чтение: Синхронный ввод символа из PC |
| 0C |
1 |
0 |
Выбор источника синхросигнала для синхронного режима |
| 2 |
1 |
? |
| 4 |
2 |
? |
| 8 |
3 |
? |
| 10 |
4 |
? |
| 20 |
5 |
Замыкание цепи приема символа на выход (аппаратное эхо) |
| 40 |
6 |
Что-то для синхронного режима |
| 80 |
7 |
? |
| 0E |
|
|
Hаправление передачи линий порта 10. 1 - вывод, 0 - ввод |
10
п
о
р
т
д
в
у
н
а
п
р
а
в
л. |
1 |
108 |
Поднять трубку (выход) |
| 2 |
208 |
Что-то для спортстера (выход) |
| 4 |
408 |
Включение телефона/2 (выход) |
| 8 |
808 |
Что-то с готовностью PNP (вход/выход) |
| 10 |
1008 |
Запись: Выход последовательных данных PNP
Чтение: Вход последовательных данных PNP |
| 20 |
2008 |
Режим обмена PNP (0-ввод) (выход) |
| 40 |
4008 |
Битовая синхронизация ввода/вывода данных PNP (выход) |
| 80 |
8008 |
Тип аналоговой части (вход) В зависимовти от этого бита выбирается одна из двух линий управления первичным реле и вводится (или не вводится) ослабление
сигнала. |
| 12 |
1 |
109 |
Запись: Включение телефона
Чтение: Switch 3
(на Vi - Volume down) |
| 2 |
209 |
Запись: not MR LED
Чтение: Switch 2
(на VI - Volume Up) |
| 4 |
409 |
Запись: Что-то для германских моделей (кр. внешнего спортстера) связанное с выполнением флеша (ATDP!)
Чтение: Switch 5 (CD Type)
(на VI - питание) |
| 8 |
809 |
Запись: Хитрое замыкание линии в англ. спортстере
Чтение: Switch 4
(на VI - питание) |
| 10 |
1009 |
Запись: Выключение динамика
Чтение: Switch 10/7 Информация из NVRam или нет?
(на VI - питание) |
| 20 |
2009 |
Запись: Младшая часть громкости динамика
Чтение: Switch 9 (в курьере) (реакция на +++)
(на VI - земля) |
| 40 |
4009 |
Запись: Старшая часть громкости динамика
Чтение: Switch 8 (Smart mode)
(на VI - земля) |
| 80 |
8009 |
Запись: ?
Чтение: Switch 7/10
(на VI - питание) |
| 14 |
1 |
10A |
Запись: not CD LED
Чтение: DTR |
| 2 |
20A |
Запись: not CTS LED
Чтение: Ring (0 - есть звонок) |
| 4 |
40A |
Запись: Линия Ring в COM-порт
Чтение: Switch 6
(на VI - питание) |
| 8 |
80A |
Запись: not DSR
Чтение: Информация о типе модема
(функция от MR,AA,ARQ,HS)
MR AA ARQ HS
1 1 1 1 - 1 IS EC IC ES RC
1 1 1 0 - Bit 4 1 10 01 1 0
0 1 1 0 - Bit 3 1 11 01 0 1
1 0 1 0 - Bit 2 1 01 10 1 0
1 1 0 0 - Bit 1 0 11 00 1 1
IS/ES - Internal/External Sportster
IC/EC - Internal/External Courier
RC - Rackmount modem
прочее ошибочно
|
| 10 |
100A |
Запись: not AA LED
Чтение: Детектор напряжения в линии (0 - присутствует) (в спортстере может отсутствовать)
(на VI - питание) |
| 20 |
200A |
Запись: not ARQ LED
Чтение: Что-то с MI/MIC
(на VI - питание) |
| 40 |
400A |
Запись: not HS LED
Чтение: Клавиша Voice/DATA |
| 80 |
800A |
Запись: not sync-mode LED
Чтение: Сигнал CTS с ноги 1 i186 |
|
Далее порты обмена с DSP:
18h:
чтение
Bit 0 ( 1): 0 - DSP готово
запись вместе с 1Ah
чтение
1Ch
Bit 0 ( 1): DSP хочет получить команду
Bit 1 ( 2): DSP хочет возвратить статус
Bit 2 ( 4): DSP хочет передать блок данных
1E
Чтение:
Bit 0 ( 1): Должен быть установлен для начала загрузки
Bit 1 ( 2): Должен быть установлен для начала/продолжения загрузки
Bit 2 ( 4): Сбрасывается DSP после исполнения команды
Запись кодов:
4 - начало загрузки
1 - перед загрузкой вторичного слова (побайтно в 48,4A,4C,4E)
2 - после загрузки вторичного слова
Запись:
40h-4Eh - Восьмибайтное слово для загрузки оверлея DSP
50h-5Eh - Второе восьмибайтовое слово для загрузки
Запись
58-5E - Регистр команд DSP:
58 - команда, остальное данные
Чтение
58-5A - Регистр ответов DSP:
58 - код ответа, остальное данные
Чтение
60-62 - регистр чтения блока информации от DSP
Порты откликаются до 80h, далее - пусто (аппаратно не подключены)
NVRAM
В ОЗУ Курьера образ nvram может находится по разным адресам. Посему, целесообразнее использовать раскладку, используемую внутри микросхемы nvram:
| Off |
Длина |
Hазначение |
| 000 |
19 dup(?) |
Запакованные параметры |
| 013 |
51 dup(?) |
Сохранение S-регистров |
| 046 |
10*8 dup(?) |
Пароли. 10 штук по 8 символов |
| 096 |
8 dup(?) |
Пароль от AT%V=PWx |
| 09E |
8 dup(?) |
Пароль от AT%L=PWx |
| 0A6 |
4 dup(?) |
Дата прошивки |
| 0AE |
9 dup(?) |
Первая часть серийного номера модема |
| 0B7 |
2 dup(?) |
Сохранение контрольной сумма прошивки |
| 0B9 |
7*3dup(?) |
7 регистров конфигурации (ATI14) |
| 0CE |
8 dup(?) |
Пароль для удаленного просмотра параметров |
| 0D6 |
8 dup(?) |
Пароль для удаленного конфигурирования модема |
| 0DE |
31 dup(?) |
Записанная команда модема |
| 0FD |
10*24 dup(?) |
Область телефонов 10 штук * 24 символа |
| 1ED |
8 dup(?) |
Пароль введенный по AT%S= |
| 1F5 |
3 dup(?) |
Флажки паролей (по 4 бита на пароль) |
| 1FB |
4 dup(?) |
Вторая часть серийного номера |
| 1FF |
1 dup(?) |
Контрольная сумма nvram |
|
Вероятно, целесообразно дать некоторые пояснения к назначению отдельных параметров:
Запакованные параметры
Сюда сохраняются все нерегистровые параметры (типа atx?, atm? и т.д). При этом из параметра выделяются только значащие биты и записывается непереывной последовательностью бит.
Сохранение S-регистров
Записываются сохраняемые S-регистры. S-регистры не подлежащие сохранению пропускаются.
Дата прошивки
При запуске теста (по кнопке) записывается дата супервизора.
Сохранение контрольной суммы прошивки
Если при запуске теста дата прошивки совпадает с сохраненной датой прошивки, а контрольная сумма не совпадает, выдается сообщение об ошибке.
Регистры конфигурации
Регистры, показывающие разрешенные функциональные возможности модема. Для сохранения каждого байта используются три байта в nvram, связанные определенной функцией. Если значения различаются,
параметр считается недостоверным (и пропускается при показе по ATI14). Используется следующая функция:
Byte1= (code - 5) ROL 2
Byte2= (code + 15) ROR 1
Byte3= (code XOR 1Dh)
Флажки паролей
Определяют параметры каждого парольного входа по-отдельности. Hа каждый пароль приходится по 4 бита:
1 - Account Enable
2 - Dialback
3 - New #
4 - Hе используется
Подробнее о них можно прочитать в описании команды AT%A
Приложение A
Для особо ленивых привожу краткую информация на мелкие микросхемы, применяемые в модеме.
NVRAM
Используются микросхемы серии 93c66 (256*16).

|______________| | | __________________
CLK______/| \|_______________|/| \_________
| |
|Tdis| Tdih | |
____ | __________ | _________________ _____________ _________________
/\ \ / valid \ /\ /\ /\ /\ /\ /\ \ / valid \ /\ /\ /\ /\ /\ /\
DI/_/ \__________/ \/_\/_\/_\/_\/_\/_/ \_____________/ \/_\/_\/_\/_\/_\/_
| |
|Tcss | | Tcsl|
|__________________________________________________________| |_
CS___/ | | |\___/
| | |
| Tpd | | Tpd | |Tcz|
__________________ | _____________________________ | _______________ |
\ / valid \ / valid \|_
DO________________/ \_____________________________/ \_______________/
Hабор команд:
Команда Старт Код операции Адрес Входные/выходные данные
бит OP1 OP2
Чтение 1 1 0 A7 A6 A5....A1 A0 D15-D0
Запись 1 0 1 A7 A6 A5....A1 A0 D15-D0 (RDY/^BSY)
Разр. записи 1 0 0 1 1 X.....X X High-Z
Запр. записи 1 0 0 0 0 X.....X X High-Z
Режим чтения:
DI 1 1 0 A7 A6 A5....A1 A0
DO D15 D14 D13 D12 ... D2 D1 D0
Режим записи:
DI 1 0 1 A7 A6 A5....A1 A0 D15 D14 D13 D12 ... D2 D1 D0
DO BSY RDY
Режим Разрешение/запрещение записи:
DI 1 0 0 1/0 1/0 X X X X
Буфера RS323
1488, 75188 - преобразователь TTL в RS232
VDD=+12, VEE=-12.
 |
| A |
B |
Y |
| 0 |
0 |
VDD |
| 0 |
1 |
VDD |
| 1 |
0 |
VDD |
| 1 |
1 |
VEE |
|
1489, 75189 - преобразователь RS232 в TTL
ОЗУ - 62256 (32 КБ)
Приложение Б
Таблица соответствия принимаемого DTMF-сигнала и формируемого кода.
| Частота низкой группы, Гц |
Частота высокой группы, Гц |
Цифра |
| 697 |
1209 |
1 |
| 697 |
1336 |
2 |
| 697 |
1477 |
3 |
| 770 |
1209 |
4 |
| 770 |
1336 |
5 |
| 770 |
1477 |
6 |
| 852 |
1209 |
7 |
| 852 |
1336 |
8 |
| 852 |
1447 |
9 |
| 941 |
1209 |
* |
| 941 |
1336 |
0 |
| 941 |
1477 |
# |
| 697 |
1633 |
A |
| 770 |
1633 |
B |
| 852 |
1633 |
C |
| 941 |
1633 |
D |
|
|