ืืืจ ืืฆืืจืืื ืืืืื ืื ืื ื ืืคืจืืืงื
Qt ืืื ืืกืืจืช ืืืฆืช ืคืืืคืืจืืืช ืืืืืืช ืื ืจืง ืจืืืืื ืืจืคืืื, ืืื ืื ืืืจืื ืืื QtNetwork, ืกื ืฉื ืืืืงืืช ืืขืืืื ืขื ืืกืื ื ืชืื ืื, Qt for Automation (ืืืื ืืืืืขืช IoT) ืืขืื ืืจืื ืืืชืจ. ืฆืืืช Qt ืืื ืคืจืืืงืืืื ืืฉืืืืฉ ื-Qt ืืืขืจืืืช ืืฉืืืฆืืช, ืื ืฉืืกืคืจืืืช ื ืืชื ืืช ืืืืืจื. ืขื ืืืช, ืขื ืืืืจืื ื, ืืขืืื ืืฉืื ืขื ืืขืืจืช Qt ืืืืงืจื-ืืงืจืื, ืื ืจืื ืืืื ืฉืืฉืืื ืืื ื ืจืืืช ืงืฉื - Qt ืืืื, MCUs ืงืื ืื.
ืืฆื ืฉื ื, ืืจืืข ืืฉ ืืืงืจื-ืืงืจืื ืืืืืขืืื ืืขืืื ืขื ืืืืืืืืื ืืขืืืื ืขื ืคื ื ืืคื ืืืื ืืจืืฉืื ืื. ืืคื ื ืืฉื ื ืืืคืืข ืืืืื Qt
Qt 4.8 ืืืขืืจ ื-Embox ืืืฉื ืืื ืจื, ืื ืืืืื ื ืื ืกืืช ืืืชื ืขืืื. ืืืจื ื ืืืคืืืงืฆืืืช moveblocks - ืืืืื ืืื ืืืฆืื ืงืคืืฆืืช.
Qt moveblocks ืขื QEMU
ืืืืชืืืื, ืื ื ืืืืืจืื ืืช Qt, ืื ืืคืฉืจ, ืขื ืกื ืืจืืืืื ืืืื ืืืื ืื ืืจืฉ ืืชืืืื ืืื ืืืฆืื. ืืฉืืื ืื ืืฉ ืืคืฉืจืืช "-qconfig minimal,small, medium...". ืืื ืืืืจ ืงืืืฅ ืชืฆืืจื ื-Qt ืขื ืคืงืืืืช ืืืงืจื ืจืืืช - ืื ืืืคืขืื / ืื ืืืื. ืืืืจ ืืคืฉืจืืช ืื, ื ืืกืืฃ ืืืืื ื ืืกืคืื ืืชืฆืืจื ืื ืืจืฆืื ื ื ืืืฉืืืช ืืฉืื ืืืจ. ืื ื ืืืืื ืฉืื ื
ืืื ืฉ-Qt ืืขืืื, ืขืืื ืืืืกืืฃ ืฉืืืช ืชืืืืืช ืืืขืจืืช ืืืคืขืื. ืืจื ืืืช ืืื ืืืืฉื QPA (Qt Platform Abstraction). ืืงืื ื ืืืกืืก ืืช ืืชืืกืฃ fb_base ืืืืื ืืืืื ื-Qt, ืฉืขื ืืกืืกื ืขืืื QPA ืขืืืจ ืืื ืืงืก. ืืชืืฆืื ืืื ืชืืกืฃ ืงืื ืืฉื emboxfb, ืฉืืกืคืง ื-Qt ืืช ื-framebuffer ืฉื Embox, ืืื ืืื ืืฆืืืจ ืืฉื ืืื ืื ืขืืจื ืืืืืฅ.
ืื ื ืจืืืช ืืฆืืจืช ืชืืกืฃ
QEmboxFbIntegration::QEmboxFbIntegration()
: fontDb(new QGenericUnixFontDatabase())
{
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
const char *fbPath = "/dev/fb0";
fbFd = open(fbPath, O_RDWR);
if (fbPath < 0) {
qFatal("QEmboxFbIntegration: Error open framebuffer %s", fbPath);
}
if (ioctl(fbFd, FBIOGET_FSCREENINFO, &finfo) == -1) {
qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
}
if (ioctl(fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
qFatal("QEmboxFbIntegration: Error ioctl framebuffer %s", fbPath);
}
fbWidth = vinfo.xres;
fbHeight = vinfo.yres;
fbBytesPerLine = finfo.line_length;
fbSize = fbBytesPerLine * fbHeight;
fbFormat = vinfo.fmt;
fbData = (uint8_t *)mmap(0, fbSize, PROT_READ | PROT_WRITE,
MAP_SHARED, fbFd, 0);
if (fbData == MAP_FAILED) {
qFatal("QEmboxFbIntegration: Error mmap framebuffer %s", fbPath);
}
if (!fbData || !fbSize) {
qFatal("QEmboxFbIntegration: Wrong framebuffer: base = %p,"
"size=%d", fbData, fbSize);
}
mPrimaryScreen = new QEmboxFbScreen(fbData, fbWidth,
fbHeight, fbBytesPerLine,
emboxFbFormatToQImageFormat(fbFormat));
mPrimaryScreen->setPhysicalSize(QSize(fbWidth, fbHeight));
mScreens.append(mPrimaryScreen);
this->printFbInfo();
}
ืืื ืืืจืื ืืฆืืืจ ืืืืฉ
QRegion QEmboxFbScreen::doRedraw()
{
QVector<QRect> rects;
QRegion touched = QFbScreen::doRedraw();
DPRINTF("QEmboxFbScreen::doRedrawn");
if (!compositePainter) {
compositePainter = new QPainter(mFbScreenImage);
}
rects = touched.rects();
for (int i = 0; i < rects.size(); i++) {
compositePainter->drawImage(rects[i], *mScreenImage, rects[i]);
}
return touched;
}
ืืชืืฆืื ืืื, ืขื ืืืคืืืืืืฆืืืช ืืงืืืคืืืืจ ืืืืื ืืืืืจืื -Os ืืืคืขืืช, ืชืืื ืช ืืกืคืจืืื ืืชืืจืจื ื-3.5 ืืื-ืืืื, ืื ืฉืืืืื ืื ื ืื ืก ืืืืืจืื ืืจืืฉื ืฉื ื-STM32F746. ืืคื ืฉืืืจ ืืชืื ื ืืืืืจ ืืืจ ืฉืื ื ืขื OpenCV, ืืืื ืืื ืืฉ:
- 1 MB ROM
- ืืืืจืื RAM ืฉื 320 KB
- 8 MB SDRAM
- 16 MB QSPI
ืืืืืื ืฉืืืจ ื ืืกืคื ื-OpenCV ืชืืืื ืืืืฆืืข ืงืื ื-QSPI, ืืืืื ื ืืืชืืื ืืืขืื ืช ืื ืชืืื ืช ื-Embox c Qt ืืชืื QSPI. ืืืื, ืืื ืืชืืื ืืืขื ืืื ื-QSPI! ืืื ืืื ืืืงืจื ืฉื OpenCV, ืืชืืจืจ ืฉืืื ืขืืื ืืื ืืื.
ืืื, ืืืืื ื ืืขืฉืืช ืืช ืื ืื - ืงืืื ืื ื ืขืชืืง ืืช ืืชืืื ื ื-QSPI, ืืื ื ืืขื ืื ืืืชื ื-SDRAM ืื ืืฆืข ืืฉื. ื-SDRAM ืื ื ืืื ืงืฆืช ืืืชืจ ืืืืจ, ืืื ืขืืืื ืจืืืง ื-QEMU.
ืืืืจ ืืื, ืืื ืจืขืืื ืืืืื ื ืงืืื ืฆืคื - ืืืจื ืืื, Qt ืขืืฉื ืืื ืืืฉืืืื ืฉื ืืงืืืืจืืื ืืืช ืฉื ืจืืืืขืื ืืื ืืืฆืื. ื ืืกืื ื, ืืื ืืื ืื ืงืืืื ื ืฉืื ืชืืืฆื ื ืจืืืช ืืขืื, ืื ืื ืคื ืืื
ืืจืขืืื ืืืขืื ืืืืชืจ ืืื ืืืขืืืจ ืืช ื-framebuffer ื-SDRAM ืืืืืจืื ืคื ืืื. ืืฉื ืื, ืขืฉืื ื ืืช ืืืืืช ืืืกื ืื 480x272, ืืื 272x272. ืืืจืื ื ืื ืืช ืขืืืง ืืฆืืข ื-A8R8G8B8 ื-R5G6B5, ืืืื ืืงืืื ื ืืช ืืืืื ืฉื ืคืืงืกื ืืื ื-4 ื-2 ืืชืื. ืืืื ื-framebuffer ืืืชืงืื ืืื 272*272*2 = 147968 ืืชืื. ืื ื ืชื ืืืฆื ืืฉืืขืืชืืช, ืืืื ืืื ืืืืืช, ืืื ืืืฆืื ืืคืื ืืืขื ืืืงื.
ืืืืคืืืืืืฆืื ืืืืจืื ื ืืืืชื ืืืคืขืื ืืช ืงืื ื-Embox ื-RAM ืืงืื Qt ื-SDRAM. ืืฉื ืื, ืื ื ืงืืื, ืืจืืื, ืืงืฉืจืื ืืช Embox ืืืืคื ืกืืื ืขื Qt, ืื ืื ื ืื ืืืื ืืช ืืงืืขื ืืืงืกื, ื-rodata, ืื ืชืื ืื ืื-bss ืฉื ืืกืคืจืืื ื-QSPI ืืื ืืืขืชืืง ืืืชื ืืืืจ ืืื ื-SDRAM.
section (qt_text, SDRAM, QSPI)
phdr (qt_text, PT_LOAD, FLAGS(5))
section (qt_rodata, SDRAM, QSPI)
phdr (qt_rodata, PT_LOAD, FLAGS(5))
section (qt_data, SDRAM, QSPI)
phdr (qt_data, PT_LOAD, FLAGS(6))
section (qt_bss, SDRAM, QSPI)
phdr (qt_bss, PT_LOAD, FLAGS(6))
ืขื ืืื ืืคืขืืช ืงืื ื-Embox ื-ROM, ืงืืืื ื ืื ืืืฆื ื ืืืจืช. ืืชืืฆืื ืืื, ืืื ืืืฆืื ืืฆืื ืืืงื ืืืื:
ืืืฉ ืืกืืฃ, ืชืื ืืื ืืื ืช ืืืชืื ืื ืืกืืื ืชืฆืืจืืช ืฉืื ืืช ืฉื Embox, ืืชืืจืจ ืฉ-Qt moveblocks ืขืืื ืืฆืืื ื-QSPI ืขื framebuffer ื-SDRAM, ืืฆืืืืจ ืืืงืืืง ืืื ืืืืืง ืืืืื ืฉื ื-framebuffer! ืืื ืื ืจืื, ืืื ืืืชืืืจ ืขื "ืืฆืืช ืืฉืงืืคืืืช" ืืจืืฉืื ืืช, ืืกืคืืงื ืชืืืฆื ืคื 2 ืขืงื ืืงืื ื ืื ืืืืช ืืืืื ื-framebuffer. ืืื ืื ื ืืชื ืืื ืืืืืข ืืชืืฆืื ืืื ืขื ืืื ืืขืืจืช ืงืื ื-Embox ืืืื ืืืืจืื ืืช ืืืืจืื ืฉืื ืื (ืืืืฆื ืื ืืืืชื ืคื 2, ืืื ืืขืจื ืคื 1.5).
ืืื ืื ืกืืช ืืช ืื ืืขืฆืื
ืื ืืฉ ืื STM32F7-Discovery, ืืชื ืืืื ืืืจืืฅ Qt ืชืืช Embox ืืขืฆืื. ืืชื ืืืื ืืงืจืื ืืื ืื ื ืขืฉื ืืฆืื ื
ืืกืงื ื
ืืชืืฆืื ืืื, ืืฆืืื ื ืืืฉืืง ืืช Qt! ืืืจืืืืช ืืืฉืืื, ืืืขืชื ื, ืืืืืืช ืืืงืฆืช. ืืืืคื ืืืขื, ืืชื ืฆืจืื ืืงืืช ืืืฉืืื ืืช ืืคืจืืื ืืกืคืฆืืคืืื ืฉื ืืืงืจื-ืืงืจืื ืืืืืคื ืืืื ืืืืื ืืช ืืืจืืืืงืืืจื ืฉื ืืขืจืืืช ืืืฉื. ืชืืฆืืืช ืืืืคืืืืืืฆืื ืืฆืืืขืืช ืขื ืืขืืืื ืืืืืขื ืฉืฆืืืืจ ืืืงืืืง ืืืขืจืืช ืืืฉืื ืืื ื ืืืขืื, ืืื ืืืืืจืื.
ืืฉื ื ื ืฉืชืชืฃ ืืคืกืืืื
ืืงืืจ: www.habr.com