diff --git a/bsp/qemu-virt64-aarch64/applications/graphic.c b/bsp/qemu-virt64-aarch64/applications/graphic.c index a83498c6f1..7331ebfc65 100644 --- a/bsp/qemu-virt64-aarch64/applications/graphic.c +++ b/bsp/qemu-virt64-aarch64/applications/graphic.c @@ -103,8 +103,7 @@ void graphic_thread(void *param) { int i = 0; - rt_memset(graphic_info.framebuffer, 0xff, - graphic_info.width * graphic_info.height * graphic_info.bits_per_pixel); + rt_memset(graphic_info.framebuffer, 0xff, graphic_info.pitch * graphic_info.height); cur_last_points[0] = graphic_info.width / 2; cur_last_points[1] = graphic_info.height / 2; @@ -207,7 +206,7 @@ _graphic_fail: } } -int graphic_init(void) +int graphic_test(void) { rt_thread_t graphic_tid = rt_thread_create("graphic work", graphic_thread, RT_NULL, GRAPHIC_THREAD_STACK_SIZE, GRAPHIC_THREAD_PRIORITY, GRAPHIC_THREAD_TIMESLICE); @@ -221,8 +220,4 @@ int graphic_init(void) return -RT_ERROR; } -#ifdef RT_USING_SMP -INIT_ENV_EXPORT(graphic_init); -#else -MSH_CMD_EXPORT(graphic_init, Graphic initialize); -#endif +MSH_CMD_EXPORT(graphic_test, Graphic test); diff --git a/components/drivers/virtio/virtio.c b/components/drivers/virtio/virtio.c index 3de4fccc7e..f8894b70c2 100644 --- a/components/drivers/virtio/virtio.c +++ b/components/drivers/virtio/virtio.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2021-11-11 GuEe-GUI the first version + * 2023-10-12 fangjianzhou support SDL2 */ #include @@ -322,3 +323,127 @@ void virtio_fill_desc(struct virtio_device *dev, rt_uint32_t queue_index, rt_uin desc->flags = flags; desc->next = next; } + +#ifdef RT_USING_SMART +#ifdef RT_USING_VIRTIO_GPU + +#include +#include "drivers/lcd.h" +#include +#include + +static struct rt_device_graphic_info _graphic_info; +static struct rt_device_rect_info _rect_info; +static struct rt_device _fb = {}; +static rt_device_t _gpu_dev = RT_NULL; + +static rt_err_t fb_open(rt_device_t dev, rt_uint16_t oflag) +{ + return RT_EOK; +} + +static rt_err_t fb_close(rt_device_t dev) +{ + return RT_EOK; +} + +static rt_err_t fb_control(rt_device_t dev, int cmd, void *args) +{ + switch(cmd) + { + case FBIOPAN_DISPLAY: + { + rt_hw_cpu_dcache_clean(_graphic_info.framebuffer, _graphic_info.smem_len); + rt_device_control(_gpu_dev, RTGRAPHIC_CTRL_RECT_UPDATE, &_rect_info); + break; + } + case FBIOGET_FSCREENINFO: + { + struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args; + strncpy(info->id, "lcd", sizeof(info->id)); + info->smem_len = _graphic_info.smem_len; + break; + } + case FBIOGET_VSCREENINFO: + { + struct fb_var_screeninfo *info = (struct fb_var_screeninfo *)args; + info->bits_per_pixel = _graphic_info.bits_per_pixel; + info->xres = _graphic_info.width; + info->yres = _graphic_info.height; + break; + } + case RT_FIOMMAP2: + { + struct dfs_mmap2_args *mmap2 = (struct dfs_mmap2_args *)args; + + if(mmap2) + { + mmap2->ret = lwp_map_user_phy(lwp_self(), RT_NULL, rt_kmem_v2p(_graphic_info.framebuffer), mmap2->length, 1); + } + else + { + return -EIO; + } + + break; + } + default: + break; + } + + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops fb_ops = +{ + RT_NULL, + fb_open, + fb_close, + RT_NULL, + RT_NULL, + fb_control +}; +#endif + +static int fb_init() +{ + _gpu_dev = rt_device_find("virtio-gpu0"); + RT_ASSERT(_gpu_dev); + + if(_gpu_dev != RT_NULL && rt_device_open(_gpu_dev, 0) == RT_EOK) + { + rt_memset(&_graphic_info, 0, sizeof(_graphic_info)); + rt_memset(&_rect_info, 0, sizeof(_rect_info)); + rt_device_control(_gpu_dev, VIRTIO_DEVICE_CTRL_GPU_SET_PRIMARY, RT_NULL); + rt_device_control(_gpu_dev, VIRTIO_DEVICE_CTRL_GPU_CREATE_2D, (void *)RTGRAPHIC_PIXEL_FORMAT_RGB888); + rt_device_control(_gpu_dev, RTGRAPHIC_CTRL_GET_INFO, &_graphic_info); + _rect_info.x = 0; + _rect_info.y = 0; + _rect_info.width = _graphic_info.width; + _rect_info.height = _graphic_info.height; + memset(_graphic_info.framebuffer, 0xff, _graphic_info.smem_len); + rt_device_control(_gpu_dev, RTGRAPHIC_CTRL_RECT_UPDATE, &_rect_info); + } + + RT_ASSERT(!rt_device_find("fb0")); + _fb.type = RT_Device_Class_Miscellaneous; + +#ifdef RT_USING_DEVICE_OPS + _fb.ops = &fb_ops; +#else + _fb.init = RT_NULL; + _fb.open = fb_open; + _fb.close = fb_close; + _fb.read = RT_NULL; + _fb.write = RT_NULL; + _fb.control = fb_control; + _fb.user_data = RT_NULL; +#endif + + rt_device_register(&_fb, "fb0", RT_DEVICE_FLAG_RDWR); + return RT_EOK; +} +INIT_COMPONENT_EXPORT(fb_init); +#endif +#endif