Архив метки: linux

OpenNews: Компания LEGO представила конструктор для создания роботов с прошивкой на базе Linux

http://www.opennet.ru/opennews/art.shtml?num=35787

Компания LEGO анонсировала подготовку к выпуску Mindstorms EV3, нового поколения конструкторов серии Mindstorms, нацеленных на конструирование роботов. Отвечающая за управление роботами прошивка построена на базе Linux. Для удалённого управления роботами со смартфона подготовлены специальные приложения для платформ Android и iOS. Окружение для разработки будет построено на основе визуальной среды LabView, кроме того будет поддерживаться определение логики на RobotC и других языках программирования.

Новая платформа Mindstorms EV3 построена на базе ARM9 SoC (300 MHz), содержит 64 Мб ОЗУ, 16 Мб Flash и позволяет создавать 17 предопределённых типов роботов, от манипуляторов и роботизированных машин до шагающих человеко-подобных роботов и систем, напоминающих змею и скорпиона. Платформа оснащена слотом для SD-карт, WiFi, USB Host, Bluetooth, тремя сервоприводами, двумя сенсорами касаний, датчиком инфракрасного излучения для отслеживания движения других роботов и четырьмя портами для сопряжения с другими конструкциями LEGO. Ожидается, что конструктор поступит в продажу во второй половине 2013 года, стоимость базового набора составит $350.

 

OpenNews: На выставке потребительской электроники продемонстрирован смартфон c Ubuntu

Марк Шаттлворт устроил на проходящей в Лас-Вегасе выставке потребительской электроники демонстрацию работы представленной в начале января редакции дистрибутива Ubuntu для смартфонов (Ubuntu Phone OS). Новая система была показана на смартфоне Samsung Galaxy Nexus, который используется при разработке в качестве эталонного устройства. В конце февраля планируется опубликовать исходные тексты компонентов платформы и готовые образы для установки Ubuntu Phone OS на Galaxy Nexus. До февраля наработки не будут доступны публично, так как разработка некоторых базовых мобильных приложений ещё не завершена.

 

Источник: OpenNews: На выставке потребительской электроники продемонстрирован смартфон c Ubuntu.

Как включить тачпад на ноутбуке DNS с Linux

Картина такая: хотим мы на своём букваре запустить Linux — загружаемся, всё красиво, только вот тачпад на ноутбуке не работает. Пальцами поковыряли, постучали, поцарапали, а курсор не шевелится. Для выянения причин проблем можно использовать следующие действия:

  • проверить, есть ли в папке /dev/input/ файлы mouseN (mouse0, mouse1). Если к ноутбуку не подключена внешняя мышь, значит скорее всего это будет файл устройства тачпада
  • выполнить в консоли команду xinput list и посмотреть на результаты.

$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ ImPS/2 Generic Wheel Mouse                  id=11    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Power Button                                id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=10    [slave  keyboard (3)]

Здесь у меня тачпад высветился как ImPS/2 Generic Wheel Mouse

  • за мышей и тачпад в часности скорее всего будет отвечать модуль psmouse (слышал версию, что имя модуля может оказаться другим). Попробуем проверить, загружен он или нет. Смотрим lsmod | grep psmouse, если пусто — значит либо модуль зашит в ядро, либо не загружен вовсе. Загружается модуль через # modprobe psmouse. И вот тут важный момент: модуль может запускаться с разными параметрами! Тачпад может неработать с успешно загруженными драйверами просто из-за неправильных параметров, указанных при загрузке модуля.

Параметры ядра можно пробовать так:

sudo rmmod psmouse
sudo modprobe psmouse proto=imps

Мне на нетбуке DNS помогла именно эта опция. Если не подойдёт, то есть ещё вариант proto=exps.

Если правильные опции для модулей подобраны, надо организовать их автоматическую загрузку при старте системы. Здесь есть варианты. Можно создать например файл  /etc/modprobe.d/options, в который записать

options psmouse proto=imps

Другой вариант — вписать дополнительные параметры запуска ядра системы в файл настроек загрузчика (/boot/grub/grub.cfg) в пункт меню проблемной операционки. Выглядеть строчка станет примерно так:     linux /boot/vmlinuz-3.5.3-i686-CLD root=UUID=77777777-3588-45d0-7777-0177d0fdbeec ro video=uvesafb:ywrap,1024×600-32,mtrr:3,splash=silent,theme:calculate elevator=cfq doscsi calculate=video:intel console=tty1 udev quiet psmouse.proto=imps

Вот примерно вся информация, которая мне понадобилась, чтоб настроить тачпад в Calculate Linux 12.0.3 на нетбуке DNS 0128811.

