понедельник, 14 декабря 2015 г.

Установка python 2.7.11+, django 1.6.1 с поддержкой mysql на ubuntu 16.04

Я ставил Ubuntu 16.04 amd64 с LiveUSB-системы, на базе исошника c официального сайта. Питон версии 2.7.11+ был предустановлен. Проверяем версию python:

python --version
Python 2.7.11+

Установка пакетного менеджера pip:

sudo apt-get install python-pip

Установка virtualenv:

sudo pip install virtualenv

Перейдем в папку с нашим проектом (у меня  /media/Data/Projects/Python/test) и создадим виртуальное окружение:

cd /media/Data/Projects/Python/test
virtualenv dj1_6_1


Активируем окружение:

source dj1_6_1/bin/activate


Строка должна принять вид: (dj1_6_1) adil@adil:/media/Data/Projects/Python/test$
Устанавливаем django 1.6.1 через pip под virtualenv dj1_6_1:

pip install django==1.6.1

Проверяем версию django:

python manage.py --version
1.6.1


Установка БД MySQL и клиентской библиотеки для работы с ней:

sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev

Установка модулей питона для работы с MySQL:

pip install mysql-python

Использованные статьи:

понедельник, 9 ноября 2015 г.

Подключение 4-проводной тачпанели Sharp LQ057Q3DC12 к BBB (через промежуточную плату Digi LCD application board for 6.4 sharp vga)

Для того, чтобы на BBB появилось соответствующее устройство надо включить сборку следующих модулей при конфигурировании ядра (у меня 4.1.0-rc1-bone0):

1) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC);
2) ti_am335x_tsc.ko(CONFIG_TOUCHSCREEN_TI_AM335X_TSC);
3) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC).


Модули лучше сделать встроенными (build-in): соответствующие опции будут выделены звездочкой (*). Можно сделать загружаемыми (loadable) - соответствующие опции при конфигурировании будут выделены (M). Модули adc и tsc зависят от tscadc, поэтому настойки типа сборки касаются сразу всех модулей.

Необходимые опции menuconfig: 

1) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC)

Device Drivers --->
 [*] Industrial I/O support --->
   [*] Enable buffer support within IIO
   <*> Industrial I/O lock free software ring
     Analog to digital converters --->
       <*> TI's AM335X ADC driver


2) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC)

Device Drivers --->
  Multifunction device drivers --->
    <*> TI ADC / Touch Screen chip support


3) ti_am335x_tsc.ko(CONFIG_TOUCHSCREEN_TI_AM335X_TSC)

Device Drivers ---> 
Input device support ---> 
  -*- Generic input layer (needed for keyboard, mouse, ...) -*- Support for memoryless force-feedback devices {M} Polled input device skeleton <M> Sparse keymap support library <M> Matrix keymap support library *** Userland interfaces *** < > Mouse interface < > Joystick interface <*> Event interface <*> Event debugging < > Input Power Event -> APM Bridge *** Input Device Drivers *** [ ] Keyboards ---- [ ] Mice ---- [ ] Joysticks/Gamepads ---- [*] Tablets ---> [*] Touchscreens ---> <*> <*> TI Touchscreen Interface

В device tree для корректной работы tsc-контроллера надо внести следующие исправления:
1) файл bb-kernel/KERNEL/arch/arm/boot/dts/am33xx.dtsi :

...
tscadc: tscadc@44e0d000 {
compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
ti,wires = <4>;
ti,x-plate-resistance = <200>;
ti,coordinate-readouts = <5>;
ti,wire-config = <0x00 0x11 0x22 0x33>;
ti,charge-delay = <0x400>;
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <4 5 6 7>;
};
};
...


После сборки обновленного ядра должно появиться устройство /dev/input/event[0..9] (у меня /dev/input/event0).

Проверить получение данных с панели можно следующим образом:

cat /dev/input/event0 | hexdump

Подключение тачпанели через промежуточную плату  к BBB произведем следующим образом:
1) TSMx (41 X10) - AIN0 (39 P9)
2) TSPx (39 X10) - AIN1 (40 P9)
3) TSMy (42 X10) - AIN2 (37 P9)
4) TSPy (40 X10) - AIN3 (38 P9)

