I. О чем это ?

Эта статья попала мне в руки где-то в конце 1999 года, когда Борис Литвак опубликовал ее в конференции сети FIDO RU.USR. Автор пожелал остаться неизвестным и мы так и не знаем, кто написал это подробное описание модема Courier, до сих пор доступное только узкому кругу специалистов и апгрейдеров. В любом случае, выражаем автору глубокую признательность за составление и обнародование столь серьезного труда, тем более, что апгрейдеры этого никогда бы не сделали, так как для них эта информация составляет коммерческий интерес.

Данный документ не является фирменным описанием модема Courier, и составлен на базе широкого опыта отечественных разработчиков прошивок, апгрейдеров и просто пользователями модемов USR. Автор не несет никакой ответственности за последствия использования приведенной здесь информации и не гарантирует ее точность. Местами будут появляться знаки "?" или пропуски. Это означает, что точная информация отсутствует или это (устройство, регистр, бит и т.п.) не используется в работе модема.

В дальшейшем под словом Курьер или USR будет подразумеваться Courier V.Everything фирмы U.S.Robotics. Модемы Sportster, выпущенные в 1994 и 1995 годах имеют абсолютно аналогичную схемотехнику цифровой и аналоговой частей. Незначительные отличия Sportster 20.16Mhz и Courier V.Everything:

  1. Вместо Flash стоит однократная ПЗУ.
  2. Отсутствуют два DIP-переключателя. На VI-моделях отсутствуют совсем
  3. Уменьшено количество индикаторов на передней панели модема
  4. Плохо расчитанный блок питания Sporster'а иногда приводит к перегреву.

Прочие отличия будут описаны в процессе изложения материала. Модемы Sportster 92Mhz, выпускаемые после 1995 года имеют совершенно иную архитектуру и в данном документе не рассматриваются. Изменения, характерные для Sportster VI (голосовые модели) будут помечены значком VI. В материале активно используются ссылки на интернет-сайты производителей и другие источники.

Ссылки по теме:

Подразумевается, что читатель представляет себе, что такое электричество и закон Ома. :-)

С уважением, Андрей Ваваев.

II. Структурная схема модема

Структурная схема модема

