Показаны сообщения с ярлыком bbb. Показать все сообщения
Показаны сообщения с ярлыком bbb. Показать все сообщения

вторник, 12 октября 2021 г.

Использование тачскрина на BBB (USB-тачскин от панели eGalax и 4-wire тачскрин от панели Sharp LQ057Q3DC12 через промежуточную плату)

В случае с панелью Lilliput 8.0" SKD видео-информация передается через кабель HDMI (панель Lilliput) - microHDMI (разъем BBB). Информация о прикосновениях с тачпанели идет через micro-USB (разъем на панели Lilliput) - USB (разъем BBB). Желательно использовать кабель, который идет в комплекте с панелью Lilliput (28AWG/IP-24AWG/2C), при подключении через другой кабель длиннее и другого сечения появляются ошибки в USB-интерфейсе "USB BUBBLE", после которых тачскрин перестает функционировать, лечится только перезагрузкой. Направление видео-вывода задается параметром в u_boot (video=HDMI-A-1:640x480@75). USB-тачскрину в ОС Debian соответствует устройство ввода /dev/input/event1.

В случае с LCD-панелью Sharp LQ057Q3DC12 с 4-wire тачскрином, подключенными через промежуточную плату Digi LCD application board for 6.4 sharp vga, видео-информация идет по пинам RGB (подробнее), информация о прикосновениях идет по четырем пинам встроенного в BBB АЦП (подробнее). 4-wire тачскрину в результате упомянутых манипуляций соответствует устройство ввода /dev/input/event0.

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

Использованный материал:
1) https://habrahabr.ru/company/metrotek/blog/266075/
2) https://forum.qt.io/topic/27228/solved-problem-reading-simulated-touch-events-from-dev-input-event1/3
3) http://ru.aliexpress.com/item/7-inch-Raspberry-pi-touch-screen-1024-600-7-inch-Capacitive-Touch-Screen-LCD-HDMI-interface/32583690910.html
4) http://doc.qt.io/qt-4.8/qmousedriverplugin.html
5) http://doc.qt.io/qt-4.8/qwsmousehandler.html
6) https://doc.qt.io/archives/qtextended4.4/tut-deviceexample.html

Управление двигателем постоянного тока на Beagle Bone Black

Я использовал трехвольтовый двигатель постоянного тока (купить), драйвер для двигателей постоянного тока (datasheet, хорошее описание на русском, купить), макетную плату (aliexpress) и провода, сделанные из МГТФ с припаянными штыревыми разъемами, лучше просто купить набор проводов (aliexpress).

Использованный материал:
1) http://www.engineersgarage.com/contribution/dc-motor-interfacing-beaglebone-black
2) http://www.thebrokendesk.com/post/beaglebone-black-driving-a-dc-motor/
3) https://www.cs.sfu.ca/CourseCentral/433/bfraser/other/2014-student-howtos/ControlDCMotorViaGPIO.pdf
4) https://www.hackster.io/hoffmanjon/controlling-a-motor-with-an-h-bridge-fd13b2
5) https://myrobot.ru/stepbystep/el_driver.php
6) https://oroboto.net/2014/03/29/beaglebone-pwm-motor-control/
7) https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/adc
8) https://blog.adafruit.com/2013/05/13/reading-analog-adc-values-on-a-beaglebone-black/

понедельник, 13 июля 2020 г.

BBB run TI-RTOS (SYS/BIOS) and JTAG

14-pin and 20-pin jtag pinout

JTAG, CCS on BBB:
1) https://www.twosixlabs.com/running-a-baremetal-beaglebone-black-part-1/
2) https://www.twosixlabs.com/running-a-baremetal-beaglebone-black-part-2/
3) http://cholla.mmto.org/bbb/jtag.html
4) https://elinux.org/BeagleBoardJTAG
5) https://blog.parr.us/2014/11/14/beaglebone-black-debugging-via-ti-usb100v2-jtag-emulator/
6) https://beagleboard.org/static/Docs/ccs-jtag-simple.htm
7) https://www.vittali.ch/1-bbb-jtag/
8) #BBB - Getting Started with StarterWare, CCSv6, JTAG on BeagleBone Black https://www.youtube.com/watch?v=iOQisBaDANA
9) #BBB - GPIO Control on #Beaglebone Black in #CCSv6
https://www.youtube.com/watch?v=QmV_WDJsnZw

jtag xdc100 v1/2/3 emulator (https://processors.wiki.ti.com/index.php/XDS100):
3) (?) Diymore XILINX USB JTAG https://aliexpress.ru/item/32672868436.html (1800р.)