Настройка TSC controller производится через devicetree, а из полученного бинарника считывают следующие исходные файлы модулей:
1) заголовочный файл с определением констант регистров ADCTSC controller'а - /media/Data/Kernel/bbb/bb-kernel/KERNEL/include/linux/mfd/ti_am335x_tscadc.h;
2) конфигурирование tscadc - /media/Data/Kernel/bbb/bb-kernel/KERNEL/drivers/mfd/ti_am335x_tscadc.c;
3) конфигурирование tsc - /media/Data/Kernel/bbb/bb-kernel/KERNEL/drivers/input/touchscreen/ti_am335x_tsc.c.


Для корректной работы курсора в qt-приложении, надо написать специальный драйвер, преобразующий информацию, полученную с /dev/input/event0 в перемещения курсора на экране.

Использованный материал:
1) http://processors.wiki.ti.com/index.php/Linux_Core_ADC_User%27s_Guide
2) http://www.farnell.com/datasheets/1780810.pdf
3) http://ftp1.digi.com/support/documentation/90000944_A.pdf

пятница, 30 октября 2015 г.

Подключение LCD экрана Sharp LQ057Q3DC12 к BBB

Datasheet LCD-TFT модуля LQ057Q3DC12 тут. У меня BBB element 14 с ОС Debian 7 версии 4.1.0-rc1-bone0. Подключение экрана мы производим через промежуточную плату DIGI
LCD APPLICATION KIT (схема).

Интересующие нас пины платы BBB для вывода изображения на LCD-панель мы можем получить из SRM (8.1.1 LCD Pins), полная таблица мультиплексирования пинов разъема P8 тут. Нас интересуют пины: lcd_vsync, lcd_pclk, lcd_hsync, lcd_ac_bias_en, lcd_data[0:15]. Распределение по цветам пинов lcd_data можно найти в схеме (страница 10 HDMI Interface). 

Нам надо подключить соответствующие пины платы Digi LCDAPKITJS (разъем x10) и платы BBB (разъем P8). После подключения необходимо проверить настройки мультиплексирования пинов, нам подходит режим 0 (mode 0):

PIN PINCTRL ADDR   NAME            MODE0 ...

27  0x0e0          lcd_vsync       lcd_vsync ...
28  0x0e8          lcd_pclk        lcd_pclk ...
29  0x0e4          lcd_hsync       lcd_hsync ...
30  0x0ec          lcd_ac_bias_en  lcd_ac_bias_en ...
31  0x0d8          lcd_data14      lcd_data14 ...
....
45  0x0a0          lcd_data0       lcd_data0 ...
46  0x0a4          lcd_data1       lcd_data1 ...


Получение текущего состояния пинов мультиплексирования можно произвести с помощью команды:

cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins | pager

Вывод:

registered pins: 142
... 
pin 40 (44e108a0.0) 00000000 pinctrl-single 
pin 41 (44e108a4.0) 00000000 pinctrl-single 
pin 42 (44e108a8.0) 00000000 pinctrl-single 
pin 43 (44e108ac.0) 00000000 pinctrl-single 
pin 44 (44e108b0.0) 00000000 pinctrl-single 
pin 45 (44e108b4.0) 00000000 pinctrl-single 
pin 46 (44e108b8.0) 00000000 pinctrl-single 
pin 47 (44e108bc.0) 00000000 pinctrl-single 
pin 48 (44e108c0.0) 00000000 pinctrl-single 
pin 49 (44e108c4.0) 00000000 pinctrl-single 
pin 50 (44e108c8.0) 00000000 pinctrl-single 
pin 51 (44e108cc.0) 00000000 pinctrl-single 
pin 52 (44e108d0.0) 00000000 pinctrl-single 
pin 53 (44e108d4.0) 00000000 pinctrl-single 
pin 54 (44e108d8.0) 00000000 pinctrl-single 
pin 55 (44e108dc.0) 00000000 pinctrl-single 
pin 56 (44e108e0.0) 00000008 pinctrl-single 
pin 57 (44e108e4.0) 00000008 pinctrl-single 
pin 58 (44e108e8.0) 00000008 pinctrl-single 
pin 59 (44e108ec.0) 00000008 pinctrl-single 
...

