tag:blogger.com,1999:blog-68273632805925329572024-02-08T08:24:51.703+02:00cat **/* | grep яAkshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-6827363280592532957.post-23963477900823888672009-03-22T15:22:00.002+02:002009-03-22T15:48:40.596+02:00CeBootLin - автозагрузка Linux/Android из WinCE на Loox 5XX (560/550)Написал "bootloader" для загрузки Linux/Android из WinCE автоматически при включении КПК. Это не настоящий bootloader, так как он не имеет ничего общего с загрузочными секторами, это просто WinCE приложение, которое начинает свою работу как можно раньше, чтобы загрузить Linux. Я сделал это именно так, а не иначе, из-за того, что не хотел убить свою КПК изменением бут секторов или иметь сложный механизм перепрошивок, обновлений и т.д. Автозагрузка из WinCE мне показалась досточно неплохим решением, имеющим разве что 3-4 секундный проиграш, если сравнивать с нормальным bootloader'ом, который еще помучиться реализовать надо. Также, такая рализация позволяет достаточно легко пропустить загрузку Linux и продолжить загрузку WM5 или WM6.. Код основан на утилите Haret (спасибо им), но я удалил ненужные мне части. Так как загрузчик использует аппаратные регистры для работы с клавиатурой и подсветкой (GPIO/CPLD) Fujitsu Siemens Loox N560/C550, то без изменений кода данный загрузчик не заработает на другой модели КПК...<br />Когда КПК включается и начинается загрузка WinCE, то ядро WinCE читает список приложений из HKEY_LOCAL_MACHINE\init и запускает их. Таким способом загружается CeBootLin. CeBootLin начинает мигать подсветкой клавиатуры и ждет одну секунду. В то время, пока клавиатура подмигивает, пользователь может нажать и отпустить какую-нибудь кнопку КПК - это сигнал для CeBootLin не продолжать загрузку Linux. Если никакие кнопки нажаты не были, то CeBootLin попытается открыть \CeBootLin\default.txt и будет использовать его в качестве скрипта Haret для загрузки Linux'а.<br /><br />Итого, чтобы поставить и настроить CeBootLin, надо проделать такие шаги:<br />1. <a href="http://downloads.akshaal.info/linux-n560-c550/CeBootLin-1.zip?attredirects=0">Скачать</a> CeBootLin.<ad2></ad2><br />2. Распаковать содержимое архива в корень основной памяти КПК. CeBootLin.exe должен быть доступен по пути \CeBootLin\CeBootLin.exe.<br />3. Поместить default.txt в каталог \CeBootLin. Файл default txt может например выглядеть так (для загрузки Andorid'а, например):<pre><br />set MTYPE 1454<br />set KERNEL "\CeBootLin\zImage"<br />set CMDLINE "root=179:3 mem=62M rootdelay=3 boot_delay=0 init=/init console=tty0 fbcon=rotate:0 androidboot.console=tty0 android.checkjni=1"<br />set RAMADDR 0xA0200000<br />bootlinux<br /></pre><br />4. Поместить zImage в каталог \CeBootLin\.<br /><a href="http://picasaweb.google.com/lh/photo/11wJSVlZKWbWAN3DhaJXSw?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibMt1fqjMm9uy6EMLPY4mwHyfLCOW185T9ijHbvRoLy8Tie-w2iGxszcs56nBWhFItjaSQrtHOE3QU12YELZ74f5LkatyqTaZAScb2U-scZwwV-38A8-2hp8p93up16fgbuqGxGlvoesYb/s400/CeBootEdit-1.png" /></a><br />5. Добавить в HKEY_LOCAL_MACHINE\init значение для Launch82 ="CeBootLin.exe" и Depend82 = 14 00.<br /><a href="http://picasaweb.google.com/lh/photo/00DSupXz9qiOXs43h5f5cA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9oV7TAoWKEU_GCw6OXVRJ1BK9hnUP69xa-WuhYHXtKmWV9GY2JCefQgcwiKWIu47XplDAwIOoXSaL9e-R2LxHO7QtgdDxeHcrp0hKaYMT-l436PcYqDbS8anEKXGXnqUqC2gLfGdgFq_/s400/CeBootEdit-3.png" /></a><br /><a href="http://picasaweb.google.com/lh/photo/0Rc2C1G2xiQKk5R0RmvaZg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsra4QotvdaOFNtqhXwTExBB-6IzxtGbNG8k_5wEhLbub444YRB3SwXYALep1YHUJIKiHW0QP0JQhOGh46UAY-QDl3DEREPLrKaVHqYCSZawYbzzMOF8364TZ8tK2e9Ng10CO4jEqgmYj/s400/CeBootEdit-4.png" /></a><br />6. Добавить в HKEY_LOCAL_MACHINE\Loader\SystemPath путь \CeBootLin\<br /><a href="http://picasaweb.google.com/lh/photo/hbLfmcNrlr6RpUPvLX_-5A?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecsc4aDa4i188OdbQynB4cMKKWsC0NBX7w_e2xk_xhGfYBNFqDdAd1U09x7brqDSKQxtPdW-v1-H6HrzWhSZJ6mmcdSaVaCdmDU-icOJBm9vu99JhQ6iDiNAkFEyaLR6c7qnXgrHTHq_K/s400/CeBootEdit-2.png" /></a><br />7. Подождать 5 минут или типа того (WinCE нужно время, прежде чем она сохранит обновление в registry).<br />8. Перезагрузить КПК<br /><br />Если возникнут какие-то проблемы, то первым делом стоит проверить, а грузит ли CeBootLin.exe вообще ядро... для этого достаточно просто его запустить.<br /><br />В дальнейшем при желании можно сделать нормальный cab с setup'ом внутри, который, например, будет ставить андройд..<br /><br /><a href="http://downloads.akshaal.info/linux-n560-c550/CeBootLin-1.tar.gz?attredirects=0">Здесь</a> находятся исходные коды CeBootLinux. CeBootLinux лицензирован под GNU GPL.<ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com3tag:blogger.com,1999:blog-6827363280592532957.post-43833809951685196992009-03-15T16:06:00.002+02:002009-03-15T16:09:43.071+02:00Фотографии Android и Linux на Fujitsu-Siemens Loox N560<a href="http://picasaweb.google.com/lh/photo/CUrNwUv_XICGqKQKeMx6rA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYTyWCI0G04tQ2C5IB7hMG8hB8xxTS9R4Wqzh2l5gUz1SxqrACiQnHKXEkK1oniuJe7DVPy7lb3atRpOTaJf2sVqxp3b_UTCk0K3FBi4L5SKtHutDlSUJTMy3Mg6i73mJ2Irg3Q3JQKwtN/s400/n560-1s.jpg" /></a><br />Сегодня судьба WM5 - загрузить Linux<br /><br /><a href="http://picasaweb.google.com/lh/photo/Wdt450DQpEcjKa1aIu3iUA?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKLGJW-BwuQJWgtqbHTt_mgBxtwqwcAkLNUIYXz5HE6l3SRO51kY0jTCwsBOUCS5wYb4MFXt-ioMlLUlMnbZFjCvV-zwPOweGrWUVtYGVhpyK_8kE4rbI7_SxbNdYI5AwAUaUBIYvhxJCU/s400/n560-2s.jpg" /></a><br />Haret.. все что нужно - нажать Run<br /><br /><a href="http://picasaweb.google.com/lh/photo/LQ7LXZhb1hXw6cwFARC4pg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoAhm1XwOODQ7HJVbEqCZKUpubw8hFU3wqcZR-J2TkJ6Y4CoLBwQv8yBJoLDMptwc_bb1siIfqb8v5Eal2KEIZLlhxpBmsIZY068X3KPBSL-o1GVEp_8HA2i9QGKnu-Pgugxw5yK-krTOz/s400/n560-3s.jpg" /></a><br />Android на Loox N560<br /><br /><a href="http://picasaweb.google.com/lh/photo/K2EytIW2FJWybumV11UTRg?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPExtvRBTFgBGjrq8_5nVNThzgVPma48WWa0yeTET00SrhbQahYqiHcnYNqr54nrmAVvVzJ7nHF5736a4Ca0xFut8SLpJgW8Gj1JjqEzXExv_viafVVvSyPGthxhvTye8zaVI1IeZ3nJz/s400/n560-4s.jpg" /></a><br /><a href="http://rus.akshaal.info/2009/03/emdebian-pda-c550n560.html">Установка Debian'а</a> на Loox N560<br /><br /><a href="http://picasaweb.google.com/lh/photo/ReuuEUcxhZ4y-Es7lRGneQ?authkey=Gv1sRgCMTt-MKs5cTh6wE&feat=embedwebsite"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDSxbzLLIncA482Nd5wTtRvYB0AyYMcHu3-V9Yayr5Ja8XtilIhk2u0mQ5lmEr-Cws_tXK-Qf_x2AJp5EKqvn4N1ac3vqeuUZgAh3gM0T8LBoXzBzj5IWMr3g1BdF3rB0zrdpb-uow69Xw/s400/n560-5s.jpg" /></a><br /><a href="http://rus.akshaal.info/2009/03/emdebian-pda-c550n560.html">Установка Debian'а</a> на Loox N560Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com6tag:blogger.com,1999:blog-6827363280592532957.post-85406637443782264322009-03-15T14:54:00.004+02:002009-03-15T15:08:07.134+02:00Тестирование памяти на Loox N560/C550Недавно набросал "утилиту" для тестирования памяти на Fujitsu-Siemens Loox N560/C550. Нужна она тем, кто перепаевает память (с 64М на 128М) и хочет проверить ее работоспособность "на месте" без переустановки WM5. Итак, для того, чтобы протестировать память КПК:<br />1. Качаем <a href="http://downloads.akshaal.info/other-soft-for-pda">LooxMem128-v0.zip</a> (чтобы тестировать 128Мб памяти) или <a href="http://downloads.akshaal.info/other-soft-for-pda">LooxMem64-v0.zip</a> (чтобы тестировать 64Мб памяти).<br />2. Заливаем распакованный архив на SD карточку.<br />3. Карточку вставляем в Loox и перегружаем КПК.<br />4. Не давая КПК заснуть, запускаем haret.exe из архива, что распаковывали на SD карточку.<br />5. После запуска haret.exe нужно нажать на Run.<br />6. Загрузится linux и появится предупреждение.<br />7. Читаем предупреждение и либо нажимаем на RESET (на попе у КПК) либо нажимаем enter..<ad2></ad2><br />ВНИМАНИЕ: Накачественная память при тестировании может сгореть (собственно "утилита" для этого и нужна, чтобы выявлять такую память). Ни я, ни авторы memtester ни кто иной кроме вас никакой ответственности за это нести не будет. Вы тестируете память на свой страх и риск!!<br /><br />Замечание: При тестировании необходимо раз в 3-5 минут нажимать какую-нибудь кнопку КПК, чтобы КПК не заснула...<br />(<i>Для портирования "утилиты" на другую платформу достаточно заменить ядро zImage и поправить default.txt.</i>)<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-6141997722341529132009-03-14T19:49:00.003+02:002009-03-14T20:36:07.533+02:00Ядро linux для Loox N560/C550 с рабочим CPLD и светодиодамиДобавил поддержку CPLD и светодиодов. Для CPLD был заюзан драйвер htc-gpio с перечислением адресов регистров CPLD на Fujitsu-Siemens Loox 5XX (N560/C550). Теперь CPLD доступен для других драйверов.<br /><br />Примечательно, как в Linux'е реализована работа с CPLD. По сути, CPLD это чип, содержащий очень простую логику (за счет чего он очень быстр по сравнению с CPU), имеющий входные и выходные "ножки" (pins). Входные и выходные ножки - регистры - проецируются на определенную область памяти CPU. С логической точки зрения работа с CPLD заключается в переключении битов в регистрах CPLD в 0 или 1 (можно еще и читать оттуда, но я об этом тут не буду рассказывать..). Таким же образом выглядит работа с GPIO - общим вводом/выводом CPU: биты регистров CPU таким же образом принимают значение 0 или 1. В ядре Linux уже имеется драйвер GPIO, предоставляющий функции для работы с GPIO разработчикам платформенных драйверов. Также драйвер GPIO имеет механизм расширения, позволяющий другим драйверам/модулям проецировать заданные интервалы портов GPIO таким образом, что при обращении к такому порту произойдет вызов указанных при проецировании функций. Этот механизм используется CPLD драйвером htc-egpio для проецирования CPLD регистров на GPIO порты. Таким образом работа с CPLD идет через обыкновенные методы типа gpio_set_value.<ad2></ad2><br />На основе работающиго CPLD драйвера для Loox N560/C550 реализовал драйвер управления светодиодами КПК. Драйвер экспортирует методы и константы которые другие драйвера (wifi, gps, bluetooth, pm, ...) должны использовать для управления светодиодами. Также драйвер позволяет контролировать светодиоды из userspace пространства путем манипуляций с файлами sysfs. <br /><br />Ниже перечисленны файлы и значения которые могут находиться:<br /><b>/sys/devices/platform/loox5xx-leds.1/keyboard</b>: on, off, any<br />- подсветка клавиатуры<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_green</b>: on, off, any<br />- зеленый светодиод с левой стороны. WM5 использует для индикации активности WiFi<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_blue</b>: on, off, any<br />- голубой светодиод с левой стороны. WM5 использует для индикации активности Bluetooth<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/left_orange</b>: on, off, any<br />- оранжевый светодиод с левой стороны. WM5 использует для индикации активности GPS на Loox N560<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/right_green</b>: on, off, any<br />- зеленый светодиод на правой стороне КПК. WM5 использует как светодиод доступный приложениям (нотификации и т.д.)<br /><br /><b>/sys/devices/platform/loox5xx-leds.1/right_orange</b>: on, off, blink, any<br />- оранжевый светодиод с правой стороны КПК. WM5 использует для индикации процесса зарядки<br /><br />Где:<br /><b>on</b> - светодиод включен независимо от желаний ядра,<br /><b>off</b> - светодиод выключен независимо от желаний ядра,<br /><b>blink</b> - светодиод мигает независимо от желаний ядра,<br /><b>any</b> - светодиод контролируется ядром.<br /><br />Например, если установить right_orange в состояние on, то светодиод зарядки будет гореть независимо от того, заряжается КПК или нет. Это будет продолжаться до тех пор, пока в файл right_orange не будет записано значение any. После чего, первое же событие (установка КПК в крэдл и т.д.) переключит светодиод в соответствующее состояние. Sysfs интерфейс для светодиодов позволяет использовать светодиоды из программ для нотификации о событиях (пришла почта, кончается заряд и т.д.) с помощью всех доступных на устройстве светодиодов - насколько хватит фантазии. Например следующий shell код мигает подсветкой клавиатуры:<pre><br />while true;<br /> do echo on > /sys/devices/platform/loox5xx-leds.1/keyboard;<br /> sleep 0.1;<br /> echo off > /sys/devices/platform/loox5xx-leds.1/keyboard;<br /> sleep 0.1;<br /> # Condition for break...<br />done<br />echo any > /sys/devices/platform/loox5xx-leds.1/keyboard;</pre><br /><br />Актуальный патч на cupcake ядро андройда качать <a href="http://downloads.akshaal.info/linux-n560-c550/c550-android-kernel-2009-03-14.patch.gz?attredirects=0">здесь</a>.<br /><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com6tag:blogger.com,1999:blog-6827363280592532957.post-52969838341258099952009-03-09T15:29:00.003+02:002009-03-09T15:39:22.028+02:00Установка emdebian на PDA (C550/N560)Последовательность действий, выполнив которую я без проблем установил debian на свой Fujitsu-Siemens Loox N560. Я предполагаю, что emdebian-tools уже установлен, а также стоят всякие кросскомпиляторы под arm платформу.<br /><br />Первым делом необходимо собрать архив базовой системой:<pre>cd /tmp;<br />mkdir grip/<br />sudo debootstrap --arch=arm --foreign lenny grip/ http://www.emdebian.org/grip/<br />cd grip/<br />sudo tar -czf /tmp/emdebian-grip-arm-debootstrap.tgz .</pre>Теперь необходимо переразбить SD карточку выделив на ней раздел под linux:<pre><br />cfdisk /dev/sdX<br />mkfs.ext3 /dev/sdXy</pre><br />где sdX - это устройство с SD картой, а sdXy это раздел который предполагается использовать под linux. Теперь монтируем раздел и разворачиваем туда emdebian-grip-arm-debootstrap.tgz:<pre><br />mount /dev/sdXy /mnt<br />cd /mnt<br />tar zxpvf /tmp/emdebian-grip-arm-debootstrap.tgz<br />ln -s bin/sh init<br />cd /tmp<br />umount /mnt<br /></pre><br />Теперь, когда раздел подготовлен, загружаем с него linux и выполняем следующие команды:<pre>cd /debootstrap<br />export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin<br />run ./debootstrap --second-stage<br />dpkg --configure -a<br />rm /init<br />cd /<br />ln -s sbin/init init<br /></pre><ad2></ad2>Теперь перегружаем linux еще раз. В этот раз должно появится приглашение залогинится. Используем root без пароля. И конфигурируем основные настройки:<pre><br />echo 'nameserver 1.1.1.1' > /etc/resolv.conf<br />echo '127.0.0.1 localhost' > /etc/hosts<br />echo '172.16.0.2 myhost 172.16.0.2' >> /etc/hosts<br />echo 'myhost' > /etc/hostname<br /></pre><br />Вместо 1.1.1.1 нужно использовать IP DNS сервера. И снова перегружаем КПК. Теперь конфигурирем сеть:<pre><br />ifconfig usb0 172.16.0.1 netmask 255.255.255.0<br />route add default gw 172.16.0.1</pre>Убеждаемся, что сеть работает. Апгрейдим пакеты:<pre><br />echo 'deb http://www.emdebian.org/grip/ sid main' > /etc/apt/sources.list<br />echo 'deb http://ftp.debian.org/debian/ sid main contrib non-free' >> /etc/apt/sources.list<br />apt-get update<br />apt-get dist-upgrade<br />apt-get install ...что угодно...</pre><br />И теперь настраеваем сеть так как это положено (собственно это можно было зделать и раньше, но тут можно уже залогинится через ssh и нормально все сделать с помощью copy&paste с ББ...):<pre>cat > /etc/network/interfaces<br />auto lo<br />iface lo inet loopback<br />allow-hotplug usb0<br />iface usb0 inet static<br /> address 172.16.0.2<br /> netmask 255.255.255.0<br /> network 127.16.0.0<br /> broadcast 172.16.0.255<br /> gateway 172.16.0.1<br /> dns-nameservers 1.1.1.1<br /> dns-search your.domain<br /></pre><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-72887756924752396952009-03-07T22:51:00.005+02:002009-03-08T12:49:32.445+02:00Ядро linux для Loox N560/C550 с рабочим usbnet'омПосле 3х дней мучений все-таки собрал ядро linux для Fujitsu-Siemens Loox N560/C550. Ядро брал с <a href="http://www.asm32.ru">http://www.asm32.ru</a>. Потратив еще несколько часов разобрался как запустить usbnet (сеть через обычный usb шнурок). Для этого пришлось дополнительно пропатчить pxa27x_udc.c. Сделал diff между текущей версией ядра андройда и теми исходниками (за 02-03-09), что выложены на asm32. В дальнейшем при обновлении ядра в cupcake'овской ветке можно будет просто накладывать этот патч сверху имея в результате и изменения под c550/n560 и исправления/дополнения внесенные в cupcake ветку. <a href="http://downloads.akshaal.info/linux-n560-c550/c550-android-kernel-2009-03-07.patch.gz?attredirects=0">Вот итоговый патч</a> в который также включены изменения для работы usbnet. В патче уже имеется .config, но там не включена поддержка usbnet. <a href="http://downloads.akshaal.info/linux-n560-c550/linux-config-2009-03-07?attredirects=0">Вот другой config</a>, он отличается от того, что в патче (а там тот, что выложен на asm32) поддержкой usbnet, выключенной power management (зачем не знаю, потом надо будет включить обратно), и настройкой для более крупного шрифта в консоли.. может еще чем-то.<br /><br />Собирать ядро можно с помощью любого toolchain'а. Я пробовал собирать с помощью: crosstool-ng, emdebian, а также того, что идет вместе с ядром андройда. Остановился на emdebian'е. Для сборки ядра emdebian'ом необходимо выполнить:<pre>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-</pre>Предварительно emdebian конечно же нужно установить, например так:<pre><br />apt-get install emdebian-tool<br />emsetup --arch arm</pre>Добавить:<pre><br />deb http://www.emdebian.org/debian/ unstable main</pre><br />в /etc/apt/sources.list и выполнить:<br /><pre>apt-get install linux-kernel-headers-arm-cross gcc-4.2-arm-linux-gnu</pre><br /><br />Готовое ядро запускается haret'ом с конфигом:<pre><br />set MTYPE 1454<br />set KERNEL zImage<br />set CMDLINE "root=179:2 mem=60M rootdelay=3 boot_delay=0 init=/init console=tty0 fbcon=rotate:0 androidboot.console=tty0 android.checkjni=1"<br />set RAMADDR 0xA0200000<br />bootlinux</pre><ad></ad><br />И самое главное! После того, как ядро закинуто на sd карточку, эту sd карточку нужно вставить в КПК и ребутнуть КПК. А уже только после этого грузить haret'ом ядро! Ибо ядро не грузится (либо грузится с вероятностью 10%), если:<br />1. КПК заснула, а потом ее разбудили.<br />2. Вы только что вставили в КПК карточку.<br />Наверное это бага драйвера wince...<br /><br />P.S. Cupcake на который накладывается выложенный патч качается отсюда <a href="http://source.android.com/download"> http://source.android.com/download</a><br /><br />P.P.S. При сборке с поддержкой usbnet опцию CONFIG_USB_ETH_RNDIS<br /> включать не следует! Ибо в этом случае ПК не может нормально соеденится с КПК.. ни cdc_ether ни cdc_subset не видят usb устройство.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-277740139868048232008-08-12T00:22:00.001+03:002009-02-22T16:35:07.602+02:00N560Звук и кнопки на КПК после дождя плохо себя ведут. Сегодня решил с этой проблемой что-то сделать.<br /><ad2></ad2><br />Открывать КПК как-то стремно стало. Боюсь, что обратно я его соберу с еще большими повреждениями. Решил забить на встроенный динамик. При желании можно и наушники для громкой связи использовать задрав громкость до предела. Не выход конечно... А вот с клавиатурой все печальнее. Сначало я думал, что на каждое нажатие кнопки приходит два скан кода один за другим. И думал, что смогу отрезать второй, который приходит слишком рано. Благо перехват скан кодов уже реализован в LooxLight'е. А тут оказалось все куда печальнее. Там не два скан кода приходит. А один "одновременный". Как бы это описать. Ну вот PC клавиатуре там настоящие скан коды. А в клавиатуре КПК, там просто значение у которого каждый бит занчит нажатую кнопку. Значение состоит из двух слов, старшее для стрелочек, а младьшее для всех остальных кнопок. И вот я по логам LooxLight'а наблюдаю следующую картину:<br />2003.01.02 17:33:38.0000: 6f7dacca: 8f7ddf4c: Char <b>00040004</b>, cur=00000004, next=00000005, 8f7ddf4c, 8f7ddc64<br />И так на каждое нажатие. На любое нажатие левое слово = правое. В результате нажимаем стрелочку влево, а получаем и влево и еще какое-то нажатие. И наоборот. Короче хрен обьяснишь. Думаю это как-то завязано на то, что такие клавиатуры обычно реализуются через "матрицу" контактов или хз как и какие-то две ветки там замыкает. А может я и не прав. Сейчас сделаю временное решение, чтобы дисплей хоть разблокировать можно было, а потом буду думать...<br /><br /><b>Временное решение</b>:<br />Сравнивать коды клавиш таким образом, что fix(нажатой кнопки) == fix (образца):<pre><br />UINT fix (UINT x) {<br /> UINT y = (x & 0xFFFF) | (x >> 16);<br /> return y | (y << 16);<br />}<br /></pre><ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-74347826486506103032007-11-19T21:58:00.001+02:002009-02-22T16:00:08.492+02:00eurokbdСобрал на скорую руку <a class="snap_shots" href="http://toril.ru/pda/eukbak.zip">cab</a> для модифицированной eurokbd, о которой я писал <a ljaddtriggersobjectstatus="mouseout" href="http://rus.akshaal.info/2007/11/iphone.html">ранее</a>.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-65277390892137034662007-11-19T17:24:00.004+02:002009-03-01T12:30:38.365+02:00LooxLight 2007-11-19Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Обновление!<br /><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-11-19.zip?attredirects=0">Вот cab.</a><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-11-19.src.zip?attredirects=0">Вот исходники.</a><ad></ad><br /><br />Добавил возможность блокрировать экран и клавиатуру. Раньше у меня стояло что-то-там-guard (screen guard или типа того). Но оно было глючное: иногда при разблокриовке весило кпк, при нажатии на кнопку suspend разблокировала экран, но при нажатии любой клавиши блокировало его обратно - выглядело это страшно, при нажатии на кнопки разблокировало экран и тутже блокировало обратно. Терпел. А вот недавно перепрошил КПК на новую версию WM5 (кстати стало побыстрее все рисоваться, а в каталог /windows так вообще мгновенно заходит (раньше 10сек)). После перепрошивки обнаружил, что жить без блокировки тяжело - батарея садится быстрее, кнопки нажимаются случайно, когда в кармане КПК лежит... И позавчера вечером не выдержал и решил написать сам. Ну как сказать, получилось вобщем-то. Отличается от прочих (<a href="http://4pda.ru/forum/index.php?showtopic=20758">пукнт 1.42</a>) тем, что заточено чисто под Fujitsu-Siemens Loox N560/C550 (может конечно и на 720 заработает, дрова у них похожие), поэтому выключает и экран и клавиатуру в том числе и кнопку suspend(!!). Кстати, выключенный экран (при прослушивании музыки или аудиокниги) экономит более 50мА. С выключенным экраном заряжаться с USB должно быстрее.<br /><br /><b>Как установить:</b><br />Если КПК не Fujitsu-Siemens Loox N560/C550, то очень рекоменудю сделать backup! Если это Fujitsu-Siemens Loox N560/C550, то все равно рекомендую, хотя у меня и жены вроде ничего страшного не произошло пока. В любом случае, я ответственности никакой не несу. :) (<b>Добполнение: У меня работает уже больше чем 2 года без проблем</b>)<br /><br />Скачать cab. Закинуть на кпк. Запустить установку. Установить. Подождать минуту для верности. Перезагрузить КПК (софтресет). Запустить LooxLight Control и поставить галочку напротив "Permit blocking". Ниже, напротив "Unblock by" два выпадающих списка. В них задается какими кнопками будет происходить РАЗБЛОКИРОВКА. Когда КПК будет заблокирована, эти две кнопки надо будет последовательно нажать. У меня это 2 и 3 кнопки. А по умолчанию почему-то стоит 2 и 4, ну и фик с ним. Теперь идем в Settings/Buttons и там вешаем LooxLight Control на ту кнопку, которой КПК будет БЛОКИРОВАТЬСЯ. У меня это долгое нажатие на кнопку 2. Готово. Можно тестировать.<br /><br />При нажатии на первую из кнопок разблокировки, следующую нужно зажать в течении одной секунды. Во время ожидания клавиатура КПК будет подмигивать.<ad2></ad2><br /><br /><b>Как реализовано (в общих чертах):</b><br />С выключением экрана все просто. А вот с его блокировкой посложнее. LooxLight аттачит себя к gwes.exe. Находит в памяти keybddr.dll и правит в ней таблицу импортированных функций, а именно WaitForSingleObject. Эта функция вызывается нитями keybddr.dll для ожидания прерывания клавиатуры (0x10 и 0x2a), а также для ожидания срабатывания события suspend. Т.е. в таблице импорта keybddr.dll, LooxLight подменяет адрес WaitForSingleObject с адреса функции из библиотеки coredll.dll на собственную функцию. Получается, что в момент, когда keybddr инициирует ожидание нажатия, вызывается функция LooxLight'а, которая в свою очередь дергает оригинальную функцию. Если блокировка не включена, то результат сразу же возвращается в keybddr.dll. Иначе в результате проверяется пара адресов памяти на код нажатой клавиши. По нему решается, разблокировать ли экран или нет (грубо очень). Если нажатие нужно проигнорировать, то сообщаем OS о том, что мы обработали прерывание (InterruptDone) и вызываем оригинальный WaitForSingleObject - тоесть управление обратно в keybddr не передается, пока клавиатуру не разблокируется. Таким образом ни одной нажатие мимо нас в принципе не проходит. Ибо обработчик LooxLight находится первым в цепочке обработки прерывания клавиатуры.<br /><br />Пока заметил, что если воткнуть КПК в крэдл, когда КПК заблокирована, то экран включается. Правда при этому клавиатура попрежнему заблокирована. Я думаю activesync что-то делает такое не хорошее, например вызывает ExtEscape - функция используемая для выключения/включения питания экрана. Или еще хуже. он дергает какое-то более общее API (варианты: вывести окно на передний план, послать уведомление, включить подсветку), которое как раз и и дергает ExtEscape. Вариантов лечения я вижу два:<br />1. Простой. Эпизодически запрашивать состояния питания на экран и если блокировка включена, а экран выключен - то выключать экран. Но я так не люблю по таймеру что-то делать. Да и мерцание будет, хоть и очень редко.<br />2. Сложный. Я уже попробовал пойти по этому пути - убил 3 часа и пока решил отложить. Смысл в том, что можно вклинится в какое-нибудь API какой-нибудь dll. Например можно было бы перехватить ExtEscape, но для этого нужно пробежаться по всем dll'кам в системе и каждую из них происнструментировать так же как и keybddr. Так я еще не пробовал, но есть подозрение, что может не сработать. Ибо у нас есть gwes.exe который и рулит GDI'ем. И если кто-то вызывает API у coredll, тот направляет его еще куда.. короче я к тому, что вызов ExtEscape из coredll может быть проскипан кодом, который напрямую работает с DeviceDriver'ом - а с ним напрямую, я так подозреваю, работает gwes. Было бы просто идиально вклинится в Display Driver. Когда кто-то дергает ExtEscape, тот в свою очередь вызывает DrvEscape callback у драйвера дисплея. Как это вообще работает. Когда gwes.exe грузит драйвер дисплея, он вызывает у него метод DrvDeviceEnable (или типа того). Передавая ему в качестве параметра структуру, которую драйвер должен заполнить. В этой структуре указатели на методы связаные с работой с дисплеем, в том числе и DrvEscape. После того, как драйвер заполнил эту структуру, далее gwes уже работает только с методами прописанными в этой структуре. Было бы клево, найти в памяти адрес этой структура и прописать свой DrvEscape туда. Но полазив по header'ам от wince я пока не нашел цепочку, чтобы добраться до туда. Может имея HDC можно по нему добраться? Но HDC - это указатель на C++ структуру и я этот путь пока не осилил. Другой вариант, изучать gwes.exe и посмотреть куда он копирует адрес заполненной структуры и плясать отсюда. Но блин, gwes.exe как-то криво разобрался IDA (или криво задампился). Все локальные переменные имеют совсем не те адреса, на какие ссылается код. Еще можно было бы посмотреть coredll.dll и как там работает ExtEscape и потыкаться оттуда, но coredll.dll у меня задамлпнного нет (это вообще вроде kernel сам). А дамп всей ОЗУ неплохо так разобранный во времена когда искал как управлять диодами я где-то посеял..<br /><br />Вобщем я решил пока этот вопрос отложить. Посмотрим как оно будет анноить или нет.<br /><br />--------<br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com3tag:blogger.com,1999:blog-6827363280592532957.post-8115201471502279612007-11-17T21:27:00.003+02:002009-02-22T16:02:53.963+02:00iphone?<img src="http://toril.ru/lj/eukbak/ekak.gif" align="left"><br />Прочитал недавно статью про iphone. Какой он там весь удобный и все такое. Заразился идеей о управлении КПК (WM5) с помощью одной руки и даже одного пальца. Для меня это актуально, так как пользуюсь КПК в метро. Поменял часть софта - менеджер задач и лоунчер. А с клавиатурой пришлось повозится. Перепробовал много вариантов. PocketCM уовлетворила почти всем, кроме того, что была глючная и не давала сделать такую раскладку какую я хочу. И вот я случайно наткнулся на eurokbd. Программа интересная тем, что opensource (хоть и слегка кривовато написана, но да ладно, дареному коню... спасибо автору огромное!). Подправил для нее раскладку, перерисовал скины, подправил исходники и вот, что получилось.<br /><br /><a href="http://toril.ru/lj/eukbak/ekak-1.png">Картинко 1</a><br /><a href="http://toril.ru/lj/eukbak/ekak-2.png">Картинко 2</a><br /><a href="http://toril.ru/lj/eukbak/ekak-3.png">Картинко 3</a><br /><a href="http://toril.ru/lj/eukbak/ekak-4.png">Картинко 4</a><ad2></ad2><br /><br />Первое, что нужно было сделать - придумать раскладку. Раскладка должна была быть такой, чтобы легко попадать по клавишам большим пальцем моей руки (держа КПК той же рукой). Qwerty не подходит. Был соблазн набросать как придется новую раскладку, но это абсолютно не аправданно. Решил сгенерировать оптимальный вариант с учетом частоты следования букв друг за другом. Написал на perl анализатор текста на входе которого текст, на выходе описание для graphwiz (буква -> буква [вес]). Вес являлся частотой появления комбинации букв. На основе такого описания graphwiz построил графики, расположив узлы таким образом, чтобы расстояния между элементами с наибольшими весами было наименьшее. Таким образом минимизируется время набор слов. На графиках линии связей между буквами убраны для простоты картинки.<br /><br /><a href="http://toril.ru/lj/eukbak/english.png">Инглиш</a><br /><a href="http://toril.ru/lj/eukbak/russian.png">Русский</a><br /><br />Далее нарисовал скины. А саму eurokbd пришлось пропатчить, чтобы она активную кнопку подсвечивала белым фоном (а не черным как это жестко вбито в исходниках), а также не выводила меню переключения раскладки, а переключала ее сразу же с rus на lat и с lat на rus). Итого получилась очень удобная клавиатура! Несмотря на то, что раскладка не qwerty - привыкаешь ОЧЕНЬ быстро. Я уже не могу на стандартную мелкую смотреть без тошноты.<br /><br />http://toril.ru/pda/eukbak.zip<br /><br /><b>Для интересующихся, скрипт на perl для анализа текста (textanal.pl):</b><br /><pre><br />#!/usr/bin/perl<br /># Akshaal (C) 2007<br /><br /># Creates dot graph for link between characters<br /><br />use warnings;<br />use strict;<br /><br />use utf8;<br />use encoding 'utf8';<br /><br />my %ass;<br />my $prev;<br /><br />my %allow;<br />for (split '', "йцукенгшщзхъфывапролджэячсмитьбюё ") {<br /> $allow{$_} = 1;<br />};<br /><br />sub add ($) {<br /> my $c = shift;<br /><br /> if (defined $prev) {<br /> if (ord($prev) > ord($c)) {<br /> $ass{"$prev$c"} ++;<br /> } else {<br /> $ass{"$c$prev"} ++;<br /> }<br /> }<br /><br /> $prev = $c;<br />}<br /><br /># Calc weights<br />while (<>) {<br /> chop;<br /> for my $c (split '') {<br /> $c = lc $c;<br /><br /> unless ($allow{$c}) {<br /> $c = ' ';<br /> }<br /><br /> add ($c);<br /> }<br /> add (' ');<br />}<br /><br /># Create dot<br />print "graph D {\n";<br />for my $link (keys %ass) {<br /> my $weight = $ass {$link};<br /> my $a = substr $link, 0, 1;<br /> my $b = substr $link, 1, 1;<br /><br /> print " \"$a\" -- \"$b\" [weight=$weight, style=invis];\n";<br />}<br />print "}\n";<br /></pre><ad></ad><br /><br /><b>А это патч на eurokbd:</b><br /><pre><br />--- eurokbd.cpp.old 2007-10-11 20:45:00.000000000 +0300<br />+++ eurokbd.cpp 2007-11-17 17:58:48.000000000 +0200<br />@@ -369,10 +369,12 @@<br /> <br /> if(vk==_VK_MOD)<br /> {<br />- if( m_subkeyCurrent!=SUBKEY_PARENT )<br />- {<br />- LoadConfig(m_subkeyCurrent->data.pw);<br />- }<br />+ if(0==wcscmp(m_pwCurrentConfigName.ptr(), L"rus"))<br />+ {<br />+ LoadConfig(L"lat");<br />+ } else {<br />+ LoadConfig(L"rus");<br />+ }<br /> } else if(vk==_VK_FN)<br /> {<br /> // } else if(vk==_VK_CUT)<br />@@ -788,8 +790,8 @@<br /> COLORREF bgColor, fgColor;<br /> if( m_subkeyCurrent==p )<br /> {<br />- fgColor = RGB(0xFF,0xFF,0xFF);<br />- bgColor = RGB(0x00,0x00,0x00);<br />+ bgColor = RGB(0xFF,0xFF,0xFF);<br />+ fgColor = RGB(0x00,0x00,0x00);<br /> } else<br /> {<br /> fgColor = m_config->m_colors[p->group][0];<br />@@ -832,8 +834,8 @@<br /> COLORREF bgColor, fgColor;<br /> if( m_subkeyCurrent==SUBKEY_PARENT )<br /> {<br />- fgColor = RGB(0xFF,0xFF,0xFF);<br />- bgColor = RGB(0x00,0x00,0x00);<br />+ bgColor = RGB(0xFF,0xFF,0xFF);<br />+ fgColor = RGB(0x00,0x00,0x00);<br /> } else<br /> {<br /> fgColor = m_config->m_colors[m_keyCurrent->group][0];<br />@@ -987,43 +989,6 @@<br /> }<br /> if(m_hwndPop)<br /> {<br />- // кнопка Mod<br />- if(m_keyCurrent->vk==_VK_MOD)<br />- {<br />- m_keyCurrent->subkeys.destroy();<br />-<br />- WIN32_FIND_DATA ffdata;<br />- WCHAR* pwMask = new WCHAR[wcslen(g_pwDllDir)+6+1];<br />- wcscpy(pwMask, g_pwDllDir);<br />- wcscat(pwMask, L"\\*.txt");<br />- //UINT iLenMask = wcslen(swMask);<br />- HANDLE hFind = FindFirstFile(pwMask, &ffdata);<br />- if( hFind!=INVALID_HANDLE_VALUE )<br />- {<br />- int i = 0;<br />- do<br />- {<br />- SUBKEYENTRY* psk = new SUBKEYENTRY;<br />- psk->vk = _VK_MOD;<br />- //psk->data.pw= new WCHAR[iLenMask-5+wcslen(ffdata.cFileName)+1];<br />- //wcscpy(psk->data.pw, swMask);<br />- //wcscpy(psk->data.pw+iLenMask-5, ffdata.cFileName);<br />- ffdata.cFileName[wcslen(ffdata.cFileName)-4] = '\0'; // trim .txt<br />- psk->data.pw= _wcsdup(ffdata.cFileName);<br />- psk->left = 0;<br />- psk->top = (i+1)*-16;<br />- psk->right = 80;<br />- psk->bottom = (i+0)*-16;<br />- psk->group = SK_GROUP_LATIN;<br />- psk->desc.pw= 0;<br />- m_keyCurrent->subkeys.add_first(psk);<br />- i ++;<br />- } while(FindNextFile(hFind, &ffdata));<br />- FindClose(hFind);<br />- }<br />- delete []pwMask;<br />- }<br />-<br /> // кнопка Fn<br /> if(m_keyCurrent->vk==_VK_FN)<br /> {<br />@@ -1148,7 +1113,7 @@<br /> // если нет обоев - рисуем кнопочку, если кнопка текущая - рисуем чёрную кнопочку<br /> if(!m_hbmSkin || p==m_keyCurrent)<br /> {<br />- COLORREF bgColor = p==m_keyCurrent ? RGB(0x00,0x00,0x00) : m_config->m_colors[p->group][1];<br />+ COLORREF bgColor = p==m_keyCurrent ? RGB(0xff,0xff,0xff) : m_config->m_colors[p->group][1];<br /> CGdiObj>HBRUSH> hBrushBg2 = CreateSolidBrush(bgColor);<br /> assert(hBrushBg2);<br /> DrawButton(hdc, r0, hBrushBg2, hPenTL, hPenBR);<br />@@ -1158,13 +1123,13 @@<br /> if (0!=p->data.pw)<br /> {<br /> SelectObject(hdc, m_hFontBig);<br />- COLORREF fgColor = p==m_keyCurrent ? RGB(0xFF,0xFF,0xFF) : m_config->m_colors[p->group][0];<br />+ COLORREF fgColor = p==m_keyCurrent ? RGB(0x00,0x00,0x00) : m_config->m_colors[p->group][0];<br /> DrawText(hdc, p->data, &rText, DT_NOPREFIX | DT_BOTTOM | DT_LEFT, fgColor);<br /> <br /> if (0!=p->desc.pw) // надстрочный знак<br /> {<br /> SelectObject(hdc, m_hFontIndex);<br />- COLORREF fgColor2 = p==m_keyCurrent ? RGB(0xFF,0xFF,0xFF) : m_config->m_colorDesc;<br />+ COLORREF fgColor2 = p==m_keyCurrent ? RGB(0x00,0x00,0x00) : m_config->m_colorDesc;<br /> //if(0!=p->desc2.pw) // есть оба знака - надстрочный двинем чуть левее<br /> // rText.right -= 7*m_vga;<br /> DrawText(hdc, p->desc, &rText, DT_NOPREFIX | DT_RIGHT | DT_TOP, fgColor2);<br />@@ -1175,13 +1140,13 @@<br /> {<br /> rText.top += 4*m_vga;<br /> SelectObject(hdc, m_hFontIndex);<br />- COLORREF fgColor2 = p==m_keyCurrent ? RGB(0xFF,0xFF,0xFF) : m_config->m_colorDesc2;<br />+ COLORREF fgColor2 = p==m_keyCurrent ? RGB(0x00,0x00,0x00) : m_config->m_colorDesc2;<br /> DrawText(hdc, p->desc2, &rText, DT_NOPREFIX | DT_RIGHT | DT_TOP, fgColor2);<br /> }<br /> } else if (0!=p->desc.pw) // текст вроде 'Caps'<br /> {<br /> SelectObject(hdc, m_hFontSmall);<br />- COLORREF fgColor2 = p==m_keyCurrent ? RGB(0xFF,0xFF,0xFF) : m_config->m_colors[p->group][0];<br />+ COLORREF fgColor2 = p==m_keyCurrent ? RGB(0x00,0x00,0x00) : m_config->m_colors[p->group][0];<br /> DrawText(hdc, p->desc, &rText, DT_NOPREFIX | DT_CENTER | DT_VCENTER, fgColor2);<br /> }<br /> }<br />@@ -1205,7 +1170,6 @@<br /> {<br /> m_keyCurrent = pKey;<br /> if(0==m_nPopupDelay ||<br />- m_keyCurrent->vk==_VK_MOD ||<br /> m_keyCurrent->vk==_VK_FN )<br /> {<br /> PopUp();<br /><br /></pre><br /><br />Долой стилус!Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-58383115181896553492007-03-05T22:29:00.002+02:002009-02-22T16:12:30.050+02:00WM5DevSpy<a href="http://toril.ru/pda/WM5DevSpy.tar.gz">Выкладываю</a> утилиту для мониторинга обращений к устройствам WM5. Если вы не программист-хакер, то вам программа не нужна. А нужна она вам, если вы хотите видеть с какими аргументами и когда вызываются функции того или иного драйвера. Перед использованием программу нужно скомпилировать. Имя устройсва без труда найдете в файле WM5DevSpy.c - если оно вам и правда нужно. Делать нормальный гуи лень. Как бонус данное приложение показывает какие программы обслуживают какие прерывания и какими нитями.<br /><br /><b>Пример лога:</b><br /><pre>2007.02.22 00:15:32: Starting ------------------------------------------------------<br />2007.02.22 00:15:33: interrupt 5 (abs 13): event struct at 8ffb2818, thread struct at 8efb4024, owner proc at 8c5976d0, proc name=NK.EXE, thread start addr=8c215240<br />2007.02.22 00:15:33: interrupt 8 (abs 16): event struct at 8f7a5xf0, thread struct at 8e7a2a64, owner proc at 8c597ad0, proc name=gwes.exe, thread start addr=015c39b4<br />2007.02.22 00:15:33: interrupt 9 (abs 17): event struct at 8f796yc4, thread struct at 8e785400, owner proc at 8c597ad0, proc name=gwes.exe, thread start addr=01e944e4<br />[...]<br />2007.02.22 00:15:34: fsDev_t at: 06048c50<br />2007.02.22 00:15:34: LegalName: BAT1:<br />2007.02.22 00:15:34: DeviceName: BAT1<br />2007.02.22 00:15:34: BusName: BuiltInPhase1_0_26_0<br />2007.02.22 00:15:34: DeviceKey: Drivers\BuiltIn\Battery<br />2007.02.22 00:15:34: control (openData=0x00000001, code=0x00290400, inBuf=0x0806fa8c, inSize=0x00000004, outBuf=0x0806fa60, outSize=0x00000014, outUsed=0x0806fa20) -> 0x00000001<br />2007.02.22 00:15:34: [ *outUsed : 0x00000018 ]<br />2007.02.22 00:15:34: IN:<br />2007.02.22 00:15:34: 01 00 00 00 <br />2007.02.22 00:15:34: OUT:<br />2007.02.22 00:15:34: 00 08 5a 00 ff ff ff ff <br />2007.02.22 00:15:34: ff ff ff ff 00 ff 00 00 <br />2007.02.22 00:15:34: ff ff ff ff ff ff ff ff <br />2007.02.22 00:15:37: Calls to open function: 0<br />2007.02.22 00:15:37: Calls to close function: 0<br />2007.02.22 00:15:38: Calls to control function: 1<br />2007.02.22 00:15:38: Calls to read function: 0<br />2007.02.22 00:15:38: Calls to write function: 0<br />2007.02.22 00:15:38: Calls to seek function: 0<br />2007.02.22 00:15:38: Calls to powerup function: 0<br />2007.02.22 00:15:38: Calls to powerdn function: 0<br />2007.02.22 00:15:38: ----------------------- stop -------------------------</pre><ad></ad>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-24242127970163179422007-03-04T22:38:00.004+02:002009-03-01T12:39:54.179+02:00LooxLight 2007-03-04Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Сделал новую версию LooxLight. Изменения:<br /><ll><li> Полная поддержка GPS светодиода.<br /></li><li> Поддержка bluetooth стека от Broadcom.<br /></li><li> Полная поддержка индиктора питания.<br /></li><li> Лучше реализована поддержка индикатора клавиатуры (теперь переживает изменение яркости).<br /></li><li> LooxLight теперь не EXE, а DLL. Это лучше тем, что в wince есть ограничение в 32 процесса.<br /></li><li> В два раза меньшее потребление памяти, чем раньше</li></ll><br />CAB архив в ZIP'е: <a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-03-04.zip?attredirects=0">тут</a>.<br />Исходные коды (GPL): <a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-03-04.tar.gz?attredirects=0">тут</a>.<br /><br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-90811280048626534252007-02-19T17:30:00.001+02:002009-02-22T16:14:04.757+02:00Вирус для WinCEКонкретно так изучил внутренности WM5. Может вспомнить детство и написать под него вирус? Надо перейти в режим ядра? Нет проблем, есть ф-ия SetKMode. Надо прочитать память какого-то прилажения? Нет проблем, бери да читай. Надо перехватит системный вызов, обращение к драйверу или прерывание? И это можно. :) <ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-1637798112165413602007-02-11T23:05:00.002+02:002009-02-22T16:14:38.206+02:00WM5EventSpyСегодня очень продуктивный день. Сегодня я реализовал утилиту для мониторига системных событий в Windows Mobile 2005. Если вы запустите WM5EventSpy, оно создаст файл с именем \SD-MMCard\WM5EventSpy.log. Туда утилита запишет имена всех зарегестрированных приложениями событий. Затем утилита будет ожидать срабатывания какого либо события и писать об этом в лог, когда одно из событий сработает. <a href="http://toril.ru/pda/WM5EventSpy-2007-02-11.zip">Тут зип архив</a> с исполняемым файлом WM5EventSpy внутри. А <a href="http://toril.ru/pda/WM5EventSpy-2007-02-11.tar.gz">тут его исходные коды</a>. При написании утилиты были использованы недокументированные структуры ядра WM5, поэтому оно врятли заработает на какой-то другой версии ОС.<br /><br /><b>Пример лога:</b><ad></ad><br /><pre>2007.02.11 22:28:36: Started ------------------------------------------------------<br />2007.02.11 22:28:36: - - - - Start of event list - - - - <br />2007.02.11 22:28:36: 1: 'WM5EventSpy/SomeEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 2: '50650_ConnMgr', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 3: 'PluginInitialized', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 4: 'HistoryMappingsClosedEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 5: 'CookiesMappingsClosedEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 6: 'ContentMappingsClosedEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 7: 'HistoryCloseMappingsEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 8: 'CookiesCloseMappingsEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 9: 'ContentCloseMappingsEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 10: 'ActiveSync:Started', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 11: 'CE2STATEEVENT1', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 12: 'CE2COMMANDDONEEVENT', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 13: 'CE2COMMANDEVENT', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 14: '__SD_CARD_INOUT', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 15: 'tiacwlnControlReady', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 16: 'tiacwlnResponseToControlReady', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 17: '_LEAP_LIST_CHANGE', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 18: '_BT_STATE_OFF', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 19: '_BT_STATE_ON', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 20: 'WLANStateNotified', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 21: 'LooxLight/FlashlightEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 22: 'LooxLight/SetupEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 23: 'LooxLight/ExitEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 24: 'SYSTEM\netui-TNETWLN1', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 25: 'WLANStatusHasChanged', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 26: 'ProfileStatusEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 27: 'ConnMgrApiReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 28: 'DTPT_SRV_STARTED', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 29: 'BindingMapSharedMemoryEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 30: 'All_Awake', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 31: 'BT_EVENT_SECURITY', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 32: '_KeyPress', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 33: 'Shell_Ready', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 34: '$*@DBChanged#%&', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 35: '$*@RegChanged#%&', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 36: 'SSTimeChange', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 37: 'SSUpdatePower', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 38: '$*EventInboxEnableSound*$', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 39: '$*EventInboxDisableSound*$', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 40: 'SSUpdateRecalc', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 41: 'SYSTEM\SipTimerActive', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 42: 'EventSounds_GlobalStopEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 43: 'MS_GWE_TPC_cont_startup', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 44: 'MS_GWE_TPC_startup', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 45: 'TouchPanelCommandEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 46: 'CgrTabletInnerEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 47: 'CgrTabletEvent', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 48: '_SSP_INIT_OK_EVENT3', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 49: 'WatsonUploadClientReady', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 50: 'WALNStatusChangeEvent', manualreset=0, pIntrProxy=8f9fba3c<br />2007.02.11 22:28:36: 50: 'system/events/bluetooth/PairingChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 51: 'system/events/bluetooth/HardwareChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 52: 'system/events/bluetooth/DeviceIdChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 53: 'system/events/bluetooth/ConnectivityChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 54: 'system/events/bluetooth/SecurityChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 55: 'system/events/bluetooth/ConnectionsChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 56: 'system/events/bluetooth/BasebandChange', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 57: 'system/events/bluetooth/StackInitialized', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 58: 'IP6_ROUTE_CHANGE_EVENT', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 59: 'IP6_ADDR_CHANGE_EVENT', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 60: 'TAPILINE00000000', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 61: 'IP_ROUTE_CHANGE_EVENT', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 62: 'IP_ADDR_CHANGE_EVENT', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 63: 'BTWCEShimShutdownThread', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 64: 'BTWCEShimFreeLibs', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 65: 'BTWCEShimLoadLibs', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 66: '_SSP_INIT_OK_EVENT2', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 67: 'Event_HS_PTT_Down', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 68: 'Event_HS_PTT_Up', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 69: 'CPUSpeed4lter', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 70: '_SSP_INIT_OK_EVENT', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 71: '_hLedChangeEvent_Name_', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 72: 'BackLightOverTempEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 73: 'BackLightNormTempEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 74: 'BackLightHighTempEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 75: 'BackLightChangeEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 76: 'BackLightActiveEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 77: 'BackLightNotifyEvent', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 78: 'PowerManager/SystemIdleTimerReset', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 79: 'PowerManager/ReloadActivityTimeouts', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 80: 'PowerManager/UserActivity_Inactive', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 81: 'PowerManager/UserActivity_Active', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 82: 'PowerManager/ActivityTimer/UserActivity', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 83: 'SYSTEM/SystemStarted', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 84: 'system/events/notify/APIReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 85: 'SYSTEM/ShellAPIReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 86: 'SYSTEM/BatteryAPIsReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 87: 'SYSTEM/NLedAPIsReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 88: 'SYSTEM/CertChange', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: 89: 'SYSTEM/BootPhase2', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 90: 'SYSTEM/DevMgrApiSetReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 91: 'SYSTEM/PowerManagerReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 92: 'SYSTEM/GweApiSetReady', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 93: 'LASS_SRV_STARTED', manualreset=1, pIntrProxy=00000000<br />2007.02.11 22:28:36: 94: 'WatsonEventDumpFileReady', manualreset=0, pIntrProxy=00000000<br />2007.02.11 22:28:36: - - - - End of event list - --- - - -<br />2007.02.11 22:28:37: We are going to monitor 63 events!<br />2007.02.11 22:28:37: We are going to monitor 31 events!<br />[...]<br />2007.02.11 22:28:56: Event 'PowerManager/ActivityTimer/UserActivity' is signaled, avgDelay = 54, count=10!<br />2007.02.11 22:28:56: Event 'PowerManager/ActivityTimer/UserActivity' is signaled, avgDelay = 46, count=11!<br />2007.02.11 22:28:56: Monitoring of 'PowerManager/ActivityTimer/UserActivity' is disabled, current count of monitoring events=69!<br />2007.02.11 22:29:16: Event '$*@RegChanged#%&' is signaled, avgDelay = 0, count=1!<br />2007.02.11 22:29:17: Event '$*@RegChanged#%&' is signaled, avgDelay = 24, count=2!</pre>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-37879944554082567922007-02-09T23:08:00.001+02:002009-02-22T16:15:59.219+02:00Synce & Linux & WM5 & PasswordКогда я разрабатывал для WM5 под linux'ом мне показалось, что копировать файлы для тестирования на КПК весьма напряжно. Файлы копировались на КПК либо через MMC карточку, либо с помощью монтирования КПК как USB флешки. Оба способа совершенно не удобны, когда эти действия приходится делать каждые 5 минут. В добавок, исполняемый файл надо было запускать, чтобы увидеть как он работает. Я запускал файлы руками. <ad2></ad2>Вобщем-то нет особого смысла говорить, как меня это раздражало после того как я в свое время поразрабатывал под виндой, где все эти действия выполнялись одним батничком. Тогда когда я попробовал найти что-то типа того я наткнулся на проект <a href="http://www.synce.org">synce</a>. Сначало мне показалось, что надо поставить драйвер <a href="http://www.synce.org/index.php/Connecting_your_Windows_Mobile_2005_device_via_USB_(usb-rndis)">usb-rndis</a>. Я попытался, но оно обломалось на этапе компиляции. После небольшого изучения сайта synce я все-таки обнаружил существование новой версии драйвера <a href="http://www.synce.org/index.php/Connecting_your_Windows_Mobile_2005_device_via_USB_%28usb-rndis-lite%29">"usb-rndis-lite"</a>. На этот раз получилось без проблем. После установки драйвера появилось новое сетевое устройство: rndis0. Затем надо было поставить synce утилиты и библиотеки. Это была самая жостка часть. Первым делом я попробовал следовать инструкциям с <a href="http://www.synce.org/index.php/Building_SynCE_with_Windows_Mobile_2005_support_from_Subversion">вики</a>. Но odccm вывавал мне ошибки о d-ubs, hal и т.д.. Ошибки были откровенно тупыми, т.е. по ним нельзя никак было сказать о причине... ну это было что-то типа "d-bus error" или типа того. Тогда я попробовал vdccm.. и мне показалось, что уже лучше. Появилось что-то первое и хорошее - программа запустилась без ошибок :). В остальном все было тихо и грустно. Я начал искать в гугле слово 'vdccm' и через какое-то время нашел, что некто пользовался утилитой triggerconnection, чтобы уведомить ActiveSync. Но в моих руках triggerconnection не производила никакого эффекта ни на vdccm, ни на ActiveSync. Я прошелся по исходникам triggerconnection, было походе, что оно (утилито) отсылает пакет на порт 5679 нашего PPC. Тогда я посканил КПК с помощью nmap. Но nmap сказал мне, что портов открытых немає. У меня не было никаких идей почему порт 5679 закрыт в том время, как сам ActiveSync запущен. Я устал и заколебался. Увы, я потратил кучу времени пытаясь понять почему порт 5679 закрыт, пока в конце-концов, не предположил, что порт может оставаться открытым только несколько секунд после того как мы воткнули КПК в кроватку. И действительно, vdcomm обнаружил КПК, когда я запустил tirggerconnection сразу после того, как воткнул КПК в крэдл. В этот раз стало ясно, что одна проблема закрывала собой другую. Теперь, vdccm мог обнаруживать КПК, но он не мог держать соединение с КПК больше нескольких секунд. И снова я стал гуглить. Где-то кто-то написал, что vdccm не работает с устройствами защищенными паролями. "@!#%@#%*#$!!!" воскликнул я. Я не хотел держать КПК не защищенным или снимать пароль каждый раз как я вставляю КПК в крэдл. Короче я сделал <a href="http://toril.ru/pda/vdccm-password.patch.gz">патч</a> для vdccm, сразу как только отреверсинженирил протокол авторизации и разобрался в коде synce. И тогда наше время пришло, пропатченный vdccm разарботал как надо! Вии! Итак вкратце, что я сделал:<br />1. Поставил usb-rndis-lite.<br />2. Поставил библиотеки: librapi2, libsynce.<br />3. Пропатчил vdccm.<br />4. Установил ifplugd. Он запускает ifup/ifdown для rndis0 когда это нужно.<br />5. Добавил следующее в /etc/network/interfaces:<pre><br />iface rndis0 inet static<br /> address 169.254.2.2<br /> netmask 255.255.255.0<br /> post-up /usr/local/bin/triggerconnection-delayed local-pda</pre><br />6. Добавил строку '169.254.2.1 local-pda' в /etc/hosts.<br />7. Написал /usr/local/bin/triggerconnection-delayed:<pre><br />#!/bin/sh<br /><br />sleep 2<br />exec /usr/local/bin/triggerconnection $@</pre><br />8. Следующее я добавил в ~/.xsession:<br /><pre>vdccm -d 3 -f -t -p `cat ~/.pda-pwd` 1>>~/logs/vdccm 2>>~/logs/vdccm &</pre><ad></ad><br />9. Записал секретный пароль в ~/.pda-pwd file (chmod 0600).<br /><br />Теперь могу наслаждаться использованием утилит: pls, pstatus... ставить кабы и тд.<br /><br />Любые комменты приветствуются.<br /><br />P.S. Патч собственно не совсем полный. Я написал его очень прямолинейно. Он не поддерживает ожидание ввода пароля откуда-то, вместо этого вы должны указать пароль через ключ -p. К сожалению, у меня нет времени это реализовывать.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-86382566777323718772007-02-04T03:12:00.002+02:002009-03-01T12:42:33.619+02:00LooxLight-2007-02-03Подробнее о Looxlight (утилита для Fujitsu-Siemens Loox N560/C550) смотрите <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br /><br />Обновление. Надеюсь исправил проблему из-за которой владельцы локализованных версий WM5 не могли поставить программу. Сообщение об ошибке сделал более детальным - если проблема все-таки не исчезла можно будет хоть понять причину более точно.<br /><br /><a href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-02-03.zip?attredirects=0">Зазипованный каб файл (2007-02-03)</a>,<br /><ad></ad><br />Будущие версии программы можно будет найти <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-20263169095474790782007-02-02T19:17:00.001+02:002009-02-22T16:18:01.704+02:00GoodWavPowerТретья программа. Смотрел <a href="http://firstloox.org/forums/index.php?styleid=1">форум firstloox</a> и <a href="http://firstloox.org/forums/showthread.php?t=7719">нашел</a>, что после того как КПК Fujitsu-Siemens Loox N560 или C550 просыпается из спящего режима, она вдруг начинает потреблять на 40мА больше, чем до сна. Советуют нажимать на кнопку Start - помогает. Попытался определить почему помогает и предположил, что проблема в аудио драйвере. Вобщем, поставив это программу забудите про эту багу, как если бы вы о ней не знали вообще. Вы сможете читать книги на 3 часа дольше на той же батарее.<br /><br /><a href="http://toril.ru/pda/GoodWavPower-2007-02-02.zip">Зазипованный cab архив (3k).</a><br /><a href="http://toril.ru/pda/GoodWavPower-2007-02-02.tar.gz">Сырцы (GPL, 11k).</a><ad></ad><br /><br />Следить за обновлением программы можно по <a href="http://rus.akshaal.info/search/label/goodwavpower">ссылке</a>.<br /><br />(другая программа, чтобы сэкономить эл-энэргию (где-то 15 ... 40мА) <a href="http://rus.akshaal.info/search/label/looxlight">тут</a>)Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-22776280666268622192007-02-01T07:46:00.002+02:002009-03-01T12:44:57.750+02:00LooxLight<p> <img ljaddtriggersobjectstatus="mouseout" src="http://toril.ru/lj/LooxLight-0.png" align="left" /><br />Я сделал это! Я написал свое второе приложение для PPC. LooxLight - это крошечное приложение, которое позволяет контролировать встроенные светодиоды на вашем FSC Pocket PC.<br /><ad></ad><br />Фичи:<br /><ll></ll></p><div style="margin-left: 30px;"><li> LooxLight позволяет управлять светодиодами: клавиатуры, wifi, bluetooth, gps, питания. Каждый светодиод может быть установлен в свое состояние. LooxLight может поддерживать любой светодиод в заданном состоянии или просто временно переключать из одного состояния в другое.<br /></li><li> Сервис LooxLight занимает всего 3.5k памяти, когда загружен (можно и не загружать). LooxLight не грузит процессор: сервис делает только то, что требуется в те моменты, когда оно требуется и не более того (реагирует на изменение состояний светодиодов). LooxLight не разряжает батарею.<br /></li><li> Работа из командной строки. Вы можете контролировать светодиоды из скриптов. Резидентная часть для этого не нужна. Например, "LooxLightCtrl +keyb sleep100 -keyb sleep100 +keyb" подмигнет вам подсветкой клавиатуры.<br /></li><li> Протестировано на Fujitsu-Siemens Loox N560 и Fujitsu-Siemens Loox C550. Но ЕМНИП должно работать и на Loox 720 / Loox 718 .<br /></li><li> Выложу исходники под GPL как только реализую все что хотел..<br /><br /><a class="snap_shots" href="http://downloads.akshaal.info/looxlight-1/LooxLight-2007-01-31.zip?attredirects=0">ZIP архив с CAB'ом (17k).<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: "trebuchet ms",arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.67/theme/silver/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -1128px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.67/t.gif" /></a><br /><br /><b>Что к чему в диалоге настройки.</b><br />KBD озанчает KEYBOARD т.е. клавиатура, BTH сокращение от BLUETOOTH, PWR это POWER т.е. питание как вы догадались уже. Каждая строка с элементами управления озаглавлена названием светодиода.<br />"On" кнопка просто включает светодиод, а "off" выключает. Blink означает мигать.<br />"KEEP ON"/"KEEP OFF" подразумевает, что LooxLight будет восстанавливать состояние светодиода после того как какая либо другая программа установит его в ненужное состояние.<br /><br />Некоторые элементы управления отключены сейчас, потому, что еще не реализованы.<br /><br /><b>Опции командной строки:</b><br />LooxLightCtrl.exe <op1> <op2> <op3> ... <opx>, где opN:<br /><ll></ll></opx></op3></op2></op1></li><li><i>stop</i> - выключает резидентную часть<br /></li><li><i>setup</i> - говорит резидентной части прочитать настройки из registry<br /></li><li><i>sleep123</i> - спать 123 миллисекунд (где 123 это любое положительное число)<br /></li><li><i>flashlight</i> - включает все светодиоды<br /></li><li><i>+wifi</i> - включает светодиод wifi<br /></li><li><i>-wifi</i> - выключает светодиод wifi<br /></li><li><i>+bluetooth</i> - включает светодиод bluetooth<br /></li><li><i>-bluetooth</i> - выключает светодиод bluetooth<br /></li><li><i>+gps</i> - включает светодиод gps<br /></li><li><i>-gps</i> - выключает светодиод gps<br /></li><li><i>+keyboard</i> - включает светодиод клавиатуры<br /></li><li><i>-keyboard</i> - выключает светодиод клавиатуры<br /></li><li><i>+power</i> - включает светодиод питания<br /></li><li><i>-power</i> - выключает светодиод питания<br /></li><li><i>=power</i> - включает светодиод питания в режим мерцания<br /><br /><b>История создания:</b><br />Однажды я нашел <a class="snap_shots" href="http://www.textzombie.com/keylightc/">KeyLightC<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="border: 0pt none ; margin: 0pt ! important; padding: 1px 0pt 0pt; max-height: 2000px; max-width: 2000px; min-width: 0px; min-height: 0px; font-style: normal; font-weight: normal; font-family: "trebuchet ms",arial,helvetica,sans-serif; float: none; position: static; left: auto; top: auto; line-height: normal; background-image: url(http://i.ixnp.com/images/v3.67/theme/silver/palette.gif); background-color: transparent; visibility: visible; width: 14px; height: 12px; background-position: -1128px 0pt; background-repeat: no-repeat; text-decoration: none; vertical-align: top; display: inline;" src="http://i.ixnp.com/images/v3.67/t.gif" /></a>. Это была полезная программа, но в ней нельзя было включать-выключать отдельные светодиоды (а только все вместе и только выключать). Также там нужно было заново запускать KeyLightC как только какая-то программа поменяла состояние светодиода или просто после включения КПК. Я написал письмо Phill McManus. Я попросил его добавить опции +keyboard или -keyboard. Также я попросил его открыть исходники KeyLightC, чтобы я сам мог добавить эти фичи, если у него нет времени или желания. Но он не ответил. Тогда я начал мои собственные исследования прошивки. Прошло порядка 20 вечеров, прежде чем я нашел как управлять светодиодами правильным образом. Потом ушло порядка 10 вечеров, чтобы разобраться как писать под КПК и как пользоваться WinCE API. Потом ушло 3 дня, чтобы избавится от ужасного MS Visual Studio и мигрировать на mingw32ce под линух. И вообще, я ненавижу Win32 API за тонну подводных камней и неожиданностей.<br /><br /><b>Планы:</b><br /><ll></ll></li><li>Реализовать режим фонарик (не всегда темнота друг молодежи).<br /></li><li>Доделать контроль светодиодов питания и GPS..<br /></li><li>Реализовать контроль уровня подсветки.<br /><br /><b>О прошивке Loox N560/C550.</b><br />Я уже устал от этого поста. Опишу в другом попозже.<br /><ad></ad><br /><b>Обратная связь:</b><br />Было б прикольно увидеть комменты с пожеланиями, замечаниями и информацией у кого заработало (и на чем), а у кого нет (и на чем).</li></div><br />Новые версии программы <a href="http://rus.akshaal.info/search/label/looxlight">здесь</a>.<br />Другая программа для уменьшения расхода заряда батареи описана <a href="http://rus.akshaal.info/search/label/goodwavpower">здесь</a>.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com2tag:blogger.com,1999:blog-6827363280592532957.post-78816656216140404412006-12-14T23:52:00.001+02:002009-02-22T16:22:34.984+02:00Восстановление после чисткиЕсли вы обладатель КПК, то наверняка слышали про утилиты MemMaid или SKTools, а значит этот пост для вас. Если вы к тому-же не только слышали, но еще и пользуетесь, то это 100% для вас. Если вы не только пользуетесь одной из этих программ, но еще и по глупости полностью почистили Notification Queue и не знаете как заставить КПК работать - как раз об этом и пойдет речь.<ad></ad><br />1. Почему это проблема? Notification queue (очередь уведомления, NQ) говорит КПК какое действие необходимо выполнить когда какое-то событие произошло. Например, если вы включаете КПК, то это событие AppRunAtWakeup (или типа того). КПК не будет ничего делать по событиям, если вы почистили NQ. Самое главное, что вы не сможете даже приконнектится своим КПК к ПК с помощью обычных USB, IR, RS232. Это означает, что вы не сможете синхронизировать ваш КПК с ПК, а также не сможете его поэксплорить с вашего большого компьютера.<br /><br />2. Как я могу это вылечить? Простой путь - это восстановить состояние КПК из резервной копии. Очень хорошо иметь такую свежую копию :)))).<br /><br />3. У меня нет резервной копии... не совсем так... есть, но она древняя, что я могу сделать в этом случае? Вы можете сделать аппаратный сброс (Hard Reset, XР). Но все же лучше восстановится из бэкапа, даже если он у вас древний.<br /><br />4. Я не хочу делать ХР или восстанавливаться из резервной копии! Да, я тоже. Тогда мы должны добавить события в NQ вручную.<br /><br />5. Какие события я должен добавить? Чтобы узнать список событий вы можете: сделать бэкап, сделать ХР, установить SKTools и записать список событий из очереди уведомления, затем восстановится из бэкапа. Или вы можете найти список для вашего КПК в интернете. В моем случае, я посмотрел на КПК моей жены. У нее КПК почти такой же как у меня (у нее C550, у меня N560).<br /><br />6. Как добавить события в NQ? SKTools - лучшее что я видел для этих целей.<br /><br />7. Мне нужно добавить "\windows\repllog.exe AppRunAfterRndisFnDetected", но SKTools не имеет события "AppRunAfterRndisFnDetected"! Да! Это сейчас основная проблема. <br />Я потратил четыре дня, чтобы найти такую программу, которая бы позволяла мне добавить это событие. Но я не нашел. Не было такой программы. Поэтому я написал свою. Вот она: <a href="http://toril.ru/soft/akrndisadd.exe">http://toril.ru/soft/akrndisadd.exe</a>. Просто запустите ее на КПК. Она должна показать "True", если событие было успешно добавлено. <br /><br />8. Как я могу поместить эту программу на КПК, если я не могу посмотреть содержимое моего КПК с ПК, пока это событие не добавлю? Вы можете переместить программу с помощью Bluetooth, WIFI, MMC/SD/CF карты, инфракрасного порта или RS232 :).<br /><br />Исходники akrndisadd<br /><pre>#include "stdafx.h"<br />#include <windows.h><br />#include <commctrl.h><br />#include <notify.h><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> TCHAR *r = TEXT ("False");<br /><br /> // This API is deprecated. I know.<br /> if (CeRunAppAtEvent (TEXT("\\windows\\repllog.exe"), 14L)) {<br /> r = TEXT ("True");<br /> };<br /><br /> MessageBox (NULL, r, r, MB_OKCANCEL | MB_ICONEXCLAMATION);<br /> return 0;<br />}<br /></pre><ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0