ti jtag bugs:
1) http://software-dl.ti.com/ccs/esd/documents/ccsv7_debugging_jtag_connectivity_issues.html

TI-RTOS (SYS/BIOS):
1) TI-RTOS - Lab 1 translated to Beagle https://www.youtube.com/watch?v=-rMY0iIMiz8
2) http://huesmanbros.com/marc/2017/09/22/getting-ti-rtos-running-on-the-beaglebone-black/
3) https://processors.wiki.ti.com/index.php/AM335X_StarterWare_Booting_And_Flashing
4) https://e2e.ti.com/support/processors/f/791/t/439536?Using-BeagleBone-Black-with-SYS-BIOS-for-Real-Time-processing
5) https://ieeexplore.ieee.org/document/9017009
6) https://e2e.ti.com/support/legacy_forums/embedded/tirtos/f/355/t/312951?SYSBIOS-on-Beaglebone-Black

20-pin jtag connector:

20-pin to 14-pin jtag adapter:

chip-dip, aliexpress:
1) PBD1.27-20S, Разъем 2х10 гнездо на плату, поверхностный монтаж, шаг 1,27мм
2) DS1031-08-2*10 P8BS42 (PLLD1.27-20S*), Вилка штыревая 1,27мм 2х10 поверхностный монтаж https://www.electronshik.ru/item/BM/PBD1.27-20S (73 р.)
3) (на всякий случай, более дешевая замена гнезду) 
PBS1.27-10A/BS (DS1065-02-1*10), Разъем 1х10(м), поверхностный монтаж, шаг 1,27мм 
4) (!!!)(jtag с кабелем) Эмулятор DSP XDS100V2 Enterprise Edition, Прямая поставка с завода, поддерживает TI DSP ARM https://aliexpress.ru/item/32939545711.html (1370р.)
5) (гребенка для jtag) 2,54 мм 1*40P 1X40P 90 градусов прямоугольный Однорядный штырьковый разъем, положительный/обратный/верхний изгиб печатной платы, разъем, штыревой разъем (можно было взять просто прямые, всё равно надо паяться на макетке)

суббота, 14 марта 2020 г.

вторник, 19 ноября 2019 г.

Bash-скрипт для создания img-сборок образов microsd-карт для работы под BeagleBoneBlack

Работа bash-скрипта выливается в:
- создание заархивированных образов img-дампов образов microsd-карт
- создание файла словаря списка созданных дампов и аппаратных конфигураций обрудования, для которых предназначены эти дампы

Сборка состоит из:
- кросскомпилированного бинарника приложения на qt (параметры сборок передаются в виде дефайнов)
- конфигурационных файлов
- других bash-скриптов и python-скриптов (это не так важно)

Создание образа microsd-карты и его автоматическое расширение под BeagleBoneBlack частично описано тут.

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

1. bash:
1) https://habr.com/ru/company/ruvds/blog/325522/

2. sfdisk:
1) Пример скрипта, заливающего на встроенную emmc-память платы BeagleBoneBlack содержимого microsd-карты с бинарниками uboot, ядра и rootfs 
https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-ext4.sh
2) https://www.thegeekstuff.com/2017/05/sfdisk-examples/
3) https://suntong.github.io/blogs/2015/12/25/use-sfdisk-to-partition-disks/
4) https://stackoverflow.com/questions/12150116/how-to-script-sfdisk-or-parted-for-multiple-partitions
5) http://download.vikis.lt/doc/util-linux-ng-2.17.2/sfdisk.examples
6) https://www.systutorials.com/docs/linux/man/8-sfdisk/

3. генерирование файла словаря созданных дампов из bash-скрипта:
1) https://habr.com/ru/company/ruvds/blog/326594/

4. формирование номера программы и билда:
1) https://habr.com/ru/post/118756/
2) Нумерация версий программного обеспечения 

среда, 18 октября 2017 г.

Сборка и установка ядра 4.1, u-boot, rootfs на BBB с поддержкой CapeMgr

У меня есть плата beagle bone black rev. C element 14 (еMMC размером 4GB) с предустановленной ОС (debian 8). Купить ее можно на алиэкспресс за 4250 рублей (04.02.2021) или, например, здесь за 6000 рублей (цены актуальны на 03.10.2017). На рабочей машине у меня установлена ОС Ubuntu 16.04 amd64. Beagle Bone Green на aliexpress стоит 4900 рублей (04.02.2021).