Значение, например пина 56 lcd_vsync (0x8), формируется следующим образом (AM335x Sitara Processors Technical Reference Manual глава 9.3.1.50 таблица 9-60 или SRM 8.2.5 Pin usage):

Bit10
5Receive EnabledReceive Disabled
4PullupPulldown
3Pullup/down DisabledPullup/down Enabled
2,1,0Mode

В соответствии с таблицей пин lcd_vsync, установленный в значение 0x8 (001000), настроен следующим образом:
- режим 0;
- не может передавать значение уровня (pullup/down disabled);
- установлен в значение логической единицы (pullup);
- может принимать значение уровня (receive enabled)

Нам нужно установить пины в следующее состояние:
- режим 0;
- может передавать значение уроня (pullup/down enabled);
- закрыть возможность чтения (нужно ли?)
- по умолчанию установлен в значение логического нуля (нужно ли?)

Всем этим параметрам соответствует значение 0x0 (000000), в которое установлены пины данных (lcd_data).

У меня установлена версия Debian 4.1.0-rc1-bone0 без поддержки оверлеев device tree и capemgr. Поэтому установить другое значение пина можно только через изменение соответствующего файла devicetree (у нас u_boot BBB грузит бинарный файл am355x_boneblack.dtb из папки /boot/dtbs/4.1.0-rc1-bone0/).

В device tree для корректной работы tsc-контроллера надо внести следующие исправления (файлы, содержащие настройки device tree, у меня находятся в директории /media/Data/Kernel/bbb/bb-kernel/KERNEL/arch/arm/boot/dts):

1) добавим файлы настройки lcd-панели с разрешением 320x240:

-  файл настройки разрешения и частоты LCD (am335x-panel-320x240.dtsi):

&lcdc {
status = "okay";
};

/ {
panel {
status = "okay";
compatible = "ti,tilcdc,panel";
pinctrl-names = "default";

panel-info {
ac-bias           = <255>;
ac-bias-intrpt    = <0>;
dma-burst-sz      = <16>;
bpp               = <32>;
fdd               = <0x80>;
sync-edge         = <0>;
sync-ctrl         = <0>;
raster-order      = <1>;
fifo-th           = <0>;
};
display-timings {
native-mode = <&timing0>;
timing0: 320x240 {
clock-frequency = <25000000>;
hactive = <320>;
vactive = <240>;
hfront-porch = <1>;
hback-porch = <45>;
hsync-len = <30>;
vback-porch = <22>;
vfront-porch = <12>;
vsync-len = <2>;
hsync-active = <1>;
vsync-active = <1>;
de-active = <1>;
pixelclk-active = <0>;
};
};
};
};

- файл мультиплексирования LCD-пинов (am335x-pinmux-panel-320x240.dtsi):

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include "am335x-panel-320x240.dtsi"

