<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8183423703741506019</atom:id><lastBuildDate>Wed, 02 Nov 2016 20:37:39 +0000</lastBuildDate><category>linux</category><category>web</category><category>ubuntu</category><category>windows</category><category>embedded</category><category>Gimp</category><category>vkontakte.ru</category><category>WiFi</category><category>kernel</category><category>photo</category><category>EeePC</category><category>Google App Engine</category><category>icq</category><category>vdpau</category><category>глупости</category><category>lamerkit</category><category>python</category><category>video</category><category>Mandriva</category><category>arduino</category><category>google wave</category><category>metasploit</category><category>raid</category><category>android</category><category>latex</category><category>liquid rescale</category><title>Take World</title><description>Мой &quot;технический&quot; блог, где я буду писать умные мысли, которые иногда приходят мне в голову.</description><link>http://takeworld.blogspot.com/</link><managingEditor>noreply@blogger.com (Владимир Яковлев)</managingEditor><generator>Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-2915013303822467132</guid><pubDate>Mon, 03 Sep 2012 09:25:00 +0000</pubDate><atom:updated>2012-09-03T13:26:44.440+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Раздача интернета с нового модема Yota LTE LU156</title><description>Yota в питере включила LTE, и пришлось поменять старый модем Samsung на новый модем Yota LTE LU156.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.yota.ru/upload/iblock/ddd/one_lte__003_new.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;252&quot; src=&quot;http://www.yota.ru/upload/iblock/ddd/one_lte__003_new.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Новый модем, новые правила раздачи интернета.&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Вообще модем мне понравился. Старый модем работал только через левый драйвер madwimax, а новый определяется как сетевая карта, и инет сразу есть. Проверял в Ubuntu 12.04 и 9.04, проблем никаких.&lt;br /&gt;&lt;br /&gt;А вот с раздачей интернета проблемы. У меня уже была настроена раздача интернета на несколько человек через nat (в iptables, ничего особенного), так что я думал просто заменить имя интерфейса, и инет пойдет. Однако фокус не прошел, ноутбук прекрасно делает nat, с любого компьютера можно добраться до модема (у него есть внутренний ip адрес и web страница), а дальше сигнал не идет. Похожая проблема замечена даже на windows &lt;a href=&quot;http://forum.yotatester.ru/showthread.php?t=4691&quot;&gt;http://forum.yotatester.ru/showthread.php?t=4691&lt;/a&gt;.&lt;br /&gt;Проблема решилась установкой моста (bridge) вместо nat. Этот модем сам умеет делать nat на несколько компьютеров, и простого моста между сетями достаточно.&lt;br /&gt;&lt;br /&gt;Вот как выглядит мой /etc/network/interfaces &lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;auto lo br0&lt;br /&gt;iface lo inet loopback&lt;br /&gt;&lt;br /&gt;iface eth0 inet manual&lt;br /&gt;&lt;br /&gt;iface eth1 inet manual&lt;br /&gt;&lt;br /&gt;iface br0 inet static&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bridge_ports eth0 eth1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address 10.0.0.10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; broadcast 10.0.0.255&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; netmask 255.255.255.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gateway 10.0.0.1&lt;/blockquote&gt;&lt;br /&gt;eth0 - сетевая карта ноутбука, eth1 - модем, 10.0.0.1 - адрес модема, можно изменить на странице &lt;a href=&quot;http://forum.yotatester.ru/url.php?url=http://status.yota.ru/network&quot; target=&quot;_blank&quot;&gt;http://status.yota.ru/network&lt;/a&gt;(внутри модема).&lt;br /&gt;&lt;br /&gt;Дальше выяснилась проблема, в модеме есть dhcp сервер, но в новых версиях он выдает адрес только один раз. Проблему проще всего решить установив статические адреса на всех компьютерах. Но я решил повозиться, запустил dhcp сервер на тот же диапазон что и модем, и отфильтровал через iptables ответы dhcp от модема. Если их пропустить, то некоторые компьютеры не попадают в сеть, т.к. получают сразу два ответа, один с адресом, другой с отказом.&lt;br /&gt;&lt;br /&gt;Вот кусочек из /etc/dhcp3/dhcpd.conf &lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;subnet 10.0.0.0 netmask 255.255.255.0 {&lt;br /&gt;&amp;nbsp; range 10.0.0.50 10.0.0.254;&lt;br /&gt;&amp;nbsp; option routers 10.0.0.1;&lt;br /&gt;&amp;nbsp; option domain-name-servers 8.8.4.4, 4.2.2.1;&amp;nbsp; &lt;br /&gt;}&lt;/blockquote&gt;Так же дла автоматического перезапуска dhcp потребовалось создать /etc/network/if-up.d/&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;/etc/init.d/dhcp3-server restart&lt;/blockquote&gt;</description><link>http://takeworld.blogspot.com/2012/09/yota-lte-lu156.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-5823083943795115921</guid><pubDate>Mon, 09 Jul 2012 07:40:00 +0000</pubDate><atom:updated>2013-01-01T17:05:47.012+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Создание u-boot enviroment на компьютере</title><description>При разработке устройства на linux с процессором ARM возникла проблема, необходимо каждому&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;устройству&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;автоматически&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;задать уникальный MAC адрес. В устройстве используется загрузчик u-boot, и в его переменных окружения хранится mac адрес сетевого интерфейса платы.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;MAC адрес можно установить вручную. Для этого нужно подключиться к плате через COM-порт, и вручную ввести команды типа&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;setenv ethaddr&amp;nbsp;48:5b:39:b7:8f:84&lt;br /&gt;saveenv&lt;/blockquote&gt;Недостаток очевиден - куча ручной работы, и я стал искать способ создать этот enviroment на компьютере, и&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;уже в готовом виде,&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;записать в устройство .&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;В результате нашлась программа m&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;kenvimage, ей на вход подается файл со всеми переменными окружения, типа такого&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;baudrate=115200&lt;br /&gt;bootargs=console=ttyS0,115200 root=/dev/mtdblock5 mtdparts=atmel_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(kernel),-(root)rw ubi.mtd=5 rootfstype=ubifs root=ubi0:ps887-rootfs&lt;br /&gt;bootcmd=nand read.e ${loadaddr} kernel; bootm&lt;br /&gt;bootdelay=0&lt;br /&gt;bootfile=uImage&lt;br /&gt;ethact=macb0&lt;br /&gt;ethaddr=48:5b:39:b7:8f:80&lt;br /&gt;ipaddr=192.168.0.208&lt;br /&gt;loadaddr=0x70400000&lt;br /&gt;mtdparts=mtdparts=atmel_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(kernel),-(root)&lt;br /&gt;serverip=192.168.0.67&lt;/blockquote&gt;&lt;div&gt;Вызываем следующим образом&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;./mkenvimage -s 131072 -o out.env -r env.txt&lt;/blockquote&gt;И получаем файл out.env, пригодный для записи в nand флешку в устройстве. В параметрах указывается размер (-s) и наличие redundant enviroment (-r).&lt;br /&gt;&lt;br /&gt;Дальше встал вопрос, как сделать это на windows. В u-boot заявлена поддержка mingw для этой программы, но компиляция вылетает с ошибкой.&lt;br /&gt;&lt;br /&gt;В итоге ошибку я исправил, получился такой патч:&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/3074734.js&quot;&gt;&lt;/script&gt;Патч я отправил разработчикам u-boot, его приняли, и начаиная с версии &lt;a href=&quot;http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commit;h=8b6a4952e6064dc558cb7d5d375990b17491f26f&quot; target=&quot;_blank&quot;&gt;8b6a4952e6064dc558cb7d5d375990b17491f26f&amp;nbsp;&lt;/a&gt;&amp;nbsp;все должно быть нормально.&lt;br /&gt;Дальше начинаем ставить, проверено на ubuntu 12.04 и 11.04. Для начала потребуется mman-win32, какая то примочка-адаптация под mingw, потом компилируем сам u-boot.&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;sudo apt-get install mingw32&lt;br /&gt;svn checkout http://mman-win32.googlecode.com/svn/trunk/ mman-win32-read-only&lt;br /&gt;cd mman-win32-read-only&lt;br /&gt;bash configure --cross-prefix=i586-mingw32msvc- --prefix=/usr/i586-mingw32msvc/ --libdir=/lib --incdir=/include/sys/&lt;br /&gt;make&lt;br /&gt;sudo make DESTDIR=/usr/i586-mingw32msvc install&lt;br /&gt;cd ..&lt;br /&gt;git clone git://git.denx.de/u-boot.git&lt;br /&gt;cd u-boot&lt;br /&gt;make HOSTCC=i586-mingw32msvc-gcc HOSTSTRIP=i586-mingw32msvc-strip tools&lt;/blockquote&gt;&lt;div&gt;После этого в папке tools будет файл&amp;nbsp;mkenvimage.exe, пригодный для запуска на windows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;До меня никто этого похоже не делал, и в интернете я не смог найти готовый файл, поэтому выкладываю сам:&lt;/div&gt;&lt;div&gt;mkenvimage.exe для создания u-boot enviroment на компьютере, можно скачать по этой ссылке (&lt;a href=&quot;http://narod.ru/disk/65021869001.b56b8ac47d1d54bed8470d4c1800ae13/mkenvimage.exe.html&quot; target=&quot;_blank&quot;&gt;mkenvimage.exe&lt;/a&gt;).&lt;/div&gt;</description><link>http://takeworld.blogspot.com/2012/07/u-boot-enviroment.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-1556442623857453033</guid><pubDate>Thu, 08 Sep 2011 11:23:00 +0000</pubDate><atom:updated>2011-09-09T10:09:27.069+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Удаленная отладка ARM Linux под Eclipse</title><description>Пришло время красиво написать программу для mini2440 или любой другой ARM платы. Для этого будем использовать Eclipse, и в итоге добьемся удаленного запуска и отладки приложений.&lt;br /&gt;&lt;br /&gt;В общем процесс выглядит так:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;На компьютере компилируется программа с использованием кросс-компилятора arm&lt;/li&gt;&lt;li&gt;Программа заливается на плату через SSH&lt;/li&gt;&lt;li&gt;На плате запускается gdbserver&lt;/li&gt;&lt;li&gt;Eclipse запускает gdb и устанавливает соединение с платой, отладка началась&lt;/li&gt;&lt;/ol&gt;Eclipse автоматизирует этот процесс, достсточно нажать кнопку debug. &lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Установка&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для начала скачиваем Eclipse с официального сайта &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;http://www.eclipse.org&lt;/a&gt;, нам нужна версия&amp;nbsp;Eclipse IDE for C/C++ Developers.&lt;br /&gt;&lt;br /&gt;Так же нам понадобится toolchain под ARM. С собрал сам, с помощью OpenEmbedded, но пойдет любой, например CodeSourcery.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Настройка Eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Открываем project-settings. Там C/C++ build -&amp;gt; Enviroment. Добавляем переменную PATH со значением&lt;br /&gt;&lt;blockquote&gt;/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/bin/:/usr/local/angstrom/arm/bin/:${PATH}&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-7tAH057qtxM/TmiftvZdOMI/AAAAAAAACR0/1tcSWyhQMNA/s1600/path.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;134&quot; src=&quot;http://3.bp.blogspot.com/-7tAH057qtxM/TmiftvZdOMI/AAAAAAAACR0/1tcSWyhQMNA/s320/path.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Где /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/ - путь к вашему toolchain.&lt;br /&gt;В разделе settings-&amp;gt; GCC C++ Compiler в includes добавляем&lt;br /&gt;&lt;blockquote&gt;/usr/local/angstrom/arm/include/&lt;/blockquote&gt;Тоже самое в GCC C Compiler.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-xTxu_x2YCcQ/TmikdAcZbHI/AAAAAAAACSQ/kvqWG9VYX0U/s1600/includes.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;93&quot; src=&quot;http://1.bp.blogspot.com/-xTxu_x2YCcQ/TmikdAcZbHI/AAAAAAAACSQ/kvqWG9VYX0U/s320/includes.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;В раздел GCC C++ Linker - Library search path добавляем&lt;br /&gt;&lt;blockquote&gt;/usr/local/angstrom/arm/lib&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-ZmFh0-jUol4/TmikcgylRPI/AAAAAAAACSM/R9HTvrxAQeA/s1600/libraries.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;89&quot; src=&quot;http://2.bp.blogspot.com/-ZmFh0-jUol4/TmikcgylRPI/AAAAAAAACSM/R9HTvrxAQeA/s320/libraries.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Главное не забудьте поменять путь на свой.&lt;br /&gt;&lt;br /&gt;Далее настраиваем отладку. Кнопка Debug-&amp;gt;Debug configurations.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-0lGSweDbgNI/Tmig62ZweHI/AAAAAAAACSE/EdnWlMWu2qk/s1600/debug_config.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-0lGSweDbgNI/Tmig62ZweHI/AAAAAAAACSE/EdnWlMWu2qk/s1600/debug_config.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Создаем новое C/C++ Remote application. Connection -&amp;gt; New - &amp;gt; SSH only, и заполняем параметры.&lt;br /&gt;Remote Absolute Path - полный путь к файлу на удаленном устройстве, включая имя файла, например:&lt;br /&gt;&lt;blockquote&gt;/home/root/test&lt;/blockquote&gt;Commands to execute before application&lt;br /&gt;&lt;blockquote&gt;chmod +x /home/root/test&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-pUQpiYpv3EA/TmigbK9RshI/AAAAAAAACR4/D9hoRN0mMko/s1600/debug.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;254&quot; src=&quot;http://2.bp.blogspot.com/-pUQpiYpv3EA/TmigbK9RshI/AAAAAAAACR4/D9hoRN0mMko/s320/debug.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;На закладке debugger вводим имя gdb отладчика&lt;br /&gt;&lt;blockquote&gt;arm-angstrom-linux-gnueabi-gdb&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-CsrFAD_m8kQ/TmigtZC5qKI/AAAAAAAACSA/Vc4gr3CKH0Y/s1600/debugger.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;228&quot; src=&quot;http://2.bp.blogspot.com/-CsrFAD_m8kQ/TmigtZC5qKI/AAAAAAAACSA/Vc4gr3CKH0Y/s320/debugger.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-POMwZeUrMO4/TmigoMQQnQI/AAAAAAAACR8/FITAvk9T2JQ/s1600/debug.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;Обычный gdb, из ubuntu не пойдет, он не знает про архитектуру ARM. &lt;br /&gt;&lt;br /&gt;От mini2440 требуется ssh сервер с поддержкой sftp, в openembedded это пакеты openssh-server и openssh-sftp-server.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-vR-QNOOy8Gw/TmihUV_nHVI/AAAAAAAACSI/ruO7tVlNOuU/s1600/final.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;206&quot; src=&quot;http://2.bp.blogspot.com/-vR-QNOOy8Gw/TmihUV_nHVI/AAAAAAAACSI/ruO7tVlNOuU/s320/final.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Теперь возможно красиво, из IDE писать программы под ARM Linux. Лично мне это необходимо, для упрощения разработки второстепенных программ, что бы не я один это делал :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;: В eclipse любую задачу можно сделать сотней способов, и я нашел способ попроще. Скоро будет новая заметка.</description><link>http://takeworld.blogspot.com/2011/09/arm-linux-eclipse.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7tAH057qtxM/TmiftvZdOMI/AAAAAAAACR0/1tcSWyhQMNA/s72-c/path.png" height="72" width="72"/><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-8109224013877416346</guid><pubDate>Tue, 09 Aug 2011 06:54:00 +0000</pubDate><atom:updated>2011-08-09T10:54:41.188+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Ubuntu 11.04 на Acer revo R3700</title><description>И снова обновление, на этот раз ставлю ubuntu 11.04 на медиа-центр, сделанный из Acer Revo R3700.&lt;br /&gt;&lt;br /&gt;С прошлого раза стало на много лучше. Теперь единственная проблема - глючный драйвер wi-fi, отключается так&lt;br /&gt;&lt;blockquote&gt;echo &#39;blacklist rt2800pci&#39; | sudo tee -a /etc/modprobe.d/blacklist.conf&lt;/blockquote&gt;Звук по HDMI теперь поддерживается из коробки, достаточно в настройках выбрать правильный выход через GUI (в прошлой версии ubuntu требовалось выбирать это в консоли). Удалять pulseaudio не нужно.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Декодирование vdpau заработало сразу, без проблем.&lt;br /&gt;XBMC еще не выпустили для ubuntu 11.04, но версия с 10.10 работает отлично.&lt;br /&gt;&lt;br /&gt;Я уже давно общаюсь с этим медиа-центром, 9.04 не работала вообще, а 11.04 работает из коробки.</description><link>http://takeworld.blogspot.com/2011/08/ubuntu-1104-acer-revo-r3700.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-674651538888423909</guid><pubDate>Thu, 14 Apr 2011 11:48:00 +0000</pubDate><atom:updated>2011-04-14T15:48:42.208+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Подключение термометра DS18B20 к Linux</title><description>Продолжение моих экспериментов с arm linux. На этот раз понадобилось подключить цифровой термометр DS12B20 к линуксу, причем сразу кучу.&lt;br /&gt;&lt;br /&gt;Датчик работает по интерфейсу 1-Wire, это такой глючноватый интерфес от Dallas Semiconductor. Есть возможность подключить несколько датчиков по одному проводу, но для этого потребуется алгоритм поиска. В общем, если писать все руками, придется немного повозиться. Но у нас же Linux, и драйверы для этой микросхемы (и еще нескольких похожих) уже написаны, осталось только включить.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-8QOMCzaOUgo/Tabey_iZ_HI/AAAAAAAABxk/kjZIcxTF5qw/s1600/Zi6_2418.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; width=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-8QOMCzaOUgo/Tabey_iZ_HI/AAAAAAAABxk/kjZIcxTF5qw/s320/Zi6_2418.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;У меня плата micro2440 с процессором samsung s3c2440, и делал я все на основе &lt;a href=&quot;http://www.friendlyarm.net/forum/topic/1580&quot;&gt;вот этой инструкции&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Первым делом я подключил датчик к питанию, земле и ножку данных к GPG11.&lt;br /&gt;Дальше включаем поддержку 1-wire и нашего датчика в ядре&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;W1_MASTER_GPIO=Y (1wire bus master)&lt;br /&gt;W1_SLAVE_THERM=Y (Thermal family implementation)&lt;/blockquote&gt;&lt;br /&gt;И добавляем информацию о датчике в файл описания платы (у меня arch/arm/mach-s3c2440/mach-mini2440.c)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#include &amp;lt;linux/w1-gpio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;static struct w1_gpio_platform_data w1_gpio_pdata = {&lt;br /&gt;.pin    = S3C2410_GPG(11),&lt;br /&gt;.is_open_drain  = 0,&lt;br /&gt;};&lt;br /&gt;static struct platform_device s3c_device_w1 = {&lt;br /&gt;.name      = &quot;w1-gpio&quot;,&lt;br /&gt;.id      = -1,&lt;br /&gt;.dev.platform_data  = &amp;amp;w1_gpio_pdata,&lt;br /&gt;};&lt;br /&gt;............&lt;br /&gt;&amp;#x412; &amp;#x441;&amp;#x442;&amp;#x440;&amp;#x443;&amp;#x43a;&amp;#x442;&amp;#x443;&amp;#x440;&amp;#x443;&lt;br /&gt;static struct platform_device *mini2440_devices[] = {&lt;br /&gt;&amp;#x434;&amp;#x43e;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x43b;&amp;#x44f;&amp;#x435;&amp;#x43c;&lt;br /&gt;&amp;amp;s3c_device_w1,&lt;br /&gt;............&lt;br /&gt;&amp;#x412; &amp;#x43f;&amp;#x440;&amp;#x43e;&amp;#x446;&amp;#x435;&amp;#x434;&amp;#x443;&amp;#x440;&amp;#x443; &amp;#x438;&amp;#x43d;&amp;#x438;&amp;#x446;&amp;#x438;&amp;#x430;&amp;#x43b;&amp;#x438;&amp;#x437;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x438;&lt;br /&gt;static void __init mini2440_machine_init(void)&lt;br /&gt;.......&lt;br /&gt;s3c2410_gpio_cfgpin(w1_gpio_pdata.pin, 1);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Да, plug and play нам только снится :)&lt;br /&gt;Компилируем, прошиваем ядро, в dmesg должна появиться строчка&lt;br /&gt;&lt;blockquote&gt;Driver for 1-wire Dallas network protocol&lt;/blockquote&gt;&lt;br /&gt;А в /sys/bus/w1/devices/, при правильном подключении будет видно устройство.&lt;br /&gt;&lt;br /&gt;Теперь самое интересное, что бы прочитать температуру (или что там еще может дать 1-wire устройство), нужно выполнить команду&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;root@mini2440:~# cat /sys/bus/w1/devices/28-000001a3b893/w1_slave &lt;br /&gt;93 01 4b 46 7f ff 0d 10 32 : crc=32 YES&lt;/linux&gt;&lt;br /&gt;93 01 4b 46 7f ff 0d 10 32 t=25187&lt;/linux&gt;&lt;br /&gt;&lt;/blockquote&gt;В первой строке написано что контрольна сумма сошлась, во второй темпиратура, в тысячных долях градуса.&lt;br /&gt;Прикладываю палец и еще разок&lt;br /&gt;&lt;blockquote&gt;root@mini2440:~# cat /sys/bus/w1/devices/28-000001a3b893/w1_slave &lt;br /&gt;fc 01 4b 46 7f ff 04 10 9b : crc=9b YES&lt;br /&gt;fc 01 4b 46 7f ff 04 10 9b t=31750&lt; &lt;/blockquote&gt;&lt;br /&gt;Температура 31.7 цельсия, погрешность 0.2 градуса.&lt;br /&gt;&lt;br /&gt;Дальше я написал небольшую программу на QT Embedded, она читает этот файл и рисует температуру на экране&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-Yod6Yt_3HQI/Tabey-ZSCcI/AAAAAAAABxs/vRZ2nT7SNdo/s1600/Zi6_2419.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;240&quot; src=&quot;http://2.bp.blogspot.com/-Yod6Yt_3HQI/Tabey-ZSCcI/AAAAAAAABxs/vRZ2nT7SNdo/s320/Zi6_2419.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description><link>http://takeworld.blogspot.com/2011/04/ds18b20-linux.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-8QOMCzaOUgo/Tabey_iZ_HI/AAAAAAAABxk/kjZIcxTF5qw/s72-c/Zi6_2418.JPG" height="72" width="72"/><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-8510834024698132199</guid><pubDate>Mon, 11 Apr 2011 06:01:00 +0000</pubDate><atom:updated>2011-04-11T10:01:00.712+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">latex</category><title>Оформление longtable в LaTeX по госту</title><description>Вот &lt;a href=&quot;http://boxofwisdom.blogspot.com/2011/04/longtable-and-caption.html&quot;&gt; тут есть интересная заметка&lt;/a&gt;, как оформить longtable по госту, самое то для написания диплома.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-U_7TK32BD0k/TZ3wzgNg84I/AAAAAAAAAUQ/4I0VEA3Fryg/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA-5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;130&quot; width=&quot;512&quot; src=&quot;http://2.bp.blogspot.com/-U_7TK32BD0k/TZ3wzgNg84I/AAAAAAAAAUQ/4I0VEA3Fryg/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA-5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А вот тут другие мелочи, типа шаблонов для подписей руководителя &lt;a href=&quot;http://boxofwisdom.blogspot.com/2011/04/latex.html&quot;&gt;http://boxofwisdom.blogspot.com/2011/04/latex.html&lt;/a&gt;</description><link>http://takeworld.blogspot.com/2011/04/longtable-latex.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-U_7TK32BD0k/TZ3wzgNg84I/AAAAAAAAAUQ/4I0VEA3Fryg/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA-5.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-5650177940922176894</guid><pubDate>Sun, 10 Apr 2011 06:38:00 +0000</pubDate><atom:updated>2011-04-10T10:38:34.537+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Контроллер емкостной клавиатуры с драйвером под Linux</title><description>Мне в руки попала очередная прикольная штучка, отладочная плата AD7147, для демонстрации возможностей емкостных кнопок.&lt;br /&gt;Никакой механики, просто, надежно, в общем куча веселья.&lt;br /&gt;Есть официальный драйвер под linux (уже в ядре), так что теперь в моем embedded linux будет тачскрин :)&lt;br /&gt;&lt;br /&gt;&lt;iframe title=&quot;YouTube video player&quot; width=&quot;512&quot; height=&quot;318&quot; src=&quot;http://www.youtube.com/embed/8ymchwL37I4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</description><link>http://takeworld.blogspot.com/2011/04/linux.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/8ymchwL37I4/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-590210913104707938</guid><pubDate>Sat, 26 Mar 2011 09:10:00 +0000</pubDate><atom:updated>2013-04-08T08:38:05.224+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Китайский шедевр aPad</title><description>Наверно все видели &quot;китайский iPhone&quot;, но теперь они делают и &quot;китайский iPad&quot;.&lt;br /&gt;&lt;br /&gt;На корпусе никаких опознавательных знаков, но в итоге выяснилось что это модель aPad m7002&lt;br /&gt;Внутри этого экземпляра Android 1.6, процессор 800МГц (по другим данным 600), 325мб флешка под программы. Так же стоит Android Market.&lt;br /&gt;GPS нет.&lt;br /&gt;Самый большой косяк - старинный Android 1.6, был бы 2.2, смотрелось бы получше.&lt;br /&gt;&lt;br /&gt;Для девайса за 3000р он работает очень хорошо. Китайский iPad с Android получился на много лучше чем китайский iPhone.&lt;br /&gt;&lt;br /&gt;&lt;iframe title=&quot;YouTube video player&quot; width=&quot;500&quot; height=&quot;300&quot; src=&quot;http://www.youtube.com/embed/9RSPreMW9hM?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</description><link>http://takeworld.blogspot.com/2011/03/apad.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/9RSPreMW9hM/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-1222264433136528742</guid><pubDate>Thu, 03 Feb 2011 07:56:00 +0000</pubDate><atom:updated>2011-02-03T11:01:53.006+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><category domain="http://www.blogger.com/atom/ns#">vdpau</category><title>Ubuntu на Acer revo R3700</title><description>Acer обновил свою линейку маленьких компьютеров, пора и мне обновить свою статью.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Что нового&lt;/span&gt;&lt;br /&gt;В r3700 поставили новый процессор Intel Atom D530, а в r3600 был z530. На &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_atom&quot;&gt;википедии написано&lt;/a&gt; что приставка D означает &quot;desktop&quot;, получается он должен быть быстрее, так что ждите тесты в следующий раз.&lt;br /&gt;&lt;br /&gt;Так же обновили чипсет с nvidia ION до nvidia ION2. И конечно все железо новое, из коробки не работает.&lt;br /&gt;&lt;br /&gt;Так же на этот компьютер Windows XP не поставить, официально. Наконец то свершилось!&lt;br /&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Установка&lt;/span&gt;&lt;br /&gt;Я ставил ubuntu 10.10. Установка прошла нормально, без проблем. После установки драйвера nvidia из репозитория заработало декодирование видео (vdpau).&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;А теперь что не работает&lt;/span&gt;&lt;br /&gt;Компьютер зависает при выключении, в этом виноват драйвер wi-fi rt2800. Решается просто, блокируем его. Не бойтесь, это не тот драйвер, который нам нужен, в компьютере стоит другой модуль.&lt;br /&gt;&lt;blockquote&gt;echo &#39;blacklist rt2800pci&#39; | sudo tee -a /etc/modprobe.d/blacklist.conf&lt;/blockquote&gt;Следующая проблема - нет звука по HDMI. Для начала проверяем, подошли ли драйверы, есть ли звук через alsa.&lt;br /&gt;Включаем alsamixer, выбираем HDMI аудиокарту, отключаем mute со всех каналов. Вот тут можно &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=1670681&quot;&gt;посмотреть картинки&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;speaker-test -D plughw:1,7&lt;/blockquote&gt;У меня звук был, значит драйвер подошел. А тут дальше тонкость, в hdmi аудиокарте несколько точек, куда можно выводить звук (&quot;кодек&quot;, цифра 7), и необходимо выбрать нужную.&lt;br /&gt;Для этого создаем файл .asoundrc с нужными настройками&lt;br /&gt;&lt;blockquote&gt;cat &amp;gt;.asoundrc &amp;lt;&amp;lt;&quot;EOF&quot;&lt;br /&gt;pcm.dmixer {&lt;br /&gt;type dmix&lt;br /&gt;ipc_key 2048&lt;br /&gt;slave {&lt;br /&gt;pcm &quot;hw:1,7&quot; # Always use pure hw. dmix will reformat/resample audio.&lt;br /&gt;period_size 512 # If you get stuttering/or non-working audio, fiddle around with these&lt;br /&gt;buffer_size 4096&lt;br /&gt;rate 48000 # HDMI, I&#39;ll assume 48kHz&lt;br /&gt;format S16_LE # Should be default for pretty much any soundcard.&lt;br /&gt;}&lt;br /&gt;bindings {&lt;br /&gt;0 0&lt;br /&gt;1 1&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pcm.!default {&lt;br /&gt;type plug&lt;br /&gt;slave.pcm dmixer&lt;br /&gt;}&lt;br /&gt;EOF&lt;/blockquote&gt;В pulseaudio этой фишки нет, поэтому просто его удаляем:&lt;br /&gt;&lt;blockquote&gt;sudo apt-get remove pulseaudio&lt;/blockquote&gt;Звук теперь будет работать правильно, но переключаться с hdmi на аналоговый выход будет тяжело (нужно удалить .asounrc).&lt;br /&gt;&lt;br /&gt;Звук в XBMC есть сразу, но в меню так и не появился. Настройки: Analog, &quot;устройство по-умолчанию&quot;.&lt;br /&gt;&lt;br /&gt;Еще стоит отключить &quot;эффекты рабочего стола&quot;, compiz. Из за них в XBMC видео рассыпается, как при отсутствии вертикальной синхронизации.&lt;br /&gt;&lt;br /&gt;Ссылки:&lt;br /&gt;1. &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=1670681&quot;&gt;Руководство на английском&lt;/a&gt;, есть практически все что нужно.&lt;br /&gt;2. &lt;a href=&quot;http://www.nvnews.net/vbulletin/showpost.php?p=2312420&amp;amp;postcount=7&quot;&gt;Пост на официальном форуме&lt;/a&gt;, рассказано под какие чипы что нужно ставить. Как я понял все патчи уже выпущены и приняты, в следующей версии ubuntu должно работать из коробки.</description><link>http://takeworld.blogspot.com/2011/02/ubuntu-acer-revo-r3700.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-2569074982971327440</guid><pubDate>Sun, 16 Jan 2011 12:54:00 +0000</pubDate><atom:updated>2011-01-17T15:52:46.789+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Формат GRAY в imagemagick</title><description>Название так себе, но дальше станет понятно о чем я.&lt;br /&gt;Значит ситуация: имеется устройство, которое по usb передает картинку (типа сканер). Картинка - 8 бит на пиксель, оттенки серого. Нужна программа что бы быстро сохранить и показать эту картинку.&lt;br /&gt;&lt;br /&gt;Правильное решение - взять готовую библиотеку, типа libpng, создать правильную картинку и сохранить. Но программу я пишу тестовую, не хочется тратить много сил на libpng.&lt;br /&gt;&lt;br /&gt;Мое решение: сохранить принимаемые данные в файл как есть, байт за байтом, без заголовка или еще чего нибудь, а потом преобразовать в png через Image magick.&lt;br /&gt;Оказалось что в image magick есть специальный формат, &lt;a href=&quot;http://www.imagemagick.org/script/formats.php&quot;&gt;GRAY&lt;/a&gt;, как раз для таких случаев. Говоришь ему размер картинки, глубину цвета, и он может преобразовать в любой формат.&lt;br /&gt;&lt;br /&gt;Вот пример:&lt;br /&gt;&lt;blockquote&gt;#создаем картинку&lt;br /&gt;echo -n -e &quot;\x00\xFF\xFF\x00&quot;&amp;gt; data.bin&lt;br /&gt;#преобразуем в png&lt;br /&gt;convert -depth 8 -size 2x2 GRAY:data.bin out.png&lt;/blockquote&gt;В итоге получается файл out.png, 2x2 пикселя, выглядит это так:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_981heDvOCaQ/TTLp_yuRvWI/AAAAAAAABxc/RmP67B7JMZI/s1600/gray.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;246&quot; src=&quot;http://4.bp.blogspot.com/_981heDvOCaQ/TTLp_yuRvWI/AAAAAAAABxc/RmP67B7JMZI/s320/gray.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Вот так можно быстро и просто создать картинку из сырых данных.</description><link>http://takeworld.blogspot.com/2011/01/gray-imagemagick.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_981heDvOCaQ/TTLp_yuRvWI/AAAAAAAABxc/RmP67B7JMZI/s72-c/gray.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-2984573466215472708</guid><pubDate>Sat, 08 Jan 2011 11:02:00 +0000</pubDate><atom:updated>2011-01-09T14:22:02.891+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">vdpau</category><title>Аппаратное декодирование видео на intel gma hd</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Введение&lt;/span&gt;&lt;br /&gt;В новых процессорах intel core i3, i5, i7 есть встроенная видеокарта intel GMA HD (не путать с GMA X4500HD). Эта видеокарта позволяет аппаратно декодировать H.264 (все 3 варианта), так что можно смотреть FullHD видео без тормозов. При этом VC-1 не поддерживается, так что &amp;nbsp;экзотика типа WMV все еще будет декодироваться программно. С этим никаких проблем, все видео и так в H.264.&lt;br /&gt;&lt;br /&gt;В Ubuntu 10.10 используется не достаточно свежая версия драйверов intel, нужно их обновить, и все заработает.&amp;nbsp;Готовых пакетов я нигде найти не смог, поэтому собрал сам, версия Intel 2010Q4.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Установка&lt;/span&gt;&lt;br /&gt;Так что если у вас Ubuntu 10.10, Intel core i3, i5, i7, используется встроенная видеокарта, и хочется FullHD видео, то достаточно добавить мой источник программ, и обновить систему.&lt;br /&gt;&lt;blockquote&gt;sudo add-apt-repository ppa:nagos/ppa&lt;br /&gt;sudo apt-get update&lt;br /&gt;sudo apt-get upgrade&lt;/blockquote&gt;&lt;br /&gt;Драйверы Intel работают через VAAPI, универсальный API для декодирования видео, и все плееры, поддерживающие его, будут работать.&lt;br /&gt;&lt;br /&gt;Например VLC 1.1.4 уже умеет. Единственная тонкость, нужно отключить пункт &quot;пропускать кадры&quot; в настройках, иначе будут жуткие тормоза.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_981heDvOCaQ/TSecpFuL4kI/AAAAAAAABxE/aWc9smNcQQE/s1600/vlc-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;167&quot; src=&quot;http://1.bp.blogspot.com/_981heDvOCaQ/TSecpFuL4kI/AAAAAAAABxE/aWc9smNcQQE/s320/vlc-1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Так же можно убедиться что стоит галочка Use GPU Acceleration (стоит по умолчанию).&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_981heDvOCaQ/TSecpQT3dbI/AAAAAAAABxM/7mwP3gMBl5Y/s1600/vlc-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;198&quot; src=&quot;http://2.bp.blogspot.com/_981heDvOCaQ/TSecpQT3dbI/AAAAAAAABxM/7mwP3gMBl5Y/s320/vlc-2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Нагрузка на процессор падает, с 60% до 10-12% на FullHD видео. На mplayer с vdpau было 5%, но я думаю VLC делает какую то дополнительную пост-обработку, поэтому и запросы выше.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_981heDvOCaQ/TSedZNxZm3I/AAAAAAAABxU/XUj3sDfjtJA/s1600/vlc-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;158&quot; src=&quot;http://3.bp.blogspot.com/_981heDvOCaQ/TSedZNxZm3I/AAAAAAAABxU/XUj3sDfjtJA/s320/vlc-3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Так же должен заработать плеер XBMC (последняя версия  10.0 &quot;Dharma&quot;).&lt;br /&gt;Mplayer сразу не заработает, нужно скачать специальную версию. Этим я займусь позже.&lt;br /&gt;&lt;br /&gt;Так же для желающих - вывод программы vainfo&lt;br /&gt;&lt;blockquote&gt;libva: libva version 0.31.1&lt;br /&gt;libva: va_getDriverName() returns 0&lt;br /&gt;libva: Trying to open /usr/lib/dri/i965_drv_video.so&lt;br /&gt;libva: va_openDriver() returns 0&lt;br /&gt;vainfo: VA API version: 0.31&lt;br /&gt;vainfo: Driver version: i965 Driver 0.1&lt;br /&gt;vainfo: Supported profile and entrypoints&lt;br /&gt;VAProfileMPEG2Simple            : VAEntrypointVLD&lt;br /&gt;VAProfileMPEG2Main              : VAEntrypointVLD&lt;br /&gt;VAProfileH264Baseline           : VAEntrypointVLD&lt;br /&gt;VAProfileH264Main               : VAEntrypointVLD&lt;br /&gt;VAProfileH264High               : VAEntrypointVLD&lt;/blockquote&gt;&lt;br /&gt;P.S. Через vaapi можно заставить работать видеокарты nvidia, для этого необходимо просто поставить пакеты vdpau-va-driver).</description><link>http://takeworld.blogspot.com/2011/01/intel-gma-hd.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_981heDvOCaQ/TSecpFuL4kI/AAAAAAAABxE/aWc9smNcQQE/s72-c/vlc-1.png" height="72" width="72"/><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-2661649327261320411</guid><pubDate>Tue, 28 Dec 2010 12:49:00 +0000</pubDate><atom:updated>2010-12-28T15:52:03.185+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Ubuntu на Acer Revo R3610</title><description>Релил обновить ubuntu на моем acer revo, вышел новый xbmc и новая ubuntu. В процессе столкнулся с проблемой - пропал звук по HDMI. При этом в 9.10 все работало (долго возился, но заработало). Вернул назад 9.10, не работает.&lt;br /&gt;&lt;br /&gt;Почитал инструкции в интернете, звук пропал вообще, даже через аналоговый выход.&lt;br /&gt;При этом другой Revo, с таким же телевизором заработал сходу, без шаманства (ubuntu 10.04).&lt;br /&gt;&lt;br /&gt;В итоге выяснилось, эти компьютеры не такие одинаковые как кажется. В моем экземпляре другой чип hdmi, и определяется неверно. Проблема решилась добавлением в файл /etc/modprobe.d/alsa-base.conf строки:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;options snd-hda-intel model=3stack-6ch-dig&lt;/pre&gt;&lt;/blockquote&gt;После перезагрузки в alsamixer будут уже другие настройки, и достаточно убрать mute с spdif. Потом переключить вывод звука на hdmi через стандартные свойства ubuntu (система-параметры-звук).&lt;br /&gt;Больше ничего, описанного в &lt;a href=&quot;http://en.gentoo-wiki.com/wiki/Acer_Aspire_Revo_R3600_/_R3610&quot;&gt;руководствах&lt;/a&gt; делать не нужно, иначе пропадет весь звук! &lt;br /&gt;&lt;br /&gt;Основные симптомы, отличающиеся от обычного &quot;не работает hdmi, я не поставил драйвер nvidia&quot;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Никаких ошибок, все грузится, включается, плееры говорят что играют&lt;/li&gt;&lt;li&gt;aplay -l правильно определяет HDMI. &lt;/li&gt;&lt;li&gt;Прямой вывод звука в hdmi (aplay -D plughw:0,3) ошибок не дает, но звука нет (и не может, т.к. включена mute.&lt;/li&gt;&lt;/ul&gt;</description><link>http://takeworld.blogspot.com/2010/12/ubuntu-acer-revo-r3610.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-535545555154233747</guid><pubDate>Mon, 08 Nov 2010 13:39:00 +0000</pubDate><atom:updated>2010-11-08T16:58:38.529+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><title>Работа с Ftdi FT2232H в режиме SPI</title><description>Сегодня будет железная тема. Но как обычно под Linux, так что кому то пригодится.&lt;br /&gt;&lt;br /&gt;FT2232H - микросхема для работы с USB. Стоит во всех usb-com преобразователях, usb-jtag, программаторах для различных микросхем.&lt;br /&gt;В открытом проекте &lt;a href=&quot;http://dangerousprototypes.com/docs/Bus_Pirate&quot;&gt;bus pirate&lt;/a&gt; сейчас используют для подключения к компьютеру.&lt;br /&gt;В общем обязательная деталь для любителей железа. &lt;br /&gt;&lt;br /&gt;Возникла задача, подключить некое (еще в разработке) устройство к компьютер (с Linux), отправить туда данные по шине spi, и зарбать много данных по быстрой шине.&lt;br /&gt;Если с быстрой параллельной шиной (245 sync fifo) все просто, в интернете полно документации, то про SPI (и JTAG) почти ничего не написано.&lt;br /&gt;&lt;br /&gt;Значит для начала нам нужно установить библиотеку libftdi, через которую все и будет работать. Она есть в репозитории ubuntu или на &lt;a href=&quot;http://www.intra2net.com/en/developer/libftdi/&quot;&gt;официальном сайте&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Сам алгоритм работы по spi достаточно прост. Необходимо перевести микросхему в режим BITMODE_BITBANG_SPI, потом отправить туда несколько команд, например установить частоту передачи. Делается это отправкой специального кода (opcode) и нескольких байт данных. Подробнее все коды расписаны в документе &lt;a href=&quot;http://www.ftdichip.com/Support/Documents/AppNotes/AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf&quot;&gt;Command Processor For MPSSE and MCU Host Bus Emulation Modes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Я протестировал различные режимы, в итоге получил следующие скорости (в мегабайтах):&lt;br /&gt;sync fifo: 30 мб/сек&lt;br /&gt;async fifo: 10 мб/сек&lt;br /&gt;SPI: 30 МГц. &lt;br /&gt;Передачу по SPI померить тяжело. Но судя по алгоритму работы 30 мегабит поддерживать будет не очень сложно. Передача идет автономно, без участия USB, размер посылки до 65536 байт, практически никаких накладных расходов на начало передачи (было опасение что каждый БИТ будет передаваться в отдельной USB передаче, тогда скорость была бы просто черепашья, десятки байт в секунду).&lt;br /&gt;&lt;br /&gt;Пример работы можно найти &lt;a href=&quot;http://flashrom.org/trac/flashrom/browser/trunk/ft2232_spi.c&quot;&gt;вот в этом файле&lt;/a&gt; (это часть проекта flashrom, open source программы для прошивки SPI микросхем памяти, например BIOS, загрузочных микросхем сетевых карт). Примеры fifo лежать в папке examplex в архиме libftdi.&lt;br /&gt;&lt;br /&gt;Только одна особенность. При работе с SPI на канале B необходимо выгрузить модуль ядра ftdi_sio, иначе он будет занимать устройство.&lt;br /&gt;&lt;blockquote&gt;sudo rmmod ftdi_sio&lt;/blockquote&gt;</description><link>http://takeworld.blogspot.com/2010/11/ftdi-ft2232h-spu.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>14</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-7873052239848653486</guid><pubDate>Wed, 27 Oct 2010 07:59:00 +0000</pubDate><atom:updated>2010-10-27T12:03:06.863+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Изменения в Ubuntu 10.10</title><description>Недавно вышла ubuntu 10.10, некоторые изменения с прошлой версии, о которых еще никто не писал.&lt;br /&gt;&lt;br /&gt;Для OpenEmbedded мне нужен tftp сервер, теперь он устанавливается по другому.&lt;br /&gt;Нужно установить пакет tftpd-hpa, а его настройки хранятся в /etc/init/tftpd-hpa.conf. Раньше он запускался через inet.d, в новой ubuntu его похоже совсем убрали.&lt;br /&gt;Отладчик arm OpenOCD обновили до версии 0.4.0, придется кое что исправить в конфигах что бы все работало как раньше. &lt;br /&gt;&lt;br /&gt;Добавлены пакеты для va-api (универсальное api аппаратного декодирования видео). Теперь появилась возможность в vlc смотреть HD видео на видеокартах nvidia, ati и даже Intel. Пока у меня не получилось :)&lt;br /&gt;&lt;br /&gt;Кнопка Alt+Print Screen теперь перехватывается sys rq, &lt;a href=&quot;http://leolik.blogspot.com/2010/10/altprtscr-ubuntu-1010.html&quot;&gt;есть способ вернуть все как было&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В системе используется ядро 2.6.35, которое поддерживает функцию TRIM на ssd дисках.&lt;br /&gt;&lt;br /&gt;В общем как обычно, новый релиз, изменений вроде не много, все работает, ничего не сломали. Но как включишь ubuntu годовалой давности, страшно становится, как на таком кошмаре сидели. А через год так же будет и с ubuntu 10.10.</description><link>http://takeworld.blogspot.com/2010/10/ubuntu-1010.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-6565225978661675188</guid><pubDate>Fri, 08 Oct 2010 22:30:00 +0000</pubDate><atom:updated>2010-10-10T01:16:27.131+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Ubuntu 10.04 на нетбуке Samsung N220</title><description>Недавно ставил Ubuntu 10.04 на Samsung N220, вот некоторые советы.&lt;br /&gt;&lt;br /&gt;Ставить лучше в режиме ручного создания разделов. В автоматическом режиме установщик создаст swap размером 5Гб. У ноута 2Гб ОЗУ, я считаю что swap не нужен.&lt;br /&gt;&lt;br /&gt;По-умолчанию не работают кнопки изменения яркости подсветки. Это довольно легко решается. В Bios нужно найти пункт Brightness Control, и установить его в User Conrtol.&lt;br /&gt;После этого стамим&amp;nbsp;программу samsung-backlight, и все заработает (взято &lt;a href=&quot;http://ubuntuforums.org/showpost.php?p=9517612&amp;amp;postcount=21&quot;&gt;отсюда&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sudo add-apt-repository ppa:voria/ppa &lt;br /&gt;&lt;br /&gt;sudo apt-get update &lt;br /&gt;&lt;br /&gt;sudo apt-get install samsung-backlight samsung-tools&lt;/blockquote&gt;&lt;br /&gt;Web камера заработала сразу, wi-fi тоже (хотя в этом же репозитории есть пакет с драйверами).&lt;br /&gt;&lt;br /&gt;Еще к ноутбуку был подключен usb-модем Мегафон, Huawei E1550&amp;nbsp;с идентификатором 12d1:1446. Хитрость этого (и других модемов) в том, что нужно подать специальную usb-комманду, устройство переключится из CD режима, в режим модема.&lt;br /&gt;Для этого есть программа&amp;nbsp;usb-modeswitch, ставим ее из стандартного репозитория, и модем будет автоматически включаться.&lt;br /&gt;&lt;blockquote&gt;sudo apt-get install&amp;nbsp;usb-modeswitch&lt;/blockquote&gt;После этого модем настраивается стандартными средствами ubuntu, через NetworkManager.</description><link>http://takeworld.blogspot.com/2010/10/ubuntu-1004-samsung-n220.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-6728245820569531562</guid><pubDate>Fri, 08 Oct 2010 07:44:00 +0000</pubDate><atom:updated>2010-10-10T01:14:04.242+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">kernel</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Сборка OpenEmbedded для mini2440</title><description>Сразу скажу что mini2440 и micro2440+SDK&amp;nbsp; Board, это практически одно и то же, платы полностью совместимы.&lt;br /&gt;&lt;br /&gt;Итак, &lt;a href=&quot;http://en.wikipedia.org/wiki/Openembedded&quot;&gt;OpenEmbedded&lt;/a&gt;, это пакет для сборки Linux для встроенных систем. В начале сборки у нас нет ничего, в конце получается кросс-компилятор, и готовый образ для прошивки в плату.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Скажу сразу, процесс в первый раз занимает много времени, около 2 часов. В следующий раз, быстрее, примерно 1-2 минуты на то что бы добавить несколько программ. При этом, что бы запустить свою программу, не обязательно обновлять образ, можно скопировать по ssh, и запустить.&lt;br /&gt;&lt;br /&gt;Есть &lt;a href=&quot;http://wiki.linuxmce.org/index.php/Mini2440&quot;&gt;неплохое руководство&lt;/a&gt; на английском языке, тут я опишу все только в общих чертах. Для сборки вызывается &amp;nbsp;команда bitbake mini2440-image, она собирает рецепт mini2440-image. Сам рецепт можно посмотреть в файле OE/openembedded/recipes/images/mini2440-image.bb. Вот как выглядит мой текущий рецепт&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/616463.js&quot;&gt;  &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;В переменную IMAGE_INSTALL я добавил несколько программ, при компиляции они будут скачаны, и установлены в образ. &lt;br /&gt;После сборки в OE/oetmp/deploy/glibc/images/mini2440/ будут лежать образы:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mini2440-image-mini2440.jffs2 - для записи в NAND флешку&lt;/li&gt;&lt;li&gt;u-boot-mini2440.bin - загрузчик&lt;/li&gt;&lt;li&gt;uImage-mini2440.bin ядро системы в специальном формате&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Прошивка в u-boot &lt;/span&gt;&lt;br /&gt;В том же руководстве написано как прошить u-boot в nand флешку. Кратко процесс заключается в следующем (все делается через последовательный терминал, как в &lt;a href=&quot;http://code.google.com/p/mini2440/wiki/MiniBringup&quot;&gt;этом руководстве&lt;/a&gt;):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Переключатель nand/nor ставится в положение nor, включается загрузчик supervivi&lt;/li&gt;&lt;li&gt;Загрузчику дается команда принять файл по usb, и прошить его в nand&lt;/li&gt;&lt;li&gt;Переключатель ставится в nand, запускется u-boot &lt;/li&gt;&lt;/ol&gt;Дальше уже моя технология, обновление ядра и корневой системы по сети.&lt;br /&gt;Для начала необходимо настроить dhcp и tftp сервер на компьютере. Далее в u-boot нужно получить ip адрес по dhcp, и скачать образ системы в память, а потом записать в nand флешку.&lt;br /&gt;Как настроить tftp, можно почитать в &lt;a href=&quot;http://emqbit.com/boot-with-tftp&quot;&gt;этом руководстве&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;dhcp&lt;br /&gt;tftp 0x31000000 uImage.bin&lt;br /&gt;nand write.e 0x31000000 kernel 0x1A6C00&lt;/blockquote&gt;Обратите внимание, что 0x1A6C00 - размер ядра в формате hex, число после завершения команды tftp нужно округлить в большую сторону до 512. А 0x31000000 - адрес в RAM, по которому загружать ядро. Следующим шагом в nand из памяти записывается нужное количество байт.&lt;br /&gt;Аналогичным образом можно обновить и корневую файловую систему&lt;br /&gt;&lt;blockquote&gt;tftp 0x31000000 root.jffs2&lt;br /&gt;nand write.jffs2 0x31000000 rootfs 0x23FC000&lt;/blockquote&gt;</description><link>http://takeworld.blogspot.com/2010/10/openembedded-mini2440.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-5315898532829657320</guid><pubDate>Wed, 29 Sep 2010 07:51:00 +0000</pubDate><atom:updated>2010-10-10T01:10:28.457+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">embedded</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Linux для процессоров ARM9</title><description>Сейчас я разбираюсь вот с такой штуковиной&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.friendlyarm.net/sites/products/micro2440-sdk-35.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;207&quot; src=&quot;http://www.friendlyarm.net/sites/products/micro2440-sdk-35.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Плата содежит ARM9 процессор Samsung S3C2440, 64Мб SDRAM, 64Мб-1Гб Nand flash (в моем экземпляре 64Мб), ethernet dm9000, usb-host, usb-slave, сенсорный экран 3.5&quot;.&lt;br /&gt;На похожих процессорах ARM раньше делали кпк. Товарищи &lt;a href=&quot;http://twitter.com/inoise&quot;&gt;@inoise&lt;/a&gt; и &lt;a href=&quot;http://twitter.com/fox_clone&quot;&gt;@fox_clone&lt;/a&gt; наверное помнят, как мы ставили familiar linux на старенький кпк ipaq :) Из последних, этот процессор стоит в электронной читалке pocket book 360.&lt;br /&gt;Такой старткит можно купить на сайте &lt;a href=&quot;http://www.friendlyarm.net/&quot;&gt;http://www.friendlyarm.net&lt;/a&gt; за 127 евро. По умолчанию там запущен Linux с оболочкой qtopia, сенсорным вводом.&lt;br /&gt;&lt;br /&gt;Применять этот процессор планируется для управления сложным блоком, с web интерфейсом и парой собственных протоколов.&lt;br /&gt;&lt;br /&gt;Дальше напишу больше, но вот пара мыслей.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Поддержка Linux на arm хорошая. На порядок лучше чем, например, в nios 2.&lt;/li&gt;&lt;li&gt;На сайте &lt;a href=&quot;http://bliterness.blogspot.com/&quot;&gt;http://bliterness.blogspot.com&lt;/a&gt; можно найти ядро и систему для этой платы, с последними патчами. Чувак слишком хорошо разбирается в этом вопросе, поэтому пошаговых инструкций там не найти.&lt;/li&gt;&lt;li&gt;Собирать систему лучше из OpenEmbedded/&lt;a href=&quot;http://www.angstrom-distribution.org/&quot;&gt;Angstrom&lt;/a&gt;, там удобная система bitbake, типа portage в gentoo. Сама соберет кросс-компилятор, потом откомпилирует им всю систему и создаст файлик jffs2 для заливки в nand флешку. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Первое тестирование&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Одна из задач, которые предполагается повесить на процессор - показывать  png картинки (загрузить из файла, распаковать, и в формате rgb/bmp  скопировать в блок, который наложит этот логотип на видеосигнал).&lt;br /&gt;&lt;br /&gt;Для теста я написал программу pngread (на основе примера из интернета), она распаковывает png, складывает информацию в память в формате RGB по 8 бит на цвет, и выдает в консоль цвет одного пиксела. Картинка - 1920x1080 пикселей с прозрачностью.&lt;br /&gt;Большая картинка открывается за 1 секунду. Более реальный случай 100x100, за 0.02с.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Смотри также&lt;/span&gt;:&lt;br /&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/10/openembedded-mini2440.html&quot;&gt;Сборка OpenEmbedded для mini2440&lt;/a&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/602423.js&quot;&gt;&lt;/script&gt;</description><link>http://takeworld.blogspot.com/2010/09/linux-arm9.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-8941919935306618921</guid><pubDate>Mon, 30 Aug 2010 11:25:00 +0000</pubDate><atom:updated>2010-08-30T15:48:08.582+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>Русский Chromed Bird</title><description>Chromed Bird - twitter клиент для Google Chrome, скачать можно на &lt;a href=&quot;https://chrome.google.com/extensions/detail/encaiiljifbdbjlphpgpiimidegddhic?hl=ru&quot;&gt;официальной странице&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Проект зарегистрирован на &lt;a href=&quot;http://github.com/&quot;&gt;github&lt;/a&gt;, ну и я решил, &quot;а почему бы не помочь проекту?&quot;. Самое простое что было - перевести на Русский язык. Так что представляю вам, первую экспериментальную версию Chrome Bird с поддержкой Русского языка.&lt;br /&gt;&lt;br /&gt;Картинку можно посмотреть &lt;a href=&quot;http://twitgoo.com/1h41nl&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Что бы установить, нужно установить git и получить последнюю версию моей ветки chromed bird.&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/557314.js&quot;&gt; &lt;/script&gt;&lt;br /&gt;После этого заходим в управление расширениями Chrome, включаем режим разработчика, и нажимаем &quot;загрузить распакованное расширение&quot;.&lt;br /&gt;Если нашли какие то ошибки, можно написать в комментарий снизу, или на мою страницу github (&lt;a href=&quot;http://github.com/nagos/chromed_bird&quot;&gt;http://github.com/nagos/chromed_bird&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Запрос на объединение с официальной версией я уже отправил, жду одобрения разработчика.&lt;br /&gt;&lt;br /&gt;Пока я это делал, разобрался с Git. Оказалось что это клевая штука. А GitHub вообще великолепен, не зря его иногда пишут как преимущество перед остальными системами контроля версий.&lt;br /&gt;Код выше, тоже размещен на GitHub, через сервис gist. Нажав на кнопки под кодом, можно посмотреть оригинал (view raw) и скачать его (имя файла).&lt;br /&gt;&lt;br /&gt;Вот пара ссылок для интересующихся Git, мне очень помогли:&lt;br /&gt;&lt;a href=&quot;http://git-scm.com/&quot;&gt;http://git-scm.com/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://gitref.org/&quot;&gt;Краткое руководство&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://sysmonblog.co.uk/misc/git_by_example/&quot;&gt;Git в примерах&lt;/a&gt;</description><link>http://takeworld.blogspot.com/2010/08/chromed-bird.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-52061668989015314</guid><pubDate>Fri, 06 Aug 2010 07:12:00 +0000</pubDate><atom:updated>2010-12-25T16:14:26.627+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Работа с bazaar в Ubuntu</title><description>&lt;a href=&quot;http://bazaar.canonical.com/en/&quot;&gt;Bazaar&lt;/a&gt; - распределенная система контроля версий. Еще есть распределенные системы git и hg, но в отличии от них bazaar очень простая система, и к ней существуют GUI.&lt;div&gt;&lt;br /&gt;&lt;div&gt;На &lt;a href=&quot;http://wiki.bazaar.canonical.com/BzrExtras&quot;&gt;их сайте&lt;/a&gt; можно посмотреть список gui, но я остановлюсь на 2 самых интересных на мой взгляд.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Первое что хочется людям от bazaar, это интеграцию в меню, как у tortoisesvn (windows), что бы на файлах были метки, и можно было подтверждать изменения через правую кнопку.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:x-large;&quot;&gt;nautilus-bzr&lt;/span&gt;&lt;/div&gt;&lt;div&gt;В Ubuntu для этой цели существует пакет nautilus-bzr, поставить его можно следующей коммандой&lt;/div&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[sudo apt-get install nautilus-bzr bzr-gtk]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_981heDvOCaQ/TFu4SU_ff3I/AAAAAAAABvo/nAjhSQA8aTY/s1600/nautilis-1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 278px; height: 320px;&quot; src=&quot;http://2.bp.blogspot.com/_981heDvOCaQ/TFu4SU_ff3I/AAAAAAAABvo/nAjhSQA8aTY/s320/nautilis-1.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5502193994775363442&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_981heDvOCaQ/TFu4SiqDQuI/AAAAAAAABvw/lmPt0zk6Q3c/s1600/nautilus-2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;&quot; src=&quot;http://3.bp.blogspot.com/_981heDvOCaQ/TFu4SiqDQuI/AAAAAAAABvw/lmPt0zk6Q3c/s320/nautilus-2.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5502193998443528930&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:x-large;&quot;&gt;qbzr&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Иногда хочется красиво посмотреть изменения в проекте, не привязываясь к отдельному графическому интерфейсу, прямо из консоли (все равно она запущена для компиляции, или еще чего). Для этого нужно поставить пакет qbzr: &lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[sudo apt-get install qbzr]]&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;После чего в bzr появятся новые команды, например qlog, qcommit, qdiff. Выглядит это примерно так:  &lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[bzr qlog]]&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_981heDvOCaQ/TFu5q_YbL_I/AAAAAAAABv4/rtFwGmcAQA0/s1600/qbzr.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 252px;&quot; src=&quot;http://4.bp.blogspot.com/_981heDvOCaQ/TFu5q_YbL_I/AAAAAAAABv4/rtFwGmcAQA0/s320/qbzr.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5502195517982715890&quot; /&gt;&lt;/a&gt;</description><link>http://takeworld.blogspot.com/2010/08/bazaar-ubuntu.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_981heDvOCaQ/TFu4SU_ff3I/AAAAAAAABvo/nAjhSQA8aTY/s72-c/nautilis-1.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-2436137333579619024</guid><pubDate>Mon, 05 Jul 2010 13:40:00 +0000</pubDate><atom:updated>2010-07-05T17:41:27.262+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Эксперименты со встроенным Linux</title><description>Я тут продолжаю экспериментировать со встраиваемым linux, вот видяха для затравки. На видео - heartbeat ядра Linux выводится на светодиод. Больше load average, быстрее мигает.&lt;br /&gt;В ближайшее время может быть выложу пару интересных примеров.&lt;br /&gt;&lt;object style=&quot;background-image:url(http://i3.ytimg.com/vi/Jv2JbJ83IiQ/hqdefault.jpg)&quot;  width=&quot;320&quot; height=&quot;180&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Jv2JbJ83IiQ&amp;amp;hl=ru_RU&amp;amp;fs=1&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/Jv2JbJ83IiQ&amp;amp;hl=ru_RU&amp;amp;fs=1&quot; width=&quot;320&quot; height=&quot;180&quot; allowScriptAccess=&quot;never&quot; allowFullScreen=&quot;true&quot; wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</description><link>http://takeworld.blogspot.com/2010/07/linux.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-567114786392905914</guid><pubDate>Tue, 25 May 2010 05:44:00 +0000</pubDate><atom:updated>2010-05-26T10:04:42.467+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kernel</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Ожидание в Linux ядре</title><description>Перед этим рекомендую прочитать:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux.html&quot;&gt;Пишем модуль ядра Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/character-device-linux.html&quot;&gt;Пишем свой character device для Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/udev-auto-creating-device.html&quot;&gt;Автосоздание устройств через udev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux-kernel-sleep.html&quot;&gt;Ожидание в Linux ядре&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;В нашем прошлом драйвере есть проблема, программа может запросить данные до того как они были записаны. Т.е. cat можно запустить до echo. В реальной жизни это происходит из за того, что данные в драйвер поступают медленнее чем могут из него выходить. Простой пример - драйвер последовательного порта. Данные могут поступать со скоростью несколько килобайт в секунду, а ядро может отдавать программе со скоростью несколько гигабайт в секунду.&lt;br /&gt;&lt;br /&gt;В такой ситуации драйверу нужно дождаться получения данных, а только потом отдавать их программе. В микроконтроллерах это делали просто, тупой цикл ожидания&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;while (data_not_ready);&lt;br /&gt;read_data();&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Но в Linux так делать нельзя. Система многозадачная, и если поместить такой код в ядро, то система просто будет висеть, не отвечая на команды.&lt;br /&gt;&lt;br /&gt;Для решения этой проблемы в Linux существуют очереди ожидания(Wait Queues). Принцип работы очень прост. Создается событие, и функция отправки данных в программу начинает ждать, пока оно произойдет. При этом ядро освобождается, и могут выполняться другие модули. Когда данные станут доступны, будет вызвана команда пробуждения и отправка данных продолжиться.&lt;br /&gt;&lt;br /&gt;Как и все остальное, ожидание в Linux сделано просто и красиво.&lt;br /&gt;Вот тут можно почитать как это работает &lt;a href=http://www.linuxjournal.com/node/8144/print&quot;&gt;Kernel Korner - Sleeping in the Kernel&lt;/a&gt;.&lt;br /&gt;Заснуть, пока не появятся данные. Эта функция завершится только когда данные будут доступны.&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;wait_event_interruptible(data_ready,(buffer_size&gt;0));&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Разбудить всех кто ждет данных&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;wake_up_interruptible(&amp;data_ready);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;А теперь собственно наш драйвер, добавим в него ожидание данных.&lt;br /&gt;Новая функция memory_read, в начале ждем данных если их еще нет. Критерий buffer_size&gt;0, засыпать только если false.&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;ssize_t memory_read(struct file *filp,&lt;br /&gt;   char *buf, size_t count, loff_t *f_pos) { &lt;br /&gt;  size_t c;&lt;br /&gt;  wait_event_interruptible(data_ready,&lt;br /&gt;                     (buffer_size&gt;0));&lt;br /&gt;.....&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Новая функция memory_write, пробуждаем всех кто ждет данных&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;ssize_t memory_write( struct file *filp, char *buf,&lt;br /&gt;                      size_t count, loff_t *f_pos) {&lt;br /&gt;  size_t c;&lt;br /&gt;  c = count&gt;MEMORY_SIZE ? MEMORY_SIZE: count;&lt;br /&gt;  printk(&quot;&lt;1&gt;Memory wrire %d\n&quot;,c); &lt;br /&gt;  copy_from_user(memory_buffer,buf,c);&lt;br /&gt;  buffer_size=c;&lt;br /&gt;  wake_up_interruptible(&amp;data_ready);&lt;br /&gt;  return count;&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Как это работает:&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;sudo insmod memory.ko&lt;br /&gt;sudo chmod 666 /dev/memory&lt;br /&gt;cat /dev/memory &amp;&lt;br /&gt;echo 123 &gt; /dev/memory&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Обратите внимание, что cat запускается в фоне, и ответ &quot;123&quot; появится после команды echo, когда cat завершит ожидание чтения из устройства.&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;:~/kernel_module$ cat /dev/memory &amp;&lt;br /&gt;[1] 7423&lt;br /&gt;:~/kernel_module$ echo 123 &gt; /dev/memory&lt;br /&gt;123&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Полный код можно получить из svn&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;svn checkout http://nagos.googlecode.com\&lt;br /&gt;/svn/kernel_module/tags/20100525 kernel_module&lt;br /&gt;cd kernel_module&lt;br /&gt;make&lt;br /&gt;]]&gt;&lt;/script&gt;</description><link>http://takeworld.blogspot.com/2010/05/linux-kernel-sleep.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-4799381920565631300</guid><pubDate>Wed, 19 May 2010 07:03:00 +0000</pubDate><atom:updated>2010-05-26T10:05:01.307+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kernel</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Автосоздание устройств через udev</title><description>Перед этим рекомендую прочитать:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux.html&quot;&gt;Пишем модуль ядра Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/character-device-linux.html&quot;&gt;Пишем свой character device для Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/udev-auto-creating-device.html&quot;&gt;Автосоздание устройств через udev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux-kernel-sleep.html&quot;&gt;Ожидание в Linux ядре&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;В прошлый раз, возникла проблема, необходимо было выдумывать major номера устройств, потом еще под них создавать устройства командной mknod, что мягко говоря неудобно.&lt;br /&gt;&lt;br /&gt;Достаточно давно появился udev, что бы решить эту проблему. Сегодня я изменил драйвер так, что бы он автоматически создавал устройство /dev/memory и автоматически находил свободный major number. При выгрузке модуля устройство автоматически стирается.&lt;br /&gt;&lt;br /&gt;Делает это просто. Вот тут есть небольшой пример, &lt;a href=&quot;http://ramblings.narrabilis.com/wp/pi/&quot;&gt;Adding a device from a kernel module the udev way&lt;/a&gt;.&lt;br /&gt;Для этого нам нужно создать класс нашего устройства, и вызвать функцию создания устройства. Вот код, который лучше слов:&lt;br /&gt;&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;int memory_init(void) {&lt;br /&gt;  struct device *err_dev;&lt;br /&gt;&lt;br /&gt;  /* Получаем major number */&lt;br /&gt;  memory_major = register_chrdev(0, &quot;memory&quot;, &amp;memory_fops);&lt;br /&gt;  if (memory_major &lt; 0) {&lt;br /&gt;    printk(&lt;br /&gt;      &quot;&lt;1&gt;memory: cannot obtain major number %d\n&quot;, memory_major);&lt;br /&gt;    return memory_major;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /* Allocating memory for the buffer */&lt;br /&gt;  memory_buffer = kmalloc(MEMORY_SIZE, GFP_KERNEL); &lt;br /&gt;  if (!memory_buffer) { &lt;br /&gt;    memory_major = -ENOMEM;&lt;br /&gt;    goto fail; &lt;br /&gt;  } &lt;br /&gt;  memset(memory_buffer, 0, 1);&lt;br /&gt;  /* создаем устройство*/&lt;br /&gt;  memory_class = class_create(THIS_MODULE,&quot;memory&quot;);&lt;br /&gt;  err_dev = device_create(memory_class, NULL, MKDEV(memory_major,0),NULL,&quot;memory&quot;);&lt;br /&gt;  printk(&quot;&lt;1&gt;Inserting memory module, Major: %d\n&quot;,memory_major); &lt;br /&gt;  return 0;&lt;br /&gt;&lt;br /&gt;  fail: &lt;br /&gt;    memory_exit(); &lt;br /&gt;    return memory_major;&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Функция register_chrdev, если ее вызвать с параметром 0, возвращает свободный major number, назначенный устройству. А class_create и device_create создают устройство.&lt;br /&gt;Теперь скачиваем новую версию, компилируем и тестируем&lt;br /&gt;&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;svn checkout http://nagos.googlecode.com\&lt;br /&gt;/svn/kernel_module/tags/20100519 kernel_module&lt;br /&gt;cd kernel_module&lt;br /&gt;make&lt;br /&gt;sudo insmod memory.ko&lt;br /&gt;sudo chmod 666 /dev/memory&lt;br /&gt;echo 12346789 &gt; /dev/memory&lt;br /&gt;cat /dev/memory&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Права 666 устанавливать все еще нужно, потому что запись пытаемся делать от обычного пользователя, а устройством владеет root. Это исправляется созданием правил udev.</description><link>http://takeworld.blogspot.com/2010/05/udev-auto-creating-device.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-3202776900277409061</guid><pubDate>Tue, 18 May 2010 10:05:00 +0000</pubDate><atom:updated>2010-05-26T10:05:14.228+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kernel</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Пишем свой character device для Linux</title><description>Перед этим рекомендую прочитать:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux.html&quot;&gt;Пишем модуль ядра Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/character-device-linux.html&quot;&gt;Пишем свой character device для Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/udev-auto-creating-device.html&quot;&gt;Автосоздание устройств через udev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux-kernel-sleep.html&quot;&gt;Ожидание в Linux ядре&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Character device или символьное устройство, это устройство которое принимает данные по одному байту. Отличается от блочного устройства (block device), которое принимает данные блоками по несколько байт (например 512, как жесткий диск), и от сетевого устройства (network device), которое вообще по другому работает.&lt;br /&gt;&lt;br /&gt;Пример такого устройства - /dev/zero, устройство принимает и отдает данные по 1 байту.&lt;br /&gt;&lt;br /&gt;Сегодня мы напишем такой драйвер, который будет принимать данные от пользователя, сохранять их в памяти ядра (в обычной памяти, т.к. сейчас у нас нет железки под рукой), и отдавать по команде. В реальном устройстве будет происходить тоже самое, но память будет выделена в устройстве, а не просто в ядре. Сам код от этого сильно не поменяется.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://techpubs.sgi.com/library/dynaweb_docs/0650/SGI_Developer/books/DevDriver_PG/sgi_html/figures/03-kernel.pio.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 358px; height: 333px;&quot; src=&quot;http://techpubs.sgi.com/library/dynaweb_docs/0650/SGI_Developer/books/DevDriver_PG/sgi_html/figures/03-kernel.pio.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Char device представляются обычными файлами, что очень удобно, и нереально облегчает задачу написания драйвера и программ. Например, с таким драйвером может работать любая программа, которая способна сохранять обычные файлы.&lt;br /&gt;А раз файлы обычные, то можно вытворять разные хитрости, например mmap, отобразить файл в память пользовательской программы. В итоге можно добиться ситуации, когда читая в своей программе переменную device_buttons, можно обращаться к портам ввода-вывода на внешнем устройстве.&lt;br /&gt;&lt;br /&gt;Создать char device в своем модуле очень просто, нужно заполнить специальную структуру, и вызвать функцию инициализации. Структура содержит указатели на функции чтения и записи, так же необходимы имя устройства, major номер устройства (идентификация, выбирается из свободного диапазона).&lt;br /&gt;Вот примерный вид структуры&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;struct file_operations memory_fops = {&lt;br /&gt;  read: memory_read,&lt;br /&gt;  write: memory_write,&lt;br /&gt;  open: memory_open,&lt;br /&gt;  release: memory_release&lt;br /&gt;};&lt;br /&gt;register_chrdev(memory_major, &quot;memory&quot;, &amp;memory_fops);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;А теперь немного кода для примера&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;ssize_t memory_write( struct file *filp, char *buf,&lt;br /&gt;                      size_t count, loff_t *f_pos) {&lt;br /&gt;  size_t c;&lt;br /&gt;  c = count&gt;MEMORY_SIZE ? MEMORY_SIZE: count;&lt;br /&gt;  printk(&quot;&lt;1&gt;Memory wrire %d\n&quot;,c); &lt;br /&gt;  copy_from_user(memory_buffer,buf,c);&lt;br /&gt;  buffer_size=c;&lt;br /&gt;  return count;&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Данный кусок выполняется когда программа запрашивает запись в устройство. printk - вывод системных сообщений в dmesg, а copy_from_user - функция копирования данных из пользовательского буфера buf в буфер модуля memory_buffer. Все хитрости взаимодействия кода с разных уровней спрятано в нее.&lt;br /&gt;Функция memory_write возвращает количество записанных байт&lt;br /&gt;&lt;br /&gt;Чтение из устройства&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;ssize_t memory_read(struct file *filp, char *buf, &lt;br /&gt;                    size_t count, loff_t *f_pos) { &lt;br /&gt;&lt;br /&gt;  size_t c;&lt;br /&gt;  c = count&gt;MEMORY_SIZE ? MEMORY_SIZE: count;&lt;br /&gt;  if (*f_pos&gt;0) return 0;&lt;br /&gt;  /* Transfering data to user space */ &lt;br /&gt;  copy_to_user(buf,memory_buffer,c);&lt;br /&gt;&lt;br /&gt;  printk(&quot;Memory read: %d \n&quot;,c);&lt;br /&gt;  /* Changing reading position as best suits */ &lt;br /&gt;  if (c &gt;= 0) { &lt;br /&gt;    *f_pos+=c; &lt;br /&gt;    return c; &lt;br /&gt;  } else { &lt;br /&gt;    return 0;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Тут то же самое что и в записи, только copy_to_user - записать из ядра в программу, а код возврата memory_read 0 означает что больше читать нечего, и программа больше читать не будет. В настоящем файле это происходит, когда достигнут конец файла.&lt;br /&gt;&lt;br /&gt;Теперь протестируем наш пример (код я выложил в svn)&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;svn checkout http://nagos.googlecode.com\&lt;br /&gt;/svn/kernel_module/tags/20100518 kernel_module&lt;br /&gt;cd kernel_module&lt;br /&gt;make&lt;br /&gt;sudo mknod /dev/memory c 60 0&lt;br /&gt;sudo chmod 666 /dev/memory&lt;br /&gt;sudo insmod memory.ko&lt;br /&gt;echo 12346789 &gt; /dev/memory&lt;br /&gt;cat /dev/memory&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;В ответ должно получиться примерно следующее:&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;nagos1:~/kernel_module$ sudo insmod memory.ko&lt;br /&gt;nagos:~/kernel_module$ echo 12346789 &gt; /dev/memory&lt;br /&gt;nagos:~/kernel_module$ cat /dev/memory&lt;br /&gt;12346789&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Собственно что написали, то и получили. Драйвер принимает байты (echo последовательно записывает их в устройство), а потом отдает (cat читает их оттуда). Технически записано 9 байт, echo выдает в конце перевод строки, что бы не выдавал нужна опция -n.&lt;br /&gt;Так же в dmesg можно посмотреть как наш модуль отвечал на комманды.&lt;br /&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: js&quot;&gt;&lt;![CDATA[&lt;br /&gt;[ 5910.546070] Inserting memory module&lt;br /&gt;[ 5917.761247] Memory wrire 9&lt;br /&gt;[ 5923.931364] Memory read: 9 &lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Этот кусок написан на основе статьи &lt;a href=&quot;http://www.freesoftwaremagazine.com/articles/drivers_linux&quot;&gt;Writing device drivers in Linux: A brief tutorial&lt;/a&gt;, рекомендую ознакомиться.</description><link>http://takeworld.blogspot.com/2010/05/character-device-linux.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-7349108136166043116</guid><pubDate>Mon, 17 May 2010 06:44:00 +0000</pubDate><atom:updated>2010-06-14T21:07:39.031+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kernel</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Пишем модуль ядра Linux</title><description>Также рекомендую прочитать:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux.html&quot;&gt;Пишем модуль ядра Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/character-device-linux.html&quot;&gt;Пишем свой character device для Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/udev-auto-creating-device.html&quot;&gt;Автосоздание устройств через udev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://takeworld.blogspot.com/2010/05/linux-kernel-sleep.html&quot;&gt;Ожидание в Linux ядре&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;По работе понадобилось написать Linux драйвер для самодельного устройства. Дальше я в общих чертах покажу как написать модуль ядра Linux, как связать его с userspace программой, и даже место, куда и как вставлять работу с реальным железом.&lt;br /&gt;&lt;br /&gt;Даже если вы не собираетесь писать свой драйвер, все равно стоит это прочитать. Ядро Linux это просто эталон хорошего кода. После него будет стыдно смотреть на свой старый код.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Общие впечатления&lt;/span&gt;&lt;br /&gt;&lt;div class=&#39;highlight&#39;&gt;Драйвер еще не готов, железка не собрана, идея не принята, поэтому все что дальше - мое личное мнение, не подкрепленное законченным продуктом :)&lt;/div&gt;&lt;br /&gt;Когда возникла идея написать свой драйвер, выяснилось что у всех начинается паника при слове &quot;операционная система&quot; (раньше устройства разрабатывали на микроконтроллерах без системы, на голом C). А при словах &quot;драйвер&quot; вообще пена у рта появлялась.&lt;br /&gt;Ну мне то пофиг, я матерый линуксоид, и залезть в исходники ядра как нечего делать. Залез, посмотрел, почитал книжку (ссылка дальше), и удивился на сколько там все легко и просто.&lt;br /&gt;&lt;br /&gt;Сначала я хотел назвать пост &quot;пишем драйвер&quot;. Но драйвер подразумевает работу с реальным железом, сейчас я этого касаться не буду, это отдельная тема для каждого устройства. Если кратко, то устройство представляется для системы как область памяти. Записал по определенному адресу байт, он попал в устройство.&lt;br /&gt;&lt;br /&gt;Интересный момент - взаимодействие с userspace программами. Доступ к устройствам есть только у ядра, и его модулей. Но данные нужны обычной программе, которую запускает пользователь. В Linux предусмотрено несколько режимов взаимодействия, самый простой - через файлы устройств в /dev. Когда пользовательская программа читает данные из файла, в модуле ядра выполняется функция read, когда пишет - write. Все просто и понятно. Если необходимо отправить специальную управляющую команду, есть интерфейс ioctl.&lt;br /&gt;Существуют и более сложные механизмы взаимодействия, но нам хватит и такого.&lt;br /&gt;&lt;br /&gt;А теперь немного кода. Вот как выглядит Makefile для модуля&lt;br /&gt;&lt;div class=&#39;code&#39;&gt;&lt;br /&gt;#имена модулей которые нужно компилировать&lt;br /&gt;obj-m := hello.o&lt;br /&gt;all:&lt;br /&gt; $(MAKE) -C /lib/modules/2.6.32-22-generic/build/ M=`pwd` modules&lt;br /&gt;clean:&lt;br /&gt; $(MAKE) -C /lib/modules/2.6.32-22-generic/build/ M=`pwd` clean&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;И сам код модуля hello world (hello.c)&lt;br /&gt;&lt;div class=&#39;code&#39;&gt;&lt;br /&gt;#include &amp;lt;linux/init.h&amp;gt;&lt;br /&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;br /&gt;#include &amp;lt;linux/kernel.h&amp;gt;&lt;br /&gt;&lt;br /&gt;MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);&lt;br /&gt;&lt;br /&gt;static int hello_init(void) {&lt;br /&gt;  printk(&quot;&lt;1&gt; Hello world!\n&quot;);&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void hello_exit(void) {&lt;br /&gt;  printk(&quot;&lt;1&gt; Bye, cruel world\n&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;module_init(hello_init);&lt;br /&gt;module_exit(hello_exit);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Каждый модуль регистрируется в системе с помощью функций module_init и module_exit.&lt;br /&gt;Если теперь загрузить модуль и посмотреть dmesg, то увидим что модуль загрузился и работает.&lt;br /&gt;&lt;div class=&#39;code&#39;&gt;sudo insmod hello.ko&lt;br /&gt;dmesg&lt;/div&gt;&lt;br /&gt;А дальше читайте в книжке, и не забывайте смотреть на существующие модули Linux, все станет понятней.&lt;br /&gt;&lt;br /&gt;Отличная книга по этой теме, на английском языке, советую ознакомиться, &lt;a href=&quot;http://lwn.net/Kernel/LDD3/&quot;&gt;Linux Device Drivers, Third Edition&lt;/a&gt;&lt;br /&gt;Вот еще интересная статья про написание драйвера, &lt;a href=&quot;http://www.freesoftwaremagazine.com/articles/drivers_linux&quot;&gt;Writing device drivers in Linux: A brief tutorial&lt;/a&gt;. Она уже охватывает тему создания character device (файл устройства), получение и передачу данных через него.</description><link>http://takeworld.blogspot.com/2010/05/linux.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8183423703741506019.post-4684905339025132211</guid><pubDate>Sat, 19 Dec 2009 21:31:00 +0000</pubDate><atom:updated>2009-12-20T00:33:57.296+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows</category><title>Самый смешной вирус</title><description>Вот такое чудо вирусописания под винду я сегодня встретил. Обычно о таком я не пишу, ну уж очень смешно :)&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;400&quot; height=&quot;225&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Jc4M14b20W4&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/Jc4M14b20W4&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;400&quot; height=&quot;225&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</description><link>http://takeworld.blogspot.com/2009/12/blog-post.html</link><author>noreply@blogger.com (Владимир Яковлев)</author><thr:total>10</thr:total></item></channel></rss>