Пользуем андройдовский TTS удаленно.

Как это не странно, но в андройде появились TTS движки, от которых уже не тошнит. Потому, я оставил мысль собирать qemu в режиме исполнения x86 кода на arm, для запуска cepstral’овского синтеза, и решил заюзать родной андройдовский.
Пришлось вспоминать жабу. Опыт программирования на ней у меня сводился к написанию какого-то хеллоуворлда на j2me года эдак 4 назад.
После энного количества мытарств получилось это: Небольшая софтинка NetTTS.


(далее…)

OpenWRT на ноунейм роутере (RT3050F) (Теперь с USB!)

Как и обещал, прикрутил к этому зверю USB. Спасибо говорим Layne Edwards за его dwc_otg патчи – теперь все пашет.
Так как я сам активно юзаю эту железку, то буду делать бинарные билды.
Хватаем бинарную сборку на странице загрузки download page
Release notes:

  • comgt для 3g модемов встроен
  • USB host и dwc_otg вкомпилены в ядро, форвард портированы до транка
  • Подрехтовал размер mtd
Известные баги:
Так как usb вкомпилено в ядро доп. пакеты ставятся при помощи –force-depends

Necromant’s MultiDrop UART: Софтовая часть

Хех, несмотря на все, в девайсе нашлиись баги. Причем аппаратные в схемотехнике, которые надо будет переделывать. Например, транзюки в открытом состоянии давали просадку в 0.2 вольта, а следующий за ним диод добавлял еще 0.1 вольт, в итоге 3.3 превращались в 3.0 вольт. Терпимо, но неприятно. потому P мосфеты уже летят ко мне из солнечного китая.
ну а пока они летят, я занялся софтом. Немного красноглазия и на свет родилась простая консольная утилитка muart-ctl, которая переключает канал и напряжение. А фронтенд… хех..
Я замахнулся на плазмойд для KDE4 в виде фронтэнда.

Думаю, основное скажет скрншот:
А вот так выглядит на всем досктопе :

Управление профилями пок еще не реализовано, и будет сделано в мелкой утилитке для командной строки. В остальном, все работает.
Плазмойд сварганен на javascript’e. Биндинги оказались документированы фигово, потому пришлось немного поработать телепатом. Неприятным сюрпризом оказалось отсутствие у жабаскрипта апи к dbus’у. То есть утилитка не сможет пнуть плазмойд, чтобы тот перерисовался при изменении параметров из командной строки. (Никита Мельниченко в своем плазмойде makeProgress сварганил эту часть в виде датаэнджина на питоне, но я что-то как-то не хочу так извращаться. Подожду апи, наверное.) Так или иначе, для первого проектика на джаваскрипте неплохо.
И опять огромное спасибо Никите за его плазмойд makeprogress. Его я зазобрал на куски и пользовал вместо документации.

Сооружаем библиотеки для кикада полуавтоматически.

В общем, частенько надо сделать очередной символ для еесхемы. Благодаря утилитке от Rochbacher’a http://kicad.rohrbacher.net/quicklib.php это превращается в рутину. Скажи сколько выводов у микросхемы, забей имена пинов, скажи как ориентировать… Да в общем-то и все.
Вот только если ног за 200, заполнять это долго. Когда я делал символ для at91rm9200 терпение лопнуло на 30й ноге. А их там 208… Вот в тот момент мне и пришла в голову хорошая мысля. К сожалению, принимать файл с именами пинов утилита от Рохбахера не умеет, а его ящика почтового полазив по сайту я так и не нашел. Потому пришлось быстро сварганить костыль.

Нам потребуются:

bash (Куда же без него)
xdotool
okular (Или другой вювер PDF, который умеет выделять текст)

Шаг первый.
Открываем даташит и находим список ног. Например такое:

Шаг второй.
Копипастим имена ног в пустой файлик. Одна нога на одну строчку, строго по порядку.

Шаг третьий.
Далее немного черной магии. Берем вот этот готовый скрипт на баше:

#!/bin/bash
write_pin()
{
xdotool type "$1"
xdotool key Tab Tab Tab Tab Tab Tab
}
 