Описание компонентов:

  1. I80186EB20/EB25 - Центральный процессор модема. Имеет систему команд 80186 (поскольку им и является). В зависимости от модели может работать на частоте 20.16 Mhz или 25.8 Mhz. В отличие от обычных процессоров серии x86 имеет 2 встроенных последовательных порта, 3 таймера и несколько менее существенных узлов. Подробнее об этом процессоре можно почитать на http://www.intel.com/. Далее он будет называться i186.

  2. TMS320C51 - Сигнальный процессор модема. Работает на частоте 40 Mhz вне зависимости от модели. Подробнее об этом процессоре можно почитать на http://www.ti.com/ (или у них-же на ftp). Архитектура может показаться непривычной после Intel, но она довольно стройна. Hасколько я понял, используется совершенно стандартный процессор без каких-либо доработок (кроме изменения названия на корпусе). Далее он будет называться TMS или DSP.

  3. NEC - это самая большая "блямба" на модеме. Мне не удалось найти ее фирменное описание и далее я постараюсь описать ее работу на основе собственного опыта. Представляет собой набор битовых регистров, контроллер синхронного интерфейса и watch-dog таймер. Очень старая, пришла еще со спортстеров на 9600 в практически неизменном виде. Далее эта микросхема будет называть NEC.

  4. AIC - ЦАП/АЦП TLC320AC01. Сайт с документацией - http://www.ti.com/ С одной стороны подключен к последовательному каналу от TMS320C51, а с другой выходит на аналоговые цепи модема. Далее будет использваться название AIC.

  5. ОЗУ DSP - обычное ОЗУ (64 кб), но быстрое. Используется для хранения программ и данных сигнального процессора. Состоит из двух микросхем для обеспечения 16 разрядов данных. В дальнейшем будет называться ОЗУ DSP (не путать с внутренним ОЗУ DSP - это разные вещи).

  6. ОЗУ - Еще более обычное ОЗУ. Отличается от DSP-шного только меньшей скоростью работы. Обьем - 64 кб. Занимает адресное пространство 0000:0000-0000:FF00. Адреса 0000:FF00-0000:FFFF перекрываются внутренними регистрами i186 и не используются.

  7. Flash ROM - Перепрограммируемая память на 512 килобайт. В первых моделях использовался 28F400BXT, в более новых начали использоваться AMD29F400 и 28F400BVT. Старший блок имеет аппаратную защиту от перезаписи. В спортстерах и дешевых апгрейдах в курьер может быть заменена обычной ПЗУ-шкой. Для курьеров занимает адресное пространство 8000:0000-F000:FFFF, для спортстеров вполовину меньше - C000:0000-F000:FFFF. Далее постоянная память будет именоваться ROM.

  8. nvram - энергонезависимая память типа 93С66. Обьем - 512 байт. Конкретная фирма-производитель не важна. Документацию можно взять с любой, например - http://www.issi.com/.

  9. Vpp - устройство подачи напряжения программировани на флеш. Может различаться в зависимости от типа флеша. В самом примитивном случае может состоять из пары транзисторов. Его схемотехническое решение не существенно.

  10. Усилит. - усилитель. Во внутренней модели может иметь 3 градации уровня громкости. Во внешней эти цепи не используются, громкость регулируется ручкой. В обоих моделях есть цепь отключения динамика. Подключен после диф-системы AIC, но до трансформатора.

  11. Лампочки и переключатели. Тут ничего больше и не скажешь...

  12. Буфера RS232. Описаны в конце документа. Для внутренней модели не используются, сигналы сразу идут на аналог 16C550

Из схемы можно заметить, что модем состоит из двух процессоров с независимыми адресными пространствами и шинами данных. Межпроцессорный интерфейс осуществляется на микросхеме NEC с помощью портов, отбраженных в одном и другом пространстве. При этом основным (управляющим) процессором является i186, на которого возложены функции обработки Hayes-команд, поддержка протоколов исправления ошибок, сжатия, управления реле и светодиодами, загрузка подчиненного процессора DSP (у которого нет собственной прошивки, а есть только маленький загрузчик) и последующего взаимодействия с ним. Вспомогательный (сигнальный) процессор TMS осуществляет генерацию сигналов, анализ входного сигнала, обеспечение протоколов связи на физическом уровне (включая эхогашение, треллис-кодирование и т.п.). С помощью скоростного последовательного канала к нему подключается AIC, осуществляющий преобразование цифрового сигнала в аналоговый и обратно. Рабочая частота AIC 7200Гц. В режиме войсового спортстера со сжатием GSM частота устанавливается на 8000Гц.

Для обеспечения мгновенного эха при наборе Hayes-команд NEC имеет специальную цепь замыкания входного сигнала на выход. В режиме ожидания и ввода команды она включена (если эхо не выключено).

После завершения ввода команды эхо отключается и подключается передатчик последовательного порта i186. Само распознавание производится чисто программным образом в i186 путем анализа длительностей сигналов. В случае, если не удается распознать скорость, используется скорость 115К. При анализе символы теряются и не попадают в командный буфер модема.

В зависимости от скорости i186 применяются один или два опорных генератора.

Переключатели используются совершенно обычные, без цепей подавления дребезгом и т.п., поскольку опрашиваются редко (некоторые только при включении питания). Hагрузочная способность NEC такова, что позволяет подключать светодиоды непосредственно к выходам, без промежуточных усилителей.

III. Как все это запускается

После включения или сброса, i186 начинает извлекать инструкции начиная с адреса FFFF:0. Там находится инструкция перехода на первичный загрузчик boot-блока. Этот загрузчик проверяет CRC ROM и тестирует определенное положение переключателей. Если CRC не совпала или переключатели выставлены в режим аварийной загрузке - запускается загрузчик. Иначе управление передается основной прошивке. Более подробно работа загручика будет рассмотрена в разделе V.

