导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    a40i linux5.10 sdk g2d旋转问题

    A Series
    1
    1
    66
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • T
      timhuang LV 2 最后由 编辑

      使用g2d进行图像旋转,应用代码大致如下。

      int g2dFd = open("/dev/g2d", O_RDWR);
      
      static int rotate_hdmi_270(int srcFbFd, uint32_t dstFbFd, int w, int h) 
      {
      	printf("rotate_hdmi_270 : %d  %d\n", srcFbFd, dstFbFd);
      	OSS_Sleep(1000);
              if ( g2dFd < 0 ) 
      	{
      		return -1;
              }
      
              g2d_blt_h param;
              param.flag_h = G2D_ROT_270;
             param.src_image_h.fd = srcFbFd;
      	param.src_image_h.use_phy_addr = 0;
             param.src_image_h.format = G2D_FORMAT_ARGB8888;
      	param.src_image_h.mode = G2D_GLOBAL_ALPHA;
      	param.src_image_h.clip_rect.x = 0;
      	param.src_image_h.clip_rect.y = 0;
      	param.src_image_h.clip_rect.w = w/2;
      	param.src_image_h.clip_rect.h = h/2;
      	param.src_image_h.width = w/2;
      	param.src_image_h.height = h/2;
      	param.src_image_h.alpha = 0xff;
      	param.dst_image_h.fd = dstFbFd;
      	param.dst_image_h.use_phy_addr = 0;
      	param.dst_image_h.format = G2D_FORMAT_ARGB8888;
      	param.dst_image_h.mode = G2D_GLOBAL_ALPHA;
      	param.dst_image_h.clip_rect.x = 0;
      	param.dst_image_h.clip_rect.y = 0;
      	param.dst_image_h.clip_rect.w = w/2;
      	param.dst_image_h.clip_rect.h = h/2;
      	param.dst_image_h.alpha = 0xff;
      	param.dst_image_h.width = w/2;
      	param.dst_image_h.height = h/2;
      
      	int ret = ioctl(g2dFd, G2D_CMD_BITBLT_H, (unsigned long)&param);
              if ( ret < 0 )
      	{
                  close(s_g2dFd);
                  return -1;
              }
             return 0;
      }
      

      在执行到内核驱动个g2d_rcq - g2d_rotate.c - g2d_rotate_set_para函数的write_wvalue写入操作时,系统抛出异常:

      [  206.605831] 8<--- cut here ---
      [  206.605845] Unable to handle kernel paging request at virtual address f0086000
      [  206.605858] pgd = 8a47d1fb
      [  206.605868] [f0086000] *pgd=41c0a811, *pte=00000000, *ppte=00000000
      [  206.605896] Internal error: Oops: 807 [#1] PREEMPT SMP ARM
      [  206.605907] Modules linked in: mali(O)
      [  206.605923] CPU: 2 PID: 1883 Comm: HdmiDispTask Tainted: G
      

      dts的配置是这样的:

      g2d: g2d@1e80000 {
      		compatible = "allwinner,sunxi-g2d";
      		reg = <0x0 0x01e80000 0x0 0x8000>;
      		interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
      		clocks = <&ccu CLK_BUS_MP>, <&ccu CLK_DE_MP>, <&ccu CLK_MP_GATE>;
      		clock-names = "bus", "g2d", "mbus_g2d";
      
      		resets = <&ccu RST_BUS_MP>;
      		reset-names = "rst_bus_mp";
      
      		assigned-clocks = <&ccu CLK_DE_MP>;
      		assigned-clock-parents = <&ccu CLK_PLL_DE>;
      		assigned-clock-rates = <297000000>;
      		status = "okay";
      	};
      

      dts reg属性改成:reg = <0x0 0x01e80000 0x0 0x40000>; 后内核不再抛出异常。
      但是在:g2d_rotate_set_para-->g2d_wait_cmd_finish(unsigned int timeout) 时返回-1.
      看上去中断有点问题。
      请问: a40i g2d_rcq支持旋转吗? datasheet中并没有旋转相关的寄存器介绍。如果支持的话,是哪里出了问题? dts配置有问题吗?

      1 条回复 最后回复 回复 引用 分享 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策