if [ $# -lt 1 ]; then
  echo "Usage: fill-pins filename"
  exit
fi
 
echo "Starting in 5 seconds..."
sleep 5
 
cat $1|while read line; do
  write_pin "$line"
done

Сохраняем, chmod +x, и скармливаем ему аргументом наш файлик с распиновкой. У нас есть 5 секунд переключиться на окно браузера и поставить курсор на строчку с надписью PIN1 (и выделить ее).
Далее скрипт читает каждую строчку из файла с распином, вбивает ее за нас в поле, жмет 6 раз Tab, чтобы перескочить на следующую… И так далее.
Можно пойти попить чаю. Выглядит забавно:

На время работы костыля лучше прихлопнуть все аськи, скайпы и прочее – так как одно всплывающее окошечко с “Приффет пайдем гулять” способно украсть фокус у браузера и, как следствие, загубить заполнение распина… а вхудшем случае ответить человеку в ICQ здоровенным списком пинов микросхемы…

Роутер EDUP, RTL8196C и напильник: Эпизод первый, сборка тулчейна.

Не так давно стал обладателем карманного роутера с DX’a. Из плюсов стоит отметить наличие батарейки и чехла в комплекте. На этом хорошее заканчивается.
После краткого знакомства с функционалом девайса понял, что без серьезной доработки напильником юзать сию поделку никак не катит.

Начал с того, что разобрал. Внутри заметен неотмытый флюс, криво припаянные диоды. Антенна одна, smdшная, хотя разведено на плате две. опознать бы рассыпушные кондеры, и можно было бы второй комплект напаять и внешнюю вывести. Но учитывая что их там овер 10 штук и он меньше 0603, желание как-то отпало.

Уарт нашелся легко и непринужденно, куда вскоре была впаяна PBSка.
Унутрях кривой реалтековый загрузчик и ведро 2.4 серии. Частота 390Mhz, ОЗУ – 32, ПЗУ 4 метра в виде SPI флешины, USB 2.0 EHCI.

Гугль выдал мне на RTL8196C большой жирный кукиш. опенврт, дд-врт и прочие на этот чип вроде как забили.

Но кое что я все же нашел. Первое – что человек из проекта Wive-NG ( sfstudio.livejournal.com ) явно богат SDK под этот чип, и русским народным матом ругается в адрес криворуких *** *** ****** изувечивших ядро. Пришлось под openid регистрировать аккаунт для мессаджей и комментов в жжшке и поспрашать человека, и вот что я выяснил:

* SDK есть под 2.6.30, но он его не даст ибо NDA подписал, но оно есть в виде тарболлов которые выкладывают под свои роутеры длинки и иже с ними.
* Собирать надо только наркоманским тулчейном реалтековцев ибо их чип куда-то прокачался от MIPS’a… не в ту сторону.

Ура, сказал я, и попер в сеть за сырцами. Выбор пал на сырцы от TEW-652BRP. Там тот же вроде как чип, и сдк явно внутри подойдет.
Тарболл представлял из себя матрешку. Изрядно задолбавшись распаковвывать архив внутри архива, я нашел там исходники ядра линуха, тулчейна и еще кучки бородатых сопутствующих пакетов на радость археологам.

Далее изучив сырца ядра, я пришел в некое недоумение. Предупреждение относительно качеста сырцов явно было к месту. Ради своей поделки там соорудили новую архитектуру rlx (копия arch/mips) куда добавили поддержку своего камня.

Ладно, их тулчейном, так их тулчейном. Поматюгавшись на их скрипт сборки, который предполагал наличие сырцов с /toolchain (Гадим в корень, ай-ай-ай). Ладно, не гордые, сделал там симлинк на внешний веник со всей этой кухней, начинаем собирать тулчейн. И вот тут меня ждали приключения на всю мою голову. Слабонервным лучше не читать дальше.

Первая бага, от которой сборка вывалилась с ошибкой связана была с uclibc решилась вот этим патчем:
http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-03/msg04460.html
Вторая бага при сборке gcc (кстати, 3.4.6, вот некроманты, а?). Жаловалось на отсутствующий файл c-parse.c
При помощи гугла и медитации допер, что этот файлик генерируется bison’ом, а оный генерировал в той версии файлик правильно, так как в нем была ошибка, и чтобы более новый bison, стоящий у меня в системе этот файлик сгенерил, надо прокрутить странички на 3 наверх, найти его выхлоп (который почему-то в мейкфайле игнорируется и за ошибку не считается), и запомнить строчки, на которые он материться. Далее открыть этот c-parse.y и заменить $$ на $<ttype>$, и все пойдет дальше.

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

http://wiki.ok-labs.com/forum#nabble-td3526733

Пожалуй, это была последняя по существу. Правда? Нет! Почти в самом конце, когда паковался libgcc.a я узрел
*** buffer overflow detected ***: mips-linux-ar terminated

По счастью, имея дело с софтом разной степени бородатости и уродства, наученный горьким опытом, я держу при себе сразу все версии gcc которые есть в репозиториях бубунты, да и еще парочку самособранных, со времен когда я LFS собирал. Сборка при помощи gcc 4.1 решила проблему и я получил рабочий тулчейн. Если код, собранный им еще и заработает на роутере… вообще хорошо будет.

Продолжение следует.

Китайская поделка на InfoTM X220

Собственно свершилось. Ко мне дошел планшет на базе этого китайского чипа.
Помня большое количество мучений с SmartQ 7 я уже заготовил набор напильников, но оказалось, что китайцы в этот раз сделали все на удивление неплохо.
Итак, сначала самые основные пункты.
Тачскрин резистивный, но на удивление неплохой. нареканий особо нет, по клавиатуре не промахиваюсь, калибровка не сползает, при удержании стилуса на одном месте дребезг малозаметен.
GPS действительно есть и действительно работает. Внешняя антенка в комплекте пришлась кстати.
Видео SD и HD кушает очень неплохо, при помощи встроенного CCPlayer’a. Это поделие с “пакманом в наушниках” на значке не переводится на английский/русский но свое главное дело – играть фильмы делает. Разного рода HD кино я особо не гонял, еще предстоит, но SD играет на ура.
3D действительно есть, и действительно работает. Несколько скачанных с маркета игрушек завелись сразу.
Акселерометр тоже порадовал. aTilt3D на таком экране выглядит красиво и работает без нареканий и тормозов.
камера – обычный веб глаз, не думаю что говорить тут надо о ней особо.
Чувствительность микрофона могла бы быть и выше.
Динамики достаточно тихие, пока еще не смотрел решается ли эта проблема программно.
_ОЧЕНЬ_ порадовал USB. Оба порта не просто работают в 2.0 режиме, обеспечивая хорошую скорость как чтения, так и записи, но и еще выдают хороший ток. Планшет без проблем раскачал два внешний жесткий диска от одной батареи и перекопировал образ убунты с одного на другой. USB флешки/веники монтируются автоматом, если там fat, ext2/3 и все остальное не видит.

Теперь неприятные вещи и как с ними бороться.
Первое – это wowHome. Замена стандартному хоуму с “3д кубиком” для выбора приложений. Жрет около 40ка мегабайт памяти, и при установки LauncherPro или альтернативного хоума все равно запускается.
Судя по отрисовке, эта поделка не использует возможности 3д ускорителя, и рисует кубик через 2д – отсюда и тормоза.
Второе – “Живые обоины” не работают обычно как надо, если используют 3д. работают через раз, тормозят… в общем отключать. Благо не шибко большая потеря. \
Скайп не хочет работать нормально – звонит, а потом сразу call failed. Входящие звонки тоже не ловит – только текст.

Ну а теперь вооружимся напильником и доведем клиента до кондиции.
Сначала получаем права администратора при помощи Universal androot. проблем здесь никаких, все одной кнопкой. Далее через root explorer или командную строку ищем и переименоввываем/сносим wowHome.apk.
Это наконец прибьет китайский хоумскрин. Вместо него будет либо стандартный андройдовский хоум, либо тот, который поставите себе. Я влепил себе туда LauncherPro. Работает очень плавно, без замираний. Попутно это показало рисованную китайскую красавицу с светлоголубыми волосами.

Выглядит по любому лучше тормознутого WowHome. Сам девайс при этом разогнался, и по отзывчивости стал не слишком уступать моему Motorola Milestone.
Из прочего софта не помешает autorotate switcher, ибо лежать на боку и читать в альбомной ориентации экрана иначе не выйдет.
Но это уже на любителя.

Время работы. Погонять девайс еще предстоит, но за время просмотра 40-минутной серии мозгоразжижающего Fringe, который я скачал для тестов батарея села где-то на 40%.
Учитывая, что смотрел я его с внешнего жесткого диска при максимальной яркости подсветки вполне достойный результат. Посмотрим, как батарея будет деградировать со временем.
Антена WiFi немнго даже лучше майлстоуновской, соединение держит стабильно и проблем в стиле SmartQ7, от которых я избавлялся при помощи другой антенны, паяльника и великого русского языка не было. Сверху есть переключательль WiFi, что оказалось удобным. Подозреваю, что power management для адаптера они нормально не осилили, потому и вывели переключатель наружу.
Проверил – оказался прав. С программно выключенным вайфаем батарейка садиться немного быстрее.
Проводная сеть работает на ура, хотя ADSL я не тестил, ровно как и 3G.

Из прочих раздражающих мелочей – шипящий во время работы динамик и заметно пищащий при максимальной яркости экран.
Первое должен в теории вылечить фильтрующий кондер на питание усилка (Или DAC’a), но пока вскрывать и лезть внутро с паяльником не хочется.
Лекарств от второго я особо пока не знаю. К счастью, на максимальной яркости я обычно не работаю.

Китайская мобила + MakeProgress = Вольтметр питания УСБ

Собственно вожусь со своим сетапом для удаленной отладки. УСБ девайсов у меня много, 10портового хаба не хватает. Разумеется запитать все это дело, когда там заряжается планшет мобильник, питается несколько девборд и прч. проблемно. Надо бы знать, когда питалово проседает. По крайней мере пока я не поставлю более мощный адаптер питания.
В общем воспользовавшись АТ командой AT+EADC=1, православным башем, и плазмоидом MakeProgress получил примерно такое:

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

at_daemon.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
 
if [ -e /tmp/at_fifo ]; then
echo "Already ready."
cat /dev/rfcomm0 >> /tmp/at_fifo&
else
mkfifo /tmp/at_fifo
chmod 777 /tmp/at_fifo
echo "Configuring interface"
rfcomm bind rfcomm0 34:71:B9:53:66:01 10 
stty -F /dev/rfcomm0 115200 
echo "AT interface ready"
fi
 
#enable ADC & EKPD by default
 
./at_files/init.sh&
 
while true; do cat /tmp/at_fifo|while read line; do
#echo $line
CMD=`echo $line|cut -d" " -f1`
DATA=`echo $line|cut -d" " -f2| sed 's/.$//'`
case "$CMD" in
  "+EADC:")
  VBAT=`echo $DATA|cut -d"," -f1`
  VUSB=`echo $DATA|cut -d"," -f5`
  echo '{"minimum":0,"maximum":4.5,"value":'$VBAT'}' > /tmp/vbat
  echo '{"minimum":0,"maximum":6,"value":'$VUSB'}' > /tmp/vusb
  echo "VBAT=$VBAT; VUSB=$VUSB"
   ;;
  "+EKPDS:")
  KEYEVENT=`echo $DATA|cut -d"," -f1`
  KEYCODE=`echo $DATA|cut -d"," -f2`
  if [ $KEYEVENT -eq "1" ]; then
    echo $KEYCODE
    ./keymaps/e71.map $KEYCODE
    fi
  ;;
  "SEND")
  ATCMD=`echo $line|cut -d" " -f2`
  echo "$ATCMD" > /dev/rfcomm0
  echo "Sending CMD: $ATCMD"
  ;;
  "ERROR")
  echo "Bad stuff =("
  ;;
  "OK")
  echo "All fine"
  ;;
  *)
  echo $line
  ;;
 esac
