User Tools

Site Tools


palmconnector

Разъем на пальмах с точки зрения разработчика

Введение

Большинство существующих моделей пальм содержат разъем для присоединения внешних устройств. Настоящая статья рассказывает об возможных способах программного использования интерфейсов, имеющихся в этом разъеме.

Статья описывает два вида разъемов - Palm Universal Connector (PUC) и Clie Connector для моделей T/NR/NX/SL/SJ как самые распространенные.

Определение устройства

В разъеме имеются линии, определяющие факт присоединения и тип присоединенного устройства.

В PUC устройство закорачивает линию DETECT на землю (SG), что позволяет определить наличие устройства. По обнаружении замыкания, PalmOS рассылает нотификацию sysExternalConnectorAttachEvent. По размыканию, соответственно, отсылается нотификация sysExternalConnectorDetachEvent.

Тип устройства задается сопротивлением между землей (SG) и линией ID. Измеряя сопротивление, пальма может определить категорию устройства. Заданы следующие категории:

  • USB кредл
  • RS-232 кредл
  • Тестовый кредл (что-то недоступное простым разработчикам)
  • USB периферия (ни разу не было задействовано)
  • RS-232 периферия
  • Модем
  • Ничего не присоединено

Для определения категории используется полудокументированная функция UInt16 HwrDockStatus(void). Функция возвращает набор флагов:

#define        hwrDockStatusUndocked           0x0000  // nothing is attached
#define        hwrDockStatusModemAttached      0x0001  // some type of modem is attached
#define        hwrDockStatusDockAttached       0x0002  // serial dock or keyboard is attached
#define        hwrDockStatusUsingExternalPower        0x0004  // using some type of external power source
#define        hwrDockStatusCharging           0x0008  // internal power cells are recharging
#define        hwrDockStatusUSB1               0x0010
#define        hwrDockStatusUSB2               0x0020

Нотификации тоже присылают список флагов.

Сониевский Clie Connector тоже обладает похожей функциональностью. Линия DETECT отсутствует, а сопротивление вешается на линию CNT.

Как обычно, практика расходится с теорией. Некоторые устройства, например клавиатуры Belkin G700 для PUC, содержит неполный разъем, упомянутый резистор отсутствует, поэтому нотификация о подключении не приходит. В то же время в G700 для clie разъем распаян правильно.

Следующий нюанс - время прихода нотификации при подсоединении периферии к спящему устройству. На устройствах с PUC нотификация приходит тот час же, а на соньках нотификация будет разослана только после подключения. Похоже, что линии, отвечающие за определение в устройствах от пальмвана пробуждают спящую машинку, а на соньках - нет, и статус порта определяется просто периодически считывается, рассылая по необходимости нотификацию.

Кое-какие страшилки о определении устройств можно почитать здесь: http://forum.sources.ru/index.php?showtopic=76879

Линия Hotsync

Название этой линии вводит в заблуждение. На самом деле, активация этой линии ведет к немедленному пробуждению устройства. На периферии с PUC линия подключается к выводу внешнего питания от пальмы (VOUT), а на соньках - к земле. Замыкающая кнопка замыкает линию на землю-питание и активирует ее. В самой пальме эта линия подключается к ноге прерывания процессора, которая и вызывает вызов процедуры прерывания. Обратите внимание, что это прерывание принципиально не маскируется при засыпании, как и прерывание от аппаратных кнопок.

Обработчик прерывания поступает просто - посылает в очередь сообщений символ vchrHardCradle (или vchrHardCradle2, если устройство принадлежит к категории модем). Если эвент не был перехвачен раньше, то SysHandleEvent обрабатывает его, переключаясь на приложение с creator id = PrefGetPreference(prefHardCradleCharAppCreator), и передает ему команду sysAppLaunchCmdSyncRequestLocal (соответственно prefHardCradle2CharAppCreator и sysAppLaunchCmdSyncRequestRemote для vchrHardCradle2).

Как выяснилось, разработчики периферии любят эту линию за ее простоту и гарантированную работу еще на допотопных разъемах . Большинство драйверов клавиатур определяют наличие устройства именно по этой линии, перехватывая из входной очереди символ vchrHardCradle. Посмотрите - в FAQ по практически любой периферии есть вопрос “Почему при присоединении устройства запускается хотсинк” и ответ “Включите драйвер”.

Последовательный порт

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

  • RxD - входящие данные
  • TxD - исходящие данные
  • RTS - Поддержка аппаратного flow control
  • CTS - Поддержка аппаратного flow control
  • DTR - исходяшее подтверждение активности порта

Порт управляется через Serial Manager. При открытии порта (SrmOpen и SrmExtOpen)автоматически выставляется сигнал DTR и держится до закрытия (SrmClose). Указание hardware flow control вызывает автоматическое управление линиями RTS/CTS в процессе передачи данных. Вот практически и все, что можно сделать.

функция SrmControl позволяет выставить и получить некоторые дополнительные параметры порта. Например, число стоповых бит, четность, вид flow control и скорость. Найденные флаги srmCtlSetDTRAsserted и srmCtlGetDTRAsserted не должны радовать - “This is not supported by all hardware.”. По слухам на Tungsten T software flow control вообе не работает.

Отсутствует линия DSR, так что нельзя узнать об открытии порта с другой стороны.

Функция SrmGetStatus позволяет узнать статус RTS, CTS, наличие сигнала break и (ха-ха) DSR.

Резюме: при написании программ, работающих напрямую с последовательным портом, рекомендуется держать в голове все ограничения пальмовой реализации.

USB

Коннекторы поддерживают slave-USB. Интерфейс к USB-порту недокументирован и доступен только системным программам от производителей железа и продуктам компании SofTick. USB hotsync работает через драйвер виртуального порта, обращающегося через USB.

Заключение

Разъем у устройств на Palm OS - это не просто объединение USB и последовательного порта. Это конгломерат решений, удачных и неудачных, принятых в разное время. При программировании родной периферии учитывайте, что она использует не просто порт, но и дополнительные линии. При программировании последовательных интерфейсов учитывайте ограниченность последовательного порта.

palmconnector.txt · Last modified: 2005/02/07 17:35 by 127.0.0.1