В тему:

как отключить тачпад на ноутбуке dns

Что мне помогло, когда Calculate Linux загружался с чёрным экраном

Нетбук у меня DNS 0128811. Видео от intel. Винт разбит очень хитро, короче основная система ubuntu 11.10 стоит на разделе /dev/sda5, такой же раздел создал под новый дистриб. Выбор пал на Calculate Desktop 12.0.3. C Live-флэшки с точки зрения экрана загружается без проблем. Есть момент, что не работает тачпад, включается numlock и не работают горячие клавиши, но это сегодня к теме не относится.

И вот я его установил… Включаю бук. В GRUB выбираю строчку Calculate. Видно, как подсветка монитора светится, а индикатор жесткого диска моргает, будто система успешно загружается. Вот только ничего не видно. Дождался, пока жесткий диск перестал моргать (типа загрузка закончилась). Вслепую отправился на шестую консоль CTRL+ALT+F6. Там для аккуратной перезагрузки нажал старые добрые CTRL+ALT+DEL. Думаю, сейчас загружусь в Ubuntu, почитаю логи, посмотрю конфиги, что могло случиться. Выбираю в GRUB свою Ubuntu, и она точно так же начинает грузиться с чёрным экраном!

Ну, думаю, контрольная флэшка нормально грузилась. Вставил, загрузился, действительно экран нормально работает в композитном режиме, всё отлично. Соответственно получается, что Calculate каким-то неправильным образом настроил мне GRUB.

В списке операционок в GRUB у меня есть ubuntu recovery mode. Через него ось грузится до определённого места в текстовом режиме. Дальше выбрал продолжить загрузку. Система загрузилась в графическом режиме, но с неправильным разрешением (1024×768 вместо 1024×600). Залогинился, поставил 800х600, теперь жить можно.

Так вот, решение:

Надо переустанавливать загрузчик. Переустанавливал из этой самой убунты.

$ sudo grub-install —root-directory=/ /dev/sda — переучтановка загрузчика

$ sudo update-grub —output=/boot/grub/grub.cfg — ищет на дисках все ядра и генерирует менюшку граба.

Вот собственно после этих двух строчек Calculate начал замечательно грузиться в графическом режиме с правильным разрешением и композитом. Отмечу, что в данном случае папка /boot находилась не на разделе Calculate, а на разделе Ubuntu, то есть возможно пути в командах выше надо будет исправить под себя.

Пишем свой драйвер под Linux

Чтоб бесценный труд хорошего человека не затерялся в интернете, сделаю у себя его копию

http://habrahabr.ru/post/106702/

Пишем свой драйвер под Linux

Хочу признаться сразу, что я вас отчасти обманул, ибо драйвер, если верить википедии это компьютерная программа, с помощью которой другая программа (обычно операционная система) получает доступ к аппаратному обеспечению некоторого устройства. А сегодня мы создадим некую заготовку для драйвера, т.к. на самом деле ни с каким железом мы работать не будем. Эту полезную функциональность вы сможете добавить сами, если пожелаете.

То, что мы сегодня создадим, корректнее будет назвать LKM (Linux Kernel Module или загрузочный модуль ядра). Стоит сказать, что драйвер – это одна из разновидностей LKM.

Писать модуль мы будем под ядра линейки 2.6. LKM для 2.6 отличается от 2.4. Я не буду останавливаться на различиях, ибо это не входит в рамки поста.

Мы создадим символьное устройство /dev/test, которое будет обрабатываться нашим модулем. Хочу сразу оговориться, что размещать символьное устройство не обязательно в каталоге /dev, просто это является частью «древнего магического ритуала».

Немного теории

Если кратко, то LKM – это объект, который содержит код для расширения возможностей уже запущенного ядра Linux. Т.е. работает он в пространстве ядра, а не пользователя. Так что не стоит экспериментировать на рабочем сервере. В случае ошибки, закравшейся в модуль, получите kernel panic. Будем считать, что я вас предупредил.

Модуль ядра должен иметь как минимум 2 функции: функцию инициализации и функцию выхода. Первая вызывается во время загрузки модуля в пространство ядра, а вторая, соответственно, при выгрузке его. Эти функции задаются с помощью макроопределений: module_init и module_exit.

Стоит сказать несколько слов о функции printk(). Основное назначение этой функции — реализация механизма регистрации событий и предупреждений. Иными словами эта функция для записи в лог ядра некой информации.