done
done

init.sh
Высылает команды на включение вывода с ацп
AT() выдергиваем отсюда для своих нужд.

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
AT()
{
echo "SEND AT$1" > /tmp/at_fifo
}
sleep 5
#Since there's a bug/feature - a double command of the same thing just increases the poll frequency
AT "+EKPD=0"
AT "+EADC=0"
AT "+EKPD=1"
AT "+EADC=1"

e71.map
Пример мэппинга. В туду сделать его красивше, но это как-нибудь в следующий раз.
e71.map
A small and limited example of key mapping script. Yet to be remade into a better looking map using a more neat solution.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash -x
echo $1
 
case "$1" in
14)
  xdotool key Up
;;
15)
  xdotool key Down
;;
16)
  xdotool key Left
;;
17)
  xdotool key Right
;;

МейкПрогресс для этого пришлось немного хакнуть, он только в % отображал значение. Фичреквест отправил Никите Мельниченко, авось пофиксит к след. релизу.
P.S. Через TST-PS можно оказывается получать координаты нажатия на экран. Жаль в синий зуб не пробросишь…

madwimax + ap mode

Пришлось попотеть прежде чем заставить заработать субж на ноуте. По ходу модуь ath5k идущий с бубунтой 10.04 не умеет режима точки доступа и нужно ставить ath_pci. (Фанатики сча заорут про проприетарный hal и ненужность, бла бла.) Забавно, что снапшоты не заработали, и не хотел работать даже svn head. Все запускается, но не видят AP устройства, а сам лэптоп вайфай сетки.
Внезапно: modbrobe -r ath5k && modprobe ath_pci работать вообще никаким макаром не будет.Надо либо заблэклистить ath5k, и перезагрузиться, или