Питание платы BBB производится через USB. Подключение к BBB можно осуществить либо по RS-232 через плату-конвертор (подробнее), либо по USB (подробнее).
С рабочей машины под управлением Ubuntu 16.04 amd64 мы можем увидеть терминал следующим образом:

1) для RS232:

sudo screen /dev/ttyS0 115200,cs8

2) для USB:

sudo screen /dev/ttyUSB0 115200,cs8

Плата BBB подключена к локальной сети с действующим DHCP-сервером через коммутатор, к которому подключена рабочая машина. Дополнительно к плате я подключаю carpc-монитор с тачскрином либо через hdmi (примерно такой), либо через RGB-пины и дополнительную плату (примерно такой).

Собирать ядро, u-boot и rootfs будем по следующей инструкции https://eewiki.net/display/linuxonarm/BeagleBone+Black (версия страницы 125).

1. Скачиваем кросскомпилятор (версия 5.3.1-2016.05-x86_64_arm) отсюда, распаковываем и перемещаем в директорию /usr/local/tools/linaro-gnueabihf-5.3, настраиваем переменную окружения для сборки:

export CC=/usr/local/tools/linaro-5.3/bin/arm-linux-gnueabihf-

Проверить установленную переменную можно, выполнив echo $CC. Вывод должен соответствовать ( /usr/local/tools/linaro-5.3/bin/arm-linux-gnueabihf- ).

Для скачивания и сборки ядра, u-boot и rootfs нужна временная директория. Можно воспользоваться, как предложено в инструкции, домашней директорией(~), я же создам отдельную папку на общем диске (/media/Data/Kernel). 

2. Собираем U-boot. Переходим в папку, клонируем главную ветку репозитария, берем срез файлов коммита 2016.09-rc2скачиваем и применяем патчи, настраиваем сборку с помощью установленной переменной окружения $СС и собираем U-boot (после окончания сборки бинарник будет лежать в корне папки):

cd /media/Data/Kernel
git clone https://github.com/u-boot/u-boot
cd u-boot/
git checkout v2016.09-rc2 -b tmp


wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2016.09-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch


make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}


3. Собираем ядро. Переходим в нашу папку, клонируем ветку репозитария разработчика, берем срез файлов для ядра 4.1 am33x-v4.1 и запускаем скрипт сборки build_kernel.sh:

cd /media/Data/Kernel
git clone https://github.com/RobertCNelson/bb-kernel

cd bb-kernel/
git checkout origin/am33x-v4.1 -b tmp
./build_kernel.sh

4. Скачиваем rootfs с набором утилит для Debian 8:

cd /media/Data/Kernel

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.5-minimal-armhf-2016-08-16.tar.xz
tar xf debian-8.5-minimal-armhf-2016-08-16.tar.xz

5. Записываем все это на microsd-карту (можно взять microsd-карту размером от 2GB,  у меня размером 4GB). Воспользуемся microsd-картридером или sd-картридером, предварительно вставим microsd-карту в sd-переходник. 

5.1. Вставим microsd-карту через переходник и удалим через gparted имеющиеся разделы. Выясним, выполнив команду lsblk, номер устройства, соответствующего вставленной microsd-карте (у меня это устройство /dev/sdc):

adil@adil:/media/Data/Kernel$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0     11:0    1  1024M  0 rom
sdc      8:32   1   3,7G  0 disk
sda      8:0    0 465,8G  0 disk
├─sda2   8:2    0   100M  0 part
├─sda5   8:5    0 229,6G  0 part /media/adil/Data
├─sda1   8:1    0   133G  0 part
└─sda6   8:6    0 103,1G  0 part /

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

export DISK=/dev/sdc

5.2. Очистим карту и прошьем на неё бинарники u-boot:

sudo dd if=/dev/zero of=${DISK} bs=1M count=10
sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k


5.3. Создадим раздел на карте при помощи утилиты sfdisk. Определим версию

adil@adil:/media/Data/Kernel$ sudo sfdisk --version
sfdisk из util-linux 2.27.1


У меня версия util-linux 2.27.1 - старше 2.26 (для версии младше 2.26 эта команда выглядит иначе):

sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__


5.4. Создадим файловую систему с помощью утилиты mkfs.ext4. Определим версию:

adil@adil:/media/Data/Kernel$ sudo mkfs.ext4 -V
mke2fs 1.42.13 (17-May-2015)
Using EXT2FS Library version 1.42.13

