From 49862be65a2a1f1815a32951293173bea4e77846 Mon Sep 17 00:00:00 2001 From: vintagepc <53943260+vintagepc@users.noreply.github.com> Date: Mon, 12 Jul 2021 21:48:15 -0400 Subject: [PATCH] [WIP] Win64 native build (#69) * Win64 cygwin build and package * Fix bitfield packing declarations for IWDG and TMC2209 --- .github/workflows/build.yml | 182 +++++++++++++----------- .github/workflows/lint.yml | 2 +- hw/arm/prusa/3rdParty/meson.build | 2 +- hw/arm/prusa/meson.build | 40 ++++-- hw/arm/prusa/opengl/meson.build | 2 +- hw/arm/prusa/parts/gl_dashboard.c | 14 +- hw/arm/prusa/parts/st7789v.c | 2 +- hw/arm/prusa/parts/tmc2209.c | 25 ++-- hw/arm/prusa/prusa-mini.c | 15 +- hw/arm/prusa/stm32f407/stm32_clk_type.h | 1 + hw/arm/prusa/stm32f407/stm32_uart.c | 4 +- hw/arm/prusa/stm32f407/stm32_uart.h | 2 +- hw/arm/prusa/stm32f407/stm32f2xx_dma.c | 2 +- hw/arm/prusa/stm32f407/stm32f2xx_i2c.h | 14 +- hw/arm/prusa/stm32f407/stm32f2xx_rcc.c | 2 +- hw/arm/prusa/stm32f407/stm32f2xx_tim.c | 4 +- hw/arm/prusa/stm32f407/stm32f2xx_tim.h | 2 +- hw/arm/prusa/stm32f407/stm32f4xx_eth.c | 6 +- hw/arm/prusa/stm32f407/stm32f4xx_iwdg.c | 6 +- hw/arm/prusa/stm32f407/stm32f4xx_iwdg.h | 22 +-- hw/arm/prusa/stm32f407/stm32f4xx_otp.c | 2 +- hw/arm/prusa/stm32f407/stm32f4xx_spi.c | 4 +- hw/arm/prusa/stm32f407/stm32f4xx_usb.h | 2 +- hw/arm/prusa/utility/macros.h | 8 +- 24 files changed, 211 insertions(+), 154 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3be2660a6d..f14afc0cdb6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" - build: + build_linux: # The type of runner that the job will run on runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_BUILD')" @@ -62,7 +62,7 @@ jobs: run: cd ${{ runner.workspace }}/MINI404 && ./configure --target-list="buddy-softmmu" - name: Build qemu-system-buddy - run: cd ${{ runner.workspace }}/MINI404 && make -j2 + run: cd ${{ runner.workspace }}/MINI404 && make -j3 - name: Checkout Wiki uses: actions/checkout@v2.2.0 @@ -86,14 +86,15 @@ jobs: if: ${{ !github.event.pull_request }} run: | cd ${{ runner.workspace }}/MINI404/build - mv buddy-softmmu Mini404-dev - tar -jhcvf Mini404-development-build.tar.bz2 Mini404-dev + mv buddy-softmmu Mini404-dev-linux + mv assets Mini404-dev-linux + tar -jhcvf Mini404-dev-build-linux.tar.bz2 Mini404-dev-linux - name: Upload artifact if: ${{ !github.event.pull_request }} uses: actions/upload-artifact@v2 with: name: Binaries - path: ${{ runner.workspace }}/MINI404/build/Mini404-development-build.tar.bz2 + path: ${{ runner.workspace }}/MINI404/build/Mini404-dev-build-linux.tar.bz2 # build_osx: # # The type of runner that the job will run on @@ -139,98 +140,118 @@ jobs: # name: Binaries # path: ${{ runner.workspace }}/MK404/build/MK404_OSX - # build_cygwin: - # # The type of runner that the job will run on - # runs-on: windows-latest - # if: "!contains(github.event.head_commit.message, 'NO_BUILD')" - # steps: - # - uses: actions/cache@v1 - # with: - # path: C:\tools\chococache - # key: ${{ runner.os }}-cygwin-${{ github.sha }} - # restore-keys: | - # ${{ runner.os }}-cygwin- - # - name: Cygwin package cache - # uses: actions/cache@v1 - # with: - # path: C:\tools\cygcache - # key: ${{ runner.os }}-cygwinpkgs-1_1 - # restore-keys: | - # ${{ runner.os }}-cygwinpkgs- - # - name: Install cygwin - # run: | - # choco config set cacheLocation C:\tools\chococache - # choco install --no-progress cygwin - # - name: Install cygwin dependencies - # run: | - # C:\tools\cygwin\cygwinsetup.exe -qgnNdO -l C:/tools/cygcache -R C:/tools/cygwin -s http://mirrors.kernel.org/sourceware/cygwin/ -P cmake,make,libelf-devel,gcc-core,gcc-g++,libstdc++-6-devel,git,libglut-devel,libGLEW-devel,libSDL_sound-devel,libSDL-devel,avr-gcc,python2,libpng-devel - # shell: cmd - - # - name: Checkout ${{ github.event.pull_request.head.ref }} - # uses: actions/checkout@v2.2.0 - # if: ${{ github.event.pull_request }} - # with: - # repository: vintagepc/MK404.git - # ref: ${{ github.event.pull_request.head.sha }} - # submodules: true + build_cygwin: + # The type of runner that the job will run on + runs-on: windows-latest + if: "!contains(github.event.head_commit.message, 'NO_BUILD')" + steps: + - uses: actions/cache@v1 + with: + path: C:\tools\chococache + key: ${{ runner.os }}-cygwin-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-cygwin- + - name: Cygwin package cache + uses: actions/cache@v1 + with: + path: C:\tools\cygcache + key: ${{ runner.os }}-cygwinpkgs-1_1 + restore-keys: | + ${{ runner.os }}-cygwinpkgs- + - name: Install cygwin + run: | + choco config set cacheLocation C:\tools\chococache + choco install --no-progress cygwin + - name: Install cygwin dependencies + run: | + C:\tools\cygwin\cygwinsetup.exe -qgnNdO -l C:/tools/cygcache -R C:/tools/cygwin -s http://mirrors.kernel.org/sourceware/cygwin/ -P "mingw64-x86_64-gcc-g++,mingw64-x86_64-glew,mingw64-x86_64-freeglut,mingw64-x86_64-curl,mingw64-x86_64-glib-2.0,mingw64-x86_64-gtk3,mingw64-x86_64-libepoxy,mingw64-x86_64-pixman,mingw64-x86_64-pkg-config,mingw64-x86_64-libusb1.0,mingw64-x86_64-usbredir,python3-setuptools,git,gcc-core,make,zip" + shell: cmd - # - name: Checkout ${{ github.event.ref }} - # uses: actions/checkout@v2.2.0 - # if: ${{ !github.event.pull_request }} - # with: - # repository: vintagepc/MK404.git - # ref: ${{ github.event.ref }} - # submodules: true + - name: Fix CRLF Checkout + run: git config --global core.autocrlf false - # - name: Configure build - # run: | - # echo %USERPROFILE% - # cd MK404 - # mkdir build - # cd build - # set PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin - # bash.exe -c "cmake -DCMAKE_BUILD_TYPE=RELEASE .." - # shell: cmd + - name: Checkout ${{ github.event.pull_request.head.ref }} + uses: actions/checkout@v2.2.0 + if: ${{ github.event.pull_request }} + with: + repository: vintagepc/MINI404.git + ref: ${{ github.event.pull_request.head.sha }} + submodules: false - # - name: Build - # run: | - # cd ${{runner.workspace}}\MK404\build - # pwd - # set PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin - # bash.exe -c "make -j2" - # shell: cmd + - name: Checkout ${{ github.event.ref }} + uses: actions/checkout@v2.2.0 + if: ${{ !github.event.pull_request }} + with: + repository: vintagepc/MINI404.git + ref: ${{ github.event.ref }} + submodules: false - # - name: Upload Cygwin artifact - # if: ${{ !github.event.pull_request }} - # uses: actions/upload-artifact@v2 - # with: - # name: Binaries - # path: ${{ runner.workspace }}/MK404/build/MK404.exe + # Note we need to sed LDFLAGS_NO_PIE because mingw's LD is no-pie by default and doesn't + # recognize the `--no-pie` argument... not that it matters because we don't need to build the ROMs here. + - name: Configure build + run: | + cd MINI404 + mkdir build + cd build + set PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin + bash.exe -c "../configure --cross-prefix=x86_64-w64-mingw32- --target-list=buddy-softmmu --enable-gtk --enable-libusb" + bash.exe -c "sed -i 's/LDFLAGS_NOPIE=-no-pie/LDFLAGS_NOPIE=/g' config-host.mak" + shell: cmd + + - name: Build + run: | + cd ${{runner.workspace}}\MINI404\build + pwd + set PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin + bash.exe -c "make -j3" + shell: cmd + - name: Assemble artifacts and libraries + if: ${{ !github.event.pull_request }} + run: | + cd ${{ runner.workspace }}/MINI404/build + mkdir Mini404-dev-w64 + mv qemu-system-buddy.exe Mini404-dev-w64 + mv assets Mini404-dev-w64 + cd Mini404-dev-w64 + set PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin + bash.exe -c "mkdir pc-bios && echo \"Placeholder. DO NOT DELETE THIS DIRECTORY, IT MUST EXIST OR QEMU WILL HANG ON BOOT\" > pc-bios/README.txt" + bash.exe -c "for i in `ldd qemu-system-buddy.exe | grep \"not found\" | cut -f2 | cut -d\" \" -f1 | sort | uniq`; do echo Copying $i; cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/$i .; done" + bash.exe -c "while `ldd *.dll | grep -q \"not found\"`; do for i in `ldd *.dll | grep \"not found\" | cut -f2 | cut -d\" \" -f1 | sort | uniq`; do echo Copying $i; cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/$i .; done; sleep 2; done" + cd .. + zip -r Mini404-dev-build-w64.zip Mini404-dev-w64 + shell: cmd + + - name: Upload Cygwin artifact + if: ${{ !github.event.pull_request }} + uses: actions/upload-artifact@v2 + with: + name: Binaries + path: ${{ runner.workspace }}/MINI404/build/Mini404-dev-build-w64.zip Publish: runs-on: ubuntu-latest if: ${{ !github.event.pull_request }} - needs: [build] + needs: [build_linux, build_cygwin] steps: - name: Retrieve platform binaries uses: actions/download-artifact@v2 with: name: Binaries - - name: Extract assets - run: | - tar -jxvf Mini404-development-build.tar.bz2 - - name: Check tag version id: get_version if: startsWith(github.ref, 'refs/tags/v') run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - - name: Build ${{ steps.get_version.outputs.VERSION }} tarball + - name: Build ${{ steps.get_version.outputs.VERSION }} archives if: startsWith(github.ref, 'refs/tags/v') run: | - mv Mini404-dev Mini404-${{ steps.get_version.outputs.VERSION }} - tar -jcvf Mini404-${{ steps.get_version.outputs.VERSION }}-linux.tar.bz2 Mini404-${{ steps.get_version.outputs.VERSION }} + tar -jxvf Mini404-dev-build-linux.tar.bz2 + unzip Mini404-dev-build-w64.zip + mv Mini404-dev-linux Mini404-${{ steps.get_version.outputs.VERSION }}-linux + mv Mini404-dev-w64 Mini404-${{ steps.get_version.outputs.VERSION }}-w64 + tar -jcvf Mini404-${{ steps.get_version.outputs.VERSION }}-linux.tar.bz2 Mini404-${{ steps.get_version.outputs.VERSION }}-linux + zip -r Mini404-${{ steps.get_version.outputs.VERSION }}-w64.zip Mini404-${{ steps.get_version.outputs.VERSION }}-w64 - name: RELEASE THE KRAKEN if: startsWith(github.ref, 'refs/tags/v') @@ -240,11 +261,8 @@ jobs: prerelease: false files: | Mini404-${{ steps.get_version.outputs.VERSION }}-linux.tar.bz2 - - - name: Rebuild dev tarball - if: steps.get_version.outcome == 'Skipped' - run: tar -jcvf Mini404-dev-linux.tar.bz2 Mini404-dev - + Mini404-${{ steps.get_version.outputs.VERSION }}-w64.zip + - name: Publish prerelease if: steps.get_version.outcome == 'Skipped' uses: "marvinpinto/action-automatic-releases@latest" @@ -255,3 +273,5 @@ jobs: title: "Latest (Development) Build" files: | Mini404-dev-linux.tar.bz2 + Mini404-dev-w64.zip + diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f30a3c852c3..26b5f8f8939 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -60,7 +60,7 @@ jobs: - name: Run CPPCheck run: | cd ${{ runner.workspace }}/MINI404 - cppcheck --template='::{severity} file={file},line={line}::{message}' --error-exitcode=2 --inline-suppr --enable=warning --suppress='*:hw/arm/prusa/3rdParty/*' hw/arm/prusa/* + cppcheck --template='::{severity} file={file},line={line}::{message}' --error-exitcode=2 --inline-suppr --enable=warning --suppress='*:hw/arm/prusa/3rdParty/*' hw/arm/prusa # - name: Run Clang-tidy # run: | diff --git a/hw/arm/prusa/3rdParty/meson.build b/hw/arm/prusa/3rdParty/meson.build index 962d70e6ae1..995f622c3d5 100644 --- a/hw/arm/prusa/3rdParty/meson.build +++ b/hw/arm/prusa/3rdParty/meson.build @@ -1,4 +1,4 @@ -arm_ss.add(when: ['CONFIG_OPENGL', 'CONFIG_BUDDYBOARD'], +arm_ss.add(when: ['CONFIG_BUDDYBOARD'], if_true: files('arcball/Camera.cpp', 'tinyobjloader/tiny_obj_loader.cc' )) diff --git a/hw/arm/prusa/meson.build b/hw/arm/prusa/meson.build index 80d812662db..f76bb33dde1 100644 --- a/hw/arm/prusa/meson.build +++ b/hw/arm/prusa/meson.build @@ -1,7 +1,32 @@ -subdir('3rdParty') -subdir('opengl') +libglut = cc.find_library('glut', required: false) +if build_machine.system() == 'cygwin' + message('Cross build, finding opengl32. libglew32 and libglu32') + libgl = cc.find_library('libopengl32', required: false) + libglu = cc.find_library('libglu32', required: false) + libglew = cc.find_library('libglew32', required: false) +else + message('Native build, looking for GLEW/GLU/GL') + libgl = cc.find_library('GL', required: false) + libglu = cc.find_library('GLU', required: false) + libglew = cc.find_library('GLEW', required: false) +endif + +if libglut.found() and libglu.found() and libglew.found() and libgl.found() + message('OpenGL libraries found - enabling Mini404 GL extensions') + buddy_gl = declare_dependency(compile_args: '-DBUDDY_HAS_GL') + arm_ss.add(when: 'CONFIG_BUDDYBOARD', if_true: [libgl, libglu, libglut, libglew, buddy_gl]) + subdir('3rdParty') + subdir('opengl') + subdir('assets') +else + message('OpenGL libraries not found. Install development packages for freeglut, glew, and mesa and re-run configure.') + +endif + + + subdir('stm32f407') -subdir('assets') + arm_ss.add(when: 'CONFIG_BUDDYBOARD', if_true: files( 'prusa-mini.c', @@ -21,11 +46,4 @@ arm_ss.add(when: 'CONFIG_BUDDYBOARD', if_true: files( )) # Required if using Message queue IPC -c = meson.get_compiler('c') -arm_ss.add(when: 'CONFIG_BUDDYBOARD', if_true: cc.find_library('rt')) -arm_ss.add(when: ['CONFIG_BUDDYBOARD','CONFIG_OPENGL'], if_true: cc.find_library('glut')) -arm_ss.add(when: ['CONFIG_BUDDYBOARD','CONFIG_OPENGL'], if_true: cc.find_library('GLU')) -arm_ss.add(when: ['CONFIG_BUDDYBOARD','CONFIG_OPENGL'], if_true: cc.find_library('GL')) -arm_ss.add(when: ['CONFIG_BUDDYBOARD','CONFIG_OPENGL'], if_true: cc.find_library('GLEW')) - -# hw_arch += {'arm': buddy_ss} + diff --git a/hw/arm/prusa/opengl/meson.build b/hw/arm/prusa/opengl/meson.build index 8e336b3253b..d585e7662c4 100644 --- a/hw/arm/prusa/opengl/meson.build +++ b/hw/arm/prusa/opengl/meson.build @@ -1,4 +1,4 @@ -arm_ss.add(when: ['CONFIG_OPENGL', 'CONFIG_BUDDYBOARD'], +arm_ss.add(when: ['CONFIG_BUDDYBOARD'], if_true: files('GLDashboardMgr.cpp', 'GLMotor.cpp', 'IPCIndicator.cpp', diff --git a/hw/arm/prusa/parts/gl_dashboard.c b/hw/arm/prusa/parts/gl_dashboard.c index c9d0b111122..fc916b35efc 100644 --- a/hw/arm/prusa/parts/gl_dashboard.c +++ b/hw/arm/prusa/parts/gl_dashboard.c @@ -50,7 +50,7 @@ OBJECT_DEFINE_TYPE_SIMPLE_WITH_INTERFACES(GLDashboadState, gldashboard, GLDASHBO static void gldashboard_realize(DeviceState *dev, Error **errp) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(dev); if (s->dashboard_type) { s->dashboardmgr = gl_dashboard_start(s->dashboard_type); @@ -62,7 +62,7 @@ static void gldashboard_realize(DeviceState *dev, Error **errp) } static void gldashboard_motor_in(void *opaque, int n, int level) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(opaque); if (s->dashboard_type) { gl_dashboard_update_motor(s->dashboardmgr,n,level); @@ -71,7 +71,7 @@ static void gldashboard_motor_in(void *opaque, int n, int level) { } static void gldashboard_motor_stall_in(void *opaque, int n, int level) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(opaque); if (s->dashboard_type) { gl_dashboard_update_motor_stall(s->dashboardmgr,n,level); @@ -80,7 +80,7 @@ static void gldashboard_motor_stall_in(void *opaque, int n, int level) { } static void gldashboard_motor_enable_in(void *opaque, int n, int level) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(opaque); if (s->dashboard_type) { gl_dashboard_update_motor_enable(s->dashboardmgr,n,level); @@ -90,7 +90,7 @@ static void gldashboard_motor_enable_in(void *opaque, int n, int level) { static void gldashboard_indicator_in(void *opaque, int n, int level) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(opaque); if (s->dashboard_type) { gl_dashboard_update_indicator(s->dashboardmgr,n,level); @@ -99,7 +99,7 @@ static void gldashboard_indicator_in(void *opaque, int n, int level) { } static void gldashboard_indicator_logic_in(void *opaque, int n, int level) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(opaque); if (s->dashboard_type) { gl_dashboard_update_indicator(s->dashboardmgr,n,level ? 255 : 0); @@ -112,7 +112,7 @@ static void gldashboard_finalize(Object *obj) } static void gldashboard_reset(DeviceState *dev) { -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL GLDashboadState *s = GLDASHBOARD(dev); if (s->dashboard_type) { gl_dashboard_reset(s->dashboardmgr); diff --git a/hw/arm/prusa/parts/st7789v.c b/hw/arm/prusa/parts/st7789v.c index 67427dd275b..e4b3a44d261 100644 --- a/hw/arm/prusa/parts/st7789v.c +++ b/hw/arm/prusa/parts/st7789v.c @@ -110,7 +110,7 @@ static uint32_t st7789v_transfer(SSISlave *dev, uint32_t data) uint8_t r; uint8_t a; }; - } color; + } QEMU_PACKED color; color.full = 0; uint16_t word = 0; if (s->mode == ST7789V_CMD) { diff --git a/hw/arm/prusa/parts/tmc2209.c b/hw/arm/prusa/parts/tmc2209.c index 00e5b77f98c..2dc2c913201 100644 --- a/hw/arm/prusa/parts/tmc2209.c +++ b/hw/arm/prusa/parts/tmc2209.c @@ -65,30 +65,30 @@ typedef union uint8_t multistep_filt :1; uint8_t test_mode :1; uint32_t :22; - } __attribute__ ((__packed__)) GCONF; // 0x00 + } QEMU_PACKED GCONF; // 0x00 struct // 0x01 { uint8_t reset :1; uint8_t drv_err :1; uint8_t uv_cp :1; uint32_t :29; // unused - } __attribute__ ((__packed__)) GSTAT; // 0x01 + } QEMU_PACKED GSTAT; // 0x01 struct // 0x01 { uint32_t ifcnt :8; uint32_t :24; // unused - } __attribute__ ((__packed__)) IFCNT; // 0x02 + } QEMU_PACKED IFCNT; // 0x02 uint32_t _unimplemented[61]; //0x03 - 0x6B struct // 0x40 { uint32_t sgthrs :8; uint32_t :24; - } __attribute__((__packed__)) SGTHRS; // 0x40 + } QEMU_PACKED SGTHRS; // 0x40 struct // 0x41 { uint32_t sg_result :10; uint32_t :22; - } __attribute__((__packed__)) SG_RESULT; // 0x41 + } QEMU_PACKED SG_RESULT; // 0x41 uint32_t _unimplemented2a[42]; //0x03 - 0x6B struct //0x6C { @@ -104,7 +104,7 @@ typedef union uint32_t dedge :1; uint32_t diss2g :1; uint32_t diss2vs :1; - } __attribute__ ((__packed__)) CHOPCONF; + } QEMU_PACKED CHOPCONF; uint32_t _unimplemented2[2]; //0x6D - 0x6E struct //0x6F { @@ -125,8 +125,8 @@ typedef union uint16_t _unus2 :9; uint8_t stealth :1; uint8_t stst :1; - } __attribute__ ((__packed__)) DRV_STATUS; - }defs; + } QEMU_PACKED DRV_STATUS; + } QEMU_PACKED defs; } tmc2209_registers_t; @@ -369,6 +369,15 @@ static void tmc2209_realize(DeviceState *obj, Error **errp){ static void tmc2209_init(Object *obj){ tmc2209_state *s = TMC2209(obj); + + CHECK_REG_u32(s->regs.defs.GCONF); + CHECK_REG_u32(s->regs.defs.GSTAT); + CHECK_REG_u32(s->regs.defs.IFCNT); + CHECK_REG_u32(s->regs.defs.SGTHRS); + CHECK_REG_u32(s->regs.defs.SG_RESULT); + CHECK_REG_u32(s->regs.defs.CHOPCONF); + CHECK_REG_u32(s->regs.defs.DRV_STATUS); + s->id=' '; s->address=0; s->dir = 0; diff --git a/hw/arm/prusa/prusa-mini.c b/hw/arm/prusa/prusa-mini.c index bf17450b2d4..27c04dea6a7 100644 --- a/hw/arm/prusa/prusa-mini.c +++ b/hw/arm/prusa/prusa-mini.c @@ -144,7 +144,7 @@ static void prusa_mini_init(MachineState *machine) // DeviceState *vis = qdev_new("mini-visuals"); // sysbus_realize(SYS_BUS_DEVICE(vis), &error_fatal); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL DeviceState *gl_db = qdev_new("gl-dashboard"); if (arghelper_is_arg("gfx-full")) { qdev_prop_set_uint8(gl_db, "dashboard_type", DB_MINI_FULL); @@ -154,7 +154,10 @@ static void prusa_mini_init(MachineState *machine) qdev_prop_set_uint8(gl_db, "dashboard_type", DB_MINI_DB); } sysbus_realize(SYS_BUS_DEVICE(gl_db), &error_fatal); +#else + printf("NOTE: GL support is not compiled in, gfx-* options will be ignored.\n"); #endif + { static const char names[4] = {'X','Y','Z','E'}; static const uint8_t addresses[4] = {1, 3,0,2}; @@ -186,7 +189,7 @@ static void prusa_mini_init(MachineState *machine) qdev_connect_gpio_out(split_out,i, qdev_get_gpio_in_named(dev,"tmc2209-byte-in",0)); qdev_connect_gpio_out(DEVICE(&SOC->gpio[GPIO_D]), step_pins[i], qdev_get_gpio_in_named(dev,"tmc2209-step",0)); qdev_connect_gpio_out(DEVICE(&SOC->gpio[GPIO_D]), dir_pins[i], qdev_get_gpio_in_named(dev,"tmc2209-dir",0)); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL qemu_irq split_en = qemu_irq_split( qdev_get_gpio_in_named(dev,"tmc2209-enable",0),qdev_get_gpio_in_named(gl_db,"motor-enable",i)); qdev_connect_gpio_out(DEVICE(&SOC->gpio[GPIO_D]), en_pins[i],split_en); qemu_irq split_diag = qemu_irq_split( qdev_get_gpio_in(DEVICE(&SOC->gpio[diag_ports[i]]),diag_pins[i]),qdev_get_gpio_in_named(gl_db,"motor-stall",i)); @@ -232,7 +235,7 @@ static void prusa_mini_init(MachineState *machine) sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal); qdev_connect_gpio_out_named(DEVICE(&SOC->timers[2]),"pwm_ratio_changed",3,qdev_get_gpio_in_named(dev, "pwm_in",0)); qdev_connect_gpio_out_named(dev, "temp_out",0, qdev_get_gpio_in_named(hotend, "thermistor_set_temperature",0)); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL qdev_connect_gpio_out_named(dev, "pwm-out", 0, qdev_get_gpio_in_named(gl_db,"indicator-analog",DB_IND_HTR)); #endif @@ -243,13 +246,13 @@ static void prusa_mini_init(MachineState *machine) sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal); qdev_connect_gpio_out_named(DEVICE(&SOC->timers[2]),"pwm_ratio_changed",2,qdev_get_gpio_in_named(dev, "pwm_in",0)); qdev_connect_gpio_out_named(dev, "temp_out",0, qdev_get_gpio_in_named(bed, "thermistor_set_temperature",0)); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL qdev_connect_gpio_out_named(dev, "pwm-out", 0, qdev_get_gpio_in_named(gl_db,"indicator-analog",DB_IND_BED)); #endif dev = qdev_new("ir-sensor"); sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL qemu_irq split_fsensor = qemu_irq_split( qdev_get_gpio_in(DEVICE(&SOC->gpio[GPIO_B]),4),qdev_get_gpio_in_named(gl_db,"indicator-analog",DB_IND_FSENS)); qdev_connect_gpio_out(dev, 0, split_fsensor); #else @@ -270,7 +273,7 @@ static void prusa_mini_init(MachineState *machine) sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal); qdev_connect_gpio_out_named(dev, "tach-out",0,qdev_get_gpio_in(DEVICE(&SOC->gpio[GPIO_E]),fan_tach_pins[i])); qdev_connect_gpio_out(DEVICE(&SOC->gpio[GPIO_E]),fan_pwm_pins[i],qdev_get_gpio_in_named(dev, "pwm-in-soft",0)); -#ifdef CONFIG_OPENGL +#ifdef BUDDY_HAS_GL qdev_connect_gpio_out_named(dev, "pwm-out", 0, qdev_get_gpio_in_named(gl_db,"indicator-analog",DB_IND_PFAN+i)); #endif } diff --git a/hw/arm/prusa/stm32f407/stm32_clk_type.h b/hw/arm/prusa/stm32f407/stm32_clk_type.h index a6f5838330d..c71140761ef 100644 --- a/hw/arm/prusa/stm32f407/stm32_clk_type.h +++ b/hw/arm/prusa/stm32f407/stm32_clk_type.h @@ -24,6 +24,7 @@ #define STM32_CLK_H #include "qemu/osdep.h" +#include "../utility/macros.h" // Cannot be >255 as counts are stored in uint8_ts #define CLKTREE_MAX_IRQ 16 diff --git a/hw/arm/prusa/stm32f407/stm32_uart.c b/hw/arm/prusa/stm32f407/stm32_uart.c index f0fc4ff87a5..85f65d62597 100644 --- a/hw/arm/prusa/stm32f407/stm32_uart.c +++ b/hw/arm/prusa/stm32f407/stm32_uart.c @@ -320,7 +320,7 @@ static void stm32_uart_USART_DR_read(Stm32Uart *s, uint8_t *data_read) /* Put next character into the RDR if we have one */ stm32_uart_fill_receive_data_register(s); } else { - printf("STM32_UART WARNING: Read value from USART_DR (%08lx) while it was empty.\n", s->iomem.addr); + printf("STM32_UART WARNING: Read value from USART_DR (%08"HWADDR_PRIx") while it was empty.\n", s->iomem.addr); s->defs.DR.DR = 0; // Clear value. } @@ -571,7 +571,7 @@ static void stm32_uart_realize(DeviceState *dev, Error **errp) CHECK_REG_u32(s->defs.CR1); CHECK_REG_u32(s->defs.CR2); CHECK_REG_u32(s->defs.CR3); - CHECK_REG_u32(s->defs.GPTR); + CHECK_REG_u32(s->defs.GTPR); } static Property stm32_uart_properties[] = { diff --git a/hw/arm/prusa/stm32f407/stm32_uart.h b/hw/arm/prusa/stm32f407/stm32_uart.h index 33567904bb2..76aae4431c5 100644 --- a/hw/arm/prusa/stm32f407/stm32_uart.h +++ b/hw/arm/prusa/stm32f407/stm32_uart.h @@ -120,7 +120,7 @@ struct Stm32Uart { uint32_t PSC :8; uint32_t GT :8; uint32_t :16; - } QEMU_PACKED GPTR; + } QEMU_PACKED GTPR; } QEMU_PACKED defs; }; diff --git a/hw/arm/prusa/stm32f407/stm32f2xx_dma.c b/hw/arm/prusa/stm32f407/stm32f2xx_dma.c index 9ab656fbea4..a20b0c14217 100644 --- a/hw/arm/prusa/stm32f407/stm32f2xx_dma.c +++ b/hw/arm/prusa/stm32f407/stm32f2xx_dma.c @@ -154,7 +154,7 @@ static void set_DMAR_map(hwaddr src, f2xx_dma_stream *s) s->usart_dmar = 6; break; default: - printf("FIXME: Unknown DMAR source %08lx\n",src); + printf("FIXME: Unknown DMAR source 0x%08" HWADDR_PRIx "\n",src); s->usart_dmar = -1; } diff --git a/hw/arm/prusa/stm32f407/stm32f2xx_i2c.h b/hw/arm/prusa/stm32f407/stm32f2xx_i2c.h index 1aa02d14cce..65dcedc7bd2 100644 --- a/hw/arm/prusa/stm32f407/stm32f2xx_i2c.h +++ b/hw/arm/prusa/stm32f407/stm32f2xx_i2c.h @@ -65,7 +65,7 @@ struct STM32F2XXI2CState { uint16_t ALERT :1; uint16_t _res1 :1; uint16_t SWRST :1; - } CR1 QEMU_PACKED; + } QEMU_PACKED CR1; struct { uint16_t FREQ :6; uint16_t _res :2; @@ -75,19 +75,19 @@ struct STM32F2XXI2CState { uint16_t DMAEN :1; uint16_t LAST :1; uint16_t :3; - } CR2 QEMU_PACKED; + } QEMU_PACKED CR2; struct { uint16_t ADD0 :1; uint16_t ADDLO :7; uint16_t ADDHI :2; uint16_t _res :5; uint16_t ADDMODE :1; - } OAR1 QEMU_PACKED; + } QEMU_PACKED OAR1; struct { uint16_t ENDUAL :1; uint16_t ADD2 :7; uint16_t :8; - } OAR2 QEMU_PACKED; + } QEMU_PACKED OAR2; uint16_t DR; struct { uint16_t SB :1; @@ -106,7 +106,7 @@ struct STM32F2XXI2CState { uint16_t :1; uint16_t TIMEOUT :1; uint16_t SMBALERT :1; - } SR1 QEMU_PACKED; + } QEMU_PACKED SR1; struct { uint16_t MSL :1; uint16_t BUSY :1; @@ -117,10 +117,10 @@ struct STM32F2XXI2CState { uint16_t SMBHOST:1; uint16_t DUALF:1; uint16_t PEC :8; - } SR2 QEMU_PACKED; + } QEMU_PACKED SR2; uint16_t CCR; uint16_t TRISE; - } defs QEMU_PACKED; + } QEMU_PACKED defs; uint16_t regs[R_I2C_COUNT]; } QEMU_PACKED; diff --git a/hw/arm/prusa/stm32f407/stm32f2xx_rcc.c b/hw/arm/prusa/stm32f407/stm32f2xx_rcc.c index e5c1dbe2e72..f3afbd35da3 100644 --- a/hw/arm/prusa/stm32f407/stm32f2xx_rcc.c +++ b/hw/arm/prusa/stm32f407/stm32f2xx_rcc.c @@ -944,7 +944,7 @@ static uint64_t stm32_rcc_read(void *opaque, hwaddr offset, case 4: return stm32_rcc_readw(opaque, offset); default: - stm32_unimp("Unimplemented: RCC read from register at offset %lu", offset); + stm32_unimp("Unimplemented: RCC read from register at offset %08" HWADDR_PRIx, offset); return 0; } } diff --git a/hw/arm/prusa/stm32f407/stm32f2xx_tim.c b/hw/arm/prusa/stm32f407/stm32f2xx_tim.c index 2d0e3048a2d..dbe3ba92b1c 100644 --- a/hw/arm/prusa/stm32f407/stm32f2xx_tim.c +++ b/hw/arm/prusa/stm32f407/stm32f2xx_tim.c @@ -28,7 +28,7 @@ #include "qemu-common.h" #include "qemu/log.h" #include "qemu/timer.h" -#include +#include "../utility/macros.h" #define R_TIM_CR1 (0x00 / 4) //p #define R_TIM_CR2 (0x04 / 4) @@ -404,8 +404,6 @@ static void stm32f2xx_tim_rcc_reset(void *opaque, int n, int level) { } } -#define CHECK_ALIGN(x,y, name) static_assert(x == y, "ERROR - TIMER " name " register definition misaligned!") -#define CHECK_REG_u32(reg) CHECK_ALIGN(sizeof(reg),sizeof(uint32_t),#reg) static void f2xx_tim_init(Object *obj) diff --git a/hw/arm/prusa/stm32f407/stm32f2xx_tim.h b/hw/arm/prusa/stm32f407/stm32f2xx_tim.h index e77fc880e65..abe4f2df711 100644 --- a/hw/arm/prusa/stm32f407/stm32f2xx_tim.h +++ b/hw/arm/prusa/stm32f407/stm32f2xx_tim.h @@ -204,7 +204,7 @@ struct f2xx_tim { } QEMU_PACKED DCR; uint32_t DMAR; SHORT_REG_32(RMP,2) OR; - } defs; + } QEMU_PACKED defs; }; uint8_t id; qemu_irq pwm_ratio_changed[4]; diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_eth.c b/hw/arm/prusa/stm32f407/stm32f4xx_eth.c index 25ba5a5832c..66dee315897 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_eth.c +++ b/hw/arm/prusa/stm32f407/stm32f4xx_eth.c @@ -176,12 +176,12 @@ struct Stm32F4xx_Eth { uint32_t CR :4; uint32_t MR :5; uint32_t PA :5; - } MACMIIAR QEMU_PACKED; + } QEMU_PACKED MACMIIAR; struct { uint32_t MD :16; uint32_t :16; // unused. - } MACMIIDR QEMU_PACKED; - } defs QEMU_PACKED; + } QEMU_PACKED MACMIIDR; + } QEMU_PACKED defs; }; // LAN8742 PHY uint16_t mii[32]; diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.c b/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.c index a45ef7a114c..3324d7c163a 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.c +++ b/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.c @@ -99,7 +99,7 @@ static void stm32f4xx_iwdg_update(stm32f4xx_iwdg *s){ uint32_t tickrate = clkrate/prescale; // ticks per second. uint64_t delay_us = (1000000U* s->regs.defs.RLR.RL)/tickrate; if (s->time_changed) { - printf("Watchdog configured with timeout of %lu ms\n", delay_us/1000U); + printf("Watchdog configured with timeout of %"PRIu64" ms\n", delay_us/1000U); s->time_changed = false; } timer_mod(s->timer,qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (delay_us*1000)); @@ -193,6 +193,10 @@ stm32f4xx_iwdg_init(Object *obj) stm32f4xx_iwdg *s = STM32F4XX_IWDG(obj); assert(sizeof(s->regs)==sizeof(s->regs.all)); // Make sure packing is correct. + CHECK_REG_u32(s->regs.defs.KR); + CHECK_REG_u32(s->regs.defs.SR); + CHECK_REG_u32(s->regs.defs.RLR); + CHECK_REG_u32(s->regs.defs.SR); memory_region_init_io(&s->iomem, obj, &stm32f4xx_iwdg_ops, s, "iwdg", 0x0c); sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem); diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.h b/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.h index ff675e0fa36..f7999a28889 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.h +++ b/hw/arm/prusa/stm32f407/stm32f4xx_iwdg.h @@ -40,27 +40,27 @@ typedef struct stm32f4xx_iwdg { MemoryRegion iomem; union { - uint32_t all[R_IWDG_MAX]; struct { - union { + struct { uint32_t KEY :16; uint32_t :16; - }KR QEMU_PACKED; - union { + } QEMU_PACKED KR; + struct { uint32_t PR :3; uint32_t :29; - }PR QEMU_PACKED; - union { + } QEMU_PACKED PR; + struct { uint32_t RL :12; uint32_t :20; - }RLR QEMU_PACKED; - union { + } QEMU_PACKED RLR; + struct { uint32_t PVU :1; uint32_t RVU :1; uint32_t :30; - }SR QEMU_PACKED; - } defs; - } regs QEMU_PACKED; + } QEMU_PACKED SR; + } QEMU_PACKED defs; + uint32_t all[R_IWDG_MAX]; + } QEMU_PACKED regs; QEMUTimer *timer; diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_otp.c b/hw/arm/prusa/stm32f407/stm32f4xx_otp.c index c73efa31590..8ef0af10c85 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_otp.c +++ b/hw/arm/prusa/stm32f407/stm32f4xx_otp.c @@ -81,7 +81,7 @@ static void stm32f4xx_otp_realize(DeviceState *dev, Error **errp) // Note - some OSes do not allow files under 1k, so as long as the source is larger it's fine. if (len <= sizeof(s->data)) { - error_setg(errp, "%s: Backing file size %" PRId64 " != %lu", + error_setg(errp, "%s: Backing file size %" PRId64 " != %" PRIu64, TYPE_STM32F4XX_OTP, len, sizeof(s->data)); return; } diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_spi.c b/hw/arm/prusa/stm32f407/stm32f4xx_spi.c index e063cf3e87d..f725beb8024 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_spi.c +++ b/hw/arm/prusa/stm32f407/stm32f4xx_spi.c @@ -94,7 +94,7 @@ static uint64_t stm32f4xx_spi_read(void *opaque, hwaddr addr, if (addr < R_MAX) { r = s->regs[addr]; } else { - qemu_log_mask(LOG_GUEST_ERROR, "Out of range SPI write, addr 0x%x", (unsigned)addr<<2); + qemu_log_mask(LOG_GUEST_ERROR, "Out of range SPI write, addr 0x%"HWADDR_PRIx"\n", addr<<2); } switch (addr) { case R_DR: @@ -114,7 +114,7 @@ static void stm32f4xx_spi_write(void *opaque, hwaddr addr, { STM32F4XXSPIState *s = opaque; - DB_PRINT("Address: 0x%" HWADDR_PRIx ", Value: 0x%lx\n", addr, data); + DB_PRINT("Address: 0x%" HWADDR_PRIx ", Value: 0x%"PRIx64"\n", addr, data); int offset = addr & 0x3; diff --git a/hw/arm/prusa/stm32f407/stm32f4xx_usb.h b/hw/arm/prusa/stm32f407/stm32f4xx_usb.h index e81801af72d..be599f0ebb6 100644 --- a/hw/arm/prusa/stm32f407/stm32f4xx_usb.h +++ b/hw/arm/prusa/stm32f407/stm32f4xx_usb.h @@ -100,7 +100,7 @@ struct STM32F4xxUSBState { union { uint32_t grxstsr; /* 1c */ rxstatus_t defs; - }; + } QEMU_PACKED ; uint32_t grxstsp; /* 20 */ uint32_t grxfsiz; /* 24 */ union { diff --git a/hw/arm/prusa/utility/macros.h b/hw/arm/prusa/utility/macros.h index cba8ddf82ed..b3c650566e7 100644 --- a/hw/arm/prusa/utility/macros.h +++ b/hw/arm/prusa/utility/macros.h @@ -57,8 +57,12 @@ OBJECT_DEFINE_TYPE_SIMPLE_WITH_INTERFACES(ModuleObjName, module_obj_name, \ MODULE_OBJ_NAME, PARENT_MODULE_OBJ_NAME, {NULL}) -#define CHECK_ALIGN(x,y, name) static_assert(x == y, "ERROR - " name " register definition misaligned!") -#define CHECK_REG_u32(reg) CHECK_ALIGN(sizeof(reg),sizeof(uint32_t),#reg "size incorrect!") +#if !defined __cplusplus +#define static_assert _Static_assert +#endif +#define CHECK_PRI(x,y) #x" != "#y +#define CHECK_ALIGN(x,y, name) static_assert(x == y, "ERROR - " name " register definition misaligned! - " CHECK_PRI(x,y)) +#define CHECK_REG_u32(reg) CHECK_ALIGN(sizeof(reg),sizeof(uint32_t),#reg " size incorrect!") // Some rather ugly convenience macros for // more easily debugging save state symmetry. See the RCC implementation for