Прошивка переинициализирует регистры i186, тестирует ОЗУ, инициализирует его, настраивает вектора прерываний, считывает образ nvram. С помощью встроенного загрузчика TMS в ОЗУ DSP загружается основной сегмент кода DSP (он храниться в ROM). Hа http://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. Как работает загрузчик

При старте курьера, выполняется следующая последовательность действий:

  1. Сверяется контрольная сумма сегмента C000:0000-F000:7FFE с ячейкой F000:7FFE Если не совпало - на анализ загрузчика
  2. Проверяются переключатели 1,5,7(10) и 8. Если все кроме 8 включены - анализ загрузчика
  3. Если все в норме, переход на F7FF:5 (оттуда переход на начало прошивки)

a) Анализ загрузчика

  1. Ожидается ввод строчки начинающейся с 'AT' и заканчивающейся кодом 0Dh или 08h.
  2. Полученное сравнивается с кодовой строчкой <2> ,'E', <7> ,'H','m', 'X', <9> , <8> (для модели на 25Mhz - <2> ,'E', <7> ,'H','m','Y', <9> , <8> ) Если совпало - вызываем загрузчик для SDL
  3. Если первый символ '!' - производится переход на F7FF:5.
  4. В новых версиях сравнивается с сигнатурой Z-модема ('~X!' или '~x!'). Если совпало - вызывается загрузчик X-модем.
  5. Если не совпало - выводится 'MODEM FIRMWARE [...]', после чего переходим на пункт 1.

b) Алгоритм работы загрузчика SDL (взгляд из модема)

  1. Определим тип флеша, если не определился переход на F7FF:5
  2. Выводим код флеша (E3/E5/3F/E4)
  3. Ждем 800 внутренних тиков символа 'Q' на скорости 19200, если он не пришел или пришел не он - переход на раздел a) пункт 2.
  4. Задержка в 40 внутренних тиков (0.2 сек)
  5. Выводим символ 'Q' на скорости 9600
  6. Задержка на 10 внутренних тиков (0.05 сек)
  7. Выводим на начальной скорости (здесь и далее) код страны, тип аппаратуры модема и два <0> .
  8. Ждем 800 (4 сек) внутренних тиков байт кода загрузки флеша.
    0 - прекратить и перейти на раздел
    a) пункт 2
    2 - грузить с сегмента C000 прочее (обычно 4) - грузить с сегмента 8000
  9. Ждем 800 внутрених тиков старший и младший байты полной контрольной суммы (той, что хранится в F000:7FFE)
  10. Посылаем код 15h
  11. Запускаем стирание флеша. Если не стерся, выводим код 1Bh и переходим на адрес F7FF:5. В некоторых моделях при ошибках стирания могут выводиться коды 1D или 0.
  12. Выводим код 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 - запись завершена (это не ошибка)
        Теоретически, могут выдаваться и другие значения, зависящие от флеша
  13. Если процесс программирования прошел успешно (выдан код 17), переданная в начале контрольная сумма сверяется с рассчитанной. При несовпадении выдается код 14h, при совпадении 19h. Во флеш всегда вписывается расчитанная при программировании контрольная сумма (За что программистов USR надо было-бы немножко убить).
  14. Происходит переход по адресу 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 служит для обработки следующих действий:

  1. Передача запросов к DSP в DSP
  2. Получание и обработка событий DSP
  3. Получение блока состояния от DSP
  4. Получение/передача данных

Для передачи запросов к 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

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).

SOIC

          |______________| |               | __________________
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.

1488
A B Y
0 0 VDD
0 1 VDD
1 0 VDD
1 1 VEE

1489, 75189 - преобразователь RS232 в TTL

1489

ОЗУ - 62256 (32 КБ)

62256

Приложение Б

Таблица соответствия принимаемого 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

Хостинг от uCoz