English version

Домой   Новости   Радио   Карточки   Кодграберы   Мобилки   Телефония   АТС   Пейджинг   Транки   Жучки   Форум


Google

Описание чипа T192

А здесь лежит последняя версия этого документа.

Общее описание

Сами чипы Т192 вроде как производятся в Зеленограде и имеют очень широкое хождение по всей России. Соответственно, они являются нашей местной особенностью, и в буржуинии скорее всего про них и не слыхивали. По внешнему виду довольно трудно отличить эту карту от других - все они примерно одинаковы, и для того, чтобы понять, что за тип карты у вас имеет хождение и является ли он Т192, обязательно нужно хотя бы прочитать ее содержимое. Расположение контактов на карте стандартное (такое же, как идля большинств шестиконтактных карт):

             ________________
<===        | Vcc  \  / GND  |
this side   |-------> .------|
в картофон  | RST  |  |  nc  |
<===        |-------><-------|
            | CLK  /  \  I/O |
            ----------------
         
VCC  - 5V Питание
RST  - (входной) управляющий сигнал карты
CLK  - (входной) тактовые импульсы
I/O -  (двунаправленный выход с открытым коллектором)
       побитовый ввод/вывод информации с карты
nc   - не используется
GND  - земля

Все сигналы соответствуют уровням TTL-логики. Для чтения карты можно использовать широко распространенный "стандартный" софт, который работает со всеми таксофонными картами, а вот для модификации содержимого карты (карта модифицируется только в сторону уменьшения счетчиков ) можно либо юзать прогу моего производства, либо писать свою (при этом нужно учитывать, что вывод I/O является двунаправленным). На текущий момент программу можно взять по адресу http://jerry.al.ru/192xbr.zip, или ее другой вариант с обратным порядком бит http://jerry.al.ru/192x.zip.

Чтение с карты