У меня версия mkfs.ext4 1.42.13 (=1.42) и устройство /dev/sdX (для устройства  /dev/mmcblkX и старшей версии mkfs.ext4 следующие команды будут выглядеть иначе):

sudo mkfs.ext4 -L rootfs ${DISK}1

5.5. Создадим папку для монтирования и смонтируем microsd-карту (для устройства  /dev/mmcblkX следующие команды будут выглядеть иначе):

sudo mkdir -p /media/rootfs/
sudo mount ${DISK}1 /media/rootfs/

5.6. Сделаем backup файлов u-boot'а:

sudo mkdir -p /media/rootfs/opt/backup/uboot/
sudo cp -v ./u-boot/MLO /media/rootfs/opt/backup/uboot/
sudo cp -v ./u-boot/u-boot.img /media/rootfs/opt/backup/uboot/


5.7. Скопируем rootfs на примонтированный раздел карты:

sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/

5.8. Установим вспомогательную переменную окружения для копирования ядра (версию ядра можно взять из вывода скрипта сборки ядра, у меня версия 4.1.38-bone24):

export kernel_version=4.1.38-bone24

5.9. Установим вывод uname и скопируем бинарник ядра, device tree base и модули ядра:

Для отображения версии в uname:
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

Для HDMI дисплея 640x480:
sudo sh -c "echo 'optargs="consoleblank=0" video=HDMI-A-1:640x480@75' >> /media/rootfs/boot/uEnv.txt"

sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

5.10. Сформируем файл монтируемых при загрузке разделов (/etc/fstab), добавив туда раздел встроенного eMMC:

sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab"

5.11. Настроим сеть. Отредактируем файл /etc/network/interfaces:

sudo nano /media/rootfs/etc/network/interfaces

Добавим:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

Для того, чтобы у нас был один сетевой интерфейс eth0, отредактируем файл  /etc/udev/rules.d/70-persistent-net.rules:

sudo nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules


Добавим:

# BeagleBone: net device ()
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


5.12 (может вам это не нужно). Дадим возможность root-го доступа через ssh. Для этого отредактируем файл /etc/ssh/sshd_config:

sudo nano /media/rootfs/etc/ssh/sshd_config

Поменяем значение PermitRootLogin со значения without-password на yes.

5.13 (может вам это не нужно). Настроим доступ по RS-232. Создадим файл /etc/init/serial.conf:

sudo nano /media/rootfs/etc/init/serial.conf

Добавим:

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty 115200 ttyO0

6. Отмонтируем карту:

sync
sudo umount /media/rootfs


7. Загрузка BBB c нашей microsd-карты. Вставляем карту в BBB и, удерживая кнопку загрузки, подключаем к USB-разъему рабочей машины. Начинается загрузка с microsd-карты. После загрузки входим под пользователем debian пароль temppwd.

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

sudo passwd root

7.1. Свой скрипт при загрузке. Если мы хотим, чтобы при загрузке BBB выполнялся наш скрипт (например, файл mystart.sh), нужно создать файл в папке /etc/init.d:

sudo nano /etc/init.d/mystart.sh

Например, со следующим содержимым:

#!/bin/sh
echo "My script started!"

Записываем файл и выполняем скрипт update-rc.d, который размещает ссылки на вызов нашего скрипта в системных папках запуска ядра в стиле SystemV:

sudo update-rc.d mystart.sh defaults

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

sudo chmod +x mystart.sh

7.2. Скачаем из инета скрипт для записи содержимого microsd-карты на встроенную память eMMC и запустим:

wget https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-ext4.sh
chmod +x bbb-eMMC-flasher-eewiki-ext4.sh
sudo /bin/bash ./bbb-eMMC-flasher-eewiki-ext4.sh

После окончания прошивки вынимаем microsd-карту и загружаемся с eMMC, не нажимая кнопку загрузки.

7.3. Чтобы пересобрать ядро с изменениями в конфигурации или исходном коде, лучше запускать не скрипт build_kernel.sh, который коннектится к стабильной ветке репозитария kernel.org и скачивает fix'ы и обновления, а запустить ./tools/rebuild.sh :

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

После сборки надо заново залить измененные части ядра на установочную флешку (пункт 5.9), затем загрузиться с флешки (пункт 7) и перекинуть её содержимое на внутреннюю память eMMC (пункт 7.2).

Использованный материал:
1) https://eewiki.net/display/linuxonarm/BeagleBone+Black

вторник, 27 сентября 2016 г.