&am33xx_pinmux {
lcd_24bit_pins: pinmux_lcd_24bit_pins {
pinctrl-single,pins = <

/* P8_45: lcd_data0.lcd_data0 */
BONE_P8_45 (PIN_OUTPUT | MUX_MODE0)
/* P8_46: lcd_data1.lcd_data1 */
BONE_P8_46 (PIN_OUTPUT | MUX_MODE0)
/* P8_43: lcd_data2.lcd_data2 */
BONE_P8_43 (PIN_OUTPUT | MUX_MODE0)
/* P8_44: lcd_data3.lcd_data3 */
BONE_P8_44 (PIN_OUTPUT | MUX_MODE0)
/* P8_41: lcd_data4.lcd_data4 */
BONE_P8_41 (PIN_OUTPUT | MUX_MODE0)
/* P8_42: lcd_data5.lcd_data5 */
BONE_P8_42 (PIN_OUTPUT | MUX_MODE0)
/* P8_39: lcd_data6.lcd_data6 */
BONE_P8_39 (PIN_OUTPUT | MUX_MODE0)
/* P8_40: lcd_data7.lcd_data7 */
BONE_P8_40 (PIN_OUTPUT | MUX_MODE0)
/* P8_37: lcd_data8.lcd_data8 */
BONE_P8_37 (PIN_OUTPUT | MUX_MODE0)
/* P8_38: lcd_data9.lcd_data9 */
BONE_P8_38 (PIN_OUTPUT | MUX_MODE0)
/* P8_36: lcd_data10.lcd_data10 */
BONE_P8_36 (PIN_OUTPUT | MUX_MODE0)
/* P8_34: lcd_data11.lcd_data11 */
BONE_P8_34 (PIN_OUTPUT | MUX_MODE0)
/* P8_35: lcd_data12.lcd_data12 */
BONE_P8_35 (PIN_OUTPUT | MUX_MODE0)
/* P8_33: lcd_data13.lcd_data13 */
BONE_P8_33 (PIN_OUTPUT | MUX_MODE0)
/* P8_31: lcd_data14.lcd_data14 */
BONE_P8_31 (PIN_OUTPUT | MUX_MODE0)
/* P8_32: lcd_data15.lcd_data15 */
BONE_P8_32 (PIN_OUTPUT | MUX_MODE0)

/* gpmc_ad15.lcd_data16 */
BONE_P8_15 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad14.lcd_data17 */
BONE_P8_16 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad13.lcd_data18 */
BONE_P8_11 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad12.lcd_data19 */
BONE_P8_12 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad11.lcd_data20 */
BONE_P8_17 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad10.lcd_data21 */
BONE_P8_14 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad9.lcd_data22 */
BONE_P8_13 (PIN_OUTPUT | MUX_MODE1)
/* gpmc_ad8.lcd_data23 */
BONE_P8_19 (PIN_OUTPUT | MUX_MODE1)

/* P8_27: lcd_vsync.lcd_vsync */
BONE_P8_27 (PIN_OUTPUT | MUX_MODE0)
/* P8_29: lcd_hsync.lcd_hsync */
BONE_P8_29 (PIN_OUTPUT | MUX_MODE0)
/* P8_28: lcd_pclk.lcd_pclk*/
BONE_P8_28 (PIN_OUTPUT | MUX_MODE0)
/* P8_30: lcd_ac_bias_en.lcd_ac_bias_en */
BONE_P8_30 (PIN_OUTPUT | MUX_MODE0)
>;
};
};

/ {
panel {
pinctrl-0 = <&lcd_24bit_pins>;
};
};


2) изменение файла am355x_boneblack.dts (который подключается в файле am355x_boneblack.dtb ):

- подключим использование только что созданных файлов lcd-панели:

#include "am335x-panel-320x240.dtsi"
#include "am335x-pinmux-panel-320x240.dtsi"

- закомментим подключение настроек hdmi-контроллера:

/* #include "am335x-peripheral-nxp-hdmi.dtsi" */
/* #include "am335x-bone-pinmux-nxp-hdmi.dtsi" */

3) изменения файла am33xx.dtsi:

- включаем использование контроллера lcdc:

lcdc: lcdc@4830e000 {
compatible = "ti,am33xx-tilcdc";
reg = <0x4830e000 0x1000>;
interrupt-parent = <0x1>;
interrupts = <0x24>;
ti,hwmods = "lcdc";
status = "okay";
};


Запускаем пересборку ядра фактически для получения одного файла am355x_boneblack.dtb (собрать файл можно при помощи компилера dtc, он выдает независимый от железа бинарный код, под убунтой содержится в пакете device-tree-compiler):

cd /media/Data/Kernel/bbb/bb-kernel/
./tools/rebuild.sh


Копируем на target (BBB). я подключаюсь через mc по ssh и просто заменяю файл /boot/dtbs/4.1.0-rc1-bone0/am335x-boneblack.dtb на новый.

