diff --git a/Makefile b/Makefile
deleted file mode 100644
index 2eef49c6ee4f987db46c20550c82045dea609591..0000000000000000000000000000000000000000
--- a/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-#TARGET = max32665
-#COMPILER = GCC
-
-#export TARGET
-#export COMPILER
-
-all: sdk subdirs
-
-travis:
-	$(MAKE) ADDFLAGS=-Werror lib subdirs
-
-subdirs:
-	$(MAKE) -C bootloader
-
-sdk/Libraries/MAX32665PeriphDriver/Build/PeriphDriver.a:
-#	$(MAKE) -C sdk/Libraries/MAX32665PeriphDriver
-
-sdk/Libraries/MAXUSB/Build/maxusb.a:
-#	$(MAKE) -C sdk/Libraries/MAXUSB
-
-sdk: sdk/Libraries/MAX32665PeriphDriver/Build/PeriphDriver.a sdk/Libraries/MAXUSB/Build/maxusb.a
-
-clean:
-	$(MAKE) -C bootloader clean
-#	$(MAKE) -C sdk/Libraries/MAX32665PeriphDriver clean
-#	$(MAKE) -C sdk/Libraries/MAXUSB clean
-
diff --git a/card10-cross.ini b/card10-cross.ini
new file mode 100644
index 0000000000000000000000000000000000000000..805a38670fbce8ba8ce6b85adc0ccc4db6790fe7
--- /dev/null
+++ b/card10-cross.ini
@@ -0,0 +1,17 @@
+[binaries]
+c = 'arm-none-eabi-gcc'
+ar = 'arm-none-eabi-ar'
+strip = 'arm-none-eabi-strip'
+
+[properties]
+# TODO: Switch to hard float
+c_args      = ['-mthumb', '-mcpu=cortex-m4', '-mfloat-abi=hard', '-mfpu=fpv4-sp-d16', '-Wa,-mimplicit-it=thumb', '-ffunction-sections', '-fdata-sections', '-fsingle-precision-constant', '-fno-isolate-erroneous-paths-dereference']
+c_link_args = ['-mthumb', '-mcpu=cortex-m4', '-mfloat-abi=hard', '-mfpu=fpv4-sp-d16']
+
+target_defs = ['-DTARGET=32665', '-DTARGET_REV=0x4131', '-DBOARD_CARD10=1']
+
+[host_machine]
+system = 'none'
+cpu = 'cortex-m4'
+cpu_family = 'arm'
+endian = 'little'
diff --git a/hw-tests/bmatest/meson.build b/hw-tests/bmatest/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..6fafa0c67e03a893c016298f5a94183971850e98
--- /dev/null
+++ b/hw-tests/bmatest/meson.build
@@ -0,0 +1,10 @@
+name = 'bmatest'
+
+executable(
+  name + '.elf',
+  'main.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/bmetest/meson.build b/hw-tests/bmetest/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..485d0a78efcc8eed3237553142c3df3ef3ca24be
--- /dev/null
+++ b/hw-tests/bmetest/meson.build
@@ -0,0 +1,10 @@
+name = 'bmetest'
+
+executable(
+  name + '.elf',
+  'main.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/ecgtest/meson.build b/hw-tests/ecgtest/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..3210e186894c182ca5c7632aed545029e6edb490
--- /dev/null
+++ b/hw-tests/ecgtest/meson.build
@@ -0,0 +1,10 @@
+name = 'ecgtest'
+
+executable(
+  name + '.elf',
+  'main.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/hello-world/meson.build b/hw-tests/hello-world/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..cbd33f2e71ddd1fd7a6a0d5813f98555ab7d11fe
--- /dev/null
+++ b/hw-tests/hello-world/meson.build
@@ -0,0 +1,10 @@
+name = 'hello-world'
+
+executable(
+  name + '.elf',
+  'main.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/imutest/meson.build b/hw-tests/imutest/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..9aa7c194c7a3818a64d7e2303d0746a16afddc3f
--- /dev/null
+++ b/hw-tests/imutest/meson.build
@@ -0,0 +1,10 @@
+name = 'imutest'
+
+executable(
+  name + '.elf',
+  'main.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/ips/meson.build b/hw-tests/ips/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..59dfcdede855defb2b2cd197e2af752704cf63d4
--- /dev/null
+++ b/hw-tests/ips/meson.build
@@ -0,0 +1,12 @@
+name = 'ips'
+
+executable(
+  name + '.elf',
+  'main.c',
+  'image/image.c',
+  'image/image2.c',
+  dependencies: [libcard10],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/hw-tests/meson.build b/hw-tests/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..f5302d2cb32629ad59be041f2de8d2d6956ddaf9
--- /dev/null
+++ b/hw-tests/meson.build
@@ -0,0 +1,6 @@
+subdir('bmatest/')
+subdir('bmetest/')
+subdir('ecgtest/')
+subdir('hello-world/')
+subdir('imutest/')
+subdir('ips/')
diff --git a/lib/card10/meson.build b/lib/card10/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..9d343368bad0a67dda6cab120af700b52ac9326d
--- /dev/null
+++ b/lib/card10/meson.build
@@ -0,0 +1,40 @@
+includes = include_directories(
+  './',
+)
+
+sources = files(
+  'bosch.c',
+  'card10.c',
+  'leds.c',
+  'pmic.c',
+)
+
+lib = static_library(
+  'card10',
+  sources,
+  include_directories: includes,
+  dependencies: [
+    bhy1,
+    bma400,
+    bme680,
+    board_card10,
+    libgfx,
+    max77650,
+    periphdriver,
+  ],
+)
+
+libcard10 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+  dependencies: [
+    bhy1,
+    bma400,
+    bme680,
+    board_card10,
+    libgfx,
+    max32665_rt,
+    max77650,
+    periphdriver,
+  ],
+)
diff --git a/lib/gfx/meson.build b/lib/gfx/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..a29e567871615649a9baa3a7650133763e30b907
--- /dev/null
+++ b/lib/gfx/meson.build
@@ -0,0 +1,34 @@
+includes = include_directories(
+  './',
+  './Fonts/',
+  './GUI_DEV/',
+  './LCD/',
+)
+
+sources = files(
+  './GUI_DEV/DEV_Config.c',
+  './GUI_DEV/GUI_Paint.c',
+  './LCD/LCD_Driver.c',
+  './display.c',
+
+  './Fonts/font8.c',
+  './Fonts/font12.c',
+  './Fonts/font12CN.c',
+  './Fonts/font16.c',
+  './Fonts/font20.c',
+  './Fonts/font24.c',
+  './Fonts/font24CN.c',
+)
+
+lib = static_library(
+  'gfx',
+  sources,
+  include_directories: includes,
+  dependencies: periphdriver,
+  c_args: '-Wno-missing-braces',
+)
+
+libgfx = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/lib/meson.build b/lib/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..e2f7c313470b22b1f46247970113ac2c29c968bf
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,9 @@
+subdir('./sdk/')
+
+subdir('./vendor/Bosch/BHy1/')
+subdir('./vendor/Bosch/BME680/')
+subdir('./vendor/Bosch/BMA400/')
+subdir('./vendor/Maxim/MAX77650/')
+subdir('./gfx/')
+
+subdir('./card10/')
diff --git a/lib/sdk/Libraries/Boards/card10/meson.build b/lib/sdk/Libraries/Boards/card10/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..c86801074963a982792366977816906d2a7cc5e5
--- /dev/null
+++ b/lib/sdk/Libraries/Boards/card10/meson.build
@@ -0,0 +1,31 @@
+includes = include_directories(
+  './Include/',
+  '../Include/',
+)
+
+sources = files(
+  './Source/board.c',
+  '../Source/led.c',
+  '../Source/mx25.c',
+  '../Source/pb.c',
+)
+
+lib = static_library(
+  'board-card10',
+  sources,
+  include_directories: includes,
+  dependencies: periphdriver,
+)
+
+libstdio = static_library(
+  'board-stdio',
+  '../Source/stdio.c',
+  include_directories: includes,
+  dependencies: periphdriver,
+)
+
+board_card10 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+  link_whole: libstdio,
+)
diff --git a/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..d487ee47f7ed648057e06cee60ce42a998bdebdd
--- /dev/null
+++ b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build
@@ -0,0 +1,19 @@
+sources = files(
+  './Source/GCC/startup_max32665.S',
+  './Source/system_max32665.c',
+  './Source/heap.c',
+)
+
+lib = static_library(
+  'max32665-rt',
+  sources,
+  dependencies: periphdriver,
+)
+
+max32665_rt = declare_dependency(
+  link_whole: lib,
+  link_args: [
+    '-T', meson.current_source_dir() + 'Source/GCC/max32665.ld',
+    '--entry', 'Reset_Handler',
+  ],
+)
diff --git a/lib/sdk/Libraries/MAX32665PeriphDriver/meson.build b/lib/sdk/Libraries/MAX32665PeriphDriver/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..e6ed059fb24d61fe4ea1b7d035226a8622860c6d
--- /dev/null
+++ b/lib/sdk/Libraries/MAX32665PeriphDriver/meson.build
@@ -0,0 +1,60 @@
+includes = include_directories(
+  'Include/',
+  '../CMSIS/Device/Maxim/MAX32665/Include/',
+  '../CMSIS/Include/',
+)
+
+sources = files(
+  'Source/adc.c',
+  'Source/cipher.c',
+  'Source/crc.c',
+  'Source/dma.c',
+  'Source/dvs.c',
+  'Source/emcc.c',
+  'Source/flc.c',
+  'Source/gpio.c',
+  'Source/hash.c',
+  'Source/htmr.c',
+  'Source/i2c.c',
+  'Source/icc.c',
+  'Source/lp.c',
+  'Source/maa.c',
+  'Source/mem_utils.c',
+  'Source/mxc_assert.c',
+  'Source/mxc_delay.c',
+  'Source/mxc_lock.c',
+  'Source/mxc_pins.c',
+  'Source/mxc_sys.c',
+  'Source/nvic_table.c',
+  'Source/owm.c',
+  'Source/pt.c',
+  'Source/rpu.c',
+  'Source/rtc.c',
+  'Source/sdhc.c',
+  'Source/sema.c',
+  'Source/simo.c',
+  'Source/spi.c',
+  'Source/spi17y.c',
+  'Source/spixf.c',
+  'Source/spixfc.c',
+  'Source/spixr.c',
+  'Source/startup_core1.S',
+  'Source/system_core1.c',
+  'Source/tmr.c',
+  'Source/tmr_utils.c',
+  'Source/trng.c',
+  'Source/uart.c',
+  'Source/wdt.c',
+  'Source/wut.c',
+)
+
+lib = static_library(
+  'PeriphDriver',
+  sources,
+  include_directories: includes,
+)
+
+periphdriver = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/lib/sdk/meson.build b/lib/sdk/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..a2f64eb7a3a7f212482f3b76fcba1c813f93552d
--- /dev/null
+++ b/lib/sdk/meson.build
@@ -0,0 +1,4 @@
+subdir('./Libraries/MAX32665PeriphDriver/')
+subdir('./Libraries/CMSIS/Device/Maxim/MAX32665/')
+
+subdir('./Libraries/Boards/card10/')
diff --git a/lib/vendor/Bosch/BHy1/meson.build b/lib/vendor/Bosch/BHy1/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..a63540cc5fbab4036c86f0ffa75aebe405adb05b
--- /dev/null
+++ b/lib/vendor/Bosch/BHy1/meson.build
@@ -0,0 +1,24 @@
+includes = include_directories(
+  './driver/inc/',
+  './examples/firmware/',
+  # For bosch.h
+  '../../../card10/',
+)
+
+sources = files(
+  './driver/src/bhy.c',
+  './driver/src/bhy_support.c',
+  './driver/src/bhy_uc_driver.c',
+)
+
+lib = static_library(
+  'bhy1',
+  sources,
+  include_directories: includes,
+  dependencies: periphdriver,
+)
+
+bhy1 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/lib/vendor/Bosch/BMA400/meson.build b/lib/vendor/Bosch/BMA400/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..e8c4baf10d601220287f9e3c1a0d5aa59e8e5e12
--- /dev/null
+++ b/lib/vendor/Bosch/BMA400/meson.build
@@ -0,0 +1,18 @@
+includes = include_directories(
+  './',
+)
+
+sources = files(
+  './bma400.c',
+)
+
+lib = static_library(
+  'bma400',
+  sources,
+  include_directories: includes,
+)
+
+bma400 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/lib/vendor/Bosch/BME680/meson.build b/lib/vendor/Bosch/BME680/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..d8e87fb1e079fd1771ceb937f24c62a48f57282f
--- /dev/null
+++ b/lib/vendor/Bosch/BME680/meson.build
@@ -0,0 +1,18 @@
+includes = include_directories(
+  './',
+)
+
+sources = files(
+  './bme680.c',
+)
+
+lib = static_library(
+  'bme680',
+  sources,
+  include_directories: includes,
+)
+
+bme680 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/lib/vendor/Maxim/MAX77650/meson.build b/lib/vendor/Maxim/MAX77650/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..32e60776d2216d80fd777beeb3c10f055690dfa7
--- /dev/null
+++ b/lib/vendor/Maxim/MAX77650/meson.build
@@ -0,0 +1,14 @@
+includes = include_directories(
+  './',
+)
+
+lib = static_library(
+  'max77650',
+  'MAX77650-Arduino-Library.c',
+  dependencies: periphdriver,
+)
+
+max77650 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..e01f491ce24c50d83d478eacf28cde0f3dc18daa
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,31 @@
+project(
+  'card10-firmware',
+  'c',
+  default_options: [
+    'buildtype=minsize',
+    'c_lto=true',
+    'c_std=c99',
+    'b_staticpic=false',
+    'b_asneeded=false',
+  ],
+)
+
+assert(
+  meson.is_cross_build(),
+  'card10-firmware can only be cross-compiled for card10.\n' +
+  'Please use `--cross-file card10-cross.ini`.',
+)
+
+add_global_arguments(
+  meson.get_cross_property('target_defs'),
+  language: 'c',
+)
+
+add_global_link_arguments(
+  '-Wl,--gc-sections',
+  '-lm',
+  language: 'c',
+)
+
+subdir('lib/')
+subdir('hw-tests/')