Massdrop’s CTRL Mechanical Keyboard: my final review, including a quick start guide, how to flash the keyboard, how to modify the RGB, and more

Okay. I like this keyboard. I do. It’s TKL, which I realize now I need, need, need. It’s RGB. Custom blues are pretty! It’s got separate function row keys and media keys. It’s got full size keys. It’s got arrow keys. It’s got QMK. It’s got clicky Kailh BOX White keys. I really do like this keyboard.


After using this keyboard for a couple of days, I’ve really been taken aback by several things:

  • Flashing
  • RGB
  • Marketing vs. Production
  • Wake from Sleep
  • Macros
  • Light and Slippery
  • Quality CTRL
  • USB-C

Before I talk in depth about each of those shortcomings, let me first add a couple of positive notes. First, through all of this, I discovered PAUSE instantly turns off the displays in Mac and locks them. Awesome!

Second, as I indicated before, I am really enjoying the Kailh Box Whites—not as loud on the THOC but it is smooth, clicky—I am liking them more and more. Really feels like Cherry MX Clears but with a nice click.

Oh, and one more thing. This keyboard desperately needs a quick start guide at least for a Mac. So, here it goes:

  • Download and install a plain-text editor such as TextWrangler, BBedit, or equivalent.
  • Download and install Homebrew (
  • Enter the following commands in Terminal:

git clone

cd qmk_firmware


make massdrop/ctrl:default

open keyboards/massdrop/ctrl/keymaps

  • Duplicate the default keymap, and rename it using no spaces or special characters save for underscore if desired.
  • Open the renamed folder and open keymap.c in your plain text editor.
  • Modify your keymap per QMK guidelines or use Massdrop’s configurator. If you would like, here’s my keymap, but I removed all the RGB functions.
  • Save your keymap.
  • Flash your keyboard (see details below).

Now, let’s get into the details.


So, one cannot use QMK Toolbox to flash the firmware. This keyboard does not use a DFU compatible chip. So, it requires a custom flasher. It’s annoying. But it works—once you figure out the syntax and process. Here’s how to do it at least for a Mac.

  • Download both the applet and the mdloader executable for your operating system from this GitHub and save them to your QMK folder root directory. In my case, that’s ~/Desktop/QMK-Firmware-Master/.
  • In terminal, change directory to your root directory and then change the mode of the executable if it’s a Mac, hitting RETURN after each line. Here’s mine:

cd ~/Desktop/QMK-Firmware-Master/

chmod u+x mdloader_mac.dms

  • Note: if you downloaded on a Mac from Safari, use the above chmod line; otherwise, if you used a different browser on a Mac, just use this:

chmod u+x mdloader_mac

  • After your keymap is made and all other options are adjusted for the keyboard in the other supporting files, make your keyboard and then flash it. You will need a software keyboard or a second hardware keyboard available. Here’s how I did it, pressing RETURN and waiting after each line:

make massdrop/ctrl:JG

[use a paperclip or keycard pin to then put keyboard into flash mode on the bottom-left-center]

./mdloader_mac.dms —list

./mdloader_mac.dms -D massdrop_ctrl_JG.bin -p /dev/cu.usbmodem142321 —restart

  • Note: if you did not use Safari, then just use ./mdloader_mac without .dms in the above commands.

So, there you have it. That’s an example of how to flash the keyboard. Why couldn’t Massdrop include something like that to begin with?

Also, it’s annoying having to hit the flash button every time. QMK offers a RESET keycode so that one can put the keyboard into flash mode without having to pick it up and hit the button. For some reason or another, CTRL does not recognize the RESET keycode. Frustrating.


So, QMK and RGB on this keyboard are not a thing. They are entirely separate. I think the RGB uses old TMK Core functionality via C++ (I’m guessing here). Most assuredly what it does not do is use QMK RGB Lighting or QMK Backlighting codes, so you can’t modify the keyboard’s RGB with those keycode standards. This point is incredibly frustrating. I thought the keyboard was QMK. It is, and, yet, it’s not. I can tinker and work with QMK, but I know nothing of C programming. That said, after over 24 hours of work and hunting it down (Why should it be this hard?), I figured out how to do a few things: first, change the default RGB animation effect; second, change the colors in the RGB animations; and, third, change the CAPS Lock colors. Here’s how:

Changing the Default RGB

  • Go to the massdrop/ctrl folder and open led-programs.c. For me, that’s ~/Desktop/QMK-Firmware-Master/keyboards/massdrop/ctrl/led_programs.c. I used TextWrangler. I think you can use Xcode or any other programming editor, such as BBedit.
  • Find this list (about line 106):

void *led_setups [] = {













Take the animation you want to be default and move it to the top of the list. Save the file, make your compile, and then flash it via mdloader. Done!

Change the Colors in the RGB Animations

  • Also in the led_programs.c file that we opened a moment ago, take the following into account when modifying the animations:
    • .hs, .he refers to horizontal start and end values
    • .rs, .re refers to start, end red values
    • .gs, ge refers to start, end green values
    • .bs, be refers to start, end blue values
    • .ef refers to effect types
  • To change the colors, simply modify the reds, greens, and blues as desired as it is basic RGB codes. I modified my Blue Solid animation thusly:

led_setup_t leds_blue[] = {
{ .hs = 0, .he = 100, .rs = 0, .re = 0, .gs = 75, .ge = 75, .bs = 255, .be = 255, .ef = EF_NONE },
{ .end = 1 },

Change the CAPS Lock Colors:

  • Navigate to your QMK root directory and go into TMK Core, open the protocol folder, and open the arm_atsam folder. Open the led_matrix.c file therein.
  • Go to about line 420 to find this code:

if (*led_cur->rgb.r > 127) *led_cur->rgb.r = 0;
else *led_cur->rgb.r = 255;
if (*led_cur->rgb.g > 127) *led_cur->rgb.g = 0;
else *led_cur->rgb.g = 255;
if (*led_cur->rgb.b > 127) *led_cur->rgb.b = 0;
else *led_cur->rgb.b = 255;

  • It’s a basic if-then statement for red, green, and blue. All three arguments inform the CAPS Lock RGB. If your RGB Animation has red (.rs, .re) greater than 127, it will then dump the red value to 0, but otherwise, it will bump it to 255. So on, and so forth for green and blue. Changing the values can create custom colors. I went with 0 for true but 255, 140, and 255 for false, respectively across red, green, and blue, so that I could achieve gold (looks like orange) on my custom Blue RGB Animation when my CAPS Lock is toggled on.

Marketing vs. Production

The keyboard was marketed with a space gray back plate. What was produced and delivered was a silver back plate. They aren’t even remotely close. It’s not a minute detail change. It’s a significantly different aesthetic. Really disappointed that I didn’t get what I paid for.

Wake from Sleep

There is an issue that I experienced with my KBD75 where the keyboard goes to sleep and then cannot be woken up by pressing any key. Instead, I have to click the mouse or the portable’s built-in keyboard to wake the CTRL. I think this is a bug in QMK (or maybe it’s a beloved “feature”) because it occurred with my KBD75 too, so I took it out. However, I can’t find it in the CTRL. It’s the RGBLIGHT_SLEEP code that is supposed to reside in config.h. It’s not there in the CTRL, so I can’t find it and disable it. Frustrating.


In QMK, macros are done via SEND_STRING. However, it doesn’t work with the CTRL. It generates compile warnings that are treated as errors, saying,

quantum/quantum.h:151:40: error: implicit declaration of function ‘PSTR’; did you mean ‘XSTR’?

This part is especially annoying. The keyboard is supposed to be QMK programmable. It is not as it pertains to RGB, and it is not as it pertains to macros. Instead, one must use a slightly different function, which, as far as I can tell, is C programming language and not QMK: send_string_with_delay_P(“macro_text”, 5), where “macro_text” is what you want to have the macro produce. Also, this function will only work after n-key rollover is enabled as the CTRL defaults to 6-key rollover. Dumb. Dumb, dumb, dumb.

Note: changing quantum.h to replace PSTR with XSTR did not resolve the issue. Leave it as PSTR and use the function above; enable NKRO to work around the issue until a permanent fix is made.

Light and Slippery

One thing I have noticed is that this keyboard is considerably lighter than my KBD75 and Pok3r. It weighs in at 2.13 pounds versus KBD75 and Pok3r at 3.09 pounds and 3 pounds, respectively. This fact is surprising given that the other two keyboards are 60% and 75% boards as opposed to this lighter unit that has more keys, switches, a larger back plate and case at 85%.

Because it is lighter, I’m noticing that it slips around on my keyboard tray a little bit. It’s minor and manageable, but it is still noticeable.

Quality CTRL

Speaking of slipperiness, there are several rubber feet pieces on the bottom to give the keyboard some grip. One of the pieces is not seated properly as it is out of the groove, off-centered and crooked. It’s not what I expect from a $200+ keyboard. Quality control missed this one.

And this one. The Massdrop novelty keycap came to me chipped, never mind the fact that it is not the same size as the other keycaps—so I can’t use it without it looking out of place.

As well as this one. I have two switches that are chipped or something on the BOX walls, which is causing the keycaps to wiggle a bit and create a nasty bump on keypress—almost like they are grinding.


I find the USB-C to be awesome on the keyboard end. It’s universal nature of plugin-ability is great! It also seems quite strong and durable (contrast that with mini/micro USB). I love it! But, using a USB-C to USB-C is hit or miss. Some of those cables work. Some of them don’t. Right now, it doesn’t affect me, but I’m well aware of the issue in case I get a USB-C only portable in the future. I want future-proofed peripherals when I invest over $200.


In short, I do like the keyboard a lot. It has room to grow. The removable, hot-swappable switches means I can always change things out, which is cool. I do like the PBT keycaps. Now that I have customized the RGB a bit, it’s even better to me. This shortcomings of the keyboard are disappointing, but they are not enough for me to return the unit. With the quick start, flashing, and RGB modifications guides, I hope anyone else with the CTRL will come to appreciate it as much as I do. And, with the future RGB Customizer coming from Massdrop, that should make it all the more sweet.



(9/15/18 11:23am Pacific) Updating config.h to remove ‘//’ from the NKRO define will enable NKRO by default.

I’ve updated my keymap and stored it here. I was able to recover all of the LED functions and keep my macros.

Now that the LED configurator is available, I’m trying to figure out how to keep my previous customizations and marry them to the LED configurator. So far, they don’t work. If I use the configurator, it creates a .bin that I cannot modify, extract, etc., which means all other defaults are saved that I don’t desire. For example, I lose NKRO default, macros, Blue LED program default and custom color, CAPS lock light color customizations, etc. But I cannot figure out how to assign custom LED flags within the keymap, LED programs, LED matrix, etc., so I am unable to otherwise customize the LEDs on my CTRL. If only the configurator would allow for a download before compile, that would be great!

3 thoughts on “Massdrop’s CTRL Mechanical Keyboard: my final review, including a quick start guide, how to flash the keyboard, how to modify the RGB, and more

  1. Thanks for posting this. It is very helpful but still confusing for a noob to this line of work. I am trying to create LED animations of a white background and purple scroll – essentially changing the default white with red scroll to a purple one. However, I don’t really understand the “start/end” options in the led_programs.c file.

  2. Yeah, start and end is a way to create a gradient or blend in the transition of colors so it isn’t so harsh and stark.

    Take the white with red stripe program and keep in mind because it starts with white all the LEDs are on so you have to reduce by X amount to get the purple color you want. It’s not in this case as simple as choosing your color; you have to do the inverse opposite.

Comments are closed.