Говорит и показывает Palm Константин Клягин Xakep, номер #069, стр. 069-122-6 Удаляем запись из базы if(lstPos < LstGetNumberOfItems(lstP)) DmRemoveRecord(dbh, lstPos); Как закаля... ковырялся процессор Чтобы начать близкий к железу кодинг, для начала раздобудь доку по нужному железу. Точная маркировка нашего процессора - MC68VZ328. Идем на сайт со звучным и дающим весьма точную характеристику предстоящей деятельности названием ebus.motorola.com. Теперь вводим модель в поле keyword. Качаем PDF. Интересующая нас часть называется UART. Раздел "Programmer's Memory Map" содержит табличку с адресами всех устройств. Оттуда мы получаем адрес 0xFFFFF900 и в исходнике заводим на него прямую ссылку. По смещениям регистров для задания скорости (baud rate), передатчика, приемника и прочих (все указаны в том же разделе доки) мы будем изменять нужные нам параметры. В начале каждого сеанса работы с портом метод irmotorola::openserial() открывает порт, устанавливает нужные параметры и сохраняет прежние значения регистров порта с тем, чтобы при закрытии они могли быть восстановлены. Метод closeserial() делает в точности обратное. Для записи и воспроизведения ИК-сигнала мы будем использовать регистры UART и GPIO Port E, так как документация утверждает, что именно он связан с UART. Алгоритм такой. Сначала в порт пишется значение 0x0855. 08 - игнорируем сигнал CTS1 для немедленной отсылки сигнала. Все это мы узнали из разделов 2.9 и 10.4.6.3 документации. Биты с 0 по 7 определяют сигнал для отправки. В бинарном виде это будет 1010101 - в точности как пакеты пульта д/у. Узнать этот паттерн нам помогла дока по pulse shaping от индусов. Цикл "while((*uartbasetx & 0x8000) == 0)" ожидает установки бита FIFO-empty в 1. Как только бит установится, считаем, что символ ушел. Пока бит не установлен, выходит нужный нам тайм аут - задержка между частями ИК-сигнала. Проверка "*PEDATA & 0x10" (четвертый бит) на Port E позволяет узнать, получил ли ИК-порт первый сигнал. Получил - начинаем запись. До победного конца в том же цикле продолжаем писать байты и проверять нужный бит. Сигнал складываем в буфер в виде последовательности нулей и единиц. Для выдерживания пауз между составными частями сигнала используется UART, которому для посылки сигнала требуется время. Которое, в свою очередь, зависит от выставленного baud rate. При отсутствии в Palm OS более-менее точного таймера иногда приходится и не так извращаться. Немного проще выглядит воспроизведение, которым занимается метод irmotorola::play(). Перед посылкой каждой из частей сигнала записываем 0x55 в UART, регистр TX. Затем смотрим, что у нас в буфере. Если сигнал ненулевой, то через регистр SEL разрешаем вывод на ИК-порт. Если ноль - запрещаем. В этом случае сигнал не пойдет наружу, но нужная пауза все же будет выдержана. Пустой цикл while(), что крутится каждый раз с проверкой бита 15 регистра TX (готовность), - тот самый тайм аут, который нужно выдержать. Простейшее западло для палм-юзера Palm OS - довольно нежная операционка. Западло другу сделать очень просто. Достаточно бимнуть ему программку, содержащую одну только функцию PilotMain(). В нее можно вставить код, который будет валить систему. Скажем, такой: |