Datasheet LCD-TFT модуля LQ057Q3DC12 тут. У меня BBB element 14 с ОС Debian 7 версии 4.1.0-rc1-bone0. Подключение экрана мы производим через промежуточную плату DIGI
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/
LCD APPLICATION KIT (схема).
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 ...
- не может передавать значение уровня (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):
Интересующие нас пины платы 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):
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):
- режим 0;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):
Bit | 1 | 0 |
5 | Receive Enabled | Receive Disabled |
4 | Pullup | Pulldown |
3 | Pullup/down Disabled | Pullup/down Enabled |
2,1,0 | Mode |
В соответствии с таблицей пин lcd_vsync, установленный в значение 0x8 (001000), настроен следующим образом:
- не может передавать значение уровня (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";
};
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/