Розробка ПО для лазерного толщинамера на FriendlyARM Smart210

Короткий опис: завдання полягає у вимірюванні перерізу об'єкта між двома рухомими лазерними датчиками, весь розрахунок відбувається на стороні комп'ютера.

В якості засобу розробки була обрана Qt у зв'язку з тим, що це крос-платформний продукт, а також OpenSource. Qt встановлювалася остання на той момент версії 5.4. Первісне використання програми передбачалося під Windows OS з сенсорним екраном. Десь на середині шляху вирішили переробити за Smart210.

Smart210 розробка наших китайських побратимів, з можливістю установки операційки (в комплекті): WinCE 6, Linux, Qtopia, Android. Також була випробувана збірка Debian.

Цільовою системою на даному пристрої спочатку була Linux. Робота з контролером товщиноміра здійснюється через FT2232HL.

Використання пропрієтарних драйверів FTDI має ряд етапів і особливостей:

Потрібно відключення стандартних бібліотек ftdi_sio і usbserial:

sudo rmmod ftdi_sio
sudo rmmod usbserial

Це неможливо зробити без пере збірки ядра з включенням цих бібліотек в якості модулів ядра.

Збирання ядра здійснювалася toolschain arm-linux — версії 4.5.1 входить в комплект від виробника, спроба зібрати ядро більш новими компіляторами призводило до непрацездатності сенсорного екрану, т. к. модуль friendlyarm-ts-mtinput (відповідальний за роботу multi touch екрану) звалювався помилки, можливість пере складання під нові компілятори відсутній (немає джерел).

У файлі mini210_linux_defconfig, прописати шлях до компілятор і налаштування в якості модулів ядра:

CONFIG_CROSS_COMPILE="arm-linux-"
...
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_FTDI_SIO=m

Хоча CONFIG_USB_SERIAL=m включає всі залежні бібліотеки як модулі ядра, в тому числі і ftdi_sio (на всякий випадок CONFIG_USB_SERIAL_FTDI_SIO=m). Потім виконати команду:

./build

Так як змінився склад модулів необхідно виконати:

make modules

Після чого залишається скопіювати в файлову систему. Збірка файлової системи утилітою yaffs2, що входить в комплект з диска, що викликала помилку файлу у момент установки. Довелося використовувати стандартну:

mkyaffs2 rootfs_rtm_210 rootfs_rtm_210.img

Після виконаних маніпуляцій стало можливим використовувати бібліотеку FTDI.
Qt для роботи в Linux брав версію 5.3.2 і збирав з підтримкою linuxfb.

Подальше використання такого підходу виявило недостатню швидкість промальовування (не реагував сенсорний екран при промальовування). Використовувався для промальовування frame buffer, відсутність підтримки OpenGL ES з боку драйверів.

Зупинився на Android, довелося перемалювати переписати на використання ttyUSB, т. к. драйвер FTDI під Android існує лише для Java.

При відключення і підключення FTDI виявилося поява 0х00 байта, що призводило до зсуву, а при фіксованій довжині даних в 10 байт і без ознаки початку пакета створювало неприємність. До того ж обрив (як аварійна ситуація міг розбити пакет), рішення шукати перші 10 байт пройшли перевірку на CRC8:

bool Controller::readBlockN(uchar *tmp, qint64 blockSize){
int bytesReceived = 0;
int bytesRead = 0;
qint64 m_blockSize = blockSize;
while (m_blockSize > 0) {
bytesReceived = read(uart0_filestream, ((void*)&tmp_block) + bytesRead, m_blockSize);
if (bytesReceived > 0){
m_blockSize -= bytesReceived;
bytesRead += bytesReceived;
if (bytesRead > 9) {
if (tmp_block[bytesRead - blockSize + 9] == getCRC8((uchar*)&tmp_block + bytesRead - blockSize, 9)){
memcpy(tmp, (uchar*)&tmp_block + bytesRead - blockSize, 10);
}
else{
m_blockSize = 1;
}
}
}
}
return true;
}

На цьому етапі виявилося, що немає прав на використання портів ttyUSB* і це відбувається після кожної перезавантаження. Рішення — вставити рядок при завантаженні програми:

system("su-c 'chmod 777 /dev/ttyUSB*'");

Залишалося забрати навігаційну панель (максимально використовувати екран, крім того, передбачається, що в даному пристрої не будуть запускатися інші додатки). Стандартна панель не реагує на події про приховування і завжди поверх всіх додатків. Вирішив просто видалити її:

system("su-c 'rm /system/app/SystemUI.apk'");

FriendlyARM має акумулятор, що не скидає час, але все ж вирішив викликати стандартні налаштування дати / часу Android при запуску програми:

system("am start-n com.android.settings/.DateTimeSettingsSetupWizard");


Графіка повністю промальована в QgraphicsView:

Статус системи:



Ручний режим:



Автоматичний режим:



Відео:



Дослідження і результати:

Debian:
Громіздка, займає ~430Мб в чистому вигляді, є підтримка OpenGL ES, використовується драйвер mesa. Відсутня підтримка multi touch екрану.

Qtopia:
Відсутність підтримки OpenGL ES, та й сама вона давно не підтримується.

Linux (rootfs_rtm_210):
Відсутність підтримки OpenGL ES, займає дуже мало місця у чистому вигляді ~15Мб, з встановленими усіма бібліотеками від Qt ~90Мб, швидкість завантаження операційки трохи більше 8 сек.

WinCE 6:
Не тестував серйозно, лише покопався в бінарному файлі на згадку про OpenGL ES, так і зажадало б спорку під CE. Час підтискав прийняв рішення відкласти.

Android:
Підтримує OpenGL ES, займає ~215Мб, запускається близько 2 хвилин.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.