Т.к. драйвер работает в пространстве ядра, то он отграничен от адресного пространства пользователя. А нам хотелось бы иметь возможность вернуть некий результат. Для этого используется функция put_user(). Она как раз и занимается тем, что перекидывает данные из пространства ядра в пользовательское.

Хочу ещё сказать пару слов о символьных устройствах.

Выполните команду ls -l /dev/sda*. Вы увидите что-то вроде:
brw-rw---- 1 root disk 8, 0 2010-10-11 10:23 /dev/sda
brw-rw---- 1 root disk 8, 1 2010-10-11 10:23 /dev/sda1
brw-rw---- 1 root disk 8, 2 2010-10-11 10:23 /dev/sda2
brw-rw---- 1 root disk 8, 5 2010-10-11 10:23 /dev/sda5

Между словом «disk» и датой есть два числа разделённых запятой. Первое число называют старшим номером устройства. Старший номер указывает на то, какой драйвер используется для обслуживания данного устройства. Каждый драйвер имеет свой уникальный старший номер.

Файлы устройства создаются с помощью команты mknod, например: mknod /dev/test c 12. Этой командой мы создадим устройство /dev/test и укажем для него старший номер (12).

Я не буду сильно углубляться в теорию, т.к. кому интересно – тот сможет сам почитать про это подробнее. Я дам ссылку в конце.

Прежде чем начать

Нужно знать несколько «волшебных» команд:

  • insmod – добавить модуль в ядро
  • rmmod – соответственно, удалить
  • lsmod – вывести список текущих модулей
  • modinfo – вывести информацию о модуле

Для компиляции модуля нам потребуются заголовки текущего ядра.

В debian/ubutnu их можно легко поставить так (к примеру для 2.6.26-2-686):
apt-get install linux-headers-2.6.26-2-686
Либо собрать пакет для вашего текущего ядра самим: fakeroot make-kpkg kernel_headers

Исходник

#include <linux/kernel.h> /* Для printk() и т.д. */
#include <linux/module.h> /* Эта частичка древней магии, которая оживляет модули */
#include <linux/init.h> /* Определения макросов */
#include <linux/fs.h>
#include <asm/uaccess.h> /* put_user */

// Ниже мы задаём информацию о модуле, которую можно будет увидеть с помощью Modinfo
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Alex Petrov <petroff.alex@gmail.com>" );
MODULE_DESCRIPTION( "My nice module" );
MODULE_SUPPORTED_DEVICE( "test" ); /* /dev/testdevice */

#define SUCCESS 0
#define DEVICE_NAME "test" /* Имя нашего устройства */

// Поддерживаемые нашим устройством операции
static int device_open( struct inode *, struct file * );
static int device_release( struct inode *, struct file * );
static ssize_t device_read( struct file *, char *, size_t, loff_t * );
static ssize_t device_write( struct file *, const char *, size_t, loff_t * );

// Глобальные переменные, объявлены как static, воизбежание конфликтов имен.
static int major_number; /* Старший номер устройства нашего драйвера */
static int is_device_open = 0; /* Используется ли девайс ? */
static char text[ 5 ] = "test\n"; /* Текст, который мы будет отдавать при обращении к нашему устройству */
static char* text_ptr = text; /* Указатель на текущую позицию в тексте */

// Прописываем обработчики операций на устройством
static struct file_operations fops =
{
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};

// Функция загрузки модуля. Входная точка. Можем считать что это наш main()
static int __init test_init( void )
{
printk( KERN_ALERT "TEST driver loaded!\n" );

// Регистрируем устройсво и получаем старший номер устройства
major_number = register_chrdev( 0, DEVICE_NAME, &fops );

if ( major_number < 0 )
{
printk( "Registering the character device failed with %d\n", major_number );
return major_number;
}

// Сообщаем присвоенный нам старший номер устройства
printk( "Test module is loaded!\n" );

printk( "Please, create a dev file with 'mknod /dev/test c %d 0'.\n", major_number );

return SUCCESS;
}

// Функция выгрузки модуля
static void __exit test_exit( void )
{
// Освобождаем устройство
unregister_chrdev( major_number, DEVICE_NAME );

printk( KERN_ALERT "Test module is unloaded!\n" );
}

// Указываем наши функции загрузки и выгрузки
module_init( test_init );
module_exit( test_exit );

static int device_open( struct inode *inode, struct file *file )
{
text_ptr = text;

if ( is_device_open )
return -EBUSY;

is_device_open++;

return SUCCESS;
}

static int device_release( struct inode *inode, struct file *file )
{
is_device_open--;
return SUCCESS;
}

static ssize_t

