1.从android 系统中导出libdrm.so 、libnativeloader.so 两个drm 库文件,库文件路径/system/lib;
两种方式:1)通过adb 导出,如果出现权限问题,请参考:https://blog.youkuaiyun.com/Chhjnavy/article/details/97643584
adb pull /system/lib ./
2)通过android studio 的Device File Explorer 文件管理,找到/system/lib 路径下相关文件,右击save 保存到桌面;
2.导出相关头文件:路径android 源码根目录 /external/libdrm 下
#include "xf86drm.h"
#include "xf86drmMode.h"
3.jni 层添加c++ 文件
#include <jni.h>
//#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <time.h>
#include <unistd.h>
#include "xf86drm.h"
#include "xf86drmMode.h"
#include <android/log.h>
#define TAG "terawins" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
struct buffer_object {
uint32_t width;
uint32_t height;
uint32_t pitch;
uint32_t handle;
uint32_t size;
uint32_t *vaddr;
uint32_t fb_id;
};
struct buffer_object buf[2];
static int modeset_create_fb(int fd, struct buffer_object *bo, uint32_t color)
{
struct drm_mode_create_dumb create = {};
struct drm_mode_map_dumb map = {};
uint32_t i;
create.width = bo->width;
create.height = bo->height;
create.bpp = 32;
drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
bo->pitch = create.pitch;
bo->size = create.size;
bo->handle = create.handle;
drmModeAddFB(fd, bo->width, bo->height, 24, 32, bo->pitch,
bo->handle, &bo->fb_id);
map.handle = create.handle;
drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
bo->vaddr = static_cast<uint32_t *>(mmap(0, create.size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, map.offset));
for (i = 0; i < (bo->size / 4); i++)
bo->vaddr[i] = color;
return 0;
}
static void modeset_destroy_fb(int fd, struct buffer_object *bo)
{
struct drm_mode_destroy_dumb destroy = {};
drmModeRmFB(fd, bo->fb_id);
munmap(bo->vaddr, bo->size);
destroy.handle = bo->handle;
drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
}
int DRM2()
{
int fd;
drmModeConnector *conn;
drmModeRes *res;
uint32_t conn_id;
uint32_t crtc_id;
fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
res = drmModeGetResources(fd);
crtc_id = res->crtcs[0];
conn_id = res->connectors[0];
conn = drmModeGetConnector(fd, conn_id);
buf[0].width = conn->modes[0].hdisplay;
buf[0].height = conn->modes[0].vdisplay;
buf[1].width = conn->modes[0].hdisplay;
buf[1].height = conn->modes[0].vdisplay;
modeset_create_fb(fd, &buf[0], 0xff0000);
modeset_create_fb(fd, &buf[1], 0x0000ff);
drmModeSetCrtc(fd, crtc_id, buf[0].fb_id,
0, 0, &conn_id, 1, &conn->modes[0]);
sleep(2);
drmModeSetCrtc(fd, crtc_id, buf[1].fb_id,
0, 0, &conn_id, 1, &conn->modes[0]);
*//* getchar();
drmModeSetCrtc(fd, crtc_id, buf[1].fb_id,
0, 0, &conn_id, 1, &conn->modes[0]);
getchar();
modeset_destroy_fb(fd, &buf[1]);
modeset_destroy_fb(fd, &buf[0]);*//*
sleep(2);
*//* drmModeFreeConnector(conn);
drmModeFreeResources(res);*//*
//close(fd);
return 0;
}
4.通过内存映射,将内核空间的buffer 映射到用户空间,对其操作,即可进行写操作(读操作不行,android 这个貌似不对外开放了)
参考链接:https://blog.youkuaiyun.com/hexiaolong2009/article/details/84674127