From 227327e96a4bc1d6b649712371381ade1cd36b4d Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Thu, 7 Apr 2022 17:17:25 +0800 Subject: [PATCH 01/10] Signed-off-by:hanqiaosheng updater drm init --- services/ui/drm_driver.cpp | 56 ++++++++++++++++++++++++++++++++++---- services/ui/drm_driver.h | 2 ++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 20119428..598ab6f2 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -72,6 +72,46 @@ int DrmDriver::ModesetCreateFb(struct BufferObject *bo) return 0; } +bool DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn, uint32_t &crtcId) +{ + // get possible crtc + drmModeEncoder *encoder = nullptr; + for (int i = 0; i < conn.count_encoders; i++) { + encoder = drmModeGetEncoder(fd, conn.encoders[i]); + if (encoder == nullptr) { + continue; + } + + for (int j = 0; j < res.count_crtc; j++) { + if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { + crtcId = res.crtcs[j]; + drmModeFreeEncoder(encoder); + return true; + } + } + drmModeFreeEncoder(encoder); + encoder = nullptr; + } + return false; +} + +int DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &connId) +{ + // get connected connector + for (int i = 0; i < res.count_connectors; i++) { + conn_ = drmModeGetConnector(fd, res.connectors[i]); + if (conn_ != nullptr && + conn_->connection == DRM_MODE_CONNECTED) { + connId = conn_->connector_id; + return true; + } + drmModeFreeConnector(conn_); + conn_ = nullptr; + } + + return false; +} + int DrmDriver::DrmInit(void) { fd_ = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); @@ -86,13 +126,17 @@ int DrmDriver::DrmInit(void) return -1; } - uint32_t crtcId = res_->crtcs[0]; - uint32_t connId = res_->connectors[1]; - conn_ = drmModeGetConnector(fd_, connId); - if (conn_ == nullptr) { - LOG(ERROR) << "drmModeGetConnector"; - return -1; + uint32_t crtcId; + uint32_t connId; + if (!GetConnector(*res_, fd_, connId)) { + LOG(ERROR) << "DrmInit cannot get drm connector"; + return -1; + } + if (GetCrtc(*res_, fd_, *conn_, crtcId)) { + LOG(ERROR) << "DrmInit cannot get drm crtc"; + return -1; } + buff_.width = conn_->modes[0].hdisplay; buff_.height = conn_->modes[0].vdisplay; diff --git a/services/ui/drm_driver.h b/services/ui/drm_driver.h index 1e074929..075044f2 100644 --- a/services/ui/drm_driver.h +++ b/services/ui/drm_driver.h @@ -48,6 +48,8 @@ private: int ModesetCreateFb(struct BufferObject *bo); void ModesetDestroyFb(struct BufferObject *bo); int DrmInit(); + bool GetConnector(const drmModeRes &res, const int fd, uint32_t &connId); + bool GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn, uint32_t &crtcId); int fd_; drmModeConnector *conn_; drmModeRes *res_; -- Gitee From dd1a30c095048f9fac01cdb8a456a7089422c76f Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Thu, 7 Apr 2022 17:31:25 +0800 Subject: [PATCH 02/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 598ab6f2..9a31cbb5 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -77,36 +77,36 @@ bool DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnec // get possible crtc drmModeEncoder *encoder = nullptr; for (int i = 0; i < conn.count_encoders; i++) { - encoder = drmModeGetEncoder(fd, conn.encoders[i]); - if (encoder == nullptr) { - continue; - } - - for (int j = 0; j < res.count_crtc; j++) { - if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { - crtcId = res.crtcs[j]; - drmModeFreeEncoder(encoder); - return true; - } - } - drmModeFreeEncoder(encoder); - encoder = nullptr; + encoder = drmModeGetEncoder(fd, conn.encoders[i]); + if (encoder == nullptr) { + continue; + } + + for (int j = 0; j < res.count_crtcs; j++) { + if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { + crtcId = res.crtcs[j]; + drmModeFreeEncoder(encoder); + return true; + } + } + drmModeFreeEncoder(encoder); + encoder = nullptr; } return false; } -int DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &connId) +bool DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &connId) { // get connected connector for (int i = 0; i < res.count_connectors; i++) { - conn_ = drmModeGetConnector(fd, res.connectors[i]); - if (conn_ != nullptr && - conn_->connection == DRM_MODE_CONNECTED) { - connId = conn_->connector_id; - return true; - } - drmModeFreeConnector(conn_); - conn_ = nullptr; + conn_ = drmModeGetConnector(fd, res.connectors[i]); + if (conn_ != nullptr && + conn_->connection == DRM_MODE_CONNECTED) { + connId = conn_->connector_id; + return true; + } + drmModeFreeConnector(conn_); + conn_ = nullptr; } return false; @@ -130,11 +130,11 @@ int DrmDriver::DrmInit(void) uint32_t connId; if (!GetConnector(*res_, fd_, connId)) { LOG(ERROR) << "DrmInit cannot get drm connector"; - return -1; + return -1; } if (GetCrtc(*res_, fd_, *conn_, crtcId)) { LOG(ERROR) << "DrmInit cannot get drm crtc"; - return -1; + return -1; } buff_.width = conn_->modes[0].hdisplay; -- Gitee From 4bce5cf8257aa7a5ca177b3e8effc5f3ab2a3176 Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Sat, 9 Apr 2022 11:22:06 +0800 Subject: [PATCH 03/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 232 ++++++++++++++++++++++++++++++------- services/ui/drm_driver.h | 11 +- 2 files changed, 198 insertions(+), 45 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 9a31cbb5..3e77528b 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -72,10 +72,24 @@ int DrmDriver::ModesetCreateFb(struct BufferObject *bo) return 0; } -bool DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn, uint32_t &crtcId) +drmModeGetCrtc * DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn) { - // get possible crtc + // if connector has one encoder, use it drmModeEncoder *encoder = nullptr; + if (conn->encoder_id != 0) { + encoder = drmModeGetEncoder(fd, conn->encoder_id); + } + if (encoder != nullptr && encoder->crtc_id != 0) { + uint32_t crtcId = encoder->crtc_id; + drmModeFreeEncoder(encoder); + return drmModeGetCrtc(fd, crtcId); + } + + if (encoder != nullptr) { + drmModeFreeEncoder(encoder); + } + + // try get a vaild encoder and crtc for (int i = 0; i < conn.count_encoders; i++) { encoder = drmModeGetEncoder(fd, conn.encoders[i]); if (encoder == nullptr) { @@ -84,64 +98,180 @@ bool DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnec for (int j = 0; j < res.count_crtcs; j++) { if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { - crtcId = res.crtcs[j]; - drmModeFreeEncoder(encoder); - return true; + if (res.crtcs[j] != 0) { + uint32_t crtcId = res.crtcs[j]; + drmModeFreeEncoder(encoder); + return drmModeGetCrtc(fd, crtcId); + } } } drmModeFreeEncoder(encoder); - encoder = nullptr; } - return false; + return nullptr; } -bool DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &connId) +drmModeConnector * DrmDriver::GetFirstConnector(const drmModeRes &res, const int fd) { // get connected connector for (int i = 0; i < res.count_connectors; i++) { - conn_ = drmModeGetConnector(fd, res.connectors[i]); - if (conn_ != nullptr && - conn_->connection == DRM_MODE_CONNECTED) { - connId = conn_->connector_id; - return true; + drmModeConnector *conn = drmModeGetConnector(fd, res.connectors[i]); + if (conn == nullptr) { + continue; } - drmModeFreeConnector(conn_); - conn_ = nullptr; + if (conn->count_modes > 0 && + conn->connection == DRM_MODE_CONNECTED) { + return conn; + } + drmModeFreeConnector(conn); } + return nullptr; +} - return false; +drmModeConnector * DrmDriver::GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type) +{ + // get connected connector + for (int i = 0; i < res.count_connectors; i++) { + drmModeConnector *conn = drmModeGetConnector(fd, res.connectors[i]); + if (conn == nullptr) { + continue; + } + if (conn->connector_type == type && + conn->count_modes > 0 && + conn->connection == DRM_MODE_CONNECTED) { + return conn; + } + drmModeFreeConnector(conn); + } + return nullptr; } -int DrmDriver::DrmInit(void) + +drmModeConnector * DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId) { - fd_ = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); - if (fd_ < 0) { - LOG(ERROR) << "open failed"; - return -1; + // get main connector : lvds edp and dsi + uint32_t mainConnector[] = { + DRM_MODE_CONNECTOR_LVDS, + DRM_MODE_CONNECTOR_eDP, + DRM_MODE_CONNECTOR_DSI, + }; + + drmModeConnector *conn = nullptr; + for (int i = 0; i < sizeof(mainConnector) / sizeof(mainConnector[0]); i++) { + drmModeConnector *conn = GetConnectorByType(res, fd, mainConnector[i]); + if (conn != nullptr) + break; + } } - res_ = drmModeGetResources(fd_); - if (res_ == nullptr) { - LOG(ERROR) << "drmModeGetResources"; - return -1; + if (conn == nullptr) { + conn = GetFirstConnector(res, fd); + } + + if (conn == nullptr) { + LOG(ERROR) << "DrmDriver cannot get vaild connector"; + return nullptr; + } + + // get preferred mode index + modeId = 0; + for (int i = 0; i < conn->count_modes; i++) { + if ((conn->modes[i].type & DRM_MODE_TYPE_PREFERRED) != 0) + modeId = i; + break; + } + } + + return conn; +} + +drmModeRes * DrmDriver::GetResources(int &fd) +{ + // 1: open drm resource + drmModeRes res = nullptr; + for (int i = 0; i < DRM_MAX_MINOR; i++) { + res = GetOneResources(i, fd); + if (res != nullptr) { + break; + } } + return res; +} - uint32_t crtcId; - uint32_t connId; - if (!GetConnector(*res_, fd_, connId)) { - LOG(ERROR) << "DrmInit cannot get drm connector"; +drmModeRes * DrmDriver::GetOneResources(const int devIndex, int &fd) +{ + // 1: open drm device + std::string devName = DRM_DEV_NAME + "/card" + std::string(devIndex); + fd = open(devName, O_RDWR | O_CLOEXEC); + if (fd < 0) { + LOG(ERROR) << "open failed " << devName; + return nullptr; + } + // 2: check drm capacity + uint64_t cap = 0; + int ret = drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &cap); + if (ret != 0 || cap == 0) { + LOG(ERROR) << "drmGetCap failed"; + close(fd); + fd = -1; + return nullptr; + } + + // 3: get drm resources + drmModeRes *res = drmModeGetResources(fd); + if (res == nullptr) { + LOG(ERROR) << "drmModeGetResources failed"; + close(fd); + fd = -1; + return nullptr; + } + + // 4: check it has connected connector and crtc + if (res->count_crtcs > 0 && res->count_connectors > 0 && res->count_encoders > 0) { + drmModeConnector *conn = GetFirstConnector(res, fd); + if (conn != nullptr) { + // don't close fd + LOG(INFO) << "drm dev:" << devName; + drmModeFreeConnector(conn); + return res; + } + } + close(fd); + fd = -1; + drmModeFreeResources(res); + return nullptr; +} + +int DrmDriver::DrmInit(void) +{ + // 1: open drm resource + res_ = GetResources(fd_); + if (fd_ < 0 || res_ == nullptr) { + LOG(ERROR) << "DrmInit: GetResources failed"; return -1; } - if (GetCrtc(*res_, fd_, *conn_, crtcId)) { - LOG(ERROR) << "DrmInit cannot get drm crtc"; + + // 2 : get connected connector + uint32_t modeId; + conn_ = GetConnector(*res_, fd_, modeId); + if (conn_ == nullptr) { + LOG(ERROR) << "DrmInit: GetConnector failed"; return -1; } - buff_.width = conn_->modes[0].hdisplay; - buff_.height = conn_->modes[0].vdisplay; + // 3: get vaild encoder and crtc + crtc_ = GetCrtc(*res_, fd_, *conn_); + if (crtc_ == nullptr) { + LOG(ERROR) << "DrmInit: GetCrtc failed"; + return -1; + } + // 4: create userspace buffer + buff_.width = conn_->modes[modeId].hdisplay; + buff_.height = conn_->modes[modeId].vdisplay; ModesetCreateFb(&buff_); - drmModeSetCrtc(fd_, crtcId, buff_.fbId, 0, 0, &connId, 1, &conn_->modes[0]); + + // 5: bind ctrc and connector + drmModeSetCrtc(fd_, crtc_->crtc_id, buff_.fbId, 0, 0, &conn_->connector_id, 1, &conn_->modes[modeId]); LOG(INFO) << " drm init success."; return 0; } @@ -155,14 +285,32 @@ void DrmDriver::LoadDrmDriver() void DrmDriver::ModesetDestroyFb(struct BufferObject *bo) { - struct drm_mode_destroy_dumb destroy = {}; - drmModeRmFB(fd_, bo->fbId); - munmap(bo->vaddr, bo->size); - destroy.handle = bo->handle; - drmIoctl(fd_, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy); - drmModeFreeConnector(conn_); - drmModeFreeResources(res_); - close(fd_); + if (bo == nullptr) { + return; + } + if (fd_ > 0 && bo->fbId) { + drmModeRmFB(fd_, bo->fbId); + } + if (bo->vaddr != nullptr) { + munmap(bo->vaddr, bo->size); + } + if (bo->handle) { + struct drm_mode_destroy_dumb destroy = {}; + destroy.handle = bo->handle; + drmIoctl(fd_, DRM_IOCTL_GEM_CLOSE, &destroy); + } + if (crtc_ != nullptr) { + drmModeFreeCrtc(crtc_); + } + if (conn_ != nullptr) { + drmModeFreeConnector(conn_); + } + if (res_ != nullptr) { + drmModeFreeResources(res_); + } + if (fd_ > 0) { + close(fd_); + } } DrmDriver::~DrmDriver() diff --git a/services/ui/drm_driver.h b/services/ui/drm_driver.h index 075044f2..40aa046d 100644 --- a/services/ui/drm_driver.h +++ b/services/ui/drm_driver.h @@ -40,7 +40,7 @@ struct BufferObject { class DrmDriver { protected: - DrmDriver() : fd_(-1), conn_(nullptr), res_(nullptr) {} + DrmDriver() : fd_(-1), conn_(nullptr), res_(nullptr), crtc_(nullptr) {} virtual ~DrmDriver(); void FlipBuffer(const void* buf); void LoadDrmDriver(); @@ -48,11 +48,16 @@ private: int ModesetCreateFb(struct BufferObject *bo); void ModesetDestroyFb(struct BufferObject *bo); int DrmInit(); - bool GetConnector(const drmModeRes &res, const int fd, uint32_t &connId); - bool GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn, uint32_t &crtcId); + drmModeGetCrtc *GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn); + drmModeConnector *GetFirstConnector(const drmModeRes &res, const int fd); + drmModeConnector *GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type); + drmModeConnector *GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId); + drmModeRes *GetResources(int &fd); + drmModeRes *GetOneResources(const int devIndex, int &fd); int fd_; drmModeConnector *conn_; drmModeRes *res_; + drmModeRes *crtc_; struct BufferObject buff_ {}; }; } // namespace updater -- Gitee From f36e51bc522354047f7c63d3d8f16a1bd4496fcf Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Sat, 9 Apr 2022 14:47:03 +0800 Subject: [PATCH 04/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 42 ++++++++++++++++++++------------------ services/ui/drm_driver.h | 14 ++++++------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 3e77528b..aa8a4e26 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -72,19 +72,19 @@ int DrmDriver::ModesetCreateFb(struct BufferObject *bo) return 0; } -drmModeGetCrtc * DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn) +drmModeCrtc *DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn) const { // if connector has one encoder, use it drmModeEncoder *encoder = nullptr; - if (conn->encoder_id != 0) { - encoder = drmModeGetEncoder(fd, conn->encoder_id); + if (conn.encoder_id != 0) { + encoder = drmModeGetEncoder(fd, conn.encoder_id); } if (encoder != nullptr && encoder->crtc_id != 0) { uint32_t crtcId = encoder->crtc_id; drmModeFreeEncoder(encoder); return drmModeGetCrtc(fd, crtcId); } - + if (encoder != nullptr) { drmModeFreeEncoder(encoder); } @@ -110,7 +110,7 @@ drmModeGetCrtc * DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const d return nullptr; } -drmModeConnector * DrmDriver::GetFirstConnector(const drmModeRes &res, const int fd) +drmModeConnector *DrmDriver::GetFirstConnector(const drmModeRes &res, const int fd) const { // get connected connector for (int i = 0; i < res.count_connectors; i++) { @@ -127,7 +127,7 @@ drmModeConnector * DrmDriver::GetFirstConnector(const drmModeRes &res, const int return nullptr; } -drmModeConnector * DrmDriver::GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type) +drmModeConnector *DrmDriver::GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type) const { // get connected connector for (int i = 0; i < res.count_connectors; i++) { @@ -146,7 +146,7 @@ drmModeConnector * DrmDriver::GetConnectorByType(const drmModeRes &res, const in } -drmModeConnector * DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId) +drmModeConnector *DrmDriver::GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId) const { // get main connector : lvds edp and dsi uint32_t mainConnector[] = { @@ -156,9 +156,9 @@ drmModeConnector * DrmDriver::GetConnector(const drmModeRes &res, const int fd, }; drmModeConnector *conn = nullptr; - for (int i = 0; i < sizeof(mainConnector) / sizeof(mainConnector[0]); i++) { - drmModeConnector *conn = GetConnectorByType(res, fd, mainConnector[i]); - if (conn != nullptr) + for (uint32_t i = 0; i < sizeof(mainConnector) / sizeof(mainConnector[0]); i++) { + conn = GetConnectorByType(res, fd, mainConnector[i]); + if (conn != nullptr) { break; } } @@ -175,19 +175,19 @@ drmModeConnector * DrmDriver::GetConnector(const drmModeRes &res, const int fd, // get preferred mode index modeId = 0; for (int i = 0; i < conn->count_modes; i++) { - if ((conn->modes[i].type & DRM_MODE_TYPE_PREFERRED) != 0) + if ((conn->modes[i].type & DRM_MODE_TYPE_PREFERRED) != 0) { modeId = i; break; } - } + } return conn; } -drmModeRes * DrmDriver::GetResources(int &fd) +drmModeRes *DrmDriver::GetResources(int &fd) const { // 1: open drm resource - drmModeRes res = nullptr; + drmModeRes *res = nullptr; for (int i = 0; i < DRM_MAX_MINOR; i++) { res = GetOneResources(i, fd); if (res != nullptr) { @@ -197,11 +197,11 @@ drmModeRes * DrmDriver::GetResources(int &fd) return res; } -drmModeRes * DrmDriver::GetOneResources(const int devIndex, int &fd) +drmModeRes *DrmDriver::GetOneResources(const int devIndex, int &fd) const { // 1: open drm device - std::string devName = DRM_DEV_NAME + "/card" + std::string(devIndex); - fd = open(devName, O_RDWR | O_CLOEXEC); + std::string devName = std::string("/dev/dri/card") + std::to_string(devIndex); + fd = open(devName.c_str(), O_RDWR | O_CLOEXEC); if (fd < 0) { LOG(ERROR) << "open failed " << devName; return nullptr; @@ -215,7 +215,7 @@ drmModeRes * DrmDriver::GetOneResources(const int devIndex, int &fd) fd = -1; return nullptr; } - + // 3: get drm resources drmModeRes *res = drmModeGetResources(fd); if (res == nullptr) { @@ -227,7 +227,7 @@ drmModeRes * DrmDriver::GetOneResources(const int devIndex, int &fd) // 4: check it has connected connector and crtc if (res->count_crtcs > 0 && res->count_connectors > 0 && res->count_encoders > 0) { - drmModeConnector *conn = GetFirstConnector(res, fd); + drmModeConnector *conn = GetFirstConnector(*res, fd); if (conn != nullptr) { // don't close fd LOG(INFO) << "drm dev:" << devName; @@ -269,9 +269,11 @@ int DrmDriver::DrmInit(void) buff_.width = conn_->modes[modeId].hdisplay; buff_.height = conn_->modes[modeId].vdisplay; ModesetCreateFb(&buff_); - + // 5: bind ctrc and connector drmModeSetCrtc(fd_, crtc_->crtc_id, buff_.fbId, 0, 0, &conn_->connector_id, 1, &conn_->modes[modeId]); + LOG(ERROR) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; + LOG(ERROR) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; LOG(INFO) << " drm init success."; return 0; } diff --git a/services/ui/drm_driver.h b/services/ui/drm_driver.h index 40aa046d..c0fcb38f 100644 --- a/services/ui/drm_driver.h +++ b/services/ui/drm_driver.h @@ -48,16 +48,16 @@ private: int ModesetCreateFb(struct BufferObject *bo); void ModesetDestroyFb(struct BufferObject *bo); int DrmInit(); - drmModeGetCrtc *GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn); - drmModeConnector *GetFirstConnector(const drmModeRes &res, const int fd); - drmModeConnector *GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type); - drmModeConnector *GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId); - drmModeRes *GetResources(int &fd); - drmModeRes *GetOneResources(const int devIndex, int &fd); + drmModeCrtc *GetCrtc(const drmModeRes &res, const int fd, const drmModeConnector &conn) const; + drmModeConnector *GetFirstConnector(const drmModeRes &res, const int fd) const; + drmModeConnector *GetConnectorByType(const drmModeRes &res, const int fd, const uint32_t type) const; + drmModeConnector *GetConnector(const drmModeRes &res, const int fd, uint32_t &modeId) const; + drmModeRes *GetResources(int &fd) const; + drmModeRes *GetOneResources(const int devIndex, int &fd) const; int fd_; drmModeConnector *conn_; drmModeRes *res_; - drmModeRes *crtc_; + drmModeCrtcl *crtc_; struct BufferObject buff_ {}; }; } // namespace updater -- Gitee From 9ab34c45a7b2b426841f21668a24b5cb145dfc8e Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Sat, 9 Apr 2022 14:52:44 +0800 Subject: [PATCH 05/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 4 ++-- services/ui/drm_driver.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index aa8a4e26..eae48b9c 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -272,8 +272,8 @@ int DrmDriver::DrmInit(void) // 5: bind ctrc and connector drmModeSetCrtc(fd_, crtc_->crtc_id, buff_.fbId, 0, 0, &conn_->connector_id, 1, &conn_->modes[modeId]); - LOG(ERROR) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; - LOG(ERROR) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; + LOG(INFO) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; + LOG(INFO) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; LOG(INFO) << " drm init success."; return 0; } diff --git a/services/ui/drm_driver.h b/services/ui/drm_driver.h index c0fcb38f..2d10391f 100644 --- a/services/ui/drm_driver.h +++ b/services/ui/drm_driver.h @@ -57,7 +57,7 @@ private: int fd_; drmModeConnector *conn_; drmModeRes *res_; - drmModeCrtcl *crtc_; + drmModeCrtc *crtc_; struct BufferObject buff_ {}; }; } // namespace updater -- Gitee From e274bc6b25ce1436668ec7c154e42ce9693f00cd Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Sat, 9 Apr 2022 17:13:29 +0800 Subject: [PATCH 06/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index eae48b9c..01a6e2e8 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -98,11 +98,8 @@ drmModeCrtc *DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmMo for (int j = 0; j < res.count_crtcs; j++) { if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { - if (res.crtcs[j] != 0) { - uint32_t crtcId = res.crtcs[j]; - drmModeFreeEncoder(encoder); - return drmModeGetCrtc(fd, crtcId); - } + drmModeFreeEncoder(encoder); + return drmModeGetCrtc(fd, res.crtcs[j]); } } drmModeFreeEncoder(encoder); @@ -272,8 +269,8 @@ int DrmDriver::DrmInit(void) // 5: bind ctrc and connector drmModeSetCrtc(fd_, crtc_->crtc_id, buff_.fbId, 0, 0, &conn_->connector_id, 1, &conn_->modes[modeId]); - LOG(INFO) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; - LOG(INFO) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; + LOG(ERROR) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; + LOG(ERROR) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; LOG(INFO) << " drm init success."; return 0; } -- Gitee From 07c4fcd76d8804916673d3772bd7d5b2bd4e5507 Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Sat, 9 Apr 2022 17:17:44 +0800 Subject: [PATCH 07/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 01a6e2e8..43c4e6cd 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -269,8 +269,8 @@ int DrmDriver::DrmInit(void) // 5: bind ctrc and connector drmModeSetCrtc(fd_, crtc_->crtc_id, buff_.fbId, 0, 0, &conn_->connector_id, 1, &conn_->modes[modeId]); - LOG(ERROR) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; - LOG(ERROR) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; + LOG(INFO) << "DrmInit: buff_.width:" << buff_.width << " buff_.height:" << buff_.height; + LOG(INFO) << "DrmInit: crtc_id:" << crtc_->crtc_id << " connector_id:" << conn_->connector_id; LOG(INFO) << " drm init success."; return 0; } -- Gitee From 67f6de95d7f6b3b3c1523a47eb997b0ac4954206 Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Mon, 11 Apr 2022 16:40:48 +0800 Subject: [PATCH 08/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 43c4e6cd..2b9207f5 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -284,16 +284,13 @@ void DrmDriver::LoadDrmDriver() void DrmDriver::ModesetDestroyFb(struct BufferObject *bo) { - if (bo == nullptr) { - return; - } - if (fd_ > 0 && bo->fbId) { + if (fd_ > 0 && bo->fbId != 0) { drmModeRmFB(fd_, bo->fbId); } if (bo->vaddr != nullptr) { munmap(bo->vaddr, bo->size); } - if (bo->handle) { + if (fd_ > 0) { struct drm_mode_destroy_dumb destroy = {}; destroy.handle = bo->handle; drmIoctl(fd_, DRM_IOCTL_GEM_CLOSE, &destroy); -- Gitee From 1a1a6454153ef928c673ad177dc4cf392f326b91 Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Wed, 13 Apr 2022 15:14:29 +0800 Subject: [PATCH 09/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 2b9207f5..724cf467 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -97,7 +97,7 @@ drmModeCrtc *DrmDriver::GetCrtc(const drmModeRes &res, const int fd, const drmMo } for (int j = 0; j < res.count_crtcs; j++) { - if ((encoder->possible_crtcs & (1u << (uint32_t)j)) != 0) { + if ((encoder->possible_crtcs & (1u << static_cast(j))) != 0) { drmModeFreeEncoder(encoder); return drmModeGetCrtc(fd, res.crtcs[j]); } -- Gitee From 7f9cd6dfa40bdd2ea1bd935008cefc1dd6eb726e Mon Sep 17 00:00:00 2001 From: hanqiaosheng Date: Thu, 14 Apr 2022 10:03:42 +0800 Subject: [PATCH 10/10] Signed-off-by:hanqiaosheng --- services/ui/drm_driver.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/services/ui/drm_driver.cpp b/services/ui/drm_driver.cpp index 724cf467..44a5ae01 100644 --- a/services/ui/drm_driver.cpp +++ b/services/ui/drm_driver.cpp @@ -197,43 +197,42 @@ drmModeRes *DrmDriver::GetResources(int &fd) const drmModeRes *DrmDriver::GetOneResources(const int devIndex, int &fd) const { // 1: open drm device + fd = -1; std::string devName = std::string("/dev/dri/card") + std::to_string(devIndex); - fd = open(devName.c_str(), O_RDWR | O_CLOEXEC); - if (fd < 0) { + int tmpFd = open(devName.c_str(), O_RDWR | O_CLOEXEC); + if (tmpFd < 0) { LOG(ERROR) << "open failed " << devName; return nullptr; } // 2: check drm capacity uint64_t cap = 0; - int ret = drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &cap); + int ret = drmGetCap(tmpFd, DRM_CAP_DUMB_BUFFER, &cap); if (ret != 0 || cap == 0) { LOG(ERROR) << "drmGetCap failed"; - close(fd); - fd = -1; + close(tmpFd); return nullptr; } // 3: get drm resources - drmModeRes *res = drmModeGetResources(fd); + drmModeRes *res = drmModeGetResources(tmpFd); if (res == nullptr) { LOG(ERROR) << "drmModeGetResources failed"; - close(fd); - fd = -1; + close(tmpFd); return nullptr; } // 4: check it has connected connector and crtc if (res->count_crtcs > 0 && res->count_connectors > 0 && res->count_encoders > 0) { - drmModeConnector *conn = GetFirstConnector(*res, fd); + drmModeConnector *conn = GetFirstConnector(*res, tmpFd); if (conn != nullptr) { // don't close fd LOG(INFO) << "drm dev:" << devName; drmModeFreeConnector(conn); + fd = tmpFd; return res; } } - close(fd); - fd = -1; + close(tmpFd); drmModeFreeResources(res); return nullptr; } -- Gitee