device_write( struct file *filp, const char *buff, size_t len, loff_t * off )
{
printk( "Sorry, this operation isn't supported.\n" );
return -EINVAL;
}

static ssize_t device_read( struct file *filp, /* include/linux/fs.h */
char *buffer, /* buffer */
size_t length, /* buffer length */
loff_t * offset )
{
int byte_read = 0;

if ( *text_ptr == 0 )
return 0;

while ( length && *text_ptr )
{
put_user( *( text_ptr++ ), buffer++ );
length--;
byte_read++;
}

return byte_read;
}

* This source code was highlighted with Source Code Highlighter.

Сборка модуля

Ну а теперь можем написать небольшой Makefile:

obj-m += test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

И проверить его работоспособность:

root@joker:/tmp/test# make
make -C /lib/modules/2.6.26-2-openvz-amd64/build M=/tmp/test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-openvz-amd64'
CC [M] /tmp/1/test.o
Building modules, stage 2.
MODPOST 1 modules
CC /tmp/test/test.mod.o
LD [M] /tmp/test/test.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-openvz-amd64'

Посмотрим что у нас получилось:

root@joker:/tmp/test# ls -la
drwxr-xr-x 3 root root 4096 Окт 21 12:32 .
drwxrwxrwt 12 root root 4096 Окт 21 12:33 ..
-rw-r--r-- 1 root root 219 Окт 21 12:30 demo.sh
-rw-r--r-- 1 root root 161 Окт 21 12:30 Makefile
-rw-r--r-- 1 root root 22 Окт 21 12:32 modules.order
-rw-r--r-- 1 root root 0 Окт 21 12:32 Module.symvers
-rw-r--r-- 1 root root 2940 Окт 21 12:30 test.c
-rw-r--r-- 1 root root 10364 Окт 21 12:32 test.ko
-rw-r--r-- 1 root root 104 Окт 21 12:32 .test.ko.cmd
-rw-r--r-- 1 root root 717 Окт 21 12:32 test.mod.c
-rw-r--r-- 1 root root 6832 Окт 21 12:32 test.mod.o
-rw-r--r-- 1 root root 12867 Окт 21 12:32 .test.mod.o.cmd
-rw-r--r-- 1 root root 4424 Окт 21 12:32 test.o
-rw-r--r-- 1 root root 14361 Окт 21 12:32 .test.o.cmd
drwxr-xr-x 2 root root 4096 Окт 21 12:32 .tmp_versions

Теперь посмотрим информацию о только что скомпилированном модуле:

root@joker:/tmp/test# modinfo test.ko
filename: test.ko
description: My nice module
author: Alex Petrov <druid@joker.botik.ru>
license: GPL
depends:
vermagic: 2.6.26-2-openvz-amd64 SMP mod_unload modversions

Ну и наконец установим модуль в ядро:

root@joker:/tmp/test# insmod test.ko

Посмотрим есть ли наш модуль с списке:

root@joker:/tmp/test# lsmod | grep test

test 6920 0

И что попало в логи:

root@joker:/tmp/test# dmesg | tail