Подключение сенсорного экрана и семидюймового дисплея Waveshare Beaglebone LCD CAPE (7inch)

У нас имеется расширительная плата для BBB LCD Cape (7 inch), симидюймовая сенсорная панель, провода и USB2UART преобразователь, который шел в комплекте.

Изначально прошьем имеющийся на сайте debian-образ для семидюймового дисплея на microsd-карту ( как ). Загружаемся с карты и имеем рабочую linux-машину на базе lxde.

Теперь попробуем добавить поддержку экрана и тачпанели в свою компиляцию ядра на базе Debian 8. Для этого нам понадобится отредактировать device tree и пересобрать ядро.

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

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

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

&lcdc {
status = "okay";
};

/ {
/* Embest 7 inch LCD cape: */
panel {
compatible = "tilcdc,panel";
pinctrl-names = "default";
pinctrl-0 = <&lcd_cape_pins>;
panel-info {
ac-bias           = <255>;
ac-bias-intrpt    = <0>;
dma-burst-sz      = <16>;
bpp               = <32>;
fdd               = <0x80>;
tft-alt-mode      = <0>;
stn-565-mode      = <0>;
mono-8bit-mode    = <0>;
sync-edge         = <0>;
sync-ctrl         = <1>;
raster-order      = <0>;
fifo-th           = <0>;
};
display-timings {
native-mode = <&timing0>;
timing0: 800x480 {
hactive         = <800>;
vactive         = <480>;
hback-porch     = <40>;
hfront-porch    = <40>;
hsync-len       = <48>;
vback-porch     = <30>;
vfront-porch    = <13>;
vsync-len       = <3>;
clock-frequency = <30000000>;
hsync-active    = <0>;
vsync-active    = <0>;
};
};
};
};

- файл мультиплексирования LCD-пинов (am335x-pinmux-panel-800x480.dtsi):
#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include "am335x-panel-800x480.dtsi"

/* standard */

&am33xx_pinmux {
  lcd_24bit_pins: pinmux_lcd_24bit_pins {
    pinctrl-single,pins = <
        0xa0 0x08
        0xa4 0x08
0xa8 0x08
0xac 0x08
0xb0 0x08
0xb4 0x08
0xb8 0x08
0xbc 0x08
0xc0 0x08
0xc4 0x08
0xc8 0x08
0xcc 0x08
0xd0 0x08
0xd4 0x08
0xd8 0x08
0xdc 0x08
0xe0 0x00
0xe4 0x00
0xe8 0x00
0xec 0x00
>;
  };
};

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

};

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

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

#include "am335x-panel-800x480.dtsi"
#include "am335x-pinmux-panel-800x480.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";
};


- включаем использование четырех пинов tsc-/adc-контроллера для передачи информации о прикосновениях (4-wire touchscreen):

tscadc: tscadc@44e0d000 {
  compatible = "ti,ti-tscadc";
  reg = <0x44e0d000 0x1000>;

  interrupt-parent = <&intc>;
  interrupts = <16>;
  ti,hwmods = "adc_tsc";
  status = "okay";

  tsc {
    ti,wires = <4>;
    ti,x-plate-resistance = <200>;
    ti,coordinate-readouts = <5>;
    ti,touch-type = <2>;
    ti,wire-config = <0x00 0x11 0x22 0x33>;
  };

  adc {
    ti,adc-channels = <4 5 6 7>;
  };

};

Запускаем пересборку ядра:

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


Нам нужно подключить в конфигурации сборку следующих модулей ядра:

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).


Аналогичная сборка драйверов (модулей) для другой 4-wire тачскрин-панели подробно описана тут.

Сформируем microsd-карту для записи и прошьем наш beagle bone в соответствии с этим руководством.

Использованный материал:
1) http://www.waveshare.com/wiki/LCD_CAPE_(7inch)

Ссылки (написание своего драйвера для тачскрина waveshare):
1) https://habr.com/ru/post/267655/

понедельник, 22 августа 2016 г.

Чтение значения ADC с платы BBB

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

1) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC);
2) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC). 


Модули лучше сделать встроенными (build-in): соответствующие опции будут выделены звездочкой (*). Модуль adc зависит от 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

В device tree для корректной работы adc надо внести следующие исправления:

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"; }; adc { compatible = "ti,am3359-adc"; ti,adc-channels = <0 1 2 3 4 5 6 7>; }; };
...

В результате после загрузки в директории /sys/bus/iio/devices/iio:device0  должны появиться устройства in_voltage0_raw,  in_voltage1_raw ... , in_voltage7_raw:

cd /sys/bus/iio/devices/iio:device0
ls -la

Вывод:

root@arm:/sys/bus/iio/devices/iio:device0# ls -la
total 0
drwxr-xr-x 5 root root    0 Jan  1 00:03 .
drwxr-xr-x 4 root root    0 Jan  1 00:03 ..
drwxr-xr-x 2 root root    0 Jan  1 00:03 buffer
-r--r--r-- 1 root root 4096 Jan  1 00:03 dev
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage0_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage1_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage2_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage3_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage4_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage5_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage6_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage7_raw
-r--r--r-- 1 root root 4096 Jan  1 00:03 name
lrwxrwxrwx 1 root root    0 Jan  1 00:03 of_node -> ../../../../../../firmware/devicetree/base/ocp/tscadc@44e0d000/adc
drwxr-xr-x 2 root root    0 Jan  1 00:03 power
drwxr-xr-x 2 root root    0 Jan  1 00:03 scan_elements
lrwxrwxrwx 1 root root    0 Jan  1 00:03 subsystem -> ../../../../../../bus/iio
-rw-r--r-- 1 root root 4096 Jan  1 00:03 uevent


Получение данных с первого из восьми встроенных АЦП:

cd /sys/bus/iio/devices/iio:device0
cat ./in_voltage0_raw

Вывод:
6

Источники:
1) http://processors.wiki.ti.com/index.php/AM335x_ADC_Driver's_Guide
2) http://beagleboard.org/support/BoneScript/potentiometer/
3) https://www.linux.com/learn/how-get-analog-input-beaglebone-black
4) https://www.youtube.com/watch?v=ncHVFsxGy9w

среда, 30 марта 2016 г.

Настройка DHCP-сервера на windows-ноуте для подключения к BBB

Ставим на ноут с Windows 7 Open DHCP Server через виндовый интсталлятор в папку по умолчанию c:\OpenDHCPServer (в папках с длинными путями a-la c:\Program Files\ и т.д. могут быть проблемы с запуском линуксовых приложений).

Обжимаем crossover ethernet-кабель и подключаем ноут к плате BeagleBone Black под управлением Debian 8 с настроенным по умолчанию получением ip-адреса через DHCP.

Выставляем в ноуте в настройках ethernet-адаптера статический ip-адрес 192.168.100.1 и маску 255.255.255.0. Открываем  в вашем любимом виндовом текстовом редакторе (у меня Notepad++) файл OpenDHCPServer.ini. В нем находим секцию [RANGE_SET] и устанавливаем параметр DHCPRange=192.168.100.10-192.168.100.200. Кроме этого, надо задать фильтрацию секции либо по MAC-адресу биглбона, либо по подсети (192.168.100.1). Чтобы биглбон с любым mac-адресом попадал в нашу секцию адресов (RANGE_SET) добавим строку FilterMacRange=00:00:00:00:00:00-ff:ff:ff:ff:ff:ff. Либо фильтрацию можно сделать через наш статический адрес следующим образом FilterSubnetSelection=192.168.100.1. Полезно стереть секции, специфичные для конкретных mac-адресов, которые имеются в файле настроек по умолчанию. Прописываем в секции [LISTEN_ON] наш статический ip-адрес - таким образом мы задается фильтр адресов, которых надо слушать серверу. Результирующий файл настроек OpenDHCPServer.ini под виндой у меня получисля следующим:

[LISTEN_ON]
192.168.100.1

[RANGE_SET]
DHCPRange=192.168.100.10-192.168.100.200
FilterMacRange=00:00:00:00:00:00-ff:ff:ff:ff:ff:ff
FilterSubnetSelection=192.168.100.1
SubnetMask=255.255.255.0


Таким образом мы установили пул, из которого будут выбираться адреса для раздачи. Запускаем на ноуте командный интерпретатор cmd и переходим в папку с сервером (cd c:\OpenDHCPServer). Запускаем RunStandAlone.bat. В консоли появляется ожидание подключения сетевого кабеля.

Запускаем BBB. На стадии загрузки ядра производится запрос адреса. Процесс получения отображается в консоли на ноуте. На BBB после загрузки можно будет проверить адрес через ifconfig. Они должны совпасть. После этого можно зайти c ноута на BBB через winscp или putty.

Использованные источники:
1) https://sourceforge.net/projects/dhcpserver/files/Open%20DHCP%20Server%20%28Regular%29/OpenDHCPServerManual.pdf/download

понедельник, 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/