==== Разъем на пальмах с точки зрения разработчика ==== ==== Введение ==== Большинство существующих моделей пальм содержат разъем для присоединения внешних устройств. Настоящая статья рассказывает об возможных способах программного использования интерфейсов, имеющихся в этом разъеме. Статья описывает два вида разъемов - 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 и последовательного порта. Это конгломерат решений, удачных и неудачных, принятых в разное время. При программировании родной периферии учитывайте, что она использует не просто порт, но и дополнительные линии. При программировании последовательных интерфейсов учитывайте ограниченность последовательного порта.