Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    男人至死都是孩子——大佬在D1开发板上移植魂斗罗游戏

    MR Series
    2
    2
    1758
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by

      小白通过buildroot搭建哪吒D1开发环境详细步骤,并且在HDMI显示器上玩上了魂斗罗(基于QT5).(感谢晕哥对我的指导)
      所有的内容都通过buildroot搭建,包括uboot,内核,qt5等等。
      我是通过UBUNTU18.4搭建的,如果在buildroot的下载过程中遇到了半天都下不下来,直接就强行终止,然后执行
      sudo systemd-resolve --flush-caches (UBUNTU18.4,其他的版本需要自己查)这个是刷DNS,我有的时候下载不动就用此命令。

      1.apt-get update

      2.sudo apt-get install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget python cvs git mercurial rsync scp subversion android-tools-mkbootimg libncurses5-dev

      Bzr 注意:第2步骤是我自己摸索出来的,与韦东山老师要求安装的库的不同,请注意。

      3.找一个文件夹 或者是home文件夹 mkdir -p ~/Neza-D1/ && cd ~/Neza-D1/ 这样就有Neza-D1文件夹了。

      4.git clone https://gitee.com/weidongshan/neza-d1-buildroot.git buildroot-2021 这个是韦东山老师的buildroot,下载速度应该是比较快。

      5.在buildroot-2021/configs/的文件夹下有neza-d1_defconfig,这个就是默认的配置文件。 通过make neza-d1_defconfig 生成默认文件。然后通过
      make menuconfig 进入buildroot配置,Qt5的这三个库去掉。(我是下载不下来没有办法去掉的,如果可以下载下来,也不用去掉)
      Qt5-coap需要去掉
      Qt5-knx 需要去掉
      Qt5-mqtt需要去掉

      6.make all,这个过程非常漫长。完成之后会在buildroot/image下生成sdcard.img,通过写SD卡的工具写入就可以了。

      7.写入之后,可以通过串口启动,就成功了一半,这个时候插入HDMI是不能识别,好像是sink什么什么错误。然后执行

      mount -t debugfs none /sys/kernel/debug;
      cd /sys/kernel/debug/dispdbg;
      echo disp0 > name; 
      echo switch1 > command; 
      echo 4 10 0 0 0x4 0x101 0 0 0 8 > param; 
      echo 1 > start;
      

      然后你的显示屏幕就只能显示左边一部分,然后你执行 cat /dev/urandom > /dev/fb0 应该可以看到左边一小半屏幕有雪花屏幕。

      8.我的LCD是1024x600的,显示不全应该是设备树的问题,然后就修改uboot设备树和linux内核设备树。
      uboot与linux内核都在 buildroot的output/build/目录下
      uboot设备树在 uboot-origin_master文件夹下的 arch/boot/dts/uboot-board.dts
      linux内核设备树在 linux-origin_master文件夹下的 arch/riscv/boot/dts/board.dts
      两个设备树都要修改成下面这种,-就是要去掉,+就是要增加,其中dev0_output_mode是调分辨率

      • <10>就是1080p
      • <5> 就是720p
      • <2> 就是360p

      具体可以查文档

              disp_init_enable         = <1>;
              disp_mode                = <0>;
      -       screen0_output_type      = <1>;
      -       screen0_output_mode      = <4>;
      -
      -       screen1_output_type      = <3>;
      -       screen1_output_mode      = <10>;
      -
      -       screen1_output_format    = <0>;
      -       screen1_output_bits      = <0>;
      -       screen1_output_eotf      = <4>;
      -       screen1_output_cs        = <257>;
      -       screen1_output_dvi_hdmi  = <2>;
      -       screen1_output_range     = <2>;
      -       screen1_output_scan      = <0>;
      -       screen1_output_aspect_ratio = <8>;
      -
      -       dev0_output_type         = <1>;
      -       dev0_output_mode         = <4>;
      +    screen0_output_type      = <3>;
      +    screen0_output_mode      = <10>;
      +
      +    screen0_output_format    = <0>;
      +    screen0_output_bits      = <0>;
      +    screen0_output_eotf      = <4>;
      +    screen0_output_cs        = <257>;
      +    screen0_output_dvi_hdmi  = <2>;
      +    screen0_output_range     = <2>;
      +    screen0_output_scan      = <0>;
      +    screen0_output_aspect_ratio = <8>;
      +
      +    screen1_output_type      = <1>;
      +    screen1_output_mode      = <4>;
      +
      +    dev0_output_type         = <4>;
      +    dev0_output_mode         = <10>;
              dev0_screen_id           = <0>;
      -       dev0_do_hpd              = <0>;
      -
      -       dev1_output_type         = <4>;
      -       dev1_output_mode         = <10>;
      -       dev1_screen_id           = <1>;
      -       dev1_do_hpd              = <1>;
      +       dev0_do_hpd              = <1>;
      

      改完成之后,在uboot-origin_master文件夹下与 linux-origin_master文件夹下都需要执行
      rm .stamp_built
      然后 在buildroot目录下 make all
      然后下载到sd卡,
      cat /dev/urandom > /dev/fb0 应该是全屏幕的雪花

      9.这个时候插入鼠标键盘虽然有打印消息但是没有/dev/input/ 这个时候需要在内核加入Event interface,
      修改完成还是需要 rm .stamp_built,烧入sd卡,这个时候就有/dev/input/eventx,这个时候鼠标与键盘还是不能用在qt5中。

      export QT_QPA_GENERIC_PLUGINS=tslib,evdevkeyboard:/dev/input/eventx,evdevmouse:/dev/input/eventx

      这个eventx需要根据实际情况来 这个时候qt5就支持键盘了.

      10.交叉编译QT5的NES模拟器,我在github下的,它那个需要很多的依赖,
      例如需要继承OPENGL。我后面就改成了,只要有最基本的库就可以了。(文件会随后发出来)
      qmake在 buildroot的output/host/bin目录下,有qmake就可以交叉编译。

      qt4-NES4_5_512_480_640_480.7z
      这个是QT5源文件,,qt4-NES4_5_512_480_640_480/Qt/hdl.nes 拷贝到根目录可以直接一运行,接上键盘就可以直接玩。
      1 2 A W S D L O通过这几个键就可以玩魂斗罗啦,嘻嘻。

      微信图片_20211013132647.jpg
      这个是我的HDMI显示器图

      for (y = 0; y < NES_DISP_HEIGHT; y++ )//240
      {
      for (x = 0; x < NES_DISP_WIDTH; x++ )//256
      {
      p=(WorkFrame+(y*NES_DISP_WIDTH)+x);
      ((WorkFrameX+(y<<1))+(x<<1))=*p;
      ((WorkFrameX+(y<<1))+((x<<1)+1))=*p;
      ((WorkFrameX+((y<<1)+1))+(x<<1))=*p;
      ((WorkFrameX+((y<<1)+1))+((x<<1)+1))=*p;
      }
      }
      这个是将图像放大两倍,mask一个标签
      infones的linux版本 绘制点是一点一点计算,如果屏幕比较大,应该就比较慢

      (文章转载自:WhyCan Forum 哇酷开发者社区 )
      (原文链接:https://whycan.com/t_7253.html )

      1 Reply Last reply Reply Quote Share 1
      • whycan
        whycan晕哥 LV 9 last edited by whycan

        6ab7d743-7970-40b8-9ad0-ccc5204ad739-image.png

        windows 用 QtCreator 编译 qt4-NES4_5_512_480_640_480\Qt\Qt.pro 运行成功。

        1 Reply Last reply Reply Quote Share 0
        • 1 / 1
        • First post
          Last post

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

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