modprobe -r ath5k
переводим лэптоп в спячку
будим
modprobe ath_pci

Впрочим, виндофанаты могут сделать и ребут. Им не привыкать.
Ну а теперь самое главное скрипт, переключающий режимы wifi карточки между AP и STA

#!/bin/bash
WW=$1
if [ $WW == "ap" ]; then
ifconfig ath0 down
wlanconfig ath0 destroy
killall knetworkmanager
/etc/init.d/network-manager stop
wlanconfig ath0 create wlandev wifi0 wlanmode ap
#wlanconfig ath0 destroy
#wlanconfig ath0 create wlandev wifi0 wlanmode ap
#wlanconfig ath1 create wlandev wifi0 wlanmode sta nosbeacon
hostapd -B /etc/hostapd/anomalia.conf&
sleep 1
ifconfig ath0 192.168.0.1
/etc/init.d/dhcp3-server start
exit 0
fi
if [ "$WW" == "sta" ]; then
killall hostapd
ifconfig ath0 down
wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta nosbeacon
sleep 1
/etc/init.d/network-manager start
su necromant -c knetworkmanager&
/etc/init.d/dhcp3-server stop
sleep 1
exit 0
fi

./ap.sh ap прибивает network-manager & knetworkmanager
(Гномерам надо прибивать nm-applet)
./ap.sh sta возвращает sta режим.
Дешево, сердито, но работает.
Полный хавту писать было лень.

MakeProgress + mysql + PHP

ТЗ: Хранить задания со статусом выполнения на серваке и отдавать их плазмойду мейкпрогресс.

Реализация: Так как набросать надо было быстро – обошлось мне в 100 строк на пыхыпэ, для хранения используется mysql

Лицензия: WTFPL

Исходник под катом, выслал Никите Мельниченко, глядишь включит в виде бонуса к плазмойду.

(далее…)

Сетевой изврат

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

conntrack -e DESTROY -s x.x.x.x -E | (while true; do read line; echo $line; lsay “The board is ready to use”; done )

где вместо x.x.x.x айпишнег стенда. Это конечно не тунель овер ицмп, но тоже весело.