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

Комментариев нет:

Отправить комментарий