пятница, 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 г.