Источники:
1) http://processors.wiki.ti.com/index.php/Sitara_Linux_LCDC_Porting_Guide
2) http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/
3) http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio/

вторник, 27 октября 2015 г.

Установка значения GPIO-пина на BBB

Я хочу управлять выходом с пина P8.03. В файле настроек режимов пинов клеммы p8 мы находим соответствующую строчку:

PIN PROC PINCTRL ADDR NAME MODE0 ... MODE7
3 R9 0x018 gpmc_ad6 gpmc_ad6 ... gpio1[6]

   
Его текущее состояние мультиплексирования получаем следующим образом:

cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins | pager

Вывод:

pin 6 (44e10818.0) 00000031 pinctrl-single


Значение устанавливается в файле am335x-bone-pinmux-emmc.dtsi :

pinmux_emmc_pins { pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x31 0x1c 0x31>; linux,phandle = <0x2c>; phandle = <0x2c>;}

Значение 0x8 формируется следующим образом (AM335x Sitara Processors
Technical Reference Manual section 9.3.1.50 table 9-60):

Bit10
5Receive EnabledReceive Disabled
4PullupPulldown
3Pullup/down DisabledPullup/down Enabled
2,1,0Mode

В соответствии с таблицей по умолчанию пин P8_03 выставлен в состояние 0x31 (110001). Это режим 1 (MODE1). Пин может записывать (pullup/down enabled) и может читать (receive enabled), изначально находится в состоянии логической единицы (pullup). Установим пин в значение 0x17 (010111), в котором он способен записывать уровень (pullup/down enabled), по умолчанию установлен в единицу (pullup) и работает в режиме 7 (MODE7 - gpio1[6]). Файл device tree с изменениями:

pinmux_emmc_pins {
    pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x17 0x1c 0x31>;
    linux,phandle = <0x2c>;
    phandle = <0x2c>;
};

Настроим пин GPIO P8_03. Посмотреть текущие пины GPIO можно так:

ls /sys/class/gpio

Вывод:

export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport

Порядковый номер пина, соответствующий gpio1[6], получается примерно следующим образом - GPIO1_6 соответствует  (1*32) + 6 = 38. Нужный нам пин gpio38 не присутствует в списке. Для взаимодействия с пином его нужно экспортировать:

cd /sys/class/gpio
echo 38 > export



Теперь список выглядит следующим образом:

export  gpio38  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport

Настроим пин:

cd gpio38
ls

Вывод:

active_low  device  direction  edge  power  subsystem  uevent  value

Мы можем настроить параметры пина.

1. Текущее направление передачи (cat direction):

in

Настроим на вывод значения:

echo out > direction
cat direction


Вывод:

out

2. Текущее значение (cat value):

0

Установим значение логической единицы:

echo 1 > value
сat value

Вывод:

1

Соответствие значения value реальности можно проверить с помощью осциллографа.

Источники:

среда, 7 октября 2015 г.

Устранение проблемы при выводе ошибок компилятора VS2008 на русском языке в QtCreator

У меня windows 7 amd64, vs2008, qt4.8.5 static. Корректно сработал только первый метод с перекомпилированием jom из исходников.

Первый. Для этого скачиваем версию 1.0.10 параллельного компилятора jom с гитхаба (https://github.com/qt-labs/jom). Он корректно соберется у меня на qtcreator'е 3.5.0, qt 4.8.5, vs 2008. Последняя на сегодня версия jom 1.1.3 требует версию qt не ниже 5.2.0. Открываем в qtcreator'е файл проекта jom.pro.

Вставляем в самом начале мэина (файл \src\app\main.cpp) строчки выбора активной кодировки для консоли:


SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Пересобираем, копируем собранный jom.exe в директорию с установленным кутэкриэтэром (у меня C:\Qt\qtcreator-3.5.0\bin).

Второй. Скачиваем gpl-проект qtc-paneencode отсюда, распаковываем. Копируем папки lib, share в директорию с установленным ide (у меня C:\Qt\qtcreator-3.5.0\bin), перезапускаем кутэкриэтор. Я не нашел параметры проекта -> сборка и запуск -> кодировка панелей . У меня Qt Creator версии 3.5.0. Возможно, на старых или, наоборот, на более новых версиях сработает. У меня этот плагин не заработал.

Проект для VS2008 с собранным бинарников (правда, в режиме debug) тут.

Источники:
1) http://www.prog.org.ru/topic_11639_0.html
2) http://codedchaos.blogspot.ru/2012/09/qt-creator-windows.html
3) https://sourceforge.net/projects/qtc-paneencode
4) http://blog.mgsxx.com/?p=2979

Менеджер для получения базы sqlite из скрипта (Ubuntu/Windows)

Есть несколько opensource-проектов менеджеров sqlite-баз:
1) DB Browser for SQLite (сайт http://sqlitebrowser.org/, репозитарий https://github.com/sqlitebrowser/sqlitebrowser/releases)
2) SQLite Studio (сайт http://sqlitestudio.pl/?act=download)
3) sqliteman (сайт http://sqliteman.yarpen.cz/)

1. В Ubuntu 14.04 в дефолтном репозитарии первый (sqlitebrowser) и последний (sqliteman) доступны в виде пакетов для скачивания. Установим sqliteman:

sudo apt-get install sqliteman

2. Под Windows 7 amd64 мне понравился DB Browser for SQLite.

Источники:
1) http://softlakecity.ru/soft/chem-otkryit-i-otredaktirovat-bazu-dannyih-sqlite

вторник, 6 октября 2015 г.

четверг, 10 сентября 2015 г.

Работа с модулями (драйверами) ядра usb-тачскрина eGalax на BBB

В нашем случае необходимо посмотреть конфиги сборки ядра Debian 8, полученные через menuconfig, запущенного на одноплатнике BeagleBone Black element14. Интересующие нас конфиги показывают, как были собраны определенные драйверы для touchscreen'а eGalax, подключенного к BBB через интерфейс USB. Меня интересуют два драйвера, которые могут быть собраны в виде подключаемых (.ko-файлов) и встроенных модулей:

1) файл bb-kernel/KERNEL/drivers/input/touchscreen/usbtouchscreen.c соответствует модулю usbtouchscreen.ko; нас интересует конфиг CONFIG_TOUCHSCREEN_USB_EGALAX, который включает функциональность взаимодействия с устройством eGalax Touchkit;

2) файл bb-kernel/KERNEL/drivers/usb/musb/musb_core.c и другие соответствуют модулю musb-hdrc.ko; нас интересует конфиг CONFIG_USB_MUSB_HDRC, который отвечает за подключение и способ подключения модуля.

Я собираю версию ядра 4.1.1-bone10 по мануалу https://eewiki.net/display/linuxonarm/BeagleBone+Black с дефолтными настройками. 

При запуске на устройстве приложения с GUI, собранном на Qt 4.8.3, touchscreen через некоторое время перестает работать. В консоль при этом выводятся ошибки вида: 

[  117.033004] musb-hdrc: 28/31 max ep, 16384/16384 memory
[  117.394023] musb-hdrc musb-hdrc.1.auto: Babble
[  117.398559] musb-hdrc musb-hdrc.1.auto: Babble
[  117.403037] musb-hdrc: setup fifo_mode 4 

По умолчанию работу с устройством выполняет модуль musb_hdrc.ko, который иногда сразу корректно определяется (с родным проводом touchscreen'а microUSB-USB), иногда не сразу, но после определения всё равно корректно не работает:

[  122.553033] usb 1-1: new low-speed USB device number 112 using musb-hdrc
[  122.783949] input: eGalax Inc. Touch as /devices/platform/ocp/47400000.usb/47401c00.usb/musb-hdrc.1.auto/usb1/1-1/1-1:1.0/0003:0EEF:0001.0002/input/input2
[  122.849162] input: eGalax Inc. Touch as /devices/platform/ocp/47400000.usb/47401c00.usb/musb-hdrc.1.auto/usb1/1-1/1-1:1.0/0003:0EEF:0001.0002/input/input3
[  122.898208] hid-generic 0003:0EEF:0001.0002: input,hidraw0: USB HID v1.12 Pointer [eGalax Inc. Touch] on usb-musb-hdrc.1.auto-1/input0

Если не изменять при сборке конфигурацию ядра, модуль musb_hdrc.ko подключен как buildin, его нельзя выгрузить (modprobe -r musb_hdrc.ko). Для того, чтобы он собрался, как loadble, надо изменить значение конфига CONFIG_USB_MUSB_HDRC с y (CONFIG_USB_MUSB_HDRC=y) на m (CONFIG_USB_MUSB_HDRC=m). Я хочу попробовать использовать драйвер usbtouchscreen.ko взамен дефолтного. Надо проверить, чтобы CONFIG_TOUCHSCREEN_USB_EGALAX принимал значение y (CONFIG_TOUCHSCREEN_USB_EGALAX=y).

В запущенном ядре это можно сделать через виртуальную файловую систему /proc. C помощью команды zgrep посмотреть текущие конфиги ядра можно следующим образом:

zgrep CONFIG_TOUCHSCREEN_USB_EGALAX /proc/config.gz

Вывод:
CONFIG_TOUCHSCREEN_USB_EGALAX=y

При помощи команды zcat:

zcat /proc/config.gz | grep CONFIG_USB_MUSB_HDRC

Вывод:

CONFIG_USB_MUSB_HDRC=m

Список загруженных драйверов (lsmod) после полного включения устройства (одновременно присутствуют модули musb_hdrc и usbtouchscreen, которые работаю с одним и тем же touchscreen'ом)

root@arm:~# lsmod
Module                  Size  Used by
evdev                  10539  0 
joydev                  9151  0 
usbtouchscreen         17751  0 
rtc_ds1307             14464  0 
musb_dsps              10968  0 
musb_hdrc              88733  1 musb_dsps
omap_aes               15339  0 
omap_sham              23075  0 
tda998x                14551  1 
tilcdc                 33295  0 
omap_rng                5246  0 
drm_kms_helper        127409  4 tda998x,tilcdc
rng_core                8697  1 omap_rng
musb_am335x             1505  0 
leds_gpio               3709  0 
uio_pdrv_genirq         3681  0 
uio                    10132  1 uio_pdrv_genirq

Сокращенный вывод определения usb-устройств при загрузке (dmesg | grep usb | pager):

[    2.720396] usbcore: registered new interface driver usbfs
[    2.720462] usbcore: registered new interface driver hub
[    2.720542] usbcore: registered new device driver usb
[    3.970142] usbcore: registered new interface driver dln2
[    4.160221] usbcore: registered new interface driver usbhid
[    4.166124] usbhid: USB HID core driver
[    8.873011] 47401300.usb-phy supply vcc not found, using dummy regulator
[    8.936929] 47401b00.usb-phy supply vcc not found, using dummy regulator
[    9.708516] musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
[    9.708541] musb-hdrc: MHDRC RTL version 2.0 
[    9.708549] musb-hdrc: setup fifo_mode 4
[    9.708568] musb-hdrc: 28/31 max ep, 16384/16384 memory
[    9.718096] musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
[    9.718120] musb-hdrc: MHDRC RTL version 2.0 
[    9.718128] musb-hdrc: setup fifo_mode 4
[    9.718144] musb-hdrc: 28/31 max ep, 16384/16384 memory
[    9.718273] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[    9.767551] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 1
[    9.811958] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    9.819184] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    9.826788] usb usb1: Product: MUSB HDRC host driver
[    9.831992] usb usb1: Manufacturer: Linux 4.1.1-bone10 musb-hcd
[    9.838210] usb usb1: SerialNumber: musb-hdrc.1.auto
[   10.204805] musb-hdrc musb-hdrc.1.auto: Babble
[   10.218782] musb-hdrc musb-hdrc.1.auto: Babble
[   10.232673] musb-hdrc: setup fifo_mode 4
[   10.232692] musb-hdrc: 28/31 max ep, 16384/16384 memory
...
[  147.199617] musb-hdrc: 28/31 max ep, 16384/16384 memory
[  147.554737] musb-hdrc musb-hdrc.1.auto: Babble
[  147.582661] musb-hdrc: setup fifo_mode 4
[  148.011454] usb 1-1: new low-speed USB device number 104 using musb-hdrc
[  148.178764] usb 1-1: New USB device found, idVendor=0eef, idProduct=0001
[  148.185915] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  148.193432] usb 1-1: Product: Touch
[  148.197086] usb 1-1: Manufacturer: eGalax Inc.
[  148.261444] input: eGalax Inc. Touch as /devices/platform/ocp/47400000.usb/47401c00.usb/musb-hdrc.1.auto/usb1/1-1/1-1:1.0/0003:0EEF:0001.0001/input/input0
[  148.322628] input: eGalax Inc. Touch as /devices/platform/ocp/47400000.usb/47401c00.usb/musb-hdrc.1.auto/usb1/1-1/1-1:1.0/0003:0EEF:0001.0001/input/input1
[  148.365571] hid-generic 0003:0EEF:0001.0001: input,hidraw0: USB HID v1.12 Pointer [eGalax Inc. Touch] on usb-musb-hdrc.1.auto-1/input0
[  148.407404] usbcore: registered new interface driver usbtouchscreen

Отключим автоматическую загрузку драйвера musb_hdrc.ko, сформировав файл /etc/modprobe.d/blacklist.conf со следующим содержанием:

blacklist musb_hdrc
install musb_hdrc /bin/true

Включим автоматическую загрузку модуля usbtouchscreen.ko, добавив в файл /etc/modules следующую строчку:

usbtouchscreen

Для применения настроек выполним:

update-initramfs -u

За взаимодействие с нашим тачскрином eGalax по USB отвечает два устройства: /dev/input/event0 и /dev/input/event1. Посмотреть физическое получение информации с тачскрина можно, выполнив команду:

cat /dev/input/event1 | hexdump

Проблема с возникающей ошибкой "babble" была решена на аппаратном уровне добавлением обычного usb-хаба, на уровне приложения Qt я делаю переоткрытие устройства /dev/input/event1.

Использованный материал:

понедельник, 20 июля 2015 г.

Установка драйвера для NFC-картридера ACR1251 на BBB под управлением Debian 8

На плате BBB используется один из последних дистрибутивов GNU/Linux Debian 8, в котором есть пакетный репозитарий.

Мы подключаемся по RS-232 к BBB через собранную на коленке плату-конвертор. Подробнее тут . На нашей рабочей ОС Ubuntu 14.04 amd64 зайдем в терминал и установим связь:

sudo screen /dev/ttyS0 115200,cs8 

Подключим BeagleBone Black через коммутатор к сети и поставим уже собранные пакеты демона (pcscd) и драйвера (libacsccid) (middleware-библиотека libpcsclite уже стоит):

sudo apt-get update
sudo apt-get install pcscd
sudo apt-get install libacsccid1

Команда lsusb (sudo lsusb) видит картридер ACR1251:

Bus 001 Device 007: ID 072f:221a Advanced Card Systems, Ltd 
Bus 001 Device 006: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax TouchScreen
Bus 001 Device 005: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Команда lsusb -d 072f:221a -v :

Посмотреть вывод...


Запустим демон в режиме отладки (/usr/sbin/pcscd -fd), чтобы увидеть, что драйвер картридера libacsccid корректно загрузился при подключении устройства.


Посмотреть вывод...



Возникает ошибка: "Can't claim interface 001/007: Device or resource busy".

При загрузке ядра на BBB мы получаем следующие сообщения инициализации USB (dmesg | grep usb).

Посмотреть вывод...


Однако, несмотря на ошибки, картридер корректно выполняет чтение и запись на карту. Моё приложение, использующее динамическую библиотеку libpcsclite, корректно работает (даже при соединение через USB2.0 Hub, что по непонятным для меня причинам мешало работать другому картридеру ACR122, возможно, поддержка последним только USB1.0 (?)).