Тут все довольно обычно и просто. Биты выводятся по заднему фронту CLK (кроме скрытого счетчика, который выводится по переднему). Байты можно формировать как "MSB first" - старшим битом вперед (наиболее распространенный метод, идущий еще с ISO-шних карт. Ранее использовался этот, но по ходу дела выяснилось, что в Т192 байты кодируются наоборот, то бишь "LSB first" - младшим битом вперед. Поэтому возможны оба варианта, но по-правильному нужно придерживаться порядка LSB, (при этом не надо будет лишний раз извращаться с перекодировкой счетчиков и серийников, но прочитанный таким образом дамп уже будет выглядеть по-другому).

Сброс карты и чтение

RST  _-----________________ ___    ______________________ ___
CLK  __---___---__---__---_ xxx    -__---_____---__---__- xxx
(#1)
I/O  xx---------___________ xxx    ___________----------- ---
биты ХXXXXX<000><001><002>< ...    ><110><111>< ...
(номер )                 (xx  - любое состояние)

Сброс - стандартная процедура поднятия и снятия CLK при поднятом RST. После того, как будет снят RST, на выводе I/O карты будет доступен первый бит данных. Далее биты данных выводятся по заднему фронту CLK.

Emulator hint: Начальный сброс карты занимает что-то около единиц ms, поэтому эмуль иногда может не успевать запуститься.

После того, как будет выведен бит #110, на следующий передний фронт CLK начинается зона "скрытых счетчиков", занимающая 6 байт. То бишь, таким образом, бит #111 получается укороченным на "полклока". (хотя это не так принципиально, возможно, что этого бита так нет совсем). При, скажем так, "выводе скрытых счетчиков" вывод IO переводится в режим, при котором он является входом, и вследствие наличия обязательного подтягивающего внешнего резистора на +5в (вывод является выводом к ОК), на нем стоит единица.

Что получается после "скрытых счетчиков"

RST  = 0
CLK  --___--___--___--___--_ xxx -__---_____---__---__ ...
I/O  ----------__xxxxxxxxxx  xxx xxxxxxxxxxx--------- ...
(#2)
биты --<112><113>< ... ><142><143> ...

Такая же фигня, только наоборот. После вывод 48го (по порядку; 47ого по номеру) бит "скрытых счетчиков" ("СС"), по переднему фронту CLK выводится сначала "1", затем по заднему - следующий "нормальный" бит данных, 112-ый, если считать без "СС". И так далее. За 143-им битом (144+48=192 всего) карта зацикливается и переходит на 3-ий байт "СС". Далее диаграмма #2 повторяется по кругу, то есть непрерывно по циклу выводятся последние 8 байт карты.

Интеpесно, что каpта не моментально устанавливает значение на выводе I/O. Иногда пpоходит несколько десятых мкс между фpонтом CLK и установлением значения.

Внутреннее содержание

Возьмем, для примера, какую-нибудь карточку:

битовое поле|LSB|MSB

| 10000101 | A1 85 | Идентификатор типа карты, который для для Т192 всегда
| 00110001 | 8C 31 | равен A1 8C 90 (85 31 09 MSB). Для других типов карт
| 00001001 | 90 09 | значения будут другими.

| 01011010 | 5A 5A | Код местности.

Коды местности зависят скорее от компании-владельца таксофонной/телефонной сети, нежели от конкретно местности. Например, какой-нибудь местный "Мухосрансктелеком" может использовать один и тот же код как в Мухосранске, так и в близлежащих городах.

Коды по различным городам:
99 (99) - Петрозаводск
8F (F1) - Якутск (Сахателеком)
8D (B1) - ЗАО "Алтайские таксофоны"
8B (D1) - Тольятти
84 (21) - Брянск
5A (5А) - Артемовский (Уралтелеком)
58 (1A) - Саранск
39 (9С) - Нижний Новгород
35 (AС) - Екатеринбург (старые-старые)
31 (8С) - Екатеринбург
2F (F4) - Краснодарский край (Кубаньэлектросвязь)
27 (E4) - Тула
25 (А4) - Киров, Кирово-чепецк и тд
1D (B8) - Ростов-на-Дону
19 (98) - Калуг
04 (20) - Самара

| 11100000 | 07 E0 |
| 00000000 | 00 00 | ХЗ. Везде одинаково.
| 10100000 | 01 A0 |

| 11100001 | 87 E1 | Что-то, определяющее партию карт

| 10111000 | 1D B8 | Серийный номер. Уникальный идентификатор карты, на
| 11001010 | 53 CA | каждой карте свой. Подробная информация о серийниках будет
| 00000000 | 00 00 | подготовлен  в ближайшее время.

| 00000000 | 00 00 | Серия карты

| 11100000 | 07 E0 | Предположительно - ключ авторизации- идентификации
| 00000000 | 00 00 |

| 11111111 | FF FF |
| 11111111 | FF FF |
| 11111111 | FF FF | Область "скрытых счетчиков"
| 11111111 | FF FF | По теории - в этот момент линия I/O является входом, и
| 11111111 | FF FF | пок не установлено, что с этого можно поиметь :)
| 11111111 | FF FF |

| 01110000 | 0E 70 |
| 00000000 | 00 00 | Первый счетчик единиц

| 00001000 | 01 08 |
| 00000000 | 00 00 | Второй счетчик единиц

Формат счетчика единиц

Hа карте расположено два счетчика - с текущим, и с предыдущим количеством единиц. Чтобы посчитать сколько в данный момент на карте единиц, нужно:

- Для MSB first:
  1. Изменить порядок бит в счетчике на обратный
   | 01110000 | 70 | | 00001110 | 0E |
   | 00000000 | 00 | =>  | 00000000 | 00 |
   
  2. Порядок байт тоже
   | 00001110 | 0E | | 00000000 | 00 |
   | 00000000 | 00 | =>  | 00001110 | 0E | => 0x000E
   
  3. Пpоделываем то же самое со втоpым счетчиком, получаем значение
    0х0010, выбиpаем меньшее из них, и вычитаем из полученного
    значения единицу. min( 0x000E, 0x0010 ) - 1 = 13 .
    Это и есть кол-во оставшихся единиц.
    
- Для LSB first - п.п. 2 и 3

Работа со счетчиками

Итак, как же осуществляется вычитание единиц... Процедура довольно сложна для понимания :). Сам алгоритм уменьшения юнитов на карте вкратце выглядит так: считываются оба счетчика единиц (при первом чтении карты), затем при необходимости уменьшения их количества, при следующем чтении карты над *меньшим* счетчиком производится операция уменьшения юнитов, в результате которой карта с мостоятельно записывает получившееся значение юнитов в *больший* счетчик, таким образом, что наименьшим из двух становится другой счетчик (тот, над которым производилась операция уменьшения, остается неизменным). При следующей итерации больший и меньший счетчики опять поменяются местами. Таким образом, скорее всего обеспечивается большая надежность работы и защищенность по сравнению с обычным вариантом. Иногд карта интересно себя ведет, и при уменьшении меньшего из двух счетчик , при этом еще увеличивает больший счетчик, в результате чего тот может вырасти до страшных значений :) При этом, различные варианты - как то проведение операции уменьшения над большим счетчиком или неуменьшение счетчиков, или запись большего числа, чем имеется в счетчике невозможны - карта сообщает об ошибке и не производит операции со счетчиками. (об ошибках - ниже).