[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with 'mknod /dev/test c 249 0'.

Наш модуль подсказываем нам что нужно сделать.

Последуем его совету:

root@joker:/tmp/test# mknod /dev/test c 249 0

Ну и наконец проверим работает ли наш модуль:

root@joker:/tmp/test# cat /dev/test

test

Наш модуль не поддерживает приём данных со стороны пользователя:

root@joker:/tmp/test# echo 1 > /dev/test

bash: echo: ошибка записи: Недопустимый аргумент

Посмотрим что что скажет модуль на наши действия:

root@joker:/tmp/test# dmesg | tail

[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with 'mknod /dev/test c 249 0'.
[829747.462715] Sorry, this operation isn't supported.

Удалим его:

root@joker:/tmp/test# rmmod test

И посмотрим что он нам скажет на прощание:

root@joker:/tmp/test# dmesg | tail

[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with 'mknod /dev/test c 249 0'.
[829747.462715] Sorry, this operation isn't supported.
[829893.681197] Test module is unloaded!

Удалим файл устройства, что бы он нас не смущал:

root@joker:/tmp/test# rm /dev/test

Заключение

Дальнейшее развитие этой «заготовки» зависит только от вас. Можно превратить её в настоящий драйвер, который будет предоставлять интерфейс к вашему девайсу, либо использовать для дальнейшего изучения ядра Linux.

Только что в голову пришла совершенно безумная идея сделать sudo через файл устройства. Т.е. посылаем в /dev/test команду и она выполняется от имени root.

Литература

И под конец дам ссылку на книгу заклинаний LKMPG (Linux Kernel Module Programming Guide)

UPD:
У некоторых может не собраться модуль через Makefile, описанный выше.
Решение:
Создаём Makefile только с одной строкой: obj-m += test.o
И запускаем сборку так:
make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD modules

UPD2:
Поправил ошибки в исходнике.
Парсер глючит и сохраняет ‘MODULE_DEscriptION( «My nice module» );’. Естественно в module_description все буквы заглавные.

UPD3:
segoon прислал несколько поправок к посту:

1) В функции device_open() находится race condition:

static int device_open( struct inode *inode, struct file *file )
{
text_ptr = text;

if ( is_device_open ) <<<<
return -EBUSY;

is_device_open++; <<<<

return SUCCESS;
}

Если один процесс увеличит is_device_open во время исполнения другим
процессом команд между if (is_device_open) и is_device_open++, то в
итоге файл откроется 2 раза. Для атомарных действий нужно использовать
функцию из серии atomic_XXX().

Атомарные операции нужно использовать во всех местах работы с данными. В данном случае и в close().

2) device_write() можно было вообще не писать, т.к. обработчик по
умолчанию write() сам возвращает ошибку.

3) у put_user() ОБЯЗАТЕЛЬНО нужно проверять результат. Если не ноль, то
нужно либо
а) вернуть результат -EFAULT и сделать вид, что ничего не было (т.е.
не удалять не до конца считанные данные из внутренних буферов, в данном
случае данные константные и ничего изменять не надо)
б) вернуть кол-во УЖЕ записанный байт (это называется partial read,
позволено POSIX’ом). При этом нужно следить за тем, чтобы не вернуть 0:
read() = 0 означает, что файл подошёл к концу, а это не так.

4) В ядре в качестве успешного кода завершения используется 0, а не
задефайненная константа SUCCESS. Есть исключения, например, в
обработчике сетевого пакета, но там, где возвращается либо -EXXX (код
ошибки), либо 0 (всё хорошо), используется именно константа 0.

Ещё много функций можно заменить на более подходящие аналоги, но это
усложнило бы понимание статьи новичками 🙂

Запись опубликована автором в рубрике Без рубрики с метками .

Настройка джойстика в FCE Ultra

FCE Ultra — эмулятор игровой приставки Dendy для Linux. Управление по умолчанию — стрелки и A, S, D, F. Подключил ждойстик Logitech (набор кнопок как на PlayStation) и понял, что игра на него не обращает внимания, ни одна кнопка ничего полезного не делает. Так вот, рецепт для настройки джойстика: подключаем к компьютеру (или что у нас там) наш джойстик и набираем в терминале

$ fceu -inputcfg gamepad1 ‘game.nes’

В результате игра запустится только после того, как мы нажмём на джойстике все нужные кнопки по 2 раза:

Starting FCE Ultra 0.98.12…
GamePad #1: A (1)

Вот теперь можно и поиграть по-человечески. Даже кнопки турбо работают вотличие от некоторых других эмуляторов. Желаю всем приятно отдохнуть за танчиками.

Запись опубликована автором в рубрике Без рубрики с метками , , .

Сайты с готовыми образами для виртуальных машин

Образы свободных ОС

http://virtualboxes.org/images

Образы виртуальных машин для разработчиков от Oracle

http://www.oracle.com/technetwork/ru/community/developer-vm/index.html

TurnKey(vmdk,iso,ovf) — готовые движки для сайтов, SDK и много всего прочего, понравилось

http://www.turnkeylinux.org/all

Монтирование USB-дисков

Для распространённого случая, когда USB-диск имеет файловую систему FAT32, команда монтирования выглядит так:

mount -t vfat -o codepage=866,iocharset=utf8 /dev/sda1 /mnt

Параметр codepage необходим, чтобы имена созданных файлов корректно отображались в старых ОС (например, DOS). Если дистрибутив использует в качестве кодировки системной локали не UTF-8, то ее необходимо указать в параметре iocharset так:

mount -t vfat -o codepage=866,iocharset=koi8-r /dev/sda1 /mnt

Реально используемую кодировку можно определить выполнив команду locale.

Полезными опциями при монтировании Flash-дисков являются sync и flush. Первая приводит к постоянному сбросу на диск буфера записи, так что данные не теряются при отсоединении flash-диска без размонтирования. Побочный эффект такого монтирования — значительное уменьшение в скорости записи. Вторая опция (доступна только в новых ядрах Linux) ведёт к сбросу буфера на диск после записи последнего файла. Это также способствует сохранению данных в случае удаления диска без размонтирования, но не приводит к падению скорости записи.