ื ืืืื ืืืืื ืืืจ ืืขื ืขื ืืื ืื ืคึผืจืืืขืงื
Qt ืืื ืึท ืงืจืืึทื-ืคึผืืึทืืคืึธืจืืข ืคืจืืืืืืขืจืง ืืืึธืก ืืืื ื ืื ืืืืื ืืจืึทืคืืงืึทื ืงืึทืืคึผืึธืื ืึทื ืฅ, ืึธืืขืจ ืืืื ืึทืืึท ืืื ืื ืืื QtNetwork, ืึท ืกืืื ืคืื ืงืืืกื ืคึฟืึทืจ ืืจืืขืื ืืื ืืึทืืึทืืืืกืื, Qt ืคึฟืึทืจ ืึทืืืึธืืึทืืืึธื (ืึทืจืืึทื ืืขืจืขืื ื ืคึฟืึทืจ ืืึธื ืืืคึผืืึทืืขื ืืืืฉืึทื) ืืื ืคืื ืืขืจ. ืื Qt ืืึทื ืฉืึทืคึฟื ืืื ืคึผืจืึธืืึทืงืืืื ืืืขืื ื ืืฆื Qt ืืื ืขืืืขืืื ืกืืกืืขืืขื, ืึทืืื ืื ืืืืืจืขืจืื ืืขื ืขื ืืึทื ืฅ ืงืึทื ืคืืืืขืจืึทืืึทื. ืึธืืขืจ, ืืื ืืขืฆืื ืก, ืืืืื ืืง ืืขื ืืฉื ืืขืืึทื ืง ืืืขืื ืคึผืึธืจืืื ื Qt ืฆื ืืืงืจืึธืงืึธื ืืจืึธืืืขืจืก, ืืืกืืึธืืข ืืืืึทื ืึทืืึท ืึท ืึทืจืืขื ืกืืื ืฉืืืขืจ - Qt ืืื ืืจืืืก, MCUs ืืขื ืขื ืงืืืื.
ืืืืฃ ืื ืื ืืขืจืข ืืึทื ื, ืืขืจืืืืึทื ืขืก ืืขื ืขื ืืืงืจืึธืงืึธื ืืจืึธืืืขืจืก ืืืืืื ื ืฆื ืึทืจืืขืื ืืื ืืืืืืืขืืืึท ืืื ืืขืืขืจ ืืื ืื ืขืจืฉืืขืจ ืคึผืขื ืืืืืก. ืืื ืึท ืืึธืจ ืฆืืจืืง, ืื Qt ืืืึธื ืืื ืืจืืืก
Qt 4.8 ืืื ืืขืืืขื ืคึผืึธืจืืื ืฆื ืขืืืึธืงืก ืคึฟืึทืจ ืึท ืืึทื ื ืฆืืึทื, ืึทืืื ืืืจ ืืึทืฉืืึธืกื ืฆื ืคึผืจืืืืจื ืขืก ืืืืฃ ืขืก. ืืืจ ืืืืกืืขืจืืืืืื ืื ืืึธืืืขืืืึธืงืงืก ืึทืคึผืืึทืงืืืฉืึทื - ืึท ืืืืฉืคึผืื ืคืื ืกืคึผืจืื ืื ืึทื ืึทืืืืฉืึทื.
Qt ืืึธืืืขืืืึธืงืงืก ืืืืฃ QEMU
ืฆื ืึธื ืืืืื ืืื, ืืืจ ืงืึทื ืคืืืืขืจ Qt, ืืืื ืืขืืืขื, ืืื ืื ืืื ืืืื ืืึทื ื ืคืื ืงืึทืืคึผืึธืื ืึทื ืฅ ืคืืจืืื ืื ืฆื ืฉืืืฆื ืึทื ืึทืืืืฉืึทื. ืคึฟืึทืจ ืืขื ืขืก ืืื ืึทื ืึธืคึผืฆืืข "-qconfig ืืื ืืืึทื, ืงืืืื, ืืืื ...". ืขืก ืงืึทื ืขืงืฅ ืึท ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืคึฟืื Qt ืืื ืคืืืข ืืึทืงืจืึธืก - ืืืึธืก ืฆื ืืขืื / ืืืึธืก ืฆื ืืืกืืืืึทื. ื ืึธื ืืขื ืึธืคึผืฆืืข, ืืืจ ืืืืื ืื ืืขืจืข ืคืืึทืืก ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืื ืืืจ ืืืืื ืฆื ืืืกืืืืึทื ืขืคึผืขืก ืึทื ืืขืจืฉ. ืืึธ ืืื ืึท ืืืึทืฉืคึผืื ืคืื ืืื ืืืขืจ
ืึผืื Qt ืืึธื ืึทืจืืขืื, ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื ืึทื ืึทืก ืงืึทืืคึผืึทืืึทืืืืึทืื ืฉืืืืข. ืืืื ืืืขื ืืื ืฆื ืื ืกืืจืืืขื ื QPA (Qt Platform Abstraction). ืืืจ ืืขื ืืืขื ืืื ืึท ืืงืขืจ ืื ืคืึทืจืืืง fb_base ืคึผืืืืื ืึทืจืืึทื ืืขืจืขืื ื ืืื Qt, ืืืืฃ ืืขืจ ืืืืข ืคืื โโืืืึธืก QPA ืคึฟืึทืจ ืืื ืืงืก ืึทืจืืขื. ืืขืจ ืจืขืืืืืึทื ืืื ืึท ืงืืืื ืคึผืืืืื ืืขืจืืคื emboxfb, ืืืึธืก ืืื Qt ืืื ืขืืืึธืงืก ืก ืคืจืึทืืขืืืคืขืจ, ืืื ืืขืืึธืื ืขืก ืืจืึธื ืืึธืจื ืึธื ืงืืื ืึทืจืืืก ืืืืฃ.
ืืึธืก ืืื ืืืึธืก ืงืจืืืืืื ื ืึท ืคึผืืืืื ืงืืงื ืืื
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 ืื ืจืึทื
- 320 ืงื ืืึทืจืึทื
- 8 MB SDRAM
- 16 ืื QSPI
ืืื ื ืื ืฉืืืฆื ืคึฟืึทืจ ืขืงืกืึทืงืืืืื ื ืงืึธื ืคืื QSPI ืืื ืฉืืื ืฆืืืขืืืืื ืฆื OpenCV, ืืืจ ืืึทืฉืืึธืกื ืฆื ืึธื ืืืืื ืืื ืืึธืืืื ื ืื ืืื ืฆืข Embbox c Qt ืืืื ืืื QSPI. ืืื ืืืจืื, ืึทืืฅ ืื ืืขืืืืื ืึผืืขื ืชืืืฃ ืคืื QSPI! ืึธืืขืจ ืืื ืืื ืืขื ืคืึทื ืคืื OpenCV, ืขืก ืคืืจืงืขืจื ืืืืก ืึทื ืขืก ืึทืจืืขื ืฆื ืกืืึธืืื.
ืืขืจืืืขืจ, ืืืจ ืืึทืฉืืึธืกื ืฆื ืืึธื ืืึธืก - ืขืจืฉืืขืจ, ืืืจ ื ืึธืืืึทืื ืื ืืืื ืฆื QSPI, ืืขืืึธืื ืืึธืื ืขืก ืืื SDRAM ืืื ืืืกืคืืจื ืคึฟืื ืืึธืจื. ืคึฟืื SDRAM ืขืก ืืื ืืขืืืืจื ืึท ืืืกื ืคืึทืกืืขืจ, ืึธืืขืจ ื ืึธื ืืืืึทื ืคืื QEMU.
ืืขืจื ืึธื, ืขืก ืืื ืืขืืืขื ืึท ืืขืืึทื ืง ืฆื ืึทืจืืึทื ื ืขืืขื ืึท ืคืืึธืืืื ื ืคืื ื - ื ืึธื ืึทืืข, Qt ืืื ืขืืืขืืข ืืฉืืื ืืช ืคืื ืื ืงืึธืืึธืจืืึทื ืึทืฅ ืคืื ืกืงืืืขืจื ืืื ืึทื ืึทืืืืฉืึทื. ืืืจ ืืขืคืจืืืื, ืึธืืขืจ ืืึธ ืืืจ ืืึธืื ื ืืฉื ืืึทืงืืืขื ืงืืื ืงืขื ืืืง ืึทืงืกืขืืขืจืืืฉืึทื, ืืึธืืฉ ืืื
ืื ืืขืจืกื ืขืคืขืงืืืื ืืขืืึทื ืง ืืื ืืขืืืขื ืฆื ืึทืจืืืขืจืคืืจื ืื ืคืจืึทืืขืืืคืขืจ ืคืื SDRAM ืฆื ืื ืขืจืืขื ืืึผืจืื. ืฆื ืืึธื ืืึธืก, ืืืจ ืืขืืืื ืื ืคืึทืจืฉืืขืื ืืืืขื ืฉืึทื ื ื ืืฉื 480ืงืก272, ืึธืืขืจ 272ืงืก272. ืืืจ ืืืื ืืึธืืขืจื ืื ืงืึธืืืจ ืืืคืงืืึทื ืคืื A8R8G8B8 ืฆื R5G6B5, ืึทืืื ืจืืืืกืื ื ืื ืืจืืืก ืคืื ืืืื ืคึผืืงืกืขื ืคืื 4 ืฆื 2 ืืืืขืก. ืื ืจืืืึทืืืื ื ืจืึทื ืืึทืคืขืจ ืืจืืืก ืืื 272 * 272 * 2 = 147968 ืืืืขืก. ืืึธืก ืืึธื ืืขืืขืื ืึท ืืึทืืืืืืง ืึทืงืกืขืืขืจืืืฉืึทื, ืืึธืืขืจ ืจืืึฟ ืืืืขืจืงื, ืื ืึทื ืึทืืืืฉืึทื ืืื ืึผืืขื ืืืึทื.
ืื ืืขืฆืืข ืึทืคึผืืึทืืึทืืืืฉืึทื ืืื ืืขืืืขื ืฆื ืืืืคื ืขืืืึธืงืก ืงืึธื ืคึฟืื ืืึทืจืึทื ืืื Qt ืงืึธื ืคึฟืื SDRAM. ืฆื ืืึธื ืืึธืก, ืืืจ ืขืจืฉืืขืจ, ืืื ืืขืืืืื ืืืขื, ืกืืึทืืืงืื ืคึฟืึทืจืืื ืืื ื ืขืืืึธืงืก ืฆืืืึทืืขื ืืื Qt, ืึธืืขืจ ืืืจ ืฉืืขืื ืื ืืขืงืกื, ืจืึธืืึทืืึท, ืืึทืื ืืื 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))
ืืืจื ืขืงืกืึทืงืืืืื ื ืื ืขืืืึธืงืก ืงืึธื ืคึฟืื ROM, ืืืจ ืืืื ืืืงืืืขื ืึท ืืืืขืจืงื ืึทืงืกืขืืขืจืืืฉืึทื. ืืื ืึท ืจืขืืืืืึทื, ืื ืึทื ืึทืืืืฉืึทื ืืื ืืขืืืขื ืืึทื ืฅ ืืืึทื:
ืืื ืื ืกืืฃ, ืืฉืขืช ืคึผืจืืคึผืขืจืื ื ืืขื ืึทืจืืืงื ืืื ืืจืืื ื ืคืึทืจืฉืืืขื ืข ืขืืืึธืงืก ืงืึทื ืคืืืืขืจืืืฉืึทื ื, ืขืก ืคืืจืงืขืจื ืืืืก ืึทื Qt ืืึธืืืขืืืึธืงืงืก ืึทืจืืขื ืืจืืืก ืคึฟืื QSPI ืืื ืึท Framebuffer ืืื SDRAM, ืืื ืื ืืึทืืึทืื ืขืง ืืื ืคึผืื ืงื ืื ืืจืืืก ืคืื ืืขื Framebuffer! ืืฉืืขืืช, ืฆื ืืึทืงืืืขื ืื ืขืจืฉื "ืกืืืืขืฉืึธืื", ืึท 2-ืคืึทืจืืืืื ืึทืงืกืขืืขืจืืืฉืึทื ืืื ืืขื ืื ืจืขืื ืฆื ืึท ืืึทื ืึทื ืจืขืืืงืฆืืข ืืื ืื ืืจืืืก ืคืื ืื ืคืจืึทืืขืืึทืคืขืจ. ืึธืืขืจ ืขืก ืืื ื ืื ืืขืืืขื ืฆื ืืขืจืืจืืืื ืึทืืึท ืึท ืจืขืืืืืึทื ืืืจื ืืจืึทื ืกืคืขืจืื ื ืืืืื ืื ืขืืืึธืงืก ืงืึธื ืฆื ืคืึทืจืฉืืื ืฉื ืขื ืืขืืขืจืื (ืื ืึทืงืกืขืืขืจืืืฉืึทื ืืื ื ืืฉื 2, ืึธืืขืจ ืืืขืื 1.5 ืืื).
ืืื ืฆื ืคึผืจืืืืจื ืขืก ืืื
ืืืื ืืืจ ืืึธื ืึท STM32F7-ืึทื ืืืขืงืื ื, ืืืจ ืงืขื ืขื ืืืืคื Qt ืืื ืืขืจ ืขืืืึธืงืก ืืื. ืืืจ ืงืขื ื ืืืืขื ืขื ืืื ืืึธืก ืืื ืืขืืื ืืืืฃ ืืื ืืืขืจ ืืืขืืืืืื
ืกืึธืฃ
ืืื ืึท ืจืขืืืืืึทื, ืืืจ ืืขืจืืื ืฆื ืงืึทืืขืจ Qt! ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืืขืจ ืึทืจืืขื, ืืื ืืื ืืืขืจ ืืืื ืื ื, ืืื ืขืคึผืขืก ืืืืึทืืืฉืขืจืืืืื. ืืขืืืืื ืืืขื, ืืืจ ืืึทืจืคึฟื ืฆื ื ืขืืขื ืืื ืืฉืืื ืื ืกืคึผืืกืืคืืงืก ืคืื ืืืงืจืึธืงืึธื ืืจืึธืืืขืจืก ืืื ืืืื ืคึฟืึทืจืฉืืืื ืื ืึทืจืงืึทืืขืงืืฉืขืจ ืคืื ืงืึธืืคึผืืืืขืจ ืกืืกืืขืืขื. ืื ืึทืคึผืืึทืืึทืืืืฉืึทื ืจืขืืืืืึทืื ืคืื ื ืฆื ืื ืืึทืืืืกื ืคืึทืงื ืึทื ืื ืืึทืืึทืื ืขืง ืืื ืึท ืงืึทืืคึผืืืืื ื ืกืืกืืขื ืืื ื ืืฉื ืืขืจ ืคึผืจืึทืกืขืกืขืจ, ืึธืืขืจ ืืขืจ ืืึผืจืื.
ืืึธืก ืืึธืจ ืืืจ ืืืขืื ืึธื ืืืื ื ืขืืขื ืืื ืืขื ืืึธืืืขืื
ืืงืืจ: www.habr.com