В отличие от прочих типов карт, в Т192 нет операций write и writecarry.

Следующая последовательность

RST ___---_
CLK _----__

переводит карту в режим работы со счетчиками и вычитания единиц. Будем ее называть, например WR. WR, будучи включенной в последовательность чтения карты, прозрачна для остального процесса. Она может даваться на первый, третий, и пятнадцатый бит счетчика (на остальные просто игнорируются). Результат действия WR на первый бит - повтор счетчик , WR на третий бит начинает операцию уменьшения, на пятнадцатый - ее завершает. Если WR на карту выдан правильно, то после выдачи счетчика полностью, карта переходит к процедуре уменьшения единиц.

Как это все и остальное выглядит в целом:

* чтение
                 |<-- по циклу    <-        <---|
  [01]...[14] [H1][H2][H3][H4][H5][H6] [C1L][C1H][C2L][C2H] ^
  H* - байты "скрытого счетчик "
  C1L - младший байт первого счетчика
  ...
  C2H - старший байт второго счетчика
  
* уменьшение счетчика (меньший счетчик - первый)
            WR
            |
  [01]...[H6] [C1L][C1H] <процедур  уменьшения> [C2L][C2H]
  [H3][H4]...
  
* уменьшение счетчик  (меньший счетчик - второй)
                WR
                |
[01]..[H6] [C1L][C1H][C2L][C2H]<процедур
уменьшения>[H3][H4][H5][H6][C1L]..

Как видно, сама процедура уменьшения также абсолютно прозрачна для процесса чтения. Также, всегда после чтения последнего байта на карте ([C2H]) счетчик адреса не сбрасывается в 0, переходит на [H3], таким образом, по бесконечному циклу выводятся последние 8 байт карты. Реализация записи сделана довольно прямо и тупо. Если мы уменьшаем первый счетчик [C1L][C1H] - то новое значение запишется во второй, и непосредственно после процедуры уменьшения в [C2L][C2H] будет уже новое посчитанное значение, то есть получится так, (как будет видно ниже), что вместе с процедурой уменьшения, одно и то же значение счетчика выведется три раза подряд. Если уменьшаем второй, то аналогично - новое, уменьшенное значение окажется в первом счетчике.

Подробнее - как выдается импульс WR (например, меньший счетчик - первый)

RST  ..__________________________________---______
CLK  ..--___---___----____---____---___----___---- ...
I/O  ..-----------____xxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
bits ..H6.6>---- ...

Это называется "на третий бит". Как я уже сказал, WR абсолютно прозрачен для чтения. Поднятие RST на любой другой бит кроме третьего и первого, или если счетчик, над которым производится операция - не является меньшим - просто-напросто игнорируется картой. Важен такой момент (по крайней мере, наблюдавшийся у меня) - карта не будет уменьшать первый счетчик (если тот является меньшим) сразу после первого чтения "СМ" (то бишь на 160-тых бит х). Поэтому нужно прочитать дальше (примерно до 220-230 битов, до следующего цикла), и только затем производить уменьшение.

* процедура уменьшения в общем виде выглядит так:
               WR
               |        clk up
  [HL][HH] [CNL][CNH]  | [CNL][CNH]

[HL], [HH] - соответственно младший и старший байты числа единиц, которое необходимо вычесть из карты. В этот момент линия I/O карты является входом с ОК, и карта считывает число с внешнего устройства. Число единиц отдается карте уменьшенным на единицу и защелкивается картой по заднему фронту CLK.

Например, если нам надо вычесть две единицы:

RST  =0
CLK  ..__---_______---___---___ ..
I/O  ..xxxxxxxxxxxx-----xxx____ ..  bits
.C*H.6>
              |-> пошла процедура уменьшения -->

Бит как обычно, при переходе к скрытому счетчику - короче на полклока. Обратный переход [HH] - [CNL] аналогично приводит к удлинению бита CNL.0 на полклока.

Далее - [CNL][CNH] - соответственно младший и старший байты нового счетчика, который карта посчитала исходя из того числа единиц, которое мы ей скормили. На 15тый (всего их 16) бит счетчик выдается импульс WR для подтверждения операции записи. После этого карта переписывает новое значение счетчика куда-то себе в еепром, что занимает довольно много времени (20-40ms), по окончании операции карты перебрасывает линию I/O из нуля в единицу.

RST  ..______---______________________________
CLK  ..-____---____________________---___----_
I/O  ..xxxxxxxxx__  __----xxxxxxxx ..
bits ..>--------.....------???< ..

и еще раз выводится новый счетчик, видимо, уже из внутреннего еепром карты, и на этом процедур уменьшения и заканчивается.

Emulator hint: питание на карту производится только в момент работы с ней. Все остальное время питание с карты снято. Поэтому, если вы будете делать полный вариант - не обойтись без еепром для того, чтобы сохранять значения счетчиков.

Некорректные манипуляции со счетчиками (уменьшение большего счетчика, и тп) приводит к тому, что:
а) новый счетчик [CNL][CNH] совпадает со старым,
б) карт не делает задержки после подтверждающего импульса WR, сразу перебрасывает IO в "1".
Собственно, этим карта и сообщает, что произошла некая ошибка при обращении.

Emulator hint: Момент б), по крайней мере, у нас (есть сведения, что в каких-то картофонах такого нет), контролируется картофоном, и если нет задержки перед поднятием IO - картофон рвет связь.

После того, как закончилась процедура уменьшения, карта ведет себя стандартным образом, продолжая процесс чтения (см п.5, начало). Если записать один цикл целиком, то получится (меньший счетчик - первый, запись в него):

RST        WR                    WR
|         |                     |       |CLK up
[01]...[H6]  [C1L][C1H] [HL][HH] [CNL][CNH]  |  [CNL][CNH]
[C2L][C2H] [A1]...[FF] [ 08][ 00] [02][00] [ 05][ 00] [ 05][ 00]
[ 05][ 00]
[H3][H4]...
[FF][FF]

и при желании - тд, но картофон заканчивает запись на [C2H] и снимает питание. (нижний ряд - пример данных)

* * *

Ресурсы:
Прога для чтения карт - http://Jerry.al.ru/192xbr.zip
Более свежая версия этого текста (возможно :)) - http://Jerry.al.ru/t192.txt

========================
Copyright (C) 2001 by Jerry
=====================================
aka Ruslan V.Pisarev Jerry@mail.ru