OpenWiki

Palm Connector

Edit this page (last edited February 7, 2005)
Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help

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

  • Разъем на пальмах с точки зрения разработчика
  • Введение
  • Определение устройства
  • Линия Hotsync
  • Последовательный порт
  • USB
  • Заключение
  • Введение

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

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

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

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

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

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

    Для определения категории используется полудокументированная функция 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 по практически любой периферии есть вопрос "Почему при присоединении устройства запускается хотсинк" и ответ "Включите драйвер".

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

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

    Порт управляется через 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 и последовательного порта. Это конгломерат решений, удачных и неудачных, принятых в разное время. При программировании родной периферии учитывайте, что она использует не просто порт, но и дополнительные линии. При программировании последовательных интерфейсов учитывайте ограниченность последовательного порта.

    Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
    Edit this page | View other revisions
    Print this page | View XML
    Find page by browsing, searching or an index
    Edited February 7, 2005 (diff)
    Valid XHTML 1